From 905ee019d7465d89fcd23bea62c95eac542b1c14 Mon Sep 17 00:00:00 2001 From: sascha Date: Thu, 19 Mar 2026 16:46:44 +0100 Subject: [PATCH] startet pk_accessor class --- .../matador/utils/primary_key_accessor.hpp | 105 ++++++++++++++++++ source/core/CMakeLists.txt | 1 + 2 files changed, 106 insertions(+) create mode 100644 include/matador/utils/primary_key_accessor.hpp diff --git a/include/matador/utils/primary_key_accessor.hpp b/include/matador/utils/primary_key_accessor.hpp new file mode 100644 index 0000000..67b9a7d --- /dev/null +++ b/include/matador/utils/primary_key_accessor.hpp @@ -0,0 +1,105 @@ +#ifndef MATADOR_PRIMARY_KEY_ACCESSOR_HPP +#define MATADOR_PRIMARY_KEY_ACCESSOR_HPP + +#include "matador/utils/field_attributes.hpp" +#include "matador/utils/primary_key_attribute.hpp" + +#include +#include + +namespace matador::utils { +class foreign_attributes; +namespace detail { +template < typename PrimaryKeyType > +class primary_key_setter { +public: + explicit primary_key_setter(const std::string &name, const PrimaryKeyType& value) + : name_(name) + , value_(value){} + + void on_primary_key(const char *id, PrimaryKeyType &pk, const utils::primary_key_attribute & = utils::default_pk_attributes) { + if (id != nullptr && name_ == id) { + pk = static_cast(value_); + } + } + template + static void on_primary_key(const char * /*id*/, ValueType & /*pk*/, const utils::primary_key_attribute & = utils::default_pk_attributes) {} + static void on_revision(const char * /*id*/, uint64_t & /*rev*/) {} + template + static void on_attribute(const char * /*id*/, T &, const utils::field_attributes & = utils::null_attributes) {} + template + static void on_belongs_to(const char * /*id*/, P &, const utils::foreign_attributes & ) {} + template + static void on_has_one(const char * /*id*/, P &, const utils::foreign_attributes & ) {} + template + static void on_has_many(const char * /*id*/, C &, const char * /*join_column*/, const utils::foreign_attributes & ) {} + template + static void on_has_many_to_many(const char * /*id*/, C &, const char * /*join_column*/, const char * /*inverse_join_column*/, const utils::foreign_attributes & ) {} + template + static void on_has_many_to_many(const char * /*id*/, C &, const utils::foreign_attributes & ) {} + +private: + const std::string &name_; + PrimaryKeyType value_{}; +}; + +struct pk_unset_checker { + const std::string &name; + bool unset{true}; + + template + void on_primary_key(const char *id, V &pk, const utils::primary_key_attribute & = utils::default_pk_attributes) { + if (id != nullptr && name == id) { + // Your convention: 0 means unset for integer PKs + unset = (static_cast(pk) == 0ULL); + } + } + static void on_revision(const char * /*id*/, uint64_t & /*rev*/) {} + template + static void on_attribute(const char * /*id*/, T &, const utils::field_attributes & = utils::null_attributes) {} + template + static void on_belongs_to(const char * /*id*/, P &, const utils::foreign_attributes & ) {} + template + static void on_has_one(const char * /*id*/, P &, const utils::foreign_attributes & ) {} + template + static void on_has_many(const char * /*id*/, C &, const char * /*join_column*/, const utils::foreign_attributes & ) {} + template + static void on_has_many_to_many(const char * /*id*/, C &, const char * /*join_column*/, const char * /*inverse_join_column*/, const utils::foreign_attributes & ) {} + template + static void on_has_many_to_many(const char * /*id*/, C &, const utils::foreign_attributes & ) {} +}; + +struct pk_value_extractor { + std::uint64_t value{0}; + + template + void on_primary_key(const char * /*id*/, V &pk, const utils::primary_key_attribute & = utils::default_pk_attributes) { + value = static_cast(pk); + } + static void on_revision(const char * /*id*/, uint64_t & /*rev*/) {} + template + static void on_attribute(const char * /*id*/, T &, const utils::field_attributes & = utils::null_attributes) {} + template + static void on_belongs_to(const char * /*id*/, P &, const utils::foreign_attributes & ) {} + template + static void on_has_one(const char * /*id*/, P &, const utils::foreign_attributes & ) {} + template + static void on_has_many(const char * /*id*/, C &, const char * /*join_column*/, const utils::foreign_attributes & ) {} + template + static void on_has_many_to_many(const char * /*id*/, C &, const char * /*join_column*/, const char * /*inverse_join_column*/, const utils::foreign_attributes & ) {} + template + static void on_has_many_to_many(const char * /*id*/, C &, const utils::foreign_attributes & ) {} +}; + +} + +template +class primary_key_accessor { +public: + + PrimaryKeyType get() const; + PrimaryKeyType +}; +} + +#endif //MATADOR_PRIMARY_KEY_ACCESSOR_HPP \ No newline at end of file diff --git a/source/core/CMakeLists.txt b/source/core/CMakeLists.txt index ff8d19f..763cbf9 100644 --- a/source/core/CMakeLists.txt +++ b/source/core/CMakeLists.txt @@ -124,6 +124,7 @@ add_library(matador-core STATIC object/collection_utils.cpp ../../include/matador/object/pk_field_locator.hpp ../../include/matador/object/object_cache.hpp + ../../include/matador/utils/primary_key_accessor.hpp ) target_link_libraries(matador-core ${CMAKE_DL_LIBS})