From d08bdb9554425f4a78fc77d63439fb743bdb5121 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sascha=20K=C3=BChl?= Date: Wed, 15 Oct 2025 16:14:22 +0200 Subject: [PATCH] added update_object_binder progress --- include/matador/orm/session.hpp | 39 ++++++++++++++++++++++++++++--- include/matador/sql/statement.hpp | 2 ++ source/orm/sql/statement.cpp | 4 +++- test/backends/SessionTest.cpp | 10 +++++++- 4 files changed, 50 insertions(+), 5 deletions(-) diff --git a/include/matador/orm/session.hpp b/include/matador/orm/session.hpp index d9f1bc4..240ab43 100644 --- a/include/matador/orm/session.hpp +++ b/include/matador/orm/session.hpp @@ -190,15 +190,48 @@ utils::result, utils::error> session::insert( Args&&... class update_object_binder final { public: - explicit update_object_binder(sql::statement &stmt) - : stmt_(stmt) {} + explicit update_object_binder(sql::statement &stmt, size_t position) + : stmt_(stmt) + , binding_position_(position){} template < class Type > sql::statement& bind(Type &obj) { + access::process(*this, obj); return stmt_; } + + template + void on_primary_key(const char * /*id*/, Type &x, const utils::primary_key_attribute& /*attr*/ = utils::default_pk_attributes) { + stmt_.bind(binding_position_, x); + } + + static void on_revision(const char * /*id*/, uint64_t &/*rev*/) {} + template < class Type > + static void on_attribute(const char * /*id*/, Type &/*x*/, const utils::field_attributes &/*attr*/ = utils::null_attributes) {} + template < class Pointer > + static void on_belongs_to(const char * /*id*/, Pointer &/*x*/, const utils::foreign_attributes &/*attr*/ = utils::default_foreign_attributes) {} + template < class Pointer > + static void on_has_one(const char * /*id*/, Pointer &/*x*/, const utils::foreign_attributes &/*attr*/ = utils::default_foreign_attributes) {} + + template + static void on_has_many(const char * /*id*/, + ContainerType &/*c*/, + const char * /*join_column*/, + const utils::foreign_attributes &/*attr*/ = utils::default_foreign_attributes) {} + template + static void on_has_many_to_many(const char * /*id*/, + ContainerType &/*c*/, + const char * /*join_column*/, + const char * /*inverse_join_column*/, + const utils::foreign_attributes &/*attr*/) {} + template + static void on_has_many_to_many(const char * /*id*/, + ContainerType &/*c*/, + const utils::foreign_attributes &/*attr*/) {} + private: sql::statement &stmt_; + size_t binding_position_{0}; sql::object_pk_binder pk_binder_; }; @@ -221,7 +254,7 @@ utils::result, utils::error> session::update( const obj } res->bind(*obj); - update_object_binder binder(res.value());; + update_object_binder binder(res.value(), res->bind_pos()); if (const auto update_result = binder.bind(*obj).execute(); !update_result.is_ok()) { return utils::failure(update_result.err()); } diff --git a/include/matador/sql/statement.hpp b/include/matador/sql/statement.hpp index 73ef331..8943fa9 100644 --- a/include/matador/sql/statement.hpp +++ b/include/matador/sql/statement.hpp @@ -164,6 +164,7 @@ statement &statement::bind(const Type &obj) { template utils::result, utils::error> statement::fetch() { + std::cout << statement_proxy_->sql() << std::endl; return statement_proxy_->fetch(*bindings_).and_then([](std::unique_ptr &&value) { const auto prototype = value->prototype(); return utils::ok(query_result(std::forward(value), [prototype] { @@ -174,6 +175,7 @@ utils::result, utils::error> statement::fetch() { template utils::result, utils::error> statement::fetch_one() { + std::cout << statement_proxy_->sql() << std::endl; auto result = statement_proxy_->fetch(*bindings_); if (!result.is_ok()) { return utils::failure(result.err()); diff --git a/source/orm/sql/statement.cpp b/source/orm/sql/statement.cpp index 0c0be42..4b734cc 100644 --- a/source/orm/sql/statement.cpp +++ b/source/orm/sql/statement.cpp @@ -51,11 +51,13 @@ statement &statement::bind(const size_t pos, std::string &val, const size_t size } utils::result statement::execute() const { -// logger_.info(statement_->query_.sql); + logger_->on_execute(statement_proxy_->sql()); + std::cout << statement_proxy_->sql() << std::endl; return statement_proxy_->execute(*bindings_); } utils::result, utils::error> statement::fetch() const { + std::cout << statement_proxy_->sql() << std::endl; auto result = statement_proxy_->fetch(*bindings_); if (!result.is_ok()) { return utils::failure(result.err()); diff --git a/test/backends/SessionTest.cpp b/test/backends/SessionTest.cpp index 3194a3c..d7eb53f 100644 --- a/test/backends/SessionTest.cpp +++ b/test/backends/SessionTest.cpp @@ -46,7 +46,7 @@ TEST_CASE_METHOD(SessionFixture, "Session update test", "[session][update]") { const auto plane = result.value(); result = ses.find(1); REQUIRE(result.is_ok()); - const auto& read_airplane = *result; + auto read_airplane = *result; REQUIRE(read_airplane->id == plane->id); REQUIRE(read_airplane->brand == plane->brand); REQUIRE(read_airplane->model == plane->model); @@ -55,6 +55,14 @@ TEST_CASE_METHOD(SessionFixture, "Session update test", "[session][update]") { read_airplane->model = "A380"; auto update_result = ses.update(read_airplane); + REQUIRE(update_result.is_ok()); + + result = ses.find(1); + REQUIRE(result.is_ok()); + read_airplane = *result; + REQUIRE(read_airplane->id == plane->id); + REQUIRE(read_airplane->brand == "Airbus"); + REQUIRE(read_airplane->model == "A380"); } TEST_CASE_METHOD(SessionFixture, "Session relation test", "[session][relation]") {