sequence table progress

This commit is contained in:
sascha 2026-04-29 16:08:53 +02:00
parent 3fb23e167e
commit 433b0e40e1
5 changed files with 63 additions and 5 deletions

View File

@ -77,6 +77,11 @@ public:
basic_schema(); basic_schema();
explicit basic_schema(const std::string &name); explicit basic_schema(const std::string &name);
[[nodiscard]] std::string name() const;
[[nodiscard]] const object::repository &repo() const;
object::repository &repo();
[[nodiscard]] utils::result<void, utils::error> create(const sql::connection &conn) const; [[nodiscard]] utils::result<void, utils::error> create(const sql::connection &conn) const;
[[nodiscard]] utils::result<void, utils::error> drop(const sql::connection &conn) const; [[nodiscard]] utils::result<void, utils::error> drop(const sql::connection &conn) const;

View File

@ -245,9 +245,6 @@ public:
return basic_schema::contains(std::type_index(typeid(Type))); 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; void dump(std::ostream &os) const;
private: private:

View File

@ -1,5 +1,6 @@
#include "matador/query/basic_schema.hpp" #include "matador/query/basic_schema.hpp"
#include "matador/query/builder.hpp"
#include "matador/query/query.hpp" #include "matador/query/query.hpp"
#include "matador/sql/connection.hpp" #include "matador/sql/connection.hpp"
@ -51,6 +52,18 @@ basic_schema::basic_schema(const std::string &name)
: repo_(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<void, utils::error> basic_schema::create(const sql::connection &conn) const { utils::result<void, utils::error> basic_schema::create(const sql::connection &conn) const {
std::vector<std::string> fk_sql_commands; std::vector<std::string> fk_sql_commands;
@ -271,7 +284,27 @@ utils::result<void, utils::error> setup_primary_key_generator(const basic_schema
return utils::failure(result.err()); return utils::failure(result.err());
} }
} else if (node.pk_generator().type() == utils::generator_type::Table) { } 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<void, utils::error> cleanup_primary_key_generator(const basic_sche
return utils::failure(result.err()); return utils::failure(result.err());
} }
} else if (node.pk_generator().type() == utils::generator_type::Table) { } 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());
}
} }
} }

View File

@ -52,7 +52,7 @@ schema::iterator schema::insert_table(const std::type_index &ti, const object::r
pk_generator = std::make_unique<sequence_pk_generator>(node.name() + "_pk_seq"); pk_generator = std::make_unique<sequence_pk_generator>(node.name() + "_pk_seq");
break; break;
case utils::generator_type::Table: case utils::generator_type::Table:
pk_generator = std::make_unique<table_pk_generator>("TABLE_SEQS", node.name()); pk_generator = std::make_unique<table_pk_generator>("sequence_table", node.name());
break; break;
default: default:
pk_generator = std::make_unique<manual_pk_generator>(); pk_generator = std::make_unique<manual_pk_generator>();

View File

@ -124,3 +124,23 @@ TEST_CASE_METHOD(SessionFixture, "Test insert object with has many relation with
auto res = ses.insert(s_king); auto res = ses.insert(s_king);
REQUIRE(res.is_ok()); 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<book_table>("books")
.and_then( [this] { return schema.attach<author_table>("authors"); } )
.and_then([this] { return schema.create(db); } );
REQUIRE(result.is_ok());
session ses({bus, connection::dns, 4}, schema);
auto s_king = make_object<author_table>("Steven King");
s_king->books.push_back(make_object<book_table>("Carrie", nullobj, 1974));
s_king->books.push_back(make_object<book_table>("The Shining", nullobj, 1977));
s_king->books.push_back(make_object<book_table>("It", nullobj, 1986));
s_king->books.push_back(make_object<book_table>("Misery", nullobj, 1987));
s_king->books.push_back(make_object<book_table>("The Dark Tower: The Gunslinger", nullobj, 1982));
auto res = ses.insert(s_king);
REQUIRE(res.is_ok());
}