diff options
author | Boris Kolpackov <boris@codesynthesis.com> | 2012-09-11 13:55:46 +0200 |
---|---|---|
committer | Boris Kolpackov <boris@codesynthesis.com> | 2012-09-11 13:55:46 +0200 |
commit | f1d6aa1c5d6a2a0b694aa5cdabdf68027677eb7a (patch) | |
tree | 17af8256076690b9bec7d74cb5b8a98ea67e42bf | |
parent | 8aa22a13f94a70595666bd5e2ea36ab47f714ff1 (diff) |
Add support for mapping std::array to BLOB and char[16] to UUID types
-rw-r--r-- | odb/mysql/traits.hxx | 158 |
1 files changed, 135 insertions, 23 deletions
diff --git a/odb/mysql/traits.hxx b/odb/mysql/traits.hxx index dffde6d..68ef2dd 100644 --- a/odb/mysql/traits.hxx +++ b/odb/mysql/traits.hxx @@ -7,11 +7,17 @@ #include <odb/pre.hxx> +#include <odb/details/config.hxx> // ODB_CXX11 + #include <string> #include <vector> #include <cstddef> // std::size_t #include <cstring> // std::memcpy, std::memset, std::strlen +#ifdef ODB_CXX11 +# include <array> +#endif + #include <odb/traits.hxx> #include <odb/wrapper-traits.hxx> @@ -448,45 +454,45 @@ namespace odb { }; - template <std::size_t n> - struct default_value_traits<char[n], id_string>: c_string_value_traits + template <std::size_t N> + struct default_value_traits<char[N], id_string>: c_string_value_traits { }; - template <std::size_t n> - struct default_value_traits<const char[n], id_string>: + template <std::size_t N> + struct default_value_traits<const char[N], id_string>: c_string_value_traits { }; - template <std::size_t n> - struct default_value_traits<char[n], id_decimal>: c_string_value_traits + template <std::size_t N> + struct default_value_traits<char[N], id_decimal>: c_string_value_traits { }; - template <std::size_t n> - struct default_value_traits<const char[n], id_decimal>: + template <std::size_t N> + struct default_value_traits<const char[N], id_decimal>: c_string_value_traits { }; - template <std::size_t n> - struct default_value_traits<char[n], id_enum>: c_string_value_traits + template <std::size_t N> + struct default_value_traits<char[N], id_enum>: c_string_value_traits { }; - template <std::size_t n> - struct default_value_traits<const char[n], id_enum>: c_string_value_traits + template <std::size_t N> + struct default_value_traits<const char[N], id_enum>: c_string_value_traits { }; - template <std::size_t n> - struct default_value_traits<char[n], id_set>: c_string_value_traits + template <std::size_t N> + struct default_value_traits<char[N], id_set>: c_string_value_traits { }; - template <std::size_t n> - struct default_value_traits<const char[n], id_set>: c_string_value_traits + template <std::size_t N> + struct default_value_traits<const char[N], id_set>: c_string_value_traits { }; @@ -553,7 +559,7 @@ namespace odb const value_type&); }; - // char[n] (buffer) specialization. + // char[N] (buffer) specialization. // template <std::size_t N> struct default_value_traits<char[N], id_blob> @@ -591,7 +597,7 @@ namespace odb } }; - // unsigned char[n] (buffer) specialization. + // unsigned char[N] (buffer) specialization. // template <std::size_t N> struct default_value_traits<unsigned char[N], id_blob> @@ -629,6 +635,84 @@ namespace odb } }; +#ifdef ODB_CXX11 + // std::array<char, N> (buffer) specialization. + // + template <std::size_t N> + struct default_value_traits<std::array<char, N>, id_blob> + { + public: + typedef std::array<char, N> value_type; + typedef value_type query_type; + typedef details::buffer image_type; + + static void + set_value (value_type& v, + const details::buffer& b, + std::size_t n, + bool is_null) + { + if (!is_null) + std::memcpy (v.data (), b.data (), (n < N ? n : N)); + else + std::memset (v.data (), 0, N); + } + + static void + set_image (details::buffer& b, + std::size_t& n, + bool& is_null, + const value_type& v) + { + is_null = false; + n = N; + + if (n > b.capacity ()) + b.capacity (n); + + std::memcpy (b.data (), v.data (), n); + } + }; + + // std::array<unsigned char, N> (buffer) specialization. + // + template <std::size_t N> + struct default_value_traits<std::array<unsigned char, N>, id_blob> + { + public: + typedef std::array<unsigned char, N> value_type; + typedef value_type query_type; + typedef details::buffer image_type; + + static void + set_value (value_type& v, + const details::buffer& b, + std::size_t n, + bool is_null) + { + if (!is_null) + std::memcpy (v.data (), b.data (), (n < N ? n : N)); + else + std::memset (v.data (), 0, N); + } + + static void + set_image (details::buffer& b, + std::size_t& n, + bool& is_null, + const value_type& v) + { + is_null = false; + n = N; + + if (n > b.capacity ()) + b.capacity (n); + + std::memcpy (b.data (), v.data (), n); + } + }; +#endif + // // type_traits // @@ -723,7 +807,7 @@ namespace odb static const database_type_id db_type_id = id_double; }; - // String type. + // String types. // template <> struct default_type_traits<std::string> @@ -737,17 +821,45 @@ namespace odb static const database_type_id db_type_id = id_string; }; - template <std::size_t n> - struct default_type_traits<char[n]> + template <std::size_t N> + struct default_type_traits<char[N]> { static const database_type_id db_type_id = id_string; }; - template <std::size_t n> - struct default_type_traits<const char[n]> + template <std::size_t N> + struct default_type_traits<const char[N]> { static const database_type_id db_type_id = id_string; }; + + // Binary types. + // + template <> + struct default_type_traits<std::vector<char> > + { + static const database_type_id db_type_id = id_blob; + }; + + template <> + struct default_type_traits<std::vector<unsigned char> > + { + static const database_type_id db_type_id = id_blob; + }; + +#ifdef ODB_CXX11 + template <std::size_t N> + struct default_type_traits<std::array<char, N> > + { + static const database_type_id db_type_id = id_blob; + }; + + template <std::size_t N> + struct default_type_traits<std::array<unsigned char, N> > + { + static const database_type_id db_type_id = id_blob; + }; +#endif } } |