From f144b26dbbfd9345462a0ed8fa4ef1357c0985a4 Mon Sep 17 00:00:00 2001 From: sascha Date: Fri, 17 Apr 2026 15:16:49 +0200 Subject: [PATCH] session and insert query builder progress --- include/matador/orm/session.hpp | 29 ++++++++++--------- .../matador/query/insert_query_builder.hpp | 13 ++++----- 2 files changed, 21 insertions(+), 21 deletions(-) diff --git a/include/matador/orm/session.hpp b/include/matador/orm/session.hpp index 46222bf..2c313a0 100644 --- a/include/matador/orm/session.hpp +++ b/include/matador/orm/session.hpp @@ -114,10 +114,24 @@ utils::result, utils::error> session::insert(object::ob // Execute all steps; for Identity steps read RETURNING and write pk back into the object for (query::insert_step &step : *steps) { + if (step.pk_generator == utils::generator_type::Sequence || step.pk_generator == utils::generator_type::Table) { + auto result = it->second.pk_generator().next_id(*this); + if (!result.is_ok()) { + return utils::failure(result.err()); + } + step.apply_primary_key(utils::identifier{*result}); + } + auto stmt = cache_.acquire(step.ctx); if (!stmt.is_ok()) { return utils::failure(stmt.err()); } + + auto result = step.acquire_and_bind(cache_); + if (!result.is_ok()) { + return utils::failure(result.err()); + } + if (step.pk_generator == utils::generator_type::Identity) { // insert and read RETURNING auto record = stmt->fetch_one(); @@ -128,20 +142,7 @@ utils::result, utils::error> session::insert(object::ob return utils::failure(make_error(error_code::FailedToFindObject, "Failed to insert object and retrieve identity.")); } step.apply_returning(*record.value()); - } else if (step.pk_generator == utils::generator_type::Sequence || step.pk_generator == utils::generator_type::Table) { - auto result = it->second.pk_generator().next_id(*this); - if (!result.is_ok()) { - return utils::failure(result.err()); - } - step.apply_primary_key(utils::identifier{*result}); - } - - auto result = step.acquire_and_bind(cache_); - if (!result.is_ok()) { - return utils::failure(result.err()); - } - - if (const auto exec_result = result->execute(); !exec_result.is_ok()) { + } else if (const auto exec_result = result->execute(); !exec_result.is_ok()) { return utils::failure(exec_result.err()); } } diff --git a/include/matador/query/insert_query_builder.hpp b/include/matador/query/insert_query_builder.hpp index 274b00e..2dda231 100644 --- a/include/matador/query/insert_query_builder.hpp +++ b/include/matador/query/insert_query_builder.hpp @@ -83,7 +83,7 @@ public: visited_.clear(); ptr_ = ptr; - build_for(ptr); + build_for(ptr, steps_); ptr_.reset(); // relation inserts must run after all entity inserts were collected @@ -119,9 +119,8 @@ public: has_many_linker linker(ptr_, join_column); for (auto &obj : objects) { if (obj.is_transient()) { - build_for(obj); + build_for(obj, relation_steps_); } - // obj.is_persistent() ? build_for(obj) : on_foreign_object(obj, attr); access::process(linker, *obj); } @@ -154,7 +153,7 @@ public: // Ensure target exists as dependency (deps first) if (!obj.is_persistent()) { using dep_t = std::remove_reference_t; - build_for(obj); + build_for(obj, steps_); } // Extract FK value from the foreign object @@ -192,7 +191,7 @@ private: }; template - void build_for(const object::object_ptr &ptr) { + void build_for(const object::object_ptr &ptr, std::vector &steps) { if (!ptr) { return; } @@ -239,7 +238,7 @@ private: step.pk_accessor.set(*ptr, id); }; } - steps_.push_back(std::move(step)); + steps.push_back(std::move(step)); } template @@ -254,7 +253,7 @@ private: } using dep_t = std::remove_reference_t; - build_for(obj); + build_for(obj, steps_); } private: const basic_schema &schema_;