From 621bc135b9825fc9f18ada204f67d3800c5f6fda Mon Sep 17 00:00:00 2001 From: Constantin Michael Date: Thu, 31 Mar 2011 15:36:02 +0200 Subject: Complete qt/basic and qt/date-time implementations --- odb/qt/date-time/exceptions.cxx | 21 +++++ odb/qt/date-time/exceptions.hxx | 31 +++++++ odb/qt/date-time/mysql/default-mapping.hxx | 28 ++++++ odb/qt/date-time/mysql/qdate-time-traits.hxx | 127 ++++++++++++++++++++++++++ odb/qt/date-time/mysql/qdate-traits.hxx | 68 ++++++++++++++ odb/qt/date-time/mysql/qtime-traits.hxx | 69 ++++++++++++++ odb/qt/date-time/sqlite/default-mapping.hxx | 28 ++++++ odb/qt/date-time/sqlite/qdate-time-traits.hxx | 123 +++++++++++++++++++++++++ odb/qt/date-time/sqlite/qdate-traits.hxx | 126 +++++++++++++++++++++++++ odb/qt/date-time/sqlite/qtime-traits.hxx | 118 ++++++++++++++++++++++++ 10 files changed, 739 insertions(+) create mode 100644 odb/qt/date-time/exceptions.cxx create mode 100644 odb/qt/date-time/exceptions.hxx create mode 100644 odb/qt/date-time/mysql/default-mapping.hxx create mode 100644 odb/qt/date-time/mysql/qdate-time-traits.hxx create mode 100644 odb/qt/date-time/mysql/qdate-traits.hxx create mode 100644 odb/qt/date-time/mysql/qtime-traits.hxx create mode 100644 odb/qt/date-time/sqlite/default-mapping.hxx create mode 100644 odb/qt/date-time/sqlite/qdate-time-traits.hxx create mode 100644 odb/qt/date-time/sqlite/qdate-traits.hxx create mode 100644 odb/qt/date-time/sqlite/qtime-traits.hxx (limited to 'odb/qt/date-time') diff --git a/odb/qt/date-time/exceptions.cxx b/odb/qt/date-time/exceptions.cxx new file mode 100644 index 0000000..b2ccffe --- /dev/null +++ b/odb/qt/date-time/exceptions.cxx @@ -0,0 +1,21 @@ +// file : odb/qt/date-time/exceptions.cxx +// author : Constantin Michael +// copyright : Copyright (c) 2005-2011 Code Synthesis Tools CC +// license : GNU GPL v2; see accompanying LICENSE file + +#include + +namespace odb +{ + namespace qt + { + namespace date_time + { + const char* value_out_of_range:: + what () const throw () + { + return "date/time value out of range"; + } + } + } +} diff --git a/odb/qt/date-time/exceptions.hxx b/odb/qt/date-time/exceptions.hxx new file mode 100644 index 0000000..445b110 --- /dev/null +++ b/odb/qt/date-time/exceptions.hxx @@ -0,0 +1,31 @@ +// file : odb/qt/date-time/exceptions.hxx +// author : Constantin Michael +// copyright : Copyright (c) 2005-2011 Code Synthesis Tools CC +// license : GNU GPL v2; see accompanying LICENSE file + +#ifndef ODB_QT_DATE_TIME_EXCEPTIONS_HXX +#define ODB_QT_DATE_TIME_EXCEPTIONS_HXX + +#include + +#include +#include + +namespace odb +{ + namespace qt + { + namespace date_time + { + struct LIBODB_QT_EXPORT value_out_of_range: exception + { + virtual const char* + what () const throw (); + }; + } + } +} + +#include + +#endif // ODB_QT_DATE_TIME_EXCEPTIONS_HXX diff --git a/odb/qt/date-time/mysql/default-mapping.hxx b/odb/qt/date-time/mysql/default-mapping.hxx new file mode 100644 index 0000000..fa0b823 --- /dev/null +++ b/odb/qt/date-time/mysql/default-mapping.hxx @@ -0,0 +1,28 @@ +// file : odb/qt/date-time/mysql/default-mapping.hxx +// author : Constantin Michael +// copyright : Copyright (c) 2009-2011 Code Synthesis Tools CC +// license : GNU GPL v2; see accompanying LICENSE file + +#ifndef ODB_QT_DATE_TIME_MYSQL_DEFAULT_MAPPING_HXX +#define ODB_QT_DATE_TIME_MYSQL_DEFAULT_MAPPING_HXX + +#include +#include +#include + +// Map QDate to MySQL DATE by default. QDate provides a null +// representation so allow NULL values by default. +// +#pragma db value(QDate) type("DATE") + +// Map QTime to MySQL TIME by default. QTime provides a null +// representation so allow NULL values by default. +// +#pragma db value(QTime) type("TIME") + +// Map QDateTime to MySQL DATETIME by default. QDateTime provides a null +// representation so allow NULL values by default. +// +#pragma db value(QDateTime) type("DATETIME") + +#endif // ODB_QT_DATE_TIME_MYSQL_DEFAULT_MAPPING_HXX diff --git a/odb/qt/date-time/mysql/qdate-time-traits.hxx b/odb/qt/date-time/mysql/qdate-time-traits.hxx new file mode 100644 index 0000000..9d212a3 --- /dev/null +++ b/odb/qt/date-time/mysql/qdate-time-traits.hxx @@ -0,0 +1,127 @@ +// file : odb/qt/date-time/mysql/qdate-time-traits.hxx +// author : Constantin Michael +// copyright : Copyright (c) 2009-2011 Code Synthesis Tools CC +// license : GNU GPL v2; see accompanying LICENSE file + +#ifndef ODB_QT_DATE_TIME_MYSQL_QDATETIME_TRAITS_HXX +#define ODB_QT_DATE_TIME_MYSQL_QDATETIME_TRAITS_HXX + +#include + +#include + +#include + +namespace odb +{ + namespace mysql + { + template <> + class default_value_traits + { + public: + typedef QDateTime value_type; + typedef QDateTime query_type; + typedef MYSQL_TIME image_type; + + static void + set_value (QDateTime& v, const MYSQL_TIME& i, bool is_null) + { + if (is_null) + // Default constructor creates a null QDateTime. + // + v = QDateTime (); + else + v = QDateTime (QDate (static_cast (i.year), + static_cast (i.month), + static_cast (i.day)), + QTime (static_cast (i.hour), + static_cast (i.minute), + static_cast (i.second))); + } + + static void + set_image (MYSQL_TIME& i, bool& is_null, const QDateTime& v) + { + if (v.isNull ()) + is_null = true; + else + { + if ((v < QDateTime (QDate (1000, 1, 1))) || + (v >= QDateTime (QDate (10000, 1, 1)))) + throw odb::qt::date_time::value_out_of_range (); + + is_null = false; + + const QDate& d (v.date ()); + i.year = static_cast (d.year ()); + i.month = static_cast (d.month ()); + i.day = static_cast (d.day ()); + + const QTime& t (v.time ()); + i.hour = static_cast (t.hour ()); + i.minute = static_cast (t.minute ()); + i.second = static_cast (t.second ()); + } + } + }; + + template <> + class default_value_traits + { + public: + typedef QDateTime value_type; + typedef QDateTime query_type; + typedef MYSQL_TIME image_type; + + static void + set_value (QDateTime& v, const MYSQL_TIME& i, bool is_null) + { + if (is_null) + // Default constructor creates a null QDateTime. + // + v = QDateTime (); + else + v = QDateTime (QDate (static_cast (i.year), + static_cast (i.month), + static_cast (i.day)), + QTime (static_cast (i.hour), + static_cast (i.minute), + static_cast (i.second))); + } + + static void + set_image (MYSQL_TIME& i, bool& is_null, const QDateTime& v) + { + if (v.isNull ()) + is_null = true; + else + { + if ((v <= QDateTime (QDate (1970, 1, 1))) || + (v > QDateTime (QDate (2038, 1, 19), QTime (3, 14, 7)))) + throw odb::qt::date_time::value_out_of_range (); + + is_null = false; + + const QDate& d (v.date ()); + i.year = static_cast (d.year ()); + i.month = static_cast (d.month ()); + i.day = static_cast (d.day ()); + + const QTime& t (v.time ()); + i.hour = static_cast (t.hour ()); + i.minute = static_cast (t.minute ()); + i.second = static_cast (t.second ()); + } + } + }; + + template <> + class default_type_traits + { + static const database_type_id db_type_od = id_datetime; + }; + } +} + +#endif // ODB_QT_DATE_TIME_MYSQL_QDATETIME_TRAITS_HXX diff --git a/odb/qt/date-time/mysql/qdate-traits.hxx b/odb/qt/date-time/mysql/qdate-traits.hxx new file mode 100644 index 0000000..1034cbc --- /dev/null +++ b/odb/qt/date-time/mysql/qdate-traits.hxx @@ -0,0 +1,68 @@ +// file : odb/qt/date-time/mysql/qdate-traits.hxx +// author : Constantin Michael +// copyright : Copyright (c) 2009-2011 Code Synthesis Tools CC +// license : GNU GPL v2; see accompanying LICENSE file + +#ifndef ODB_QT_DATE_TIME_MYSQL_QDATE_TRAITS_HXX +#define ODB_QT_DATE_TIME_MYSQL_QDATE_TRAITS_HXX + +#include + +#include + +#include +#include + +namespace odb +{ + namespace mysql + { + template <> + class default_value_traits + { + public: + typedef QDate value_type; + typedef QDate query_type; + typedef MYSQL_TIME image_type; + + static void + set_value (QDate& v, const MYSQL_TIME& i, bool is_null) + { + if (is_null) + // A null QDate value is equivalent to an invalid QDate value. + // Set v to an invalid date to represent null. + // + v.setDate (0, 0, 0); + else + v.setDate (static_cast (i.year), + static_cast (i.month), + static_cast (i.day)); + } + + static void + set_image (MYSQL_TIME& i, bool& is_null, const QDate& v) + { + if (v.isNull ()) + is_null = true; + else if ((v < QDate (1000, 1, 1)) || (v > QDate (9999, 12, 31))) + throw odb::qt::date_time::value_out_of_range (); + else + { + is_null = false; + + i.year = static_cast (v.year ()); + i.month = static_cast (v.month ()); + i.day = static_cast (v.day ()); + } + } + }; + + template <> + class default_type_traits + { + static const database_type_id db_type_id = id_date; + }; + } +} + +#endif // ODB_QT_DATE_TIME_MYSQL_QDATE_TRAITS_HXX diff --git a/odb/qt/date-time/mysql/qtime-traits.hxx b/odb/qt/date-time/mysql/qtime-traits.hxx new file mode 100644 index 0000000..69cd49c --- /dev/null +++ b/odb/qt/date-time/mysql/qtime-traits.hxx @@ -0,0 +1,69 @@ +// file : odb/qt/date-time/mysql/qtime-traits.hxx +// author : Constantin Michael +// copyright : Copyright (c) 2009-2011 Code Synthesis Tools CC +// license : GNU GPL v2; see accompanying LICENSE file + +#ifndef ODB_QT_DATE_TIME_MYSQL_QTIME_TRAITS_HXX +#define ODB_QT_DATE_TIME_MYSQL_QTIME_TRAITS_HXX + +#include + +#include + +#include + +namespace odb +{ + namespace mysql + { + template <> + class default_value_traits + { + public: + typedef QTime value_type; + typedef QTime query_type; + typedef MYSQL_TIME image_type; + + static void + set_value (QTime& v, const MYSQL_TIME& i, bool is_null) + { + if (is_null) + // A null QTime value is equivalent to an invalid QTime value. + // Set v to an invalid time to represent null (hour value of + // a valid time must be in the range 0-23). + // + v.setHMS (24, 0, 0); + else + v.setHMS (static_cast (i.hour), + static_cast (i.minute), + static_cast (i.second)); + } + + static void + set_image (MYSQL_TIME& i, bool& is_null, const QTime& v) + { + if (v.isNull ()) + is_null = true; + else + { + is_null = false; + + i.neg = false; + i.day = 0; + + i.hour = static_cast (v.hour ()); + i.minute = static_cast (v.minute ()); + i.second = static_cast (v.second ()); + } + } + }; + + template <> + class default_type_traits + { + static const database_type_id db_type_id = id_time; + }; + } +} + +#endif // ODB_QT_DATE_TIME_MYSQL_QTIME_TRAITS_HXX diff --git a/odb/qt/date-time/sqlite/default-mapping.hxx b/odb/qt/date-time/sqlite/default-mapping.hxx new file mode 100644 index 0000000..82321af --- /dev/null +++ b/odb/qt/date-time/sqlite/default-mapping.hxx @@ -0,0 +1,28 @@ +// file : odb/qt/date-time/sqlite/default-mapping.hxx +// author : Constantin Michael +// copyright : Copyright (c) 2009-2011 Code Synthesis Tools CC +// license : GNU GPL v2; see accompanying LICENSE file + +#ifndef ODB_QT_DATE_TIME_SQLITE_DEFAULT_MAPPING_HXX +#define ODB_QT_DATE_TIME_SQLITE_DEFAULT_MAPPING_HXX + +#include +#include +#include + +// Map QDate to SQLite TEXT by default. QDate provides a null representation +// so allow NULL values by default. +// +#pragma db value(QDate) type("TEXT") + +// Map QTime to SQLite TEXT by default. QTime provides a null representation +// so allow NULL values by default. +// +#pragma db value(QTime) type("TEXT") + +// Map QDateTime to SQLite TEXT by default. QDateTime provides a null +// representation so allow NULL values by default. +// +#pragma db value(QDateTime) type("TEXT") + +#endif // ODB_QT_DATE_TIME_SQLITE_DEFAULT_MAPPING_HXX diff --git a/odb/qt/date-time/sqlite/qdate-time-traits.hxx b/odb/qt/date-time/sqlite/qdate-time-traits.hxx new file mode 100644 index 0000000..85c4c1a --- /dev/null +++ b/odb/qt/date-time/sqlite/qdate-time-traits.hxx @@ -0,0 +1,123 @@ +// file : odb/qt/date-time/sqlite/qdatetime-traits.hxx +// author : Constantin Michael +// copyright : Copyright (c) 2009-2011 Code Synthesis Tools CC +// license : GNU GPL v2; see accompanying LICENSE file + +#ifndef ODB_QT_DATE_TIME_SQLITE_QDATETIME_TRAITS_HXX +#define ODB_QT_DATE_TIME_SQLITE_QDATETIME_TRAITS_HXX + +#include + +#include +#include // std::size_t +#include // std::memcpy + +#include + +#include +#include +#include + +namespace odb +{ + namespace sqlite + { + template <> + class default_value_traits + { + public: + typedef QDateTime value_type; + typedef QDateTime query_type; + typedef details::buffer image_type; + + static void + set_value (QDateTime& v, + const details::buffer& i, + std::size_t n, + bool is_null) + { + if (is_null) + // Default constructor creates a null QDateTime. + // + v = QDateTime (); + else + v = QDateTime::fromString ( + QString::fromAscii (i.data (), static_cast (n)), + "yyyy-MM-ddTHH:mm:ss.zzz"); + } + + static void + set_image (details::buffer& i, + std::size_t& n, + bool& is_null, + const QDateTime& v) + { + if (v.isNull ()) + is_null = true; + else + { + is_null = false; + + std::string s ( + v.toString ("yyyy-MM-ddTHH:mm:ss.zzz").toStdString ()); + + n = s.size (); + if (n > i.capacity ()) + i.capacity (n); + + std::memcpy (i.data (), s.data (), n); + } + } + }; + + // Implementation of mapping between QDateTime and SQLite INTEGER. + // The integer value represents UNIX time. + // + template <> + class default_value_traits + { + public: + typedef QDateTime value_type; + typedef QDateTime query_type; + typedef long long image_type; + + static void + set_value (QDateTime& v, long long i, bool is_null) + { + if (is_null) + // Default constructor creates a null QDateTime. + // + v = QDateTime (); + else + { + v.setTimeSpec (Qt::UTC); + v.setTime_t (static_cast (i)); + } + } + + static void + set_image (long long& i, bool& is_null, const QDateTime& v) + { + if (v.isNull ()) + is_null = true; + else if (v < QDateTime (QDate (1970, 1, 1), + QTime (0, 0, 0), + Qt::UTC)) + throw odb::qt::date_time::value_out_of_range (); + else + { + is_null = false; + i = static_cast (v.toTime_t ()); + } + } + }; + + template <> + class default_type_traits + { + static const database_type_id db_type_id = id_text; + }; + } +} + +#endif // ODB_QT_DATE_TIME_SQLITE_QDATETIME_TRAITS_HXX diff --git a/odb/qt/date-time/sqlite/qdate-traits.hxx b/odb/qt/date-time/sqlite/qdate-traits.hxx new file mode 100644 index 0000000..d8df614 --- /dev/null +++ b/odb/qt/date-time/sqlite/qdate-traits.hxx @@ -0,0 +1,126 @@ +// file : odb/qt/date-time/sqlite/qdate-traits.hxx +// author : Constantin Michael +// copyright : Copyright (c) 2009-2011 Code Synthesis Tools CC +// license : GNU GPL v2; see accompanying LICENSE file + +#ifndef ODB_QT_DATE_TIME_SQLITE_QDATE_TRAITS_HXX +#define ODB_QT_DATE_TIME_SQLITE_QDATE_TRAITS_HXX + +#include + +#include +#include // std::size_t +#include // std::memcpy + +#include + +#include +#include +#include + +namespace odb +{ + namespace sqlite + { + template <> + class default_value_traits + { + public: + typedef QDate value_type; + typedef QDate query_type; + typedef details::buffer image_type; + + static void + set_value (QDate& v, + const details::buffer& i, + std::size_t n, + bool is_null) + { + if (is_null) + // A null QDate value is equivalent to an invalid QDate value. + // Set v to an invalid date to represent null. + // + v.setDate (0, 0, 0); + else + v = QDate::fromString ( + QString::fromAscii (i.data (), static_cast (n)), + "yyyy-MM-dd"); + } + + static void + set_image (details::buffer& i, + std::size_t& n, + bool& is_null, + const QDate& v) + { + if (v.isNull ()) + is_null = true; + else + { + is_null = false; + + std::string s (v.toString ("yyyy-MM-dd").toStdString ()); + + n = s.size (); + if (n > i.capacity ()) + i.capacity (n); + + std::memcpy (i.data (), s.data (), n); + } + } + }; + + // Implementation of the mapping between QDate and SQLite INTEGER. The + // integer value represents UNIX time. + // + template <> + class default_value_traits + { + public: + typedef QDate value_type; + typedef QDate query_type; + typedef long long image_type; + + static void + set_value (QDate& v, long long i, bool is_null) + { + if (is_null) + // A null QDate value is equivalent to an invalid QDate value. + // Set v to an invalid date to represent null. + // + v.setDate (0, 0, 0); + else + { + QDateTime dt; + dt.setTimeSpec (Qt::UTC); + dt.setTime_t(static_cast (i)); + + v = dt.date (); + } + } + + static void + set_image (long long& i, bool& is_null, const QDate& v) + { + if (v.isNull ()) + is_null = true; + else if (v < QDate (1970, 1, 1)) + throw odb::qt::date_time::value_out_of_range (); + else + { + is_null = false; + i = static_cast ( + QDateTime (v, QTime (0, 0, 0), Qt::UTC).toTime_t ()); + } + } + }; + + template <> + class default_type_traits + { + static const database_type_id db_type_id = id_text; + }; + } +} + +#endif // ODB_QT_DATE_TIME_SQLITE_QDATE_TRAITS_HXX diff --git a/odb/qt/date-time/sqlite/qtime-traits.hxx b/odb/qt/date-time/sqlite/qtime-traits.hxx new file mode 100644 index 0000000..84721ee --- /dev/null +++ b/odb/qt/date-time/sqlite/qtime-traits.hxx @@ -0,0 +1,118 @@ +// file : odb/qt/date-time/sqlite/qtime-traits.hxx +// author : Constantin Michael +// copyright : Copyright (c) 2009-2011 Code Synthesis Tools CC +// license : GNU GPL v2; see accompanying LICENSE file + +#ifndef ODB_QT_DATE_TIME_SQLITE_QTIME_TRAITS_HXX +#define ODB_QT_DATE_TIME_SQLITE_QTIME_TRAITS_HXX + +#include + +#include +#include // std::size_t +#include // std::memcpy + +#include + +#include +#include + +namespace odb +{ + namespace sqlite + { + template <> + class default_value_traits + { + public: + typedef QTime value_type; + typedef QTime query_type; + typedef details::buffer image_type; + + static void + set_value (QTime& v, + const details::buffer& i, + std::size_t n, + bool is_null) + { + if (is_null) + // A null QTime value is equivalent to an invalid QTime value. + // Set v to an invalid time to represent null (hour value of + // a valid time must be in the range 0-23). + // + v.setHMS (24, 0, 0); + else + v = QTime::fromString ( + QString::fromAscii (i.data (), static_cast (n)), + "HH:mm:ss.zzz"); + } + + static void + set_image (details::buffer& i, + std::size_t& n, + bool& is_null, + const QTime& v) + { + if (v.isNull ()) + is_null = true; + else + { + is_null = false; + + std::string s (v.toString ("HH:mm:ss.zzz").toStdString ()); + + n = s.size (); + if (n > i.capacity ()) + i.capacity (n); + + std::memcpy (i.data (), s.data (), n); + } + } + }; + + // Implementation of mapping between QTime and SQLite INTEGER. The + // integer value represents seconds since midnight. + // + template <> + class default_value_traits + { + public: + typedef QTime value_type; + typedef QTime query_type; + typedef long long image_type; + + static void + set_value (QTime& v, long long i, bool is_null) + { + if (is_null) + // A null QTime value is equivalent to an invalid QTime value. + // Set v to an invalid time to represent null (hour value of + // a valid time must be in the range 0-23). + // + v.setHMS (24, 0, 0); + else + v = QTime (0, 0, 0).addSecs (static_cast (i)); + } + + static void + set_image (long long& i, bool& is_null, const QTime& v) + { + if (v.isNull ()) + is_null = true; + else + { + is_null = false; + i = static_cast (QTime (0, 0, 0).secsTo (v)); + } + } + }; + + template <> + class default_type_traits + { + static const database_type_id db_type_id = id_text; + }; + } +} + +#endif // ODB_QT_DATE_TIME_SQLITE_QTIME_TRAITS_HXX -- cgit v1.1