aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorConstantin Michael <constantin@codesynthesis.com>2011-04-01 18:08:51 +0200
committerBoris Kolpackov <boris@codesynthesis.com>2011-04-04 18:16:53 +0200
commit597939bc9e36808d4a65b449f085927f26383c15 (patch)
tree81d48d83d620f10b3a819c47f7b88dd7b98ae043
parent58f7e971bd92c3e07059bba4b9adf205f34a7adb (diff)
Add SQLite support for Boost profile
-rw-r--r--odb/boost/date-time/gregorian-mysql.options (renamed from odb/boost/date-time/gregorian.options)2
-rw-r--r--odb/boost/date-time/gregorian-sqlite.options9
-rw-r--r--odb/boost/date-time/posix-time-mysql.options (renamed from odb/boost/date-time/posix-time.options)2
-rw-r--r--odb/boost/date-time/posix-time-sqlite.options9
-rw-r--r--odb/boost/date-time/sqlite/gregorian-mapping.hxx16
-rw-r--r--odb/boost/date-time/sqlite/gregorian-traits.hxx133
-rw-r--r--odb/boost/date-time/sqlite/posix-time-mapping.hxx21
-rw-r--r--odb/boost/date-time/sqlite/posix-time-traits.hxx234
8 files changed, 424 insertions, 2 deletions
diff --git a/odb/boost/date-time/gregorian.options b/odb/boost/date-time/gregorian-mysql.options
index f320005..953f21a 100644
--- a/odb/boost/date-time/gregorian.options
+++ b/odb/boost/date-time/gregorian-mysql.options
@@ -1,4 +1,4 @@
-# file : odb/boost/date-time/gregorian.options
+# file : odb/boost/date-time/gregorian-mysql.options
# author : Boris Kolpackov <boris@codesynthesis.com>
# copyright : Copyright (c) 2009-2011 Code Synthesis Tools CC
# license : GNU GPL v2; see accompanying LICENSE file
diff --git a/odb/boost/date-time/gregorian-sqlite.options b/odb/boost/date-time/gregorian-sqlite.options
new file mode 100644
index 0000000..8cd370d
--- /dev/null
+++ b/odb/boost/date-time/gregorian-sqlite.options
@@ -0,0 +1,9 @@
+# file : odb/boost/date-time/gregorian-sqlite.options
+# author : Boris Kolpackov <boris@codesynthesis.com>
+# copyright : Copyright (c) 2009-2011 Code Synthesis Tools CC
+# license : GNU GPL v2; see accompanying LICENSE file
+
+--profile boost/version
+
+--odb-epilogue '#include <odb/boost/date-time/sqlite/gregorian-mapping.hxx>'
+--hxx-prologue '#include <odb/boost/date-time/sqlite/gregorian-traits.hxx>'
diff --git a/odb/boost/date-time/posix-time.options b/odb/boost/date-time/posix-time-mysql.options
index 2576ac5..e87e11e 100644
--- a/odb/boost/date-time/posix-time.options
+++ b/odb/boost/date-time/posix-time-mysql.options
@@ -1,4 +1,4 @@
-# file : odb/boost/date-time/posix-time.options
+# file : odb/boost/date-time/posix-time-mysql.options
# author : Constantin Michael <constantin@codesynthesis.com>
# copyright : Copyright (c) 2009-2011 Code Synthesis Tools CC
# license : GNU GPL v2; see accompanying LICENSE file
diff --git a/odb/boost/date-time/posix-time-sqlite.options b/odb/boost/date-time/posix-time-sqlite.options
new file mode 100644
index 0000000..918f6fc
--- /dev/null
+++ b/odb/boost/date-time/posix-time-sqlite.options
@@ -0,0 +1,9 @@
+# file : odb/boost/date-time/posix-time-sqlite.options
+# author : Constantin Michael <constantin@codesynthesis.com>
+# copyright : Copyright (c) 2009-2011 Code Synthesis Tools CC
+# license : GNU GPL v2; see accompanying LICENSE file
+
+--profile boost/version
+
+--odb-epilogue '#include <odb/boost/date-time/sqlite/posix-time-mapping.hxx>'
+--hxx-prologue '#include <odb/boost/date-time/sqlite/posix-time-traits.hxx>'
diff --git a/odb/boost/date-time/sqlite/gregorian-mapping.hxx b/odb/boost/date-time/sqlite/gregorian-mapping.hxx
new file mode 100644
index 0000000..0a58a6c
--- /dev/null
+++ b/odb/boost/date-time/sqlite/gregorian-mapping.hxx
@@ -0,0 +1,16 @@
+// file : odb/boost/date-time/sqlite/gregorian-mapping.hxx
+// author : Constantin Michael <constantin@codesynthesis.com>
+// copyright : Copyright (c) 2009-2011 Code Synthesis Tools CC
+// license : GNU GPL v2; see accompanying LICENSE file
+
+#ifndef ODB_BOOST_DATE_TIME_SQLITE_GREGORIAN_MAPPING_HXX
+#define ODB_BOOST_DATE_TIME_SQLITE_GREGORIAN_MAPPING_HXX
+
+#include <boost/date_time/gregorian/gregorian_types.hpp>
+
+// By default map boost::gregorian::date to TEXT. We use the
+// NULL value to represent not_a_date_time.
+//
+#pragma db value(boost::gregorian::date) type("TEXT")
+
+#endif // ODB_BOOST_DATE_TIME_SQLITE_GREGORIAN_MAPPING_HXX
diff --git a/odb/boost/date-time/sqlite/gregorian-traits.hxx b/odb/boost/date-time/sqlite/gregorian-traits.hxx
new file mode 100644
index 0000000..b9ffd4c
--- /dev/null
+++ b/odb/boost/date-time/sqlite/gregorian-traits.hxx
@@ -0,0 +1,133 @@
+// file : odb/boost/date-time/sqlite/gregorian-traits.hxx
+// author : Constantin Michael <constantin@codesynthesis.com>
+// copyright : Copyright (c) 2009-2011 Code Synthesis Tools CC
+// license : GNU GPL v2; see accompanying LICENSE file
+
+#ifndef ODB_BOOST_DATE_TIME_SQLITE_GREGORIAN_TRAITS_HXX
+#define ODB_BOOST_DATE_TIME_SQLITE_GREGORIAN_TRAITS_HXX
+
+#include <odb/pre.hxx>
+
+#include <string>
+#include <cstddef> // std::size_t
+#include <cstring> // std::memcpy
+#include <ctime> // std::time_t
+
+#include <boost/date_time/gregorian/gregorian_types.hpp> // date
+#include <boost/date_time/posix_time/posix_time_types.hpp> // time_duration
+#include <boost/date_time/gregorian/parsers.hpp> // from_simple_string
+#include <boost/date_time/gregorian/formatters.hpp> // to_iso_extended_string
+#include <boost/date_time/posix_time/conversion.hpp> // from_time_t
+
+#include <odb/core.hxx>
+#include <odb/details/buffer.hxx>
+#include <odb/sqlite/traits.hxx>
+
+#include <odb/boost/date-time/exceptions.hxx>
+
+namespace odb
+{
+ namespace sqlite
+ {
+ template <>
+ class default_value_traits<
+ ::boost::gregorian::date, details::buffer, id_text>
+ {
+ public:
+ typedef ::boost::gregorian::date date;
+ typedef date value_type;
+ typedef date query_type;
+ typedef details::buffer image_type;
+
+ static void
+ set_value (date& v,
+ const details::buffer& i,
+ std::size_t n,
+ bool is_null)
+ {
+ if (is_null)
+ v = date (::boost::date_time::not_a_date_time);
+ else
+ v = ::boost::gregorian::from_simple_string (
+ std::string (i.data (), n));
+ }
+
+ static void
+ set_image (details::buffer& i,
+ std::size_t& n,
+ bool& is_null,
+ const date& v)
+ {
+ if (v.is_special ())
+ {
+ if (v.is_not_a_date ())
+ is_null = true;
+ else
+ throw odb::boost::date_time::special_value ();
+ }
+ else
+ {
+ is_null = false;
+
+ const std::string& s (
+ ::boost::gregorian::to_iso_extended_string (v));
+
+ n = s.size ();
+
+ if (n > i.capacity ())
+ i.capacity (n);
+
+ std::memcpy (i.data (), s.data (), n);
+ }
+ }
+ };
+
+ template <>
+ class default_value_traits<
+ ::boost::gregorian::date, long long, id_integer>
+ {
+ public:
+ typedef ::boost::gregorian::date date;
+ typedef ::boost::posix_time::time_duration time_duration;
+ typedef ::boost::posix_time::ptime ptime;
+ typedef date value_type;
+ typedef date query_type;
+ typedef long long image_type;
+
+ static void
+ set_value (date& v, long long i, bool is_null)
+ {
+ if (is_null)
+ v = date (::boost::date_time::not_a_date_time);
+ else
+ v = ::boost::posix_time::from_time_t (
+ static_cast<std::time_t> (i)).date ();
+ }
+
+ static void
+ set_image (long long& i, bool& is_null, const date& v)
+ {
+ if (v.is_special ())
+ {
+ if (v.is_not_a_date ())
+ is_null = true;
+ else
+ throw odb::boost::date_time::special_value ();
+ }
+ else
+ {
+ is_null = false;
+
+ ptime epoch (date (1970, 1, 1), time_duration (0, 0, 0));
+ i = static_cast<long long> (
+ (ptime (v, time_duration (0, 0, 0)) - epoch).ticks () /
+ time_duration::ticks_per_second ());
+ }
+ }
+ };
+ }
+}
+
+#include <odb/post.hxx>
+
+#endif // ODB_BOOST_DATE_TIME_SQLITE_GREGORIAN_TRAITS_HXX
diff --git a/odb/boost/date-time/sqlite/posix-time-mapping.hxx b/odb/boost/date-time/sqlite/posix-time-mapping.hxx
new file mode 100644
index 0000000..69a83df
--- /dev/null
+++ b/odb/boost/date-time/sqlite/posix-time-mapping.hxx
@@ -0,0 +1,21 @@
+// file : odb/boost/date-time/sqlite/posix-time-mapping.hxx
+// author : Constantin Michael <constantin@codesynthesis.com>
+// copyright : Copyright (c) 2009-2011 Code Synthesis Tools CC
+// license : GNU GPL v2; see accompanying LICENSE file
+
+#ifndef ODB_BOOST_DATE_TIME_SQLITE_POSIX_TIME_MAPPING_HXX
+#define ODB_BOOST_DATE_TIME_SQLITE_POSIX_TIME_MAPPING_HXX
+
+#include <boost/date_time/posix_time/posix_time_types.hpp>
+
+// By default map boost::posix_time::ptime to TEXT. We use
+// the NULL value to represent not_a_date_time.
+//
+#pragma db value(boost::posix_time::ptime) type("TEXT")
+
+// By default map boost::posix_time::time_duration to TEXT. We
+// use the NULL value to represent not_a_date_time.
+//
+#pragma db value(boost::posix_time::time_duration) type("TEXT")
+
+#endif // ODB_BOOST_DATE_TIME_SQLITE_POSIX_TIME_MAPPING_HXX
diff --git a/odb/boost/date-time/sqlite/posix-time-traits.hxx b/odb/boost/date-time/sqlite/posix-time-traits.hxx
new file mode 100644
index 0000000..039682b
--- /dev/null
+++ b/odb/boost/date-time/sqlite/posix-time-traits.hxx
@@ -0,0 +1,234 @@
+// file : odb/boost/date-time/sqlite/posix-time-traits.hxx
+// author : Constantin Michael <constantin@codesynthesis.com>
+// copyright : Copyright (c) 2009-2011 Code Synthesis Tools CC
+// license : GNU GPL v2; see accompanying LICENSE file
+
+#ifndef ODB_BOOST_DATE_TIME_SQLITE_POSIX_TIME_TRAITS_HXX
+#define ODB_BOOST_DATE_TIME_SQLITE_POSIX_TIME_TRAITS_HXX
+
+#include <odb/pre.hxx>
+
+#include <string>
+#include <cstddef> // std::size_t
+#include <cstring> // std::memcpy
+#include <ctime> // std::time_t
+
+#include <boost/date_time/posix_time/posix_time_types.hpp>
+#include <boost/date_time/posix_time/time_parsers.hpp> // time_from_string
+#include <boost/date_time/posix_time/time_formatters.hpp> // to_simple_string
+#include <boost/date_time/posix_time/conversion.hpp> // from_time_t
+
+#include <odb/core.hxx>
+#include <odb/details/buffer.hxx>
+#include <odb/sqlite/traits.hxx>
+
+#include <odb/boost/date-time/exceptions.hxx>
+
+namespace odb
+{
+ namespace sqlite
+ {
+ template <>
+ class default_value_traits<
+ ::boost::posix_time::ptime, details::buffer, id_text>
+ {
+ public:
+ typedef ::boost::posix_time::ptime ptime;
+ typedef ptime value_type;
+ typedef ptime query_type;
+ typedef details::buffer image_type;
+
+ static void
+ set_value (ptime& v,
+ const details::buffer& i,
+ std::size_t n,
+ bool is_null)
+ {
+ if (is_null)
+ v = ptime (::boost::date_time::not_a_date_time);
+ else
+ v = ::boost::posix_time::time_from_string (
+ std::string (i.data (), n));
+ }
+
+ static void
+ set_image (details::buffer& i,
+ std::size_t& n,
+ bool& is_null,
+ const ptime& v)
+ {
+ if (v.is_special ())
+ {
+ if (v.is_not_a_date_time ())
+ is_null = true;
+ else
+ throw odb::boost::date_time::special_value ();
+ }
+ else
+ {
+ is_null = false;
+
+ std::string s (::boost::posix_time::to_iso_extended_string (v));
+
+ // Replace ',' in iso string with '.'. SQLite requires the
+ // latter for date/time functions.
+ //
+ std::size_t p = s.rfind (',');
+ if (p != std::string::npos)
+ s[p] = '.';
+
+ // Remove 'T' separator as Boost is unable to parse correctly.
+ //
+ p = s.find ('T');
+ if (p != std::string::npos)
+ s[p] = ' ';
+
+ n = s.size ();
+ if (n > i.capacity ())
+ i.capacity (n);
+
+ std::memcpy (i.data (), s.data (), n);
+ }
+ }
+ };
+
+ // Implementation of the mapping between boost::posix_time::ptime and
+ // SQLite INTEGER. The integer value represents UNIX time.
+ //
+ template <>
+ class default_value_traits<
+ ::boost::posix_time::ptime, long long, id_integer>
+ {
+ public:
+ typedef ::boost::gregorian::date date;
+ typedef ::boost::posix_time::ptime ptime;
+ typedef ::boost::posix_time::time_duration time_duration;
+ typedef ptime value_type;
+ typedef ptime query_type;
+ typedef long long image_type;
+
+ static void
+ set_value (ptime& v, long long i, bool is_null)
+ {
+ if (is_null)
+ v = ptime (::boost::date_time::not_a_date_time);
+ else
+ v = ::boost::posix_time::from_time_t (static_cast<std::time_t> (i));
+ }
+
+ static void
+ set_image (long long& i, bool& is_null, const ptime& v)
+ {
+ if (v.is_special ())
+ {
+ if (v.is_not_a_date_time ())
+ is_null = true;
+ else
+ throw odb::boost::date_time::special_value ();
+ }
+ else
+ {
+ is_null = false;
+
+ ptime epoch (date (1970, 1, 1), time_duration (0, 0, 0));
+ i = static_cast<long long> (
+ (v - epoch).ticks () / time_duration::ticks_per_second ());
+ }
+ }
+ };
+
+ template <>
+ class default_value_traits<
+ ::boost::posix_time::time_duration, details::buffer, id_text>
+ {
+ public:
+ typedef ::boost::posix_time::time_duration time_duration;
+ typedef time_duration value_type;
+ typedef time_duration query_type;
+ typedef details::buffer image_type;
+
+ static void
+ set_value (time_duration& v,
+ const details::buffer& i,
+ std::size_t n,
+ bool is_null)
+ {
+ if (is_null)
+ v = time_duration (::boost::date_time::not_a_date_time);
+ else
+ {
+ v = ::boost::posix_time::duration_from_string (
+ std::string (i.data (), n));
+ }
+ }
+
+ static void
+ set_image (details::buffer& i,
+ std::size_t& n,
+ bool& is_null,
+ const time_duration& v)
+ {
+ if (v.is_special ())
+ {
+ if (v.is_not_a_date_time ())
+ is_null = true;
+ else
+ throw odb::boost::date_time::special_value ();
+ }
+ else if (v.total_seconds () < 0)
+ throw odb::boost::date_time::value_out_of_range ();
+ else
+ {
+ is_null = false;
+
+ const std::string& s (::boost::posix_time::to_simple_string (v));
+
+ n = s.size ();
+ if (n > i.capacity ())
+ i.capacity (n);
+
+ std::memcpy (i.data (), s.data (), n);
+ }
+ }
+ };
+
+ template <>
+ class default_value_traits<
+ ::boost::posix_time::time_duration, long long, id_integer>
+ {
+ public:
+ typedef ::boost::posix_time::time_duration time_duration;
+ typedef time_duration value_type;
+ typedef time_duration query_type;
+ typedef details::buffer image_type;
+
+ static void
+ set_value (time_duration& v, long long i, bool is_null)
+ {
+ if (is_null)
+ v = time_duration (::boost::date_time::not_a_date_time);
+ else
+ v = time_duration (0, 0, static_cast<long> (i));
+ }
+
+ static void
+ set_image (long long& i, bool& is_null, const time_duration& v)
+ {
+ if (v.is_special ())
+ {
+ if (v.is_not_a_date_time ())
+ is_null = true;
+ else
+ throw odb::boost::date_time::special_value ();
+ }
+ else
+ {
+ is_null = false;
+ i = static_cast<long long> (v.total_seconds ());
+ }
+ }
+ };
+ }
+}
+
+#endif // ODB_BOOST_DATE_TIME_SQLITE_POSIX_TIME_TRAITS_HXX