#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