insert_query_builder progress
This commit is contained in:
@@ -73,6 +73,7 @@ add_library(matador-orm STATIC
|
||||
../../include/matador/query/query_builder.hpp
|
||||
../../include/matador/query/query_collection_resolver.hpp
|
||||
../../include/matador/query/query_column.hpp
|
||||
../../include/matador/query/query_contexts.hpp
|
||||
../../include/matador/query/query_data.hpp
|
||||
../../include/matador/query/query_intermediates.hpp
|
||||
../../include/matador/query/query_object_resolver.hpp
|
||||
|
||||
@@ -4,6 +4,7 @@
|
||||
#include "matador/sql/dialect.hpp"
|
||||
|
||||
#include "matador/query/query.hpp"
|
||||
#include "matador/query/generator.hpp"
|
||||
|
||||
#include <stdexcept>
|
||||
|
||||
@@ -18,6 +19,41 @@ session::session(session_context&& ctx, const query::schema &scm)
|
||||
, dialect_(sql::backend_provider::instance().connection_dialect(pool_.info().type))
|
||||
, schema_(scm)
|
||||
, resolver_service_(ctx.resolver_service) {
|
||||
using namespace matador::utils;
|
||||
for (const auto &[type, node] : schema_) {
|
||||
query::query_contexts queries;
|
||||
|
||||
// SELECT all
|
||||
queries.select_all = query::select(node.table())
|
||||
.from(node.name())
|
||||
.compile(dialect_);
|
||||
if (node.table().has_primary_key()) {
|
||||
// SELECT one
|
||||
queries.select_one = query::select(node.table())
|
||||
.from(node.name())
|
||||
.where(*node.table().primary_key_column().value() == _)
|
||||
.compile(dialect_);
|
||||
// UPDATE one
|
||||
auto update_set = query::update(node.table());
|
||||
for (const auto &col: node.table().columns()) {
|
||||
update_set.set(col, _);
|
||||
}
|
||||
queries.update_one = update_set.where(*node.table().primary_key_column().value() == _)
|
||||
.compile(dialect_);
|
||||
// DELETE one
|
||||
queries.delete_one = query::remove()
|
||||
.from(node.name())
|
||||
.where(*node.table().primary_key_column().value() == _)
|
||||
.compile(dialect_);
|
||||
}
|
||||
// INSERT one
|
||||
queries.insert = query::insert()
|
||||
.into(node.name(), node.table())
|
||||
.values(query::generator::placeholders(node.table().columns().size()))
|
||||
.compile(dialect_);
|
||||
|
||||
contexts_by_type_[node.node().type_index()] = queries;
|
||||
}
|
||||
}
|
||||
|
||||
utils::result<void, utils::error> session::drop_table(const std::string &table_name) const {
|
||||
|
||||
@@ -31,4 +31,13 @@ column_value_generator::column_value_generator(column_value_generator_options op
|
||||
void column_value_generator::on_revision(const char* id, uint64_t& x) {
|
||||
push_back(id, x);
|
||||
}
|
||||
}
|
||||
|
||||
std::vector<utils::placeholder> placeholders(const size_t num) {
|
||||
std::vector<utils::placeholder> result;
|
||||
for (size_t i = 0; i < num; ++i) {
|
||||
result.emplace_back(utils::_);
|
||||
}
|
||||
|
||||
return result;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,8 +1,23 @@
|
||||
#include "matador/query/insert_query_builder.hpp"
|
||||
|
||||
#include "matador/sql/statement_cache.hpp"
|
||||
|
||||
namespace matador::query {
|
||||
insert_query_builder::insert_query_builder(const basic_schema& schema)
|
||||
: schema_(schema) {}
|
||||
insert_query_builder::insert_query_builder(const basic_schema& schema, const std::unordered_map<std::type_index, query_contexts> &contexts_by_type)
|
||||
: schema_(schema)
|
||||
, contexts_by_type_{contexts_by_type}
|
||||
{}
|
||||
|
||||
utils::result<sql::statement, utils::error> insert_query_builder::insert_step::acquire_and_bind(sql::statement_cache &cache) const {
|
||||
auto result = cache.acquire(ctx);
|
||||
if (!result.is_ok()) {
|
||||
return utils::failure(result.err());
|
||||
}
|
||||
|
||||
bind_object(*result);
|
||||
|
||||
return utils::ok(std::move(*result));
|
||||
}
|
||||
|
||||
void insert_query_builder::on_revision(const char* /*id*/, uint64_t&) {}
|
||||
} // namespace matador::query
|
||||
@@ -17,9 +17,9 @@ utils::result<sql::statement, utils::error> executable_query::prepare(sql::execu
|
||||
return exec.prepare(compiler.build(*context_, exec.dialect(), std::nullopt));
|
||||
}
|
||||
|
||||
sql::query_context executable_query::compile( const sql::executor& exec ) const {
|
||||
sql::query_context executable_query::compile(const sql::dialect& d) const {
|
||||
query_builder compiler;
|
||||
return compiler.build(*context_, exec.dialect(), std::nullopt);
|
||||
return compiler.build(*context_, d, std::nullopt);
|
||||
}
|
||||
|
||||
std::string executable_query::str(const sql::executor &exec) const {
|
||||
|
||||
+12
-12
@@ -16,7 +16,7 @@ namespace matador::query {
|
||||
utils::result<void, utils::error> schema::create(const sql::connection &conn) const {
|
||||
std::vector<std::string> fk_sql_commands;
|
||||
|
||||
const auto q = query::create().schema(repo_.name()).compile(conn);
|
||||
const auto q = query::create().schema(repo_.name()).compile(conn.dialect());
|
||||
std::cout << q.sql << std::endl;
|
||||
|
||||
// create plain tables without constraints
|
||||
@@ -24,7 +24,7 @@ utils::result<void, utils::error> schema::create(const sql::connection &conn) co
|
||||
auto ctx = query::create()
|
||||
.table(node.name())
|
||||
.columns(node.info().attributes())
|
||||
.compile(conn);
|
||||
.compile(conn.dialect());
|
||||
|
||||
if (auto result = conn.execute(ctx); !result) {
|
||||
return utils::failure(result.err());
|
||||
@@ -37,7 +37,7 @@ utils::result<void, utils::error> schema::create(const sql::connection &conn) co
|
||||
if (!cons.is_primary_key_constraint()) {
|
||||
continue;
|
||||
}
|
||||
auto ctx = build_add_constraint_context(node, cons, conn);
|
||||
auto ctx = build_add_constraint_context(node, cons, conn.dialect());
|
||||
|
||||
if (auto result = conn.execute(ctx); !result) {
|
||||
return utils::failure(result.err());
|
||||
@@ -50,7 +50,7 @@ utils::result<void, utils::error> schema::create(const sql::connection &conn) co
|
||||
if (cons.is_primary_key_constraint()) {
|
||||
continue;
|
||||
}
|
||||
auto ctx = build_add_constraint_context(node, cons, conn);
|
||||
auto ctx = build_add_constraint_context(node, cons, conn.dialect());
|
||||
|
||||
if (auto result = conn.execute(ctx); !result) {
|
||||
return utils::failure(result.err());
|
||||
@@ -70,7 +70,7 @@ utils::result<void, utils::error> schema::drop(const sql::connection &conn) cons
|
||||
auto ctx = alter()
|
||||
.table(node.name())
|
||||
.drop_constraint(cons)
|
||||
.compile(conn);
|
||||
.compile(conn.dialect());
|
||||
|
||||
if (auto result = conn.execute(ctx); !result) {
|
||||
return utils::failure(result.err());
|
||||
@@ -87,7 +87,7 @@ utils::result<void, utils::error> schema::drop(const sql::connection &conn) cons
|
||||
auto ctx = alter()
|
||||
.table(node.name())
|
||||
.drop_constraint(cons)
|
||||
.compile(conn);
|
||||
.compile(conn.dialect());
|
||||
|
||||
if (auto result = conn.execute(ctx); !result) {
|
||||
return utils::failure(result.err());
|
||||
@@ -99,7 +99,7 @@ utils::result<void, utils::error> schema::drop(const sql::connection &conn) cons
|
||||
for (const auto &node: repo_) {
|
||||
auto ctx = query::drop()
|
||||
.table(node.name())
|
||||
.compile(conn);
|
||||
.compile(conn.dialect());
|
||||
|
||||
if (auto result = conn.execute(ctx); !result) {
|
||||
return utils::failure(result.err());
|
||||
@@ -135,29 +135,29 @@ void schema::dump(std::ostream &os) const {
|
||||
|
||||
sql::query_context schema::build_add_constraint_context(const object::repository_node &node,
|
||||
const object::restriction &cons,
|
||||
const sql::connection &conn) {
|
||||
const sql::dialect &d) {
|
||||
if (cons.is_foreign_key_constraint()) {
|
||||
return alter()
|
||||
.table(node.name())
|
||||
.add_constraint(cons)
|
||||
.compile(conn);
|
||||
.compile(d);
|
||||
}
|
||||
if (cons.is_primary_key_constraint()) {
|
||||
return alter()
|
||||
.table(node.name())
|
||||
.add_constraint(cons)
|
||||
.compile(conn);
|
||||
.compile(d);
|
||||
}
|
||||
return {};
|
||||
}
|
||||
|
||||
sql::query_context schema::build_drop_constraint_context(const object::repository_node &node,
|
||||
const object::restriction &cons,
|
||||
const sql::connection &conn) {
|
||||
const sql::dialect &d) {
|
||||
return alter()
|
||||
.table(node.name())
|
||||
.drop_constraint(cons)
|
||||
.compile(conn);
|
||||
.compile(d);
|
||||
}
|
||||
|
||||
schema::iterator schema::insert_table(const std::type_index &ti, const object::repository_node &node, const utils::generator_type /*generator_type*/) {
|
||||
|
||||
@@ -21,6 +21,9 @@ table::table(std::string name, std::string alias, const std::vector<table_column
|
||||
, columns_(columns) {
|
||||
for (auto &col : columns_) {
|
||||
col.table(this);
|
||||
if (col.is_primary_key()) {
|
||||
pk_column_ = &col;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -102,11 +105,15 @@ std::string table::schema_name() const {
|
||||
}
|
||||
|
||||
bool table::is_relation_table() const {
|
||||
return false;
|
||||
return !has_primary_key();
|
||||
}
|
||||
|
||||
bool table::has_primary_key() const {
|
||||
return false;
|
||||
return pk_column_.has_value();
|
||||
}
|
||||
|
||||
std::optional<table_column *> table::primary_key_column() const {
|
||||
return pk_column_;
|
||||
}
|
||||
|
||||
const std::string &table::join_column_name() const {
|
||||
@@ -117,9 +124,9 @@ const std::string &table::inverse_join_column_name() const {
|
||||
return inverse_join_column_name_;
|
||||
}
|
||||
|
||||
const table_column& table::create_column(class table &tab, const std::string &name) {
|
||||
tab.columns_.emplace_back(name);
|
||||
tab.columns_.back().table(&tab);
|
||||
return tab.columns_.back();
|
||||
}
|
||||
// const table_column& table::create_column(class table &tab, const std::string &name) {
|
||||
// tab.columns_.emplace_back(name);
|
||||
// tab.columns_.back().table(&tab);
|
||||
// return tab.columns_.back();
|
||||
// }
|
||||
}
|
||||
|
||||
@@ -138,6 +138,22 @@ bool table_column::is_nullable() const {
|
||||
return !utils::is_constraint_set(attributes_.options(), utils::constraints::NotNull);
|
||||
}
|
||||
|
||||
bool table_column::is_primary_key() const {
|
||||
return !utils::is_constraint_set(attributes_.options(), utils::constraints::PrimaryKey);
|
||||
}
|
||||
|
||||
bool table_column::is_foreign_key() const {
|
||||
return !utils::is_constraint_set(attributes_.options(), utils::constraints::ForeignKey);
|
||||
}
|
||||
|
||||
bool table_column::is_unique() const {
|
||||
return !utils::is_constraint_set(attributes_.options(), utils::constraints::Unique);
|
||||
}
|
||||
|
||||
bool table_column::is_identity() const {
|
||||
return !utils::is_constraint_set(attributes_.options(), utils::constraints::Identity);
|
||||
}
|
||||
|
||||
sql::sql_function_t table_column::function() const {
|
||||
return function_;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user