From a849d159fd03d3c954df3fc60826680f5d1afd65 Mon Sep 17 00:00:00 2001 From: Boris Kolpackov Date: Thu, 24 Jan 2013 15:10:21 +0200 Subject: Add support for mapping char[N] to CHAR/VARCHAR database types Also improve query support for arrays (decaying). --- odb/sqlite/traits.cxx | 101 ++++++++++++++++++++++++++++++++++++++++++++++---- 1 file changed, 94 insertions(+), 7 deletions(-) (limited to 'odb/sqlite/traits.cxx') diff --git a/odb/sqlite/traits.cxx b/odb/sqlite/traits.cxx index 3f9c5cb..753c181 100644 --- a/odb/sqlite/traits.cxx +++ b/odb/sqlite/traits.cxx @@ -15,7 +15,6 @@ namespace odb // // default_value_traits // - void default_value_traits:: set_image (buffer& b, size_t& n, bool& is_null, const string& v) { @@ -32,7 +31,6 @@ namespace odb // // c_string_value_traits // - void c_string_value_traits:: set_image (buffer& b, size_t& n, bool& is_null, const char* v) { @@ -46,11 +44,55 @@ namespace odb memcpy (b.data (), v, n); } -#ifdef _WIN32 // - // default_value_traits + // c_array_value_traits_base // + void c_array_value_traits_base:: + set_value (char* const& v, + const details::buffer& b, + size_t n, + bool is_null, + size_t N) + { + if (!is_null) + { + n = n < N ? n : N; + + if (n != 0) + memcpy (v, b.data (), n); + } + else + n = 0; + + if (n != N) // Append '\0' if there is space. + v[n] = '\0'; + } + void c_array_value_traits_base:: + set_image (details::buffer& b, + size_t& n, + bool& is_null, + const char* v, + size_t N) + { + is_null = false; + + // Figure out the length. We cannot use strlen since it may + // not be 0-terminated (strnlen is not standard). + // + for (n = 0; n != N && v[n] != '\0'; ++n); + + if (n > b.capacity ()) + b.capacity (n); + + if (n != 0) + memcpy (b.data (), v, n); + } + + // + // default_value_traits + // +#ifdef _WIN32 void default_value_traits:: set_image (buffer& b, size_t& n, bool& is_null, const wstring& v) { @@ -67,7 +109,6 @@ namespace odb // // c_wstring_value_traits // - void c_wstring_value_traits:: set_image (buffer& b, size_t& n, bool& is_null, const wchar_t* v) { @@ -80,12 +121,59 @@ namespace odb if (n != 0) memcpy (b.data (), v, n); } + + // + // c_warray_value_traits_base + // + void c_warray_value_traits_base:: + set_value (wchar_t* const& v, + const details::buffer& b, + size_t n, + bool is_null, + size_t N) + { + if (!is_null) + { + n /= 2; + n = n < N ? n : N; + + if (n != 0) + memcpy (v, b.data (), n * sizeof (wchar_t)); + } + else + n = 0; + + if (n != N) // Append '\0' if there is space. + v[n] = L'\0'; + } + + void c_warray_value_traits_base:: + set_image (details::buffer& b, + size_t& n, + bool& is_null, + const wchar_t* v, + size_t N) + { + is_null = false; + + // Figure out the length. We cannot use wcslen since it may + // not be 0-terminated (wcsnlen is not standard). + // + for (n = 0; n != N && v[n] != L'\0'; ++n); + + n *= 2; + + if (n > b.capacity ()) + b.capacity (n); + + if (n != 0) + memcpy (b.data (), v, n); + } #endif // _WIN32 // // default_value_traits, id_blob> // - void default_value_traits, id_blob>:: set_image (details::buffer& b, size_t& n, @@ -107,7 +195,6 @@ namespace odb // // default_value_traits, id_blob> // - void default_value_traits, id_blob>:: set_image (details::buffer& b, size_t& n, -- cgit v1.1