From 433b0e40e1c03d9e2823c0f7a4072ea24d30a943 Mon Sep 17 00:00:00 2001 From: sascha Date: Wed, 29 Apr 2026 16:08:53 +0200 Subject: [PATCH] sequence table progress --- include/matador/query/basic_schema.hpp | 5 ++++ include/matador/query/schema.hpp | 3 -- source/orm/query/basic_schema.cpp | 38 +++++++++++++++++++++++++- source/orm/query/schema.cpp | 2 +- test/backends/SessionInsertHasMany.cpp | 20 ++++++++++++++ 5 files changed, 63 insertions(+), 5 deletions(-) diff --git a/include/matador/query/basic_schema.hpp b/include/matador/query/basic_schema.hpp index aa024fb..69c00e0 100644 --- a/include/matador/query/basic_schema.hpp +++ b/include/matador/query/basic_schema.hpp @@ -77,6 +77,11 @@ public: basic_schema(); explicit basic_schema(const std::string &name); + [[nodiscard]] std::string name() const; + + [[nodiscard]] const object::repository &repo() const; + object::repository &repo(); + [[nodiscard]] utils::result create(const sql::connection &conn) const; [[nodiscard]] utils::result drop(const sql::connection &conn) const; diff --git a/include/matador/query/schema.hpp b/include/matador/query/schema.hpp index 3b7d1ad..201a5fc 100644 --- a/include/matador/query/schema.hpp +++ b/include/matador/query/schema.hpp @@ -245,9 +245,6 @@ public: return basic_schema::contains(std::type_index(typeid(Type))); } - [[nodiscard]] const object::repository &repo() const { return repo_; } - object::repository &repo() { return repo_; } - void dump(std::ostream &os) const; private: diff --git a/source/orm/query/basic_schema.cpp b/source/orm/query/basic_schema.cpp index bb1f40c..b383672 100644 --- a/source/orm/query/basic_schema.cpp +++ b/source/orm/query/basic_schema.cpp @@ -1,5 +1,6 @@ #include "matador/query/basic_schema.hpp" +#include "matador/query/builder.hpp" #include "matador/query/query.hpp" #include "matador/sql/connection.hpp" @@ -51,6 +52,18 @@ basic_schema::basic_schema(const std::string &name) : repo_(name) { } +std::string basic_schema::name() const { + return repo_.name(); +} + +const object::repository& basic_schema::repo() const { + return repo_; +} + +object::repository& basic_schema::repo() { + return repo_; +} + utils::result basic_schema::create(const sql::connection &conn) const { std::vector fk_sql_commands; @@ -271,7 +284,27 @@ utils::result setup_primary_key_generator(const basic_schema return utils::failure(result.err()); } } else if (node.pk_generator().type() == utils::generator_type::Table) { + if (const auto result = conn.exists(scm.name(), "sequence_table"); result) { + if (!*result) { + const auto exec_result = create() + .table("sequence_table") + .columns({ + column("name", utils::basic_type::Varchar, 255), + column("next_id", utils::basic_type::Int64) + }) + .execute(conn); + if (!exec_result) { + return utils::failure(exec_result.err()); + } + } + } else { + return utils::failure(result.err()); + } + const auto insert_result = insert().into("sequence_table", {"name", "next_id"}).values({node.name(), 1}).execute(conn); + if (!insert_result) { + return utils::failure(insert_result.err()); + } } } @@ -286,7 +319,10 @@ utils::result cleanup_primary_key_generator(const basic_sche return utils::failure(result.err()); } } else if (node.pk_generator().type() == utils::generator_type::Table) { - + const auto result = drop().sequence(node.name() + "_pk_seq").execute(conn); + if (!result) { + return utils::failure(result.err()); + } } } diff --git a/source/orm/query/schema.cpp b/source/orm/query/schema.cpp index 53d8fef..f8f9451 100644 --- a/source/orm/query/schema.cpp +++ b/source/orm/query/schema.cpp @@ -52,7 +52,7 @@ schema::iterator schema::insert_table(const std::type_index &ti, const object::r pk_generator = std::make_unique(node.name() + "_pk_seq"); break; case utils::generator_type::Table: - pk_generator = std::make_unique("TABLE_SEQS", node.name()); + pk_generator = std::make_unique("sequence_table", node.name()); break; default: pk_generator = std::make_unique(); diff --git a/test/backends/SessionInsertHasMany.cpp b/test/backends/SessionInsertHasMany.cpp index 8075126..40a42e1 100644 --- a/test/backends/SessionInsertHasMany.cpp +++ b/test/backends/SessionInsertHasMany.cpp @@ -121,6 +121,26 @@ TEST_CASE_METHOD(SessionFixture, "Test insert object with has many relation with s_king->books.push_back(make_object("Misery", nullobj, 1987)); s_king->books.push_back(make_object("The Dark Tower: The Gunslinger", nullobj, 1982)); + auto res = ses.insert(s_king); + REQUIRE(res.is_ok()); +} + +TEST_CASE_METHOD(SessionFixture, "Test insert object with has many relation with table sequence", "[session][insert][has_many][table_sequence]") { + const auto result = schema.attach("books") + .and_then( [this] { return schema.attach("authors"); } ) + .and_then([this] { return schema.create(db); } ); + REQUIRE(result.is_ok()); + + session ses({bus, connection::dns, 4}, schema); + + auto s_king = make_object("Steven King"); + + s_king->books.push_back(make_object("Carrie", nullobj, 1974)); + s_king->books.push_back(make_object("The Shining", nullobj, 1977)); + s_king->books.push_back(make_object("It", nullobj, 1986)); + s_king->books.push_back(make_object("Misery", nullobj, 1987)); + s_king->books.push_back(make_object("The Dark Tower: The Gunslinger", nullobj, 1982)); + auto res = ses.insert(s_king); REQUIRE(res.is_ok()); } \ No newline at end of file