aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBoris Kolpackov <boris@codesynthesis.com>2011-07-28 09:45:36 +0200
committerBoris Kolpackov <boris@codesynthesis.com>2011-07-28 09:45:36 +0200
commit37f5dcb1d34205aa4a395c1e21e853e363fd7f12 (patch)
treef26a9be89a184a2bc3e60b11e04784006143d023
parentd32bbee7fdbad3eed60b8264d7950d10e4e36210 (diff)
Add value_traits specializations for std::vector<char>
This allows using it as a buffer for BLOB mapping.
-rw-r--r--odb/sqlite/traits.cxx26
-rw-r--r--odb/sqlite/traits.hxx30
2 files changed, 56 insertions, 0 deletions
diff --git a/odb/sqlite/traits.cxx b/odb/sqlite/traits.cxx
index e73462a..96e201d 100644
--- a/odb/sqlite/traits.cxx
+++ b/odb/sqlite/traits.cxx
@@ -15,8 +15,10 @@ namespace odb
{
using details::buffer;
+ //
// default_value_traits<std::string>
//
+
void default_value_traits<string, id_text>::
set_image (buffer& b,
size_t& n,
@@ -33,8 +35,10 @@ namespace odb
memcpy (b.data (), v.c_str (), n);
}
+ //
// default_value_traits<const char*>
//
+
void default_value_traits<const char*, id_text>::
set_image (buffer& b,
size_t& n,
@@ -50,5 +54,27 @@ namespace odb
if (n != 0)
memcpy (b.data (), v, n);
}
+
+ //
+ // default_value_traits<vector<char>, id_blob>
+ //
+
+ void default_value_traits<vector<char>, id_blob>::
+ set_image (details::buffer& b,
+ size_t& n,
+ bool& is_null,
+ const value_type& v)
+ {
+ is_null = false;
+ n = v.size ();
+
+ if (n > b.capacity ())
+ b.capacity (n);
+
+ // std::vector::data() may not be available in older compilers.
+ //
+ if (n != 0)
+ memcpy (b.data (), &v[0], n);
+ }
}
}
diff --git a/odb/sqlite/traits.hxx b/odb/sqlite/traits.hxx
index 2fdac04..8863fb1 100644
--- a/odb/sqlite/traits.hxx
+++ b/odb/sqlite/traits.hxx
@@ -9,6 +9,7 @@
#include <odb/pre.hxx>
#include <string>
+#include <vector>
#include <cstddef> // std::size_t
#include <odb/traits.hxx>
@@ -132,6 +133,35 @@ namespace odb
const char*);
};
+ // std::vector<char> (buffer) specialization.
+ //
+ template <>
+ struct LIBODB_SQLITE_EXPORT default_value_traits<std::vector<char>, id_blob>
+ {
+ public:
+ typedef std::vector<char> value_type;
+ typedef std::vector<char> 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)
+ v.assign (b.data (), b.data () + n);
+ else
+ v.clear ();
+ }
+
+ static void
+ set_image (details::buffer&,
+ std::size_t& n,
+ bool& is_null,
+ const value_type&);
+ };
+
//
// type_traits
//