primary key generator progress: added primary_key_generator_finder

This commit is contained in:
2026-02-17 22:43:53 +01:00
parent 38dc42ade8
commit 0876535b44
10 changed files with 241 additions and 12 deletions
+35 -1
View File
@@ -16,17 +16,51 @@
namespace matador::query {
class schema_node final {
public:
schema_node(class table tab, const object::repository_node& node);
schema_node(class table tab, utils::generator_type generator_type, const object::repository_node& node);
[[nodiscard]] const std::string& name() const;
[[nodiscard]] const class table& table() const;
[[nodiscard]] utils::generator_type generator_type() const;
[[nodiscard]] const object::repository_node& node() const;
private:
class table table_;
utils::generator_type generator_type_{};
const object::repository_node& node_;
};
class primary_key_generator_finder final {
public:
template< typename Type >
utils::generator_type find(const object::object_info<Type>& info) {
generator_type_ = utils::generator_type::Manually;
access::process(*this, info.prototype());
return generator_type_;
}
template<class V>
void on_primary_key(const char * /*id*/, V &/*pk*/, const utils::primary_key_attribute &attr = utils::default_pk_attributes) {
generator_type_ = attr.generator();
}
static void on_revision(const char * /*id*/, uint64_t & /*rev*/) {}
template<typename T>
static void on_attribute(const char * /*id*/, T &, const utils::field_attributes & = utils::null_attributes) {}
template<class P>
static void on_belongs_to(const char * /*id*/, P &, const utils::foreign_attributes & ) {}
template<class P>
static void on_has_one(const char * /*id*/, P &, const utils::foreign_attributes & ) {}
template<class C>
static void on_has_many(const char * /*id*/, C &, const char * /*join_column*/, const utils::foreign_attributes & ) {}
template<class C>
static void on_has_many_to_many(const char * /*id*/, C &, const char * /*join_column*/, const char * /*inverse_join_column*/, const utils::foreign_attributes & ) {}
template<class C>
static void on_has_many_to_many(const char * /*id*/, C &, const utils::foreign_attributes & ) {}
private:
utils::generator_type generator_type_{};
};
class basic_schema {
public:
using schema_node_map = std::unordered_map<std::type_index, schema_node>;
@@ -114,7 +114,7 @@ private:
// 2) Build INSERT for this object
// For Identity PK strategy: append RETURNING(pk_column)
const auto &info = it->second.node().info();
if (info.has_primary_key() && info.primary_key_attribute()->generator() == utils::generator_type::Identity) {
if (info.has_primary_key() && it->second.generator_type() == utils::generator_type::Identity) {
const std::string pk_name = info.primary_key_attribute()->name();
const table_column pk_col(&it->second.table(), pk_name);
insert_step step {
+5 -2
View File
@@ -270,7 +270,7 @@ private:
[[nodiscard]] static sql::query_context build_add_constraint_context(const object::repository_node& node, const object::restriction& cons, const sql::connection &conn) ;
[[nodiscard]] static sql::query_context build_drop_constraint_context(const object::repository_node& node, const object::restriction& cons, const sql::connection &conn) ;
iterator insert_table(const std::type_index& ti, const object::repository_node &node);
iterator insert_table(const std::type_index& ti, const object::repository_node &node, utils::generator_type generator_type);
private:
template<typename Type>
@@ -289,7 +289,10 @@ utils::result<void, utils::error> schema::drop_table(const sql::connection &conn
template <typename Type>
void schema_observer<Type>::on_attach(const object::repository_node &node, const Type &/*prototype*/) const {
const auto it = schema_.insert_table(typeid(Type), node);
primary_key_generator_finder finder;
const auto generator_type = finder.find(node.info<Type>().get());
const auto it = schema_.insert_table(typeid(Type), node, generator_type);
if (!it->second.node().info().has_primary_key()) {
return;