From 87e91d89a64fa32012ce0d5c6192cb6517c7b505 Mon Sep 17 00:00:00 2001 From: bergmann Date: Tue, 23 Oct 2018 22:16:57 +0200 Subject: [PATCH] * [mariadb] implemented static convertion for datatypes * [mariadb] implemented timestamp data type * [mariadb] fixed bug in filters * [mariadb] fixed wrong field names in query --- .../driver/mariadb/helper/type_properties.h | 239 +++++++++++++++++- .../driver/mariadb/schema/field.inl | 10 + .../driver/mariadb/schema/filter.inl | 16 ++ include/cpphibernate/types.h | 22 ++ .../driver/mariadb/schema/field.cpp | 6 +- test/cpphibernate_update.cpp | 12 +- 6 files changed, 293 insertions(+), 12 deletions(-) diff --git a/include/cpphibernate/driver/mariadb/helper/type_properties.h b/include/cpphibernate/driver/mariadb/helper/type_properties.h index 45ff6b6..5d44553 100644 --- a/include/cpphibernate/driver/mariadb/helper/type_properties.h +++ b/include/cpphibernate/driver/mariadb/helper/type_properties.h @@ -17,9 +17,13 @@ beg_namespace_cpphibernate_driver_mariadb template struct type_properties { - static constexpr void type() = delete; - static T convert_to(const value_t&) = delete; - static value_t convert_from(const T&) = delete; + static constexpr void type () = delete; + static T convert_to (const value_t&) = delete; + static value_t convert_from (const T&) = delete; + static constexpr const char* convert_to_open () = delete; + static constexpr const char* convert_to_close () = delete; + static constexpr const char* convert_from_open () = delete; + static constexpr const char* convert_from_close() = delete; }; template<> @@ -33,6 +37,18 @@ beg_namespace_cpphibernate_driver_mariadb static inline value_t convert_from(const bool& value) { return utl::to_string(static_cast(value)); } + + static constexpr const char* convert_to_open() + { return nullptr; } + + static constexpr const char* convert_to_close() + { return nullptr; } + + static constexpr const char* convert_from_open() + { return nullptr; } + + static constexpr const char* convert_from_close() + { return nullptr; } }; template<> @@ -46,6 +62,18 @@ beg_namespace_cpphibernate_driver_mariadb static inline value_t convert_from(const uint8_t& value) { return utl::to_string(static_cast(value)); } + + static constexpr const char* convert_to_open() + { return nullptr; } + + static constexpr const char* convert_to_close() + { return nullptr; } + + static constexpr const char* convert_from_open() + { return nullptr; } + + static constexpr const char* convert_from_close() + { return nullptr; } }; template<> @@ -59,6 +87,18 @@ beg_namespace_cpphibernate_driver_mariadb static inline value_t convert_from(const int8_t& value) { return utl::to_string(static_cast(value)); } + + static constexpr const char* convert_to_open() + { return nullptr; } + + static constexpr const char* convert_to_close() + { return nullptr; } + + static constexpr const char* convert_from_open() + { return nullptr; } + + static constexpr const char* convert_from_close() + { return nullptr; } }; template<> @@ -72,6 +112,18 @@ beg_namespace_cpphibernate_driver_mariadb static inline value_t convert_from(const uint16_t& value) { return utl::to_string(value); } + + static constexpr const char* convert_to_open() + { return nullptr; } + + static constexpr const char* convert_to_close() + { return nullptr; } + + static constexpr const char* convert_from_open() + { return nullptr; } + + static constexpr const char* convert_from_close() + { return nullptr; } }; template<> @@ -85,6 +137,18 @@ beg_namespace_cpphibernate_driver_mariadb static inline value_t convert_from(const int16_t& value) { return utl::to_string(value); } + + static constexpr const char* convert_to_open() + { return nullptr; } + + static constexpr const char* convert_to_close() + { return nullptr; } + + static constexpr const char* convert_from_open() + { return nullptr; } + + static constexpr const char* convert_from_close() + { return nullptr; } }; template<> @@ -98,6 +162,18 @@ beg_namespace_cpphibernate_driver_mariadb static inline value_t convert_from(const uint32_t& value) { return utl::to_string(value); } + + static constexpr const char* convert_to_open() + { return nullptr; } + + static constexpr const char* convert_to_close() + { return nullptr; } + + static constexpr const char* convert_from_open() + { return nullptr; } + + static constexpr const char* convert_from_close() + { return nullptr; } }; template<> @@ -111,6 +187,18 @@ beg_namespace_cpphibernate_driver_mariadb static inline value_t convert_from(const int32_t& value) { return utl::to_string(value); } + + static constexpr const char* convert_to_open() + { return nullptr; } + + static constexpr const char* convert_to_close() + { return nullptr; } + + static constexpr const char* convert_from_open() + { return nullptr; } + + static constexpr const char* convert_from_close() + { return nullptr; } }; template<> @@ -124,6 +212,18 @@ beg_namespace_cpphibernate_driver_mariadb static inline value_t convert_from(const uint64_t& value) { return utl::to_string(value); } + + static constexpr const char* convert_to_open() + { return nullptr; } + + static constexpr const char* convert_to_close() + { return nullptr; } + + static constexpr const char* convert_from_open() + { return nullptr; } + + static constexpr const char* convert_from_close() + { return nullptr; } }; template<> @@ -137,6 +237,18 @@ beg_namespace_cpphibernate_driver_mariadb static inline value_t convert_from(const int64_t& value) { return utl::to_string(value); } + + static constexpr const char* convert_to_open() + { return nullptr; } + + static constexpr const char* convert_to_close() + { return nullptr; } + + static constexpr const char* convert_from_open() + { return nullptr; } + + static constexpr const char* convert_from_close() + { return nullptr; } }; template<> @@ -150,6 +262,18 @@ beg_namespace_cpphibernate_driver_mariadb static inline value_t convert_from(const float& value) { return utl::to_string(value); } + + static constexpr const char* convert_to_open() + { return nullptr; } + + static constexpr const char* convert_to_close() + { return nullptr; } + + static constexpr const char* convert_from_open() + { return nullptr; } + + static constexpr const char* convert_from_close() + { return nullptr; } }; template<> @@ -163,6 +287,18 @@ beg_namespace_cpphibernate_driver_mariadb static inline value_t convert_from(const double& value) { return utl::to_string(value); } + + static constexpr const char* convert_to_open() + { return nullptr; } + + static constexpr const char* convert_to_close() + { return nullptr; } + + static constexpr const char* convert_from_open() + { return nullptr; } + + static constexpr const char* convert_from_close() + { return nullptr; } }; template<> @@ -176,6 +312,43 @@ beg_namespace_cpphibernate_driver_mariadb static inline value_t convert_from(const uuid& value) { return utl::to_string(value); } + + static constexpr const char* convert_to_open() + { return nullptr; } + + static constexpr const char* convert_to_close() + { return nullptr; } + + static constexpr const char* convert_from_open() + { return nullptr; } + + static constexpr const char* convert_from_close() + { return nullptr; } + }; + + template<> + struct type_properties + { + static constexpr decltype(auto) type() + { return "DATETIME"; } + + static inline timestamp convert_to(const value_t& value) + { return timestamp(utl::from_string(*value)); } + + static inline value_t convert_from(const timestamp& value) + { return utl::to_string(static_cast(value)); } + + static constexpr const char* convert_to_open() + { return "FROM_UNIXTIME("; } + + static constexpr const char* convert_to_close() + { return ")"; } + + static constexpr const char* convert_from_open() + { return "UNIX_TIMESTAMP("; } + + static constexpr const char* convert_from_close() + { return ")"; } }; template<> @@ -189,6 +362,18 @@ beg_namespace_cpphibernate_driver_mariadb static inline value_t convert_from(const std::string& value) { return value; } + + static constexpr const char* convert_to_open() + { return nullptr; } + + static constexpr const char* convert_to_close() + { return nullptr; } + + static constexpr const char* convert_from_open() + { return nullptr; } + + static constexpr const char* convert_from_close() + { return nullptr; } }; template @@ -208,6 +393,18 @@ beg_namespace_cpphibernate_driver_mariadb static inline value_t convert_from(const std::string& value) { return value; } + + static constexpr const char* convert_to_open() + { return nullptr; } + + static constexpr const char* convert_to_close() + { return nullptr; } + + static constexpr const char* convert_from_open() + { return nullptr; } + + static constexpr const char* convert_from_close() + { return nullptr; } }; template @@ -237,6 +434,18 @@ beg_namespace_cpphibernate_driver_mariadb ret = value_type_props::convert_from(*v); return ret; } + + static constexpr const char* convert_to_open() + { return nullptr; } + + static constexpr const char* convert_to_close() + { return nullptr; } + + static constexpr const char* convert_from_open() + { return nullptr; } + + static constexpr const char* convert_from_close() + { return nullptr; } }; template @@ -277,6 +486,18 @@ beg_namespace_cpphibernate_driver_mariadb static inline value_t convert_from(const enum_type& value) { return utl::enum_conversion::to_string(value, false); } + + static constexpr const char* convert_to_open() + { return nullptr; } + + static constexpr const char* convert_to_close() + { return nullptr; } + + static constexpr const char* convert_from_open() + { return nullptr; } + + static constexpr const char* convert_from_close() + { return nullptr; } }; template @@ -340,6 +561,18 @@ beg_namespace_cpphibernate_driver_mariadb } return os.str(); } + + static constexpr const char* convert_to_open() + { return nullptr; } + + static constexpr const char* convert_to_close() + { return nullptr; } + + static constexpr const char* convert_from_open() + { return nullptr; } + + static constexpr const char* convert_from_close() + { return nullptr; } }; } diff --git a/include/cpphibernate/driver/mariadb/schema/field.inl b/include/cpphibernate/driver/mariadb/schema/field.inl index 080fe2a..fd9bbbf 100644 --- a/include/cpphibernate/driver/mariadb/schema/field.inl +++ b/include/cpphibernate/driver/mariadb/schema/field.inl @@ -33,7 +33,17 @@ beg_namespace_cpphibernate_driver_mariadb ::update() { base_type::update(); + this->type = type_props::type(); + + if (type_props::convert_to_open()) + this->convert_to_open = this->convert_to_open + type_props::convert_to_open(); + if (type_props::convert_to_close()) + this->convert_to_close = type_props::convert_to_close() + this->convert_to_close; + if (type_props::convert_from_open()) + this->convert_from_open = this->convert_from_open + type_props::convert_from_open(); + if (type_props::convert_from_close()) + this->convert_from_close = type_props::convert_from_close() + this->convert_from_close; } template diff --git a/include/cpphibernate/driver/mariadb/schema/filter.inl b/include/cpphibernate/driver/mariadb/schema/filter.inl index 37667a9..6a006ef 100644 --- a/include/cpphibernate/driver/mariadb/schema/filter.inl +++ b/include/cpphibernate/driver/mariadb/schema/filter.inl @@ -44,6 +44,7 @@ beg_namespace_cpphibernate_driver_mariadb auto field_id = misc::get_type_id(hana::type_c>); auto& f = schema.field(field_id); filter.fields.emplace(&f); + filter.tables.emplace(f.table); } }; @@ -85,6 +86,21 @@ beg_namespace_cpphibernate_driver_mariadb cache_id = static_cast(utl::get_unique_id...>()); int dummy[] = { 0, (__impl::filter_add_element(*this, schema, std::forward(args)), void(), 0)... }; (void)dummy; + + // remove excluded tables if not all fields are excluded + auto it = tables.begin(); + while (it != tables.end()) + { + for (auto& field : (*it)->fields) + { + if (fields.count(field.get())) + { + it = tables.erase(it); + continue; + } + } + ++it; + } } void filter_t::clear() diff --git a/include/cpphibernate/types.h b/include/cpphibernate/types.h index 95de8f5..a47b14f 100644 --- a/include/cpphibernate/types.h +++ b/include/cpphibernate/types.h @@ -21,6 +21,28 @@ beg_namespace_cpphibernate using std::string::operator=; }; + /* timestamp */ + + struct timestamp + { + uint64_t value; + + inline timestamp() = default; + + inline timestamp(uint64_t v) + : value(v) + { } + + inline timestamp& operator=(const uint64_t& v) + { + value = v; + return *this; + } + + inline operator uint64_t() const + { return value; } + }; + /* uuid */ struct uuid diff --git a/src/cpphibernate/driver/mariadb/schema/field.cpp b/src/cpphibernate/driver/mariadb/schema/field.cpp index f9378e3..132c3b9 100644 --- a/src/cpphibernate/driver/mariadb/schema/field.cpp +++ b/src/cpphibernate/driver/mariadb/schema/field.cpp @@ -256,15 +256,15 @@ throw_not_implemented(::cppmariadb::statement&, get_statement_foreign_many_updat os << "UPDATE `" << ref_key_info.table_name << "` SET `" - << ref_key_info.table_name + << table_name << "_id_" << field_name << "`=NULL, `" - << ref_key_info.table_name + << table_name << "_index_" << field_name << "`=0 WHERE `" - << ref_key_info.table_name + << table_name << "_id_" << field_name << "`=" diff --git a/test/cpphibernate_update.cpp b/test/cpphibernate_update.cpp index 00e73b3..a4316e6 100644 --- a/test/cpphibernate_update.cpp +++ b/test/cpphibernate_update.cpp @@ -395,10 +395,10 @@ TEST(CppHibernateTests, update_derived3) expect_query(mock, "UPDATE " "`tbl_test3` " "SET " - "`tbl_test3_id_test3_list`=NULL, " - "`tbl_test3_index_test3_list`=0 " + "`tbl_derived3_id_test3_list`=NULL, " + "`tbl_derived3_index_test3_list`=0 " "WHERE " - "`tbl_test3_id_test3_list`=UuidToBin('X3d12866c-abb9-11e8-98d0-529269fb1459X')"); + "`tbl_derived3_id_test3_list`=UuidToBin('X3d12866c-abb9-11e8-98d0-529269fb1459X')"); expect_query(mock, "UPDATE " "`tbl_test3` " "SET " @@ -438,10 +438,10 @@ TEST(CppHibernateTests, update_derived3) expect_query(mock, "UPDATE " "`tbl_test3` " "SET " - "`tbl_test3_id_test3_vector`=NULL, " - "`tbl_test3_index_test3_vector`=0 " + "`tbl_derived3_id_test3_vector`=NULL, " + "`tbl_derived3_index_test3_vector`=0 " "WHERE " - "`tbl_test3_id_test3_vector`=UuidToBin('X3d12866c-abb9-11e8-98d0-529269fb1459X')"); + "`tbl_derived3_id_test3_vector`=UuidToBin('X3d12866c-abb9-11e8-98d0-529269fb1459X')"); expect_query(mock, "UPDATE " "`tbl_test3` " "SET "