insert_query_builder progress

This commit is contained in:
2026-04-12 22:07:24 +02:00
parent f03664d60a
commit a0326632ab
25 changed files with 319 additions and 124 deletions
+10 -1
View File
@@ -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;
}
}
+17 -2
View File
@@ -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
View File
@@ -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*/) {
+14 -7
View File
@@ -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();
// }
}
+16
View File
@@ -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_;
}