diff --git a/include/matador/object/attribute.hpp b/include/matador/object/attribute.hpp index 0be13a3..cbc9e2d 100644 --- a/include/matador/object/attribute.hpp +++ b/include/matador/object/attribute.hpp @@ -23,7 +23,6 @@ class attribute_generator; class attribute { public: - explicit attribute(const char *name); // NOLINT(*-explicit-constructor) explicit attribute(std::string name); // NOLINT(*-explicit-constructor) attribute(const attribute&) = default; @@ -35,24 +34,8 @@ public: attribute(std::string name, utils::basic_type type, const utils::field_attributes&, - null_option_type null_opt, - int index = 0); - attribute(std::string name, - utils::basic_type type, - int index, - const std::shared_ptr &ref_column, - const utils::field_attributes& attr, null_option_type null_opt); - attribute(std::string name, - utils::basic_type type, - const std::shared_ptr &ref_column = {}); - attribute(std::string name, - utils::basic_type type, - std::string table_name, - const attribute_options& options, - const std::shared_ptr &ref_column = {}); - [[nodiscard]] const std::string& name() const; void name(const std::string& n); [[nodiscard]] std::string full_name() const; @@ -61,15 +44,14 @@ public: [[nodiscard]] utils::field_attributes& attributes(); [[nodiscard]] bool is_nullable() const; [[nodiscard]] utils::basic_type type() const; - [[nodiscard]] const std::string& table_name() const; - void table_name(const std::string& name); + [[nodiscard]] object* owner() const; + // [[nodiscard]] const std::string& table_name() const; + // void table_name(const std::string& name); void change_type(utils::basic_type type, const utils::field_attributes &attr = utils::null_attributes); template < typename Type > void change_type(const utils::field_attributes &attr = utils::null_attributes) { type_ = utils::data_type_traits::type(attr.size()); } - [[nodiscard]] std::shared_ptr reference_column() const; - [[nodiscard]] bool is_foreign_reference() const; [[nodiscard]] bool is_integer() const; [[nodiscard]] bool is_floating_point() const; @@ -92,11 +74,8 @@ private: std::string name_; object *owner_{nullptr}; - std::string table_name_; attribute_options options_; utils::basic_type type_{utils::basic_type::type_null}; - - std::shared_ptr reference_column_; }; @@ -108,62 +87,62 @@ private: * @param null_opt * @return A column object with a given name */ -attribute make_column(const std::string &name, utils::basic_type type, utils::field_attributes attr = utils::null_attributes, null_option_type null_opt = null_option_type::NOT_NULL); - -template < typename Type > -attribute make_column(const std::string &name, utils::field_attributes attr = utils::null_attributes, null_option_type null_opt = null_option_type::NOT_NULL) -{ - return make_column(name, utils::data_type_traits::type(0), attr, null_opt); -} -template <> -attribute make_column(const std::string &name, utils::field_attributes attr, null_option_type null_opt); - -template < typename Type > -attribute make_pk_column(const std::string &name, size_t size = 0) -{ - return make_column(name, { size, utils::constraints::PrimaryKey }); -} - -template <> -attribute make_pk_column(const std::string &name, size_t size); - -template < typename Type > -attribute make_fk_column(const std::string &name, size_t size, const std::shared_ptr &ref_column) { - return {name, utils::data_type_traits::type(size), ref_column, { size, utils::constraints::ForeignKey }}; -} - -template < typename Type > -[[maybe_unused]] attribute make_fk_column(const std::string &name, const std::shared_ptr &ref_column) -{ - return {name, utils::data_type_traits::type(0), 0, ref_column, { 0, utils::constraints::ForeignKey }, null_option_type::NOT_NULL}; -} - -template <> -[[maybe_unused]] attribute make_fk_column(const std::string &name, size_t size, const std::shared_ptr &ref_column); - -template < typename Type > -[[maybe_unused]] attribute make_fk_column(const std::string &name, size_t size, const std::string &ref_table_name, const std::string &ref_column_name) { - return { - name, utils::data_type_traits::type(size), 0, - std::make_shared(ref_column_name, ref_table_name, utils::data_type_traits::type(size), utils::constraints::ForeignKey), - { 0, utils::constraints::ForeignKey }, null_option_type::NOT_NULL - }; -} - -template < typename Type > -[[maybe_unused]] attribute make_fk_column(const std::string &name, const std::string &ref_table_name, const std::string &ref_column_name) { - return { - name, utils::data_type_traits::type(0), 0, - std::make_shared(ref_column_name, utils::data_type_traits::type(0), ref_table_name, attribute_options{utils::constraints::ForeignKey}), - { 0, utils::constraints::ForeignKey }, null_option_type::NOT_NULL - }; -} - -template <> -[[maybe_unused]] attribute make_fk_column(const std::string &name, const std::string &ref_table_name, const std::string &ref_column_name); - -template <> -[[maybe_unused]] attribute make_fk_column(const std::string &name, size_t size, const std::string &ref_table_name, const std::string &ref_column_name); +// attribute make_column(const std::string &name, utils::basic_type type, utils::field_attributes attr = utils::null_attributes, null_option_type null_opt = null_option_type::NOT_NULL); +// +// template < typename Type > +// attribute make_column(const std::string &name, utils::field_attributes attr = utils::null_attributes, null_option_type null_opt = null_option_type::NOT_NULL) +// { +// return make_column(name, utils::data_type_traits::type(0), attr, null_opt); +// } +// template <> +// attribute make_column(const std::string &name, utils::field_attributes attr, null_option_type null_opt); +// +// template < typename Type > +// attribute make_pk_column(const std::string &name, size_t size = 0) +// { +// return make_column(name, { size, utils::constraints::PrimaryKey }); +// } +// +// template <> +// attribute make_pk_column(const std::string &name, size_t size); +// +// template < typename Type > +// attribute make_fk_column(const std::string &name, size_t size, const std::shared_ptr &ref_column) { +// return {name, utils::data_type_traits::type(size), ref_column, { size, utils::constraints::ForeignKey }}; +// } +// +// template < typename Type > +// [[maybe_unused]] attribute make_fk_column(const std::string &name, const std::shared_ptr &ref_column) +// { +// return {name, utils::data_type_traits::type(0), 0, ref_column, { 0, utils::constraints::ForeignKey }, null_option_type::NOT_NULL}; +// } +// +// template <> +// [[maybe_unused]] attribute make_fk_column(const std::string &name, size_t size, const std::shared_ptr &ref_column); +// +// template < typename Type > +// [[maybe_unused]] attribute make_fk_column(const std::string &name, size_t size, const std::string &ref_table_name, const std::string &ref_column_name) { +// return { +// name, utils::data_type_traits::type(size), 0, +// std::make_shared(ref_column_name, ref_table_name, utils::data_type_traits::type(size), utils::constraints::ForeignKey), +// { 0, utils::constraints::ForeignKey }, null_option_type::NOT_NULL +// }; +// } +// +// template < typename Type > +// [[maybe_unused]] attribute make_fk_column(const std::string &name, const std::string &ref_table_name, const std::string &ref_column_name) { +// return { +// name, utils::data_type_traits::type(0), 0, +// std::make_shared(ref_column_name, utils::data_type_traits::type(0), ref_table_name, attribute_options{utils::constraints::ForeignKey}), +// { 0, utils::constraints::ForeignKey }, null_option_type::NOT_NULL +// }; +// } +// +// template <> +// [[maybe_unused]] attribute make_fk_column(const std::string &name, const std::string &ref_table_name, const std::string &ref_column_name); +// +// template <> +// [[maybe_unused]] attribute make_fk_column(const std::string &name, size_t size, const std::string &ref_table_name, const std::string &ref_column_name); } diff --git a/include/matador/object/attribute_generator.hpp b/include/matador/object/attribute_generator.hpp index 8459fc9..bf8061a 100644 --- a/include/matador/object/attribute_generator.hpp +++ b/include/matador/object/attribute_generator.hpp @@ -96,12 +96,12 @@ public: template void on_foreign_key(const char *id, Pointer &x) { - std::shared_ptr ref_column; + attribute* ref_column; std::type_index ti = typeid(typename Pointer::value_type); - if (const auto result = determine_foreign_ref(std::type_index(ti))) { + if (auto result = determine_foreign_ref(std::type_index(ti))) { ref_column = *result; } else { - ref_column = std::make_shared(); + ref_column = nullptr; insert_missing_reference_column(ti, ref_column); } if (x.empty()) { @@ -119,8 +119,8 @@ public: static void on_has_many_to_many(const char * /*id*/, ContainerType & /*cont*/, const utils::foreign_attributes &/*attr*/) {} private: - [[nodiscard]] utils::result, utils::error> determine_foreign_ref(const std::type_index &ti) const; - void insert_missing_reference_column(const std::type_index &ti, const std::shared_ptr& ref_column) const; + [[nodiscard]] utils::result determine_foreign_ref(const std::type_index &ti) const; + void insert_missing_reference_column(const std::type_index &ti, attribute* ref_column) const; template attribute &emplace_attribute(const char *id, const utils::field_attributes& attr, null_option_type null_option) { diff --git a/include/matador/object/basic_object_info.hpp b/include/matador/object/basic_object_info.hpp index 3a80cc9..bd9e948 100644 --- a/include/matador/object/basic_object_info.hpp +++ b/include/matador/object/basic_object_info.hpp @@ -25,10 +25,11 @@ public: [[nodiscard]] std::type_index type_index() const; [[nodiscard]] std::string name() const; [[nodiscard]] const std::vector& attributes() const; - [[nodiscard]] std::shared_ptr reference_column() const; + // [[nodiscard]] std::shared_ptr reference_column() const; [[nodiscard]] bool has_primary_key() const; [[nodiscard]] const utils::identifier& primary_key() const; + [[nodiscard]] attribute* primary_key_attribute() const; endpoint_iterator register_relation_endpoint(const std::type_index &type, const std::shared_ptr &endpoint); void unregister_relation_endpoint(const std::type_index &type); @@ -49,15 +50,13 @@ public: [[nodiscard]] bool endpoints_empty() const; protected: - basic_object_info(std::shared_ptr node, const std::vector &attributes, utils::identifier &&pk, const std::shared_ptr &pk_as_fk_column); - basic_object_info(std::shared_ptr node, const std::vector &attributes); + // basic_object_info(std::shared_ptr node, const std::vector &attributes, utils::identifier &&pk, const std::shared_ptr &pk_as_fk_column); + // basic_object_info(std::shared_ptr node, const std::vector &attributes); + basic_object_info(std::shared_ptr node, std::unique_ptr &&obj); protected: - std::unique_ptr node_ptr_; + std::unique_ptr object_; std::shared_ptr node_; /**< prototype node of the represented object type */ - std::vector attributes_; - std::optional identifier_; - std::shared_ptr pk_as_fk_column_; t_endpoint_map relation_endpoints_; }; diff --git a/include/matador/object/error_code.hpp b/include/matador/object/error_code.hpp index fa52219..610586b 100644 --- a/include/matador/object/error_code.hpp +++ b/include/matador/object/error_code.hpp @@ -10,6 +10,7 @@ enum class error_code : uint8_t { OK = 0, NodeNotFound = 1, NodeAlreadyExists = 2, + NoPrimaryKey = 3, Failure, }; diff --git a/include/matador/object/object.hpp b/include/matador/object/object.hpp index 0168e96..5d8d3e2 100644 --- a/include/matador/object/object.hpp +++ b/include/matador/object/object.hpp @@ -29,13 +29,15 @@ public: void add_attribute(attribute attr); void add_constraint(class constraint c); - [[nodiscard]] const attribute* primary_key_attribute() const; + [[nodiscard]] attribute* primary_key_attribute() const; [[nodiscard]] const utils::identifier& primary_key() const; [[nodiscard]] bool has_primary_key() const; [[nodiscard]] const std::string& name() const; [[nodiscard]] const std::string& alias() const; + void update_name(const std::string& name); + [[nodiscard]] bool has_attributes() const; [[nodiscard]] size_t attribute_count() const; [[nodiscard]] const std::vector& attributes() const; diff --git a/include/matador/object/object_info.hpp b/include/matador/object/object_info.hpp index 3165827..258b333 100644 --- a/include/matador/object/object_info.hpp +++ b/include/matador/object/object_info.hpp @@ -12,19 +12,12 @@ public: using create_func = std::function()>; object_info(const std::shared_ptr& node, - const std::vector &attributes, - utils::identifier &&pk, - const std::shared_ptr &ref_column, + std::unique_ptr &&obj, create_func&& creator) - : basic_object_info(node, attributes, std::move(pk), ref_column) - , creator_(std::move(creator)){ - } - object_info(const std::shared_ptr& node, - const std::vector &attributes, - create_func&& creator) - : basic_object_info(node, attributes) + : basic_object_info(node, std::move(obj)) , creator_(std::move(creator)){ } + explicit object_info(const std::shared_ptr& node) : basic_object_info(node, {}) { } diff --git a/include/matador/object/repository.hpp b/include/matador/object/repository.hpp index ff5487d..471aace 100644 --- a/include/matador/object/repository.hpp +++ b/include/matador/object/repository.hpp @@ -151,8 +151,7 @@ public: return utils::ok(basic_object_info_ref{result.value()->info()}); } - [[nodiscard]] utils::result, utils::error> reference_column( - const std::type_index &type_index) const; + [[nodiscard]] utils::result primary_key_attribute(const std::type_index &type_index) const; void dump(std::ostream &os) const; static void dump(std::ostream &os, const node_ptr& node); @@ -188,7 +187,7 @@ private: t_type_index_node_map nodes_by_type_; logger::logger log_; - std::unordered_map > missing_references_; + std::unordered_map missing_references_; }; } diff --git a/include/matador/object/repository_node.hpp b/include/matador/object/repository_node.hpp index aedd289..78f8b91 100644 --- a/include/matador/object/repository_node.hpp +++ b/include/matador/object/repository_node.hpp @@ -28,10 +28,7 @@ public: const auto attributes = attribute_generator::generate(repo, *obj); auto info = std::make_unique>( node, - attributes, - std::move(pk_info.pk), - ref_column, - // obj, + std::move(obj), []{ return std::make_unique(); } ); node->info_ = std::move(info); @@ -93,10 +90,10 @@ private: void unlink(); static utils::result make_and_attach_node(repository& repo, const std::string& name, const std::type_index& ti); - static std::shared_ptr determine_reference_column(const std::type_index& ti, - const std::string& table_name, - const primary_key_info& pk_info, - repository& repo); + static attribute* determine_reference_column(const std::type_index& ti, + const std::string& table_name, + const primary_key_info& pk_info, + repository& repo); private: friend class repository; diff --git a/source/core/object/attribute.cpp b/source/core/object/attribute.cpp index 4d5d9f6..85867d6 100644 --- a/source/core/object/attribute.cpp +++ b/source/core/object/attribute.cpp @@ -1,49 +1,22 @@ #include "matador/object/attribute.hpp" +#include "matador/object/object.hpp" #include #include namespace matador::object { -attribute::attribute(const char *name) -: attribute(name, utils::basic_type::type_null, "", {utils::null_attributes}) { -} - attribute::attribute(std::string name) -: attribute(std::move(name), utils::basic_type::type_null, "", {utils::null_attributes}) { +: attribute(std::move(name), utils::basic_type::type_null, {}, null_option_type::NOT_NULL) { } attribute::attribute(std::string name, - const utils::basic_type type, - const utils::field_attributes &attr, - const null_option_type null_opt, - const int index) -: attribute(std::move(name), type, "", {attr, null_opt, index}) { -} - -attribute::attribute(std::string name, - const utils::basic_type type, - const int index, - const std::shared_ptr &ref_column, - const utils::field_attributes &attr, - const null_option_type null_opt) -: attribute(std::move(name), type, "", {attr, null_opt, index}, ref_column) { -} - -attribute::attribute( std::string name, const utils::basic_type type, const std::shared_ptr& ref_column ) -: attribute(std::move(name), type, {}, {}, ref_column) { -} - -attribute::attribute(std::string name, - const utils::basic_type type, - std::string table_name, - const attribute_options& options, - const std::shared_ptr& ref_column) + const utils::basic_type type, + const utils::field_attributes &attr, + const null_option_type null_opt) : name_(std::move(name)) -, table_name_(std::move(table_name)) -, options_( options ) -, type_( type ) -, reference_column_( ref_column ) { -} +, options_{attr, null_opt} +, type_(type) +{} const std::string &attribute::name() const { return name_; @@ -54,7 +27,7 @@ void attribute::name( const std::string& n ) { } std::string attribute::full_name() const { - return !table_name_.empty() ? table_name_ + "." + name_ : name_; + return owner_ ? owner_->name() + "." + name_ : name_; } int attribute::index() const { @@ -77,27 +50,23 @@ utils::basic_type attribute::type() const { return type_; } -const std::string& attribute::table_name() const { - return table_name_; +object* attribute::owner() const { + return owner_; } -void attribute::table_name( const std::string& name ) { - table_name_ = name; -} +// const std::string& attribute::table_name() const { +// return owner_ ? owner_->name() : ""; +// } +// +// void attribute::table_name( const std::string& name ) { +// table_name_ = name; +// } void attribute::change_type(const utils::basic_type type, const utils::field_attributes& attr) { options_.attributes = attr; type_ = type; } -std::shared_ptr attribute::reference_column() const { - return reference_column_; -} - -bool attribute::is_foreign_reference() const { - return reference_column_ != nullptr; -} - bool attribute::is_integer() const { return type_ >= utils::basic_type::type_int8 && type_ <= utils::basic_type::type_uint64; } @@ -134,45 +103,45 @@ bool attribute::is_null() const { return type_ == utils::basic_type::type_null; } -attribute make_column(const std::string &name, utils::basic_type type, utils::field_attributes attr, - null_option_type null_opt) { - return {name, type, attr, null_opt}; -} - -template<> -attribute make_column(const std::string &name, utils::field_attributes attr, - null_option_type null_opt) { - return make_column(name, utils::data_type_traits::type(attr.size()), attr, null_opt); -} - -template<> -attribute make_pk_column(const std::string &name, size_t size) { - return make_column(name, {size, utils::constraints::PrimaryKey}); -} - -template<> -attribute make_fk_column(const std::string &name, size_t size, const std::shared_ptr &ref_column) { - return { - name, utils::data_type_traits::type(size), 0, ref_column, - {size, utils::constraints::ForeignKey}, null_option_type::NOT_NULL - }; -} - -template<> -attribute make_fk_column( const std::string& name, const std::string& ref_table_name, const std::string& ref_column_name ) { - return { - name, utils::basic_type::type_varchar, 0, - std::make_shared(ref_column_name, utils::basic_type::type_varchar, ref_table_name, attribute_options{utils::constraints::ForeignKey}), - { 0, utils::constraints::ForeignKey }, null_option_type::NOT_NULL - }; -} - -template<> -attribute make_fk_column(const std::string &name, size_t size, const std::string &ref_table_name, const std::string &ref_column_name) { - const auto ref_column = std::make_shared(ref_column_name, utils::basic_type::type_varchar, ref_table_name, attribute_options{utils::constraints::ForeignKey}); - return { - name, utils::data_type_traits::type(size), 0, ref_column, - {size, utils::constraints::ForeignKey}, null_option_type::NOT_NULL - }; -} +// attribute make_column(const std::string &name, utils::basic_type type, utils::field_attributes attr, +// null_option_type null_opt) { +// return {name, type, attr, null_opt}; +// } +// +// template<> +// attribute make_column(const std::string &name, utils::field_attributes attr, +// null_option_type null_opt) { +// return make_column(name, utils::data_type_traits::type(attr.size()), attr, null_opt); +// } +// +// template<> +// attribute make_pk_column(const std::string &name, size_t size) { +// return make_column(name, {size, utils::constraints::PrimaryKey}); +// } +// +// template<> +// attribute make_fk_column(const std::string &name, size_t size, const std::shared_ptr &ref_column) { +// return { +// name, utils::data_type_traits::type(size), 0, ref_column, +// {size, utils::constraints::ForeignKey}, null_option_type::NOT_NULL +// }; +// } +// +// template<> +// attribute make_fk_column( const std::string& name, const std::string& ref_table_name, const std::string& ref_column_name ) { +// return { +// name, utils::basic_type::type_varchar, 0, +// std::make_shared(ref_column_name, utils::basic_type::type_varchar, ref_table_name, attribute_options{utils::constraints::ForeignKey}), +// { 0, utils::constraints::ForeignKey }, null_option_type::NOT_NULL +// }; +// } +// +// template<> +// attribute make_fk_column(const std::string &name, size_t size, const std::string &ref_table_name, const std::string &ref_column_name) { +// const auto ref_column = std::make_shared(ref_column_name, utils::basic_type::type_varchar, ref_table_name, attribute_options{utils::constraints::ForeignKey}); +// return { +// name, utils::data_type_traits::type(size), 0, ref_column, +// {size, utils::constraints::ForeignKey}, null_option_type::NOT_NULL +// }; +// } } diff --git a/source/core/object/attribute_generator.cpp b/source/core/object/attribute_generator.cpp index af22e18..3543abb 100644 --- a/source/core/object/attribute_generator.cpp +++ b/source/core/object/attribute_generator.cpp @@ -14,11 +14,11 @@ void attribute_generator::on_revision(const char *id, uint64_t &rev) { on_attribute(id, rev); } -utils::result, utils::error> attribute_generator::determine_foreign_ref(const std::type_index &ti) const { - return repo_.reference_column(ti); +utils::result attribute_generator::determine_foreign_ref(const std::type_index &ti) const { + return repo_.primary_key_attribute(ti); } -void attribute_generator::insert_missing_reference_column(const std::type_index& ti, const std::shared_ptr& ref_column) const { +void attribute_generator::insert_missing_reference_column(const std::type_index& ti, attribute* ref_column) const { const_cast(repo_).missing_references_.insert({ti, ref_column}); } diff --git a/source/core/object/basic_object_info.cpp b/source/core/object/basic_object_info.cpp index 0d49720..b16eff7 100644 --- a/source/core/object/basic_object_info.cpp +++ b/source/core/object/basic_object_info.cpp @@ -5,20 +5,24 @@ #include namespace matador::object { -basic_object_info::basic_object_info(std::shared_ptr node, - const std::vector &attributes, - utils::identifier &&pk, - const std::shared_ptr &pk_as_fk_column) -: node_(std::move(node)) -, attributes_(attributes) -, identifier_(std::move(pk)) -, pk_as_fk_column_(pk_as_fk_column) { -} +// basic_object_info::basic_object_info(std::shared_ptr node, +// const std::vector &attributes, +// utils::identifier &&pk, +// const std::shared_ptr &pk_as_fk_column) +// : node_(std::move(node)) +// , attributes_(attributes) +// , identifier_(std::move(pk)) +// , pk_as_fk_column_(pk_as_fk_column) { +// } +// +// basic_object_info::basic_object_info(std::shared_ptr node, +// const std::vector &attributes) +// : node_(std::move(node)) +// , attributes_(attributes) {} -basic_object_info::basic_object_info(std::shared_ptr node, - const std::vector &attributes) -: node_(std::move(node)) -, attributes_(attributes) {} +basic_object_info::basic_object_info(std::shared_ptr node, std::unique_ptr&& obj) + : object_(std::move(obj)) + , node_(std::move(node)) {} std::type_index basic_object_info::type_index() const { return node_->type_index(); @@ -29,19 +33,23 @@ std::string basic_object_info::name() const { } const std::vector& basic_object_info::attributes() const { - return attributes_; + return object_->attributes(); } -std::shared_ptr basic_object_info::reference_column() const { - return pk_as_fk_column_; -} +// std::shared_ptr basic_object_info::reference_column() const { + // return pk_as_fk_column_; +// } bool basic_object_info::has_primary_key() const { - return identifier_.has_value(); + return object_->has_primary_key(); } const utils::identifier& basic_object_info::primary_key() const { - return identifier_.value(); + return object_->primary_key(); +} + +attribute* basic_object_info::primary_key_attribute() const { + return object_->primary_key_attribute(); } basic_object_info::endpoint_iterator basic_object_info::register_relation_endpoint(const std::type_index &type, const std::shared_ptr &endpoint) { diff --git a/source/core/object/constraints_generator.cpp b/source/core/object/constraints_generator.cpp index 3d13c5a..970697e 100644 --- a/source/core/object/constraints_generator.cpp +++ b/source/core/object/constraints_generator.cpp @@ -19,7 +19,7 @@ void constraints_generator::create_pk_constraint(const std::string& name) const } void constraints_generator::create_fk_constraint(const std::string& name, const basic_object_info& info) const { - const auto pk_attribute = info.reference_column(); + const auto *pk_attribute = info.primary_key_attribute(); class constraint pk_constraint("FK_" + obj_.name() + "_" + name); pk_constraint.options_ |= utils::constraints::ForeignKey; if (const auto pk_attr = find_attribute_by_name(name); pk_attr != std::end(obj_.attributes_)) { @@ -27,7 +27,7 @@ void constraints_generator::create_fk_constraint(const std::string& name, const } pk_constraint.owner_ = &obj_; pk_constraint.ref_column_name_ = pk_attribute->name(); - pk_constraint.ref_table_name_ = pk_attribute->table_name(); + pk_constraint.ref_table_name_ = pk_attribute->owner() ? pk_attribute->owner()->name() : ""; constraints_.emplace_back(std::move(pk_constraint)); } diff --git a/source/core/object/error_code.cpp b/source/core/object/error_code.cpp index fc393f9..2f920a4 100644 --- a/source/core/object/error_code.cpp +++ b/source/core/object/error_code.cpp @@ -14,6 +14,8 @@ std::string object_category_impl::message(const int ev) const { return "Node not found"; case error_code::NodeAlreadyExists: return "Node already exists"; + case error_code::NoPrimaryKey: + return "No primary key"; case error_code::Failure: return "Failure"; default: diff --git a/source/core/object/object.cpp b/source/core/object/object.cpp index 6d53fe8..8fe0068 100644 --- a/source/core/object/object.cpp +++ b/source/core/object/object.cpp @@ -21,7 +21,7 @@ void object::add_constraint( class constraint c ) { ref.owner_ = this; } -const attribute* object::primary_key_attribute() const { +attribute* object::primary_key_attribute() const { return pk_attribute_; } @@ -41,6 +41,10 @@ const std::string& object::alias() const { return alias_; } +void object::update_name(const std::string& name) { + name_ = name; +} + bool object::has_attributes() const { return attributes_.empty(); } diff --git a/source/core/object/repository.cpp b/source/core/object/repository.cpp index 10e1b4d..87b29ee 100644 --- a/source/core/object/repository.cpp +++ b/source/core/object/repository.cpp @@ -62,13 +62,16 @@ utils::result repository::basic_info( const return utils::ok(basic_object_info_ref{result.value()->info()}); } -utils::result, utils::error> repository::reference_column(const std::type_index &type_index) const { +utils::result repository::primary_key_attribute(const std::type_index &type_index) const { const auto result = find_node(type_index); - if (result) { - return utils::ok((*result)->info().reference_column()); + if (!result) { + return utils::failure(result.err()); } - return utils::failure(result.err()); + if (!result.value()->info().has_primary_key()) { + return utils::failure(make_error(error_code::NodeAlreadyExists, "Object '" + result.value()->name() + "' does not have a primary key.")); + } + return utils::ok((*result)->info().primary_key_attribute()); } void repository::dump(std::ostream &os) const { diff --git a/source/core/object/repository_node.cpp b/source/core/object/repository_node.cpp index 2a1ef43..3c2d332 100644 --- a/source/core/object/repository_node.cpp +++ b/source/core/object/repository_node.cpp @@ -45,9 +45,9 @@ const basic_object_info &repository_node::info() const { void repository_node::update_name(const std::string& name) { name_ = name; - if (info_->reference_column()) { - info_->reference_column()->table_name(name); - } + // if (info_->reference_column()) { + // info_->reference_column()->table_name(name); + // } } const repository& repository_node::schema() const { @@ -104,19 +104,19 @@ utils::result repository_node::make_and return repo.attach_node(node, ""); } -std::shared_ptr repository_node::determine_reference_column(const std::type_index& ti, - const std::string& table_name, - const primary_key_info& pk_info, - repository& repo) { +attribute* repository_node::determine_reference_column(const std::type_index& ti, + const std::string& table_name, + const primary_key_info& pk_info, + repository& repo) { const auto it = repo.missing_references_.find(ti); if (it == repo.missing_references_.end()) { - return std::make_shared(pk_info.pk_column_name, pk_info.type, table_name, attribute_options{utils::constraints::ForeignKey}); + return new attribute(pk_info.pk_column_name, pk_info.type, {utils::constraints::ForeignKey}, null_option_type::NOT_NULL); } auto ref_column = it->second; repo.missing_references_.erase(it); ref_column->name(pk_info.pk_column_name); - ref_column->table_name(table_name); + ref_column->owner()->update_name(table_name); ref_column->change_type(pk_info.type); ref_column->attributes() = utils::constraints::ForeignKey;