Browse Source

* [mariadb] implemented static convertion for datatypes

* [mariadb] implemented timestamp data type
* [mariadb] fixed bug in filters
* [mariadb] fixed wrong field names in query
master
bergmann 7 years ago
parent
commit
87e91d89a6
6 changed files with 293 additions and 12 deletions
  1. +236
    -3
      include/cpphibernate/driver/mariadb/helper/type_properties.h
  2. +10
    -0
      include/cpphibernate/driver/mariadb/schema/field.inl
  3. +16
    -0
      include/cpphibernate/driver/mariadb/schema/filter.inl
  4. +22
    -0
      include/cpphibernate/types.h
  5. +3
    -3
      src/cpphibernate/driver/mariadb/schema/field.cpp
  6. +6
    -6
      test/cpphibernate_update.cpp

+ 236
- 3
include/cpphibernate/driver/mariadb/helper/type_properties.h View File

@@ -17,9 +17,13 @@ beg_namespace_cpphibernate_driver_mariadb
template<typename T, typename = void>
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<int>(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<int>(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<int>(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<timestamp, void>
{
static constexpr decltype(auto) type()
{ return "DATETIME"; }

static inline timestamp convert_to(const value_t& value)
{ return timestamp(utl::from_string<uint64_t>(*value)); }

static inline value_t convert_from(const timestamp& value)
{ return utl::to_string(static_cast<uint64_t>(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<size_t N>
@@ -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<typename T>
@@ -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<typename T>
@@ -277,6 +486,18 @@ beg_namespace_cpphibernate_driver_mariadb

static inline value_t convert_from(const enum_type& value)
{ return utl::enum_conversion<enum_type>::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<typename T>
@@ -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; }
};

}

+ 10
- 0
include/cpphibernate/driver/mariadb/schema/field.inl View File

@@ -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<typename T_field>


+ 16
- 0
include/cpphibernate/driver/mariadb/schema/filter.inl View File

@@ -44,6 +44,7 @@ beg_namespace_cpphibernate_driver_mariadb
auto field_id = misc::get_type_id(hana::type_c<mp::decay_t<T_field>>);
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<size_t>(utl::get_unique_id<filter_t, mp::decay_t<T_args>...>());
int dummy[] = { 0, (__impl::filter_add_element(*this, schema, std::forward<T_args>(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()


+ 22
- 0
include/cpphibernate/types.h View File

@@ -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


+ 3
- 3
src/cpphibernate/driver/mariadb/schema/field.cpp View File

@@ -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
<< "`="


+ 6
- 6
test/cpphibernate_update.cpp View File

@@ -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 "


Loading…
Cancel
Save