86 lines
3.2 KiB
C++
86 lines
3.2 KiB
C++
#ifndef QUERY_QUERY_COMPILER_HPP
|
|
#define QUERY_QUERY_COMPILER_HPP
|
|
|
|
#include "matador/query/query_part_visitor.hpp"
|
|
#include "matador/query/query_data.hpp"
|
|
|
|
#include "matador/sql/query_context.hpp"
|
|
|
|
#include "matador/utils/placeholder.hpp"
|
|
|
|
namespace matador::sql {
|
|
class connection_impl;
|
|
class dialect;
|
|
}
|
|
|
|
namespace matador::query {
|
|
|
|
namespace internal {
|
|
struct basic_type_to_string_visitor;
|
|
}
|
|
|
|
struct query_data;
|
|
struct value_visitor;
|
|
|
|
class query_compiler final : public query_part_visitor {
|
|
public:
|
|
sql::query_context compile(const query_data &data,
|
|
const sql::dialect &d,
|
|
std::optional<std::reference_wrapper<const sql::connection_impl>> conn);
|
|
|
|
protected:
|
|
void visit(internal::query_alter_part& part) override;
|
|
void visit(internal::query_alter_table_part& part) override;
|
|
void visit(internal::query_add_key_constraint_part& part) override;
|
|
void visit(internal::query_add_foreign_key_constraint_part& part) override;
|
|
void visit(internal::query_add_primary_key_constraint_part& part) override;
|
|
void visit(internal::query_add_foreign_key_reference_part& part) override;
|
|
void visit(internal::query_drop_key_constraint_part& part) override;
|
|
void visit(internal::query_drop_foreign_key_constraint_part& part) override;
|
|
|
|
protected:
|
|
void visit(internal::query_select_part &part) override;
|
|
void visit(internal::query_from_part &part) override;
|
|
void visit(internal::query_join_part &part) override;
|
|
void visit(internal::query_on_part &part) override;
|
|
void visit(internal::query_where_part &part) override;
|
|
void visit(internal::query_group_by_part &part) override;
|
|
void visit(internal::query_order_by_part &part) override;
|
|
void visit(internal::query_order_by_asc_part &part) override;
|
|
void visit(internal::query_order_by_desc_part &part) override;
|
|
void visit(internal::query_offset_part &part) override;
|
|
void visit(internal::query_limit_part &part) override;
|
|
void visit(internal::query_insert_part &part) override;
|
|
void visit(internal::query_into_part &part) override;
|
|
void visit(internal::query_values_part &part) override;
|
|
|
|
void visit(internal::query_update_part &part) override;
|
|
void visit(internal::query_set_part &part) override;
|
|
|
|
void visit(internal::query_delete_part &part) override;
|
|
void visit(internal::query_delete_from_part &part) override;
|
|
|
|
void visit(internal::query_create_part &part) override;
|
|
void visit(internal::query_create_table_part &part) override;
|
|
void visit(internal::query_create_schema_part& part) override;
|
|
|
|
void visit(internal::query_drop_part &part) override;
|
|
void visit(internal::query_drop_table_part &part) override;
|
|
void visit(internal::query_drop_schema_part& part) override;
|
|
|
|
static std::string build_table_name(sql::dialect_token token, const sql::dialect &d, const sql::table& t);
|
|
|
|
static std::string determine_value(value_visitor &visitor, const std::variant<utils::placeholder, utils::database_type> &val);
|
|
|
|
protected:
|
|
const query_data *data_{};
|
|
sql::query_context query_;
|
|
size_t table_index{0};
|
|
const sql::dialect *dialect_{nullptr};
|
|
std::optional<std::reference_wrapper<const sql::connection_impl>> connection_{};
|
|
};
|
|
|
|
}
|
|
|
|
#endif //QUERY_QUERY_COMPILER_HPP
|