primary key generator progress: added primary_key_generator_finder
This commit is contained in:
@@ -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 {
|
||||
|
||||
@@ -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;
|
||||
|
||||
Reference in New Issue
Block a user