added sequence_pk_generator implementation

This commit is contained in:
2026-02-24 16:24:06 +01:00
parent a2c5bca709
commit d50a8f2b76
6 changed files with 85 additions and 9 deletions
+31 -3
View File
@@ -17,7 +17,33 @@
6. Add `manual_pk_generator` class
7. Extend `session::insert` logic to use pk generator
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:__
@@ -32,8 +58,10 @@ If all checks succeed, the requested is fetched from the database.
```cpp
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::IdListPayload>("id_payloads", make_polymorph_type("IdListPayload"));
schema.attach<jobs::Payload, jobs::IdPayload>("id_list_payloads", {"IdPayload"});
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;
auto result = payload.as<jobs::IdPayload>();
if (result.is_ok()) {