diff --git a/include/matador/query/identity_pk_generator.hpp b/include/matador/query/identity_pk_generator.hpp new file mode 100644 index 0000000..64a7900 --- /dev/null +++ b/include/matador/query/identity_pk_generator.hpp @@ -0,0 +1,14 @@ +#ifndef MATADOR_IDENTITY_PK_GENERATOR_HPP +#define MATADOR_IDENTITY_PK_GENERATOR_HPP + +#include "matador/query/abstract_pk_generator.hpp" + +namespace matador::query { +class identity_pk_generator : public abstract_pk_generator { +public: + identity_pk_generator(); + [[nodiscard]] utils::result next_id(const sql::executor& exec) override; + [[nodiscard]] utils::result current_id(const sql::executor& exec) override; +}; +} +#endif //MATADOR_IDENTITY_PK_GENERATOR_HPP diff --git a/source/orm/CMakeLists.txt b/source/orm/CMakeLists.txt index 0d8d62c..92b7186 100644 --- a/source/orm/CMakeLists.txt +++ b/source/orm/CMakeLists.txt @@ -218,6 +218,8 @@ add_library(matador-orm STATIC sql/resolver_service.cpp sql/statement.cpp sql/statement_cache.cpp + ../../include/matador/query/identity_pk_generator.hpp + query/identity_pk_generator.cpp ) target_include_directories(matador-orm diff --git a/source/orm/query/identity_pk_generator.cpp b/source/orm/query/identity_pk_generator.cpp new file mode 100644 index 0000000..fcc63fc --- /dev/null +++ b/source/orm/query/identity_pk_generator.cpp @@ -0,0 +1,17 @@ +#include "matador/query/identity_pk_generator.hpp" + +#include "matador/sql/error_code.hpp" + +namespace matador::query { +identity_pk_generator::identity_pk_generator() +: abstract_pk_generator(utils::generator_type::Identity){ +} + +utils::result identity_pk_generator::next_id(const sql::executor &/*exec*/) { + return utils::failure(utils::error(sql::error_code::Failure, "Identity PK generator not implemented")); +} + +utils::result identity_pk_generator::current_id(const sql::executor &/*exec*/) { + return utils::failure(utils::error(sql::error_code::Failure, "Identity PK generator not implemented")); +} +} diff --git a/source/orm/query/schema.cpp b/source/orm/query/schema.cpp index c35ef8b..0f2b70b 100644 --- a/source/orm/query/schema.cpp +++ b/source/orm/query/schema.cpp @@ -4,6 +4,9 @@ #include "matador/query/query.hpp" #include "matador/query/manual_pk_generator.hpp" +#include "matador/query/identity_pk_generator.hpp" +#include "matador/query/sequence_pk_generator.hpp" +#include "matador/query/table_pk_generator.hpp" #include "matador/object/repository_node.hpp" @@ -160,11 +163,25 @@ sql::query_context schema::build_drop_constraint_context(const object::repositor .compile(d); } -schema::iterator schema::insert_table(const std::type_index &ti, const object::repository_node &node, const utils::generator_type /*generator_type*/) { +schema::iterator schema::insert_table(const std::type_index &ti, const object::repository_node &node, const utils::generator_type generator_type) { std::vector columns; for (const auto &attr: node.info().attributes()) { columns.emplace_back(nullptr, attr.name(), attr.type(), attr.attributes()); } - return schema_nodes_.insert({ti, schema_node{table(node.name(), columns), std::make_unique(), node}}).first; + std::unique_ptr pk_generator; + switch (generator_type) { + case utils::generator_type::Identity: + pk_generator = std::make_unique(); + break; + case utils::generator_type::Sequence: + pk_generator = std::make_unique(node.name()); + break; + case utils::generator_type::Table: + pk_generator = std::make_unique("TABLE_SEQS", node.name()); + break; + default: + pk_generator = std::make_unique(); + } + return schema_nodes_.insert({ti, schema_node{table(node.name(), columns), std::move(pk_generator), node}}).first; } } // namespace matador::query