added sequence_pk_generator implementation
This commit is contained in:
parent
a2c5bca709
commit
d50a8f2b76
|
|
@ -0,0 +1,19 @@
|
||||||
|
#ifndef MATADOR_ABSTRACT_PK_GENERATOR_HPP
|
||||||
|
#define MATADOR_ABSTRACT_PK_GENERATOR_HPP
|
||||||
|
|
||||||
|
#include "matador/utils/error.hpp"
|
||||||
|
#include "matador/utils/result.hpp"
|
||||||
|
|
||||||
|
#include <cstdint>
|
||||||
|
|
||||||
|
namespace matador::sql {
|
||||||
|
class executor;
|
||||||
|
}
|
||||||
|
namespace matador::query {
|
||||||
|
class abstract_pk_generator {
|
||||||
|
public:
|
||||||
|
virtual ~abstract_pk_generator() = default;
|
||||||
|
virtual utils::result<int64_t, utils::error> next_id(const sql::executor& exec) = 0;
|
||||||
|
};
|
||||||
|
}
|
||||||
|
#endif //MATADOR_ABSTRACT_PK_GENERATOR_HPP
|
||||||
|
|
@ -61,8 +61,7 @@ public:
|
||||||
[[nodiscard]] utils::result<std::optional<sql::record>, utils::error> fetch_one(const sql::executor &exec) const;
|
[[nodiscard]] utils::result<std::optional<sql::record>, utils::error> fetch_one(const sql::executor &exec) const;
|
||||||
|
|
||||||
template<typename Type>
|
template<typename Type>
|
||||||
utils::result<std::optional<Type>, utils::error> fetch_value(const sql::executor &exec)
|
utils::result<std::optional<Type>, utils::error> fetch_value(const sql::executor &exec) {
|
||||||
{
|
|
||||||
const auto result = fetch_one(exec);
|
const auto result = fetch_one(exec);
|
||||||
if (!result.is_ok()) {
|
if (!result.is_ok()) {
|
||||||
return utils::failure(result.err());
|
return utils::failure(result.err());
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,20 @@
|
||||||
|
#ifndef MATADOR_SEQUENCE_PK_GENERATOR_H
|
||||||
|
#define MATADOR_SEQUENCE_PK_GENERATOR_H
|
||||||
|
|
||||||
|
#include "matador/query/abstract_pk_generator.hpp"
|
||||||
|
#include "matador/query/intermediates/fetchable_query.hpp"
|
||||||
|
|
||||||
|
#include <string>
|
||||||
|
|
||||||
|
namespace matador::query {
|
||||||
|
class sequence_pk_generator : public abstract_pk_generator {
|
||||||
|
public:
|
||||||
|
explicit sequence_pk_generator(const std::string& sequence_name);
|
||||||
|
|
||||||
|
utils::result<int64_t, utils::error> next_id(const sql::executor& exec) override;
|
||||||
|
|
||||||
|
private:
|
||||||
|
fetchable_query query_;
|
||||||
|
};
|
||||||
|
}
|
||||||
|
#endif //MATADOR_SEQUENCE_PK_GENERATOR_H
|
||||||
|
|
@ -1,6 +1,7 @@
|
||||||
add_library(matador-orm STATIC
|
add_library(matador-orm STATIC
|
||||||
../../include/matador/orm/error_code.hpp
|
../../include/matador/orm/error_code.hpp
|
||||||
../../include/matador/orm/session.hpp
|
../../include/matador/orm/session.hpp
|
||||||
|
../../include/matador/query/abstract_pk_generator.hpp
|
||||||
../../include/matador/query/attribute_string_writer.hpp
|
../../include/matador/query/attribute_string_writer.hpp
|
||||||
../../include/matador/query/basic_schema.hpp
|
../../include/matador/query/basic_schema.hpp
|
||||||
../../include/matador/query/builder.hpp
|
../../include/matador/query/builder.hpp
|
||||||
|
|
@ -19,6 +20,7 @@ add_library(matador-orm STATIC
|
||||||
../../include/matador/query/fk_value_extractor.hpp
|
../../include/matador/query/fk_value_extractor.hpp
|
||||||
../../include/matador/query/generator.hpp
|
../../include/matador/query/generator.hpp
|
||||||
../../include/matador/query/insert_query_builder.hpp
|
../../include/matador/query/insert_query_builder.hpp
|
||||||
|
../../include/matador/query/insert_query_builder.hpp
|
||||||
../../include/matador/query/intermediates/executable_query.hpp
|
../../include/matador/query/intermediates/executable_query.hpp
|
||||||
../../include/matador/query/intermediates/fetchable_query.hpp
|
../../include/matador/query/intermediates/fetchable_query.hpp
|
||||||
../../include/matador/query/intermediates/query_alter_intermediate.hpp
|
../../include/matador/query/intermediates/query_alter_intermediate.hpp
|
||||||
|
|
@ -64,6 +66,7 @@ add_library(matador-orm STATIC
|
||||||
../../include/matador/query/query_utils.hpp
|
../../include/matador/query/query_utils.hpp
|
||||||
../../include/matador/query/schema.hpp
|
../../include/matador/query/schema.hpp
|
||||||
../../include/matador/query/select_query_builder.hpp
|
../../include/matador/query/select_query_builder.hpp
|
||||||
|
../../include/matador/query/sequence_pk_generator.hpp
|
||||||
../../include/matador/query/table.hpp
|
../../include/matador/query/table.hpp
|
||||||
../../include/matador/query/table_column.hpp
|
../../include/matador/query/table_column.hpp
|
||||||
../../include/matador/query/table_constraint.hpp
|
../../include/matador/query/table_constraint.hpp
|
||||||
|
|
@ -159,6 +162,7 @@ add_library(matador-orm STATIC
|
||||||
query/query_utils.cpp
|
query/query_utils.cpp
|
||||||
query/schema.cpp
|
query/schema.cpp
|
||||||
query/select_query_builder.cpp
|
query/select_query_builder.cpp
|
||||||
|
query/sequence_pk_generator.cpp
|
||||||
query/table.cpp
|
query/table.cpp
|
||||||
query/table_column.cpp
|
query/table_column.cpp
|
||||||
query/table_constraint.cpp
|
query/table_constraint.cpp
|
||||||
|
|
@ -188,9 +192,7 @@ add_library(matador-orm STATIC
|
||||||
sql/resolver_service.cpp
|
sql/resolver_service.cpp
|
||||||
sql/statement.cpp
|
sql/statement.cpp
|
||||||
sql/statement_cache.cpp
|
sql/statement_cache.cpp
|
||||||
../../include/matador/query/insert_query_builder.hpp
|
)
|
||||||
query/abstract_pk_generator.hpp
|
|
||||||
)
|
|
||||||
|
|
||||||
target_include_directories(matador-orm
|
target_include_directories(matador-orm
|
||||||
PUBLIC
|
PUBLIC
|
||||||
|
|
|
||||||
|
|
@ -1,11 +0,0 @@
|
||||||
#ifndef MATADOR_ABSTRACT_PK_GENERATOR_HPP
|
|
||||||
#define MATADOR_ABSTRACT_PK_GENERATOR_HPP
|
|
||||||
|
|
||||||
namespace matador::query {
|
|
||||||
class abstract_pk_generator {
|
|
||||||
public:
|
|
||||||
virtual ~abstract_pk_generator() = default;
|
|
||||||
virtual unsigned int generate() = 0;
|
|
||||||
};
|
|
||||||
}
|
|
||||||
#endif //MATADOR_ABSTRACT_PK_GENERATOR_HPP
|
|
||||||
|
|
@ -0,0 +1,19 @@
|
||||||
|
#include "matador/query/sequence_pk_generator.hpp"
|
||||||
|
#include "matador/query/query.hpp"
|
||||||
|
|
||||||
|
#include "matador/sql/error_code.hpp"
|
||||||
|
|
||||||
|
namespace matador::query {
|
||||||
|
sequence_pk_generator::sequence_pk_generator(const std::string& sequence_name)
|
||||||
|
: query_(query::select().nextval(sequence_name)) {
|
||||||
|
}
|
||||||
|
|
||||||
|
utils::result<int64_t, utils::error> sequence_pk_generator::next_id(const sql::executor& exec) {
|
||||||
|
return query_.fetch_value<int64_t>(exec).and_then([](std::optional<int64_t> id) -> utils::result<int64_t, utils::error> {
|
||||||
|
if (!id) {
|
||||||
|
return utils::failure(utils::error(sql::error_code::RETRIEVE_DATA_FAILED, "Sequence returned no value"));
|
||||||
|
}
|
||||||
|
return utils::ok(*id);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
34
todo.md
34
todo.md
|
|
@ -17,7 +17,33 @@
|
||||||
6. Add `manual_pk_generator` class
|
6. Add `manual_pk_generator` class
|
||||||
7. Extend `session::insert` logic to use pk generator
|
7. Extend `session::insert` logic to use pk generator
|
||||||
8. Add generator to `schema_node` or `table` class when attaching type
|
8. Add generator to `schema_node` or `table` class when attaching type
|
||||||
9. add `make_object`function
|
|
||||||
|
```cpp
|
||||||
|
struct abstract_pk_generator {
|
||||||
|
virtual ~abstract_pk_generator() = default;
|
||||||
|
virtual int64_t next_id() = 0;
|
||||||
|
virtual std::vector<int64_t> next_ids(int count) = 0;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct sequence_pk_generator : abstract_pk_generator {
|
||||||
|
explicit sequence_pk_generator(const std::string& sequence_name)
|
||||||
|
: query_(query::query::select().nextval(sequence_name)) {}
|
||||||
|
int64_t next_id(sql::executor& exec) override {
|
||||||
|
return query_.fetch_value<int64_t>(exec);
|
||||||
|
}
|
||||||
|
std::vector<int64_t> next_ids(int count) override;
|
||||||
|
private:
|
||||||
|
query::fetchable_query query_;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct table_pk_generator : abstract_pk_generator {
|
||||||
|
explicit table_pk_generator(const std::string& table_name);
|
||||||
|
int64_t next_id() override;
|
||||||
|
std::vector<int64_t> next_ids(int count) override;
|
||||||
|
private:
|
||||||
|
std::string table_name_;
|
||||||
|
};
|
||||||
|
```
|
||||||
|
|
||||||
__Proposal for polymorphic classes:__
|
__Proposal for polymorphic classes:__
|
||||||
|
|
||||||
|
|
@ -32,8 +58,10 @@ If all checks succeed, the requested is fetched from the database.
|
||||||
|
|
||||||
```cpp
|
```cpp
|
||||||
schema.attach<jobs::Payload>("payloads", make_polymorph("type"));
|
schema.attach<jobs::Payload>("payloads", make_polymorph("type"));
|
||||||
schema.attach<jobs::Payload, jobs::IdPayload>("id_list_payloads", make_polymorph_type("IdPayload"));
|
schema.attach<jobs::Payload, jobs::IdPayload>("id_list_payloads", {"IdPayload"});
|
||||||
schema.attach<jobs::Payload, jobs::IdListPayload>("id_payloads", make_polymorph_type("IdListPayload"));
|
schema.attach<jobs::Payload, jobs::IdListPayload>("id_payloads", {"IdListPayload"});
|
||||||
|
//schema.attach<jobs::Payload, jobs::IdPayload>("id_list_payloads", make_polymorph_type("IdPayload"));
|
||||||
|
//schema.attach<jobs::Payload, jobs::IdListPayload>("id_payloads", make_polymorph_type("IdListPayload"));
|
||||||
object::object_ptr<jobs::Payload> payload;
|
object::object_ptr<jobs::Payload> payload;
|
||||||
auto result = payload.as<jobs::IdPayload>();
|
auto result = payload.as<jobs::IdPayload>();
|
||||||
if (result.is_ok()) {
|
if (result.is_ok()) {
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue