[odb-users] Storing a UUID as binary(16) in mysql
Trevor Gattis
trevor at trevorgattis.com
Mon Jul 30 14:34:37 EDT 2012
Hi Boris,
Thanks for the quick and thorough response. I'll give it a go and will let
you know if I run into any additional issues. Thanks also for adding it to
the todo list of items to implement.
Thanks!
Trevor
On Mon, Jul 30, 2012 at 5:15 AM, Boris Kolpackov <boris at codesynthesis.com>wrote:
> Hi Trevor,
>
> Trevor Gattis <trevor at trevorgattis.com> writes:
>
> > I'm wondering if anyone has come across a solution for storing a
> > boost::uuids::uuid member value automagically as a binary(16) in
> > our mysql database.
>
> We should probably support this in the Boost profile (added to the
> TODO list). In the meantime, you will need to provide a custom
> value_traits specialization. Something along these lines:
>
> // uuid-traits.hxx
> //
> #ifndef UUID_TRAITS_HXX
> #define UUID_TRAITS_HXX
>
> #include <cstring> // std::memcpy
> #include <cstddef> // std::size_t
> #include <cassert>
>
> #include <boost/uuid/uuid.hpp>
> #include <boost/uuid/nil_generator.hpp>
>
> #include <odb/mysql/traits.hxx>
>
> namespace odb
> {
> namespace mysql
> {
> template <>
> struct default_value_traits< ::boost::uuids::uuid, id_blob>
> {
> typedef ::boost::uuids::uuid value_type;
> typedef ::boost::uuids::uuid 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 = ::boost::uuids::nil_uuid ();
> else
> {
> assert (n == 16);
> std::memcpy (v.data, b.data (), 16);
> }
> }
>
> static void
> set_image (details::buffer& b,
> std::size_t& n,
> bool& is_null,
> const value_type& v)
> {
> is_null = false;
> n = 16;
>
> if (n > b.capacity ())
> b.capacity (n);
>
> std::memcpy (b.data (), v.data, 16);
> }
> };
> }
> }
>
> #endif
>
> Assuming this is saved in uuid-traits.hxx, you can then compile your
> header like this:
>
> odb ... --odb-epilogue '#include "uuid-traits.hxx"' ...
>
> And in your header itself you can write:
>
> #include <boost/uuid/uuid.hpp>
>
> #pragma db value(boost::uuids::uuid) type("BINARY(16)")
>
> #pragma db object
> class object
> {
> ...
>
> boost::uuids::uuid id;
> };
>
> Boris
>
More information about the odb-users
mailing list