aboutsummaryrefslogtreecommitdiff
path: root/mysql/custom/traits.hxx
diff options
context:
space:
mode:
authorBoris Kolpackov <boris@codesynthesis.com>2012-07-10 15:17:16 +0200
committerBoris Kolpackov <boris@codesynthesis.com>2012-07-10 15:17:16 +0200
commit6b8def06796d1e4fc9e6e7e75ce59bccf6899261 (patch)
treef7d440fda64cf07549173cefd5d45a92bf1845d6 /mysql/custom/traits.hxx
parent7ba8d1469e331f07040352c069cf7b9d24ac57a3 (diff)
Add support for custom database type mapping
New pragma qualifier, map, and specifiers: as, to, from. New tests: <database>/custom.
Diffstat (limited to 'mysql/custom/traits.hxx')
-rw-r--r--mysql/custom/traits.hxx89
1 files changed, 89 insertions, 0 deletions
diff --git a/mysql/custom/traits.hxx b/mysql/custom/traits.hxx
new file mode 100644
index 0000000..bf4ceb4
--- /dev/null
+++ b/mysql/custom/traits.hxx
@@ -0,0 +1,89 @@
+// file : mysql/types/traits.hxx
+// copyright : Copyright (c) 2009-2012 Code Synthesis Tools CC
+// license : GNU GPL v2; see accompanying LICENSE file
+
+#ifndef TRAITS_HXX
+#define TRAITS_HXX
+
+#include <limits> // std::numeric_limits
+#include <sstream>
+#include <cstring> // std::memcpy
+
+#include <odb/mysql/traits.hxx>
+
+#include "test.hxx" // point
+
+namespace odb
+{
+ namespace mysql
+ {
+ template <>
+ class value_traits<point, id_string>
+ {
+ public:
+ typedef point value_type;
+ typedef point query_type;
+
+ typedef char* image_type;
+
+ static void
+ set_value (point& v,
+ const details::buffer& b,
+ std::size_t n,
+ bool is_null)
+ {
+ if (is_null)
+ v = point ();
+ else
+ {
+ // Point format is "POINT(x y)".
+ //
+ std::istringstream is (std::string (b.data () + 6, n - 6));
+
+ is >> v.x;
+ is >> v.y;
+ }
+ }
+
+ static void
+ set_image (details::buffer& b,
+ std::size_t& n,
+ bool& is_null,
+ const point& v)
+ {
+ is_null = false;
+ std::ostringstream os;
+
+ // The formula for the number of decimla digits required is given in:
+ //
+ // http://www.open-std.org/JTC1/SC22/WG21/docs/papers/2005/n1822.pdf
+ //
+ os.precision (std::numeric_limits<double>::digits10);
+ // os.precision (2 + std::numeric_limits<double>::digits * 301/1000);
+
+ os << "POINT(" << v.x << ' ' << v.y << ')';
+
+ const std::string& s (os.str ());
+ n = s.size ();
+
+ if (n > b.capacity ())
+ b.capacity (n);
+
+ std::memcpy (b.data (), s.c_str (), n);
+ }
+ };
+
+ template <>
+ struct type_traits<point>
+ {
+ static const database_type_id db_type_id = id_string;
+
+ struct conversion
+ {
+ static const char* to () {return "GeomFromText((?))";}
+ };
+ };
+ }
+}
+
+#endif // TRAITS_HXX