diff options
author | Boris Kolpackov <boris@codesynthesis.com> | 2012-10-08 16:09:07 +0200 |
---|---|---|
committer | Boris Kolpackov <boris@codesynthesis.com> | 2012-10-08 16:09:07 +0200 |
commit | c0af27a770b1505ad6a1226f57f90642ce395296 (patch) | |
tree | 21fa70b3fa49c639cef4d5f07b73815291e3be1c /odb/mysql/query.hxx | |
parent | 46b2db37445b97cd3dbb8acd4f417e0851a30e4f (diff) |
Ground work for multi-database support
All generated code now includes database id. The database-specific
database class interface has been updated to include all the database
operations. The database-specific tests now use this interface.
Diffstat (limited to 'odb/mysql/query.hxx')
-rw-r--r-- | odb/mysql/query.hxx | 420 |
1 files changed, 241 insertions, 179 deletions
diff --git a/odb/mysql/query.hxx b/odb/mysql/query.hxx index 74d8671..a38b5cb 100644 --- a/odb/mysql/query.hxx +++ b/odb/mysql/query.hxx @@ -82,7 +82,7 @@ namespace odb template <typename T, database_type_id ID> struct query_column; - class LIBODB_MYSQL_EXPORT query + class LIBODB_MYSQL_EXPORT query_base { public: struct clause_part @@ -104,7 +104,7 @@ namespace odb bool bool_part; }; - query () + query_base () : binding_ (0, 0) { } @@ -112,27 +112,27 @@ namespace odb // True or false literal. // explicit - query (bool v) + query_base (bool v) : binding_ (0, 0) { clause_.push_back (clause_part (v)); } explicit - query (const char* native) + query_base (const char* native) : binding_ (0, 0) { clause_.push_back (clause_part (clause_part::native, native)); } explicit - query (const std::string& native) + query_base (const std::string& native) : binding_ (0, 0) { clause_.push_back (clause_part (clause_part::native, native)); } - query (const char* table, const char* column) + query_base (const char* table, const char* column) : binding_ (0, 0) { append (table, column); @@ -140,7 +140,7 @@ namespace odb template <typename T> explicit - query (val_bind<T> v) + query_base (val_bind<T> v) : binding_ (0, 0) { append<T, type_traits<T>::db_type_id> ( @@ -149,7 +149,7 @@ namespace odb template <typename T> explicit - query (ref_bind<T> r) + query_base (ref_bind<T> r) : binding_ (0, 0) { append<T, type_traits<T>::db_type_id> ( @@ -157,12 +157,12 @@ namespace odb } template <database_type_id ID> - query (const query_column<bool, ID>&); + query_base (const query_column<bool, ID>&); - query (const query&); + query_base (const query_base&); - query& - operator= (const query&); + query_base& + operator= (const query_base&); public: std::string @@ -181,7 +181,7 @@ namespace odb return clause_.empty (); } - static const query true_expr; + static const query_base true_expr; bool const_true () const @@ -210,10 +210,10 @@ namespace odb } public: - query& - operator+= (const query&); + query_base& + operator+= (const query_base&); - query& + query_base& operator+= (const std::string& q) { append (q); @@ -221,7 +221,7 @@ namespace odb } template <typename T> - query& + query_base& operator+= (val_bind<T> v) { append<T, type_traits<T>::db_type_id> ( @@ -230,7 +230,7 @@ namespace odb } template <typename T> - query& + query_base& operator+= (ref_bind<T> r) { append<T, type_traits<T>::db_type_id> ( @@ -267,114 +267,114 @@ namespace odb mutable binding binding_; }; - inline query - operator+ (const query& x, const query& y) + inline query_base + operator+ (const query_base& x, const query_base& y) { - query r (x); + query_base r (x); r += y; return r; } template <typename T> - inline query - operator+ (const query& q, val_bind<T> b) + inline query_base + operator+ (const query_base& q, val_bind<T> b) { - query r (q); + query_base r (q); r += b; return r; } template <typename T> - inline query - operator+ (const query& q, ref_bind<T> b) + inline query_base + operator+ (const query_base& q, ref_bind<T> b) { - query r (q); + query_base r (q); r += b; return r; } template <typename T> - inline query - operator+ (val_bind<T> b, const query& q) + inline query_base + operator+ (val_bind<T> b, const query_base& q) { - query r; + query_base r; r += b; r += q; return r; } template <typename T> - inline query - operator+ (ref_bind<T> b, const query& q) + inline query_base + operator+ (ref_bind<T> b, const query_base& q) { - query r; + query_base r; r += b; r += q; return r; } - inline query - operator+ (const query& q, const std::string& s) + inline query_base + operator+ (const query_base& q, const std::string& s) { - query r (q); + query_base r (q); r += s; return r; } - inline query - operator+ (const std::string& s, const query& q) + inline query_base + operator+ (const std::string& s, const query_base& q) { - query r (s); + query_base r (s); r += q; return r; } template <typename T> - inline query + inline query_base operator+ (const std::string& s, val_bind<T> b) { - query r (s); + query_base r (s); r += b; return r; } template <typename T> - inline query + inline query_base operator+ (const std::string& s, ref_bind<T> b) { - query r (s); + query_base r (s); r += b; return r; } template <typename T> - inline query + inline query_base operator+ (val_bind<T> b, const std::string& s) { - query r; + query_base r; r += b; r += s; return r; } template <typename T> - inline query + inline query_base operator+ (ref_bind<T> b, const std::string& s) { - query r; + query_base r; r += b; r += s; return r; } - LIBODB_MYSQL_EXPORT query - operator&& (const query& x, const query& y); + LIBODB_MYSQL_EXPORT query_base + operator&& (const query_base& x, const query_base& y); - LIBODB_MYSQL_EXPORT query - operator|| (const query& x, const query& y); + LIBODB_MYSQL_EXPORT query_base + operator|| (const query_base& x, const query_base& y); - LIBODB_MYSQL_EXPORT query - operator! (const query& x); + LIBODB_MYSQL_EXPORT query_base + operator! (const query_base& x); // query_column // @@ -427,18 +427,18 @@ namespace odb // is_null, is_not_null // public: - query + query_base is_null () const { - query q (table_, column_); + query_base q (table_, column_); q += "IS NULL"; return q; } - query + query_base is_not_null () const { - query q (table_, column_); + query_base q (table_, column_); q += "IS NOT NULL"; return q; } @@ -446,102 +446,102 @@ namespace odb // in // public: - query + query_base in (const T&, const T&) const; - query + query_base in (const T&, const T&, const T&) const; - query + query_base in (const T&, const T&, const T&, const T&) const; - query + query_base in (const T&, const T&, const T&, const T&, const T&) const; template <typename I> - query + query_base in_range (I begin, I end) const; // = // public: - query + query_base equal (const T& v) const { return equal (val_bind<T> (v)); } - query + query_base equal (val_bind<T> v) const { - query q (table_, column_); + query_base q (table_, column_); q += "="; q.append<T, ID> (v, conversion_); return q; } template <typename T2> - query + query_base equal (val_bind<T2> v) const { copy_bind<T, T2> c (v.val); return equal (c); } - query + query_base equal (ref_bind<T> r) const { - query q (table_, column_); + query_base q (table_, column_); q += "="; q.append<T, ID> (r, conversion_); return q; } - friend query + friend query_base operator== (const query_column& c, const T& v) { return c.equal (v); } - friend query + friend query_base operator== (const T& v, const query_column& c) { return c.equal (v); } - friend query + friend query_base operator== (const query_column& c, val_bind<T> v) { return c.equal (v); } - friend query + friend query_base operator== (val_bind<T> v, const query_column& c) { return c.equal (v); } template <typename T2> - friend query + friend query_base operator== (const query_column& c, val_bind<T2> v) { return c.equal (v); } template <typename T2> - friend query + friend query_base operator== (val_bind<T2> v, const query_column& c) { return c.equal (v); } - friend query + friend query_base operator== (const query_column& c, ref_bind<T> r) { return c.equal (r); } - friend query + friend query_base operator== (ref_bind<T> r, const query_column& c) { return c.equal (r); @@ -550,83 +550,83 @@ namespace odb // != // public: - query + query_base unequal (const T& v) const { return unequal (val_bind<T> (v)); } - query + query_base unequal (val_bind<T> v) const { - query q (table_, column_); + query_base q (table_, column_); q += "!="; q.append<T, ID> (v, conversion_); return q; } template <typename T2> - query + query_base unequal (val_bind<T2> v) const { copy_bind<T, T2> c (v.val); return unequal (c); } - query + query_base unequal (ref_bind<T> r) const { - query q (table_, column_); + query_base q (table_, column_); q += "!="; q.append<T, ID> (r, conversion_); return q; } - friend query + friend query_base operator!= (const query_column& c, const T& v) { return c.unequal (v); } - friend query + friend query_base operator!= (const T& v, const query_column& c) { return c.unequal (v); } - friend query + friend query_base operator!= (const query_column& c, val_bind<T> v) { return c.unequal (v); } - friend query + friend query_base operator!= (val_bind<T> v, const query_column& c) { return c.unequal (v); } template <typename T2> - friend query + friend query_base operator!= (const query_column& c, val_bind<T2> v) { return c.unequal (v); } template <typename T2> - friend query + friend query_base operator!= (val_bind<T2> v, const query_column& c) { return c.unequal (v); } - friend query + friend query_base operator!= (const query_column& c, ref_bind<T> r) { return c.unequal (r); } - friend query + friend query_base operator!= (ref_bind<T> r, const query_column& c) { return c.unequal (r); @@ -635,83 +635,83 @@ namespace odb // < // public: - query + query_base less (const T& v) const { return less (val_bind<T> (v)); } - query + query_base less (val_bind<T> v) const { - query q (table_, column_); + query_base q (table_, column_); q += "<"; q.append<T, ID> (v, conversion_); return q; } template <typename T2> - query + query_base less (val_bind<T2> v) const { copy_bind<T, T2> c (v.val); return less (c); } - query + query_base less (ref_bind<T> r) const { - query q (table_, column_); + query_base q (table_, column_); q += "<"; q.append<T, ID> (r, conversion_); return q; } - friend query + friend query_base operator< (const query_column& c, const T& v) { return c.less (v); } - friend query + friend query_base operator< (const T& v, const query_column& c) { return c.greater (v); } - friend query + friend query_base operator< (const query_column& c, val_bind<T> v) { return c.less (v); } - friend query + friend query_base operator< (val_bind<T> v, const query_column& c) { return c.greater (v); } template <typename T2> - friend query + friend query_base operator< (const query_column& c, val_bind<T2> v) { return c.less (v); } template <typename T2> - friend query + friend query_base operator< (val_bind<T2> v, const query_column& c) { return c.greater (v); } - friend query + friend query_base operator< (const query_column& c, ref_bind<T> r) { return c.less (r); } - friend query + friend query_base operator< (ref_bind<T> r, const query_column& c) { return c.greater (r); @@ -720,83 +720,83 @@ namespace odb // > // public: - query + query_base greater (const T& v) const { return greater (val_bind<T> (v)); } - query + query_base greater (val_bind<T> v) const { - query q (table_, column_); + query_base q (table_, column_); q += ">"; q.append<T, ID> (v, conversion_); return q; } template <typename T2> - query + query_base greater (val_bind<T2> v) const { copy_bind<T, T2> c (v.val); return greater (c); } - query + query_base greater (ref_bind<T> r) const { - query q (table_, column_); + query_base q (table_, column_); q += ">"; q.append<T, ID> (r, conversion_); return q; } - friend query + friend query_base operator> (const query_column& c, const T& v) { return c.greater (v); } - friend query + friend query_base operator> (const T& v, const query_column& c) { return c.less (v); } - friend query + friend query_base operator> (const query_column& c, val_bind<T> v) { return c.greater (v); } - friend query + friend query_base operator> (val_bind<T> v, const query_column& c) { return c.less (v); } template <typename T2> - friend query + friend query_base operator> (const query_column& c, val_bind<T2> v) { return c.greater (v); } template <typename T2> - friend query + friend query_base operator> (val_bind<T2> v, const query_column& c) { return c.less (v); } - friend query + friend query_base operator> (const query_column& c, ref_bind<T> r) { return c.greater (r); } - friend query + friend query_base operator> (ref_bind<T> r, const query_column& c) { return c.less (r); @@ -805,83 +805,83 @@ namespace odb // <= // public: - query + query_base less_equal (const T& v) const { return less_equal (val_bind<T> (v)); } - query + query_base less_equal (val_bind<T> v) const { - query q (table_, column_); + query_base q (table_, column_); q += "<="; q.append<T, ID> (v, conversion_); return q; } template <typename T2> - query + query_base less_equal (val_bind<T2> v) const { copy_bind<T, T2> c (v.val); return less_equal (c); } - query + query_base less_equal (ref_bind<T> r) const { - query q (table_, column_); + query_base q (table_, column_); q += "<="; q.append<T, ID> (r, conversion_); return q; } - friend query + friend query_base operator<= (const query_column& c, const T& v) { return c.less_equal (v); } - friend query + friend query_base operator<= (const T& v, const query_column& c) { return c.greater_equal (v); } - friend query + friend query_base operator<= (const query_column& c, val_bind<T> v) { return c.less_equal (v); } - friend query + friend query_base operator<= (val_bind<T> v, const query_column& c) { return c.greater_equal (v); } template <typename T2> - friend query + friend query_base operator<= (const query_column& c, val_bind<T2> v) { return c.less_equal (v); } template <typename T2> - friend query + friend query_base operator<= (val_bind<T2> v, const query_column& c) { return c.greater_equal (v); } - friend query + friend query_base operator<= (const query_column& c, ref_bind<T> r) { return c.less_equal (r); } - friend query + friend query_base operator<= (ref_bind<T> r, const query_column& c) { return c.greater_equal (r); @@ -890,83 +890,83 @@ namespace odb // >= // public: - query + query_base greater_equal (const T& v) const { return greater_equal (val_bind<T> (v)); } - query + query_base greater_equal (val_bind<T> v) const { - query q (table_, column_); + query_base q (table_, column_); q += ">="; q.append<T, ID> (v, conversion_); return q; } template <typename T2> - query + query_base greater_equal (val_bind<T2> v) const { copy_bind<T, T2> c (v.val); return greater_equal (c); } - query + query_base greater_equal (ref_bind<T> r) const { - query q (table_, column_); + query_base q (table_, column_); q += ">="; q.append<T, ID> (r, conversion_); return q; } - friend query + friend query_base operator>= (const query_column& c, const T& v) { return c.greater_equal (v); } - friend query + friend query_base operator>= (const T& v, const query_column& c) { return c.less_equal (v); } - friend query + friend query_base operator>= (const query_column& c, val_bind<T> v) { return c.greater_equal (v); } - friend query + friend query_base operator>= (val_bind<T> v, const query_column& c) { return c.less_equal (v); } template <typename T2> - friend query + friend query_base operator>= (const query_column& c, val_bind<T2> v) { return c.greater_equal (v); } template <typename T2> - friend query + friend query_base operator>= (val_bind<T2> v, const query_column& c) { return c.less_equal (v); } - friend query + friend query_base operator>= (const query_column& c, ref_bind<T> r) { return c.greater_equal (r); } - friend query + friend query_base operator>= (ref_bind<T> r, const query_column& c) { return c.less_equal (r); @@ -976,84 +976,84 @@ namespace odb // public: template <typename T2, database_type_id ID2> - query + query_base operator== (const query_column<T2, ID2>& c) const { // We can compare columns only if we can compare their C++ types. // (void) (sizeof (type_instance<T> () == type_instance<T2> ())); - query q (table_, column_); + query_base q (table_, column_); q += "="; q.append (c.table (), c.column ()); return q; } template <typename T2, database_type_id ID2> - query + query_base operator!= (const query_column<T2, ID2>& c) const { // We can compare columns only if we can compare their C++ types. // (void) (sizeof (type_instance<T> () != type_instance<T2> ())); - query q (table_, column_); + query_base q (table_, column_); q += "!="; q.append (c.table (), c.column ()); return q; } template <typename T2, database_type_id ID2> - query + query_base operator< (const query_column<T2, ID2>& c) const { // We can compare columns only if we can compare their C++ types. // (void) (sizeof (type_instance<T> () < type_instance<T2> ())); - query q (table_, column_); + query_base q (table_, column_); q += "<"; q.append (c.table (), c.column ()); return q; } template <typename T2, database_type_id ID2> - query + query_base operator> (const query_column<T2, ID2>& c) const { // We can compare columns only if we can compare their C++ types. // (void) (sizeof (type_instance<T> () > type_instance<T2> ())); - query q (table_, column_); + query_base q (table_, column_); q += ">"; q.append (c.table (), c.column ()); return q; } template <typename T2, database_type_id ID2> - query + query_base operator<= (const query_column<T2, ID2>& c) const { // We can compare columns only if we can compare their C++ types. // (void) (sizeof (type_instance<T> () <= type_instance<T2> ())); - query q (table_, column_); + query_base q (table_, column_); q += "<="; q.append (c.table (), c.column ()); return q; } template <typename T2, database_type_id ID2> - query + query_base operator>= (const query_column<T2, ID2>& c) const { // We can compare columns only if we can compare their C++ types. // (void) (sizeof (type_instance<T> () >= type_instance<T2> ())); - query q (table_, column_); + query_base q (table_, column_); q += ">="; q.append (c.table (), c.column ()); return q; @@ -1069,37 +1069,37 @@ namespace odb // query fragments (e.g., ORDER BY). // template <typename T, database_type_id ID> - inline query + inline query_base operator+ (const query_column<T, ID>& c, const std::string& s) { - query q (c.table (), c.column ()); + query_base q (c.table (), c.column ()); q += s; return q; } template <typename T, database_type_id ID> - inline query + inline query_base operator+ (const std::string& s, const query_column<T, ID>& c) { - query q (s); + query_base q (s); q.append (c.table (), c.column ()); return q; } template <typename T, database_type_id ID> - inline query - operator+ (const query_column<T, ID>& c, const query& q) + inline query_base + operator+ (const query_column<T, ID>& c, const query_base& q) { - query r (c.table (), c.column ()); + query_base r (c.table (), c.column ()); r += q; return r; } template <typename T, database_type_id ID> - inline query - operator+ (const query& q, const query_column<T, ID>& c) + inline query_base + operator+ (const query_base& q, const query_column<T, ID>& c) { - query r (q); + query_base r (q); r.append (c.table (), c.column ()); return r; } @@ -1857,13 +1857,75 @@ namespace odb } } -// odb::query specialization for MySQL. +// odb::mysql::query and odb::query specialization for MySQL. // namespace odb { + namespace mysql + { + template <typename T> + class query: public query_base, + public query_selector<T, id_mysql>::columns_type + { + public: + // We don't define any typedefs here since they may clash with + // column names defined by our base type. + // + + query () + { + } + + explicit + query (bool v) + : query_base (v) + { + } + + explicit + query (const char* q) + : query_base (q) + { + } + + explicit + query (const std::string& q) + : query_base (q) + { + } + + template <typename T2> + explicit + query (val_bind<T2> v) + : query_base (v) + { + } + + template <typename T2> + explicit + query (ref_bind<T2> r) + : query_base (r) + { + } + + query (const query_base& q) + : query_base (q) + { + } + + template <database_type_id ID> + query (const query_column<bool, ID>& qc) + : query_base (qc) + { + } + }; + } + + // Derive odb::query from odb::mysql::query so that it can be + // implicitly converted in mysql::database::query() calls. + // template <typename T> - class query<T, mysql::query>: public mysql::query, - public query_selector<T>::columns_type + class query<T, mysql::query_base>: public mysql::query<T> { public: // We don't define any typedefs here since they may clash with @@ -1876,44 +1938,44 @@ namespace odb explicit query (bool v) - : mysql::query (v) + : mysql::query<T> (v) { } explicit query (const char* q) - : mysql::query (q) + : mysql::query<T> (q) { } explicit query (const std::string& q) - : mysql::query (q) + : mysql::query<T> (q) { } template <typename T2> explicit query (mysql::val_bind<T2> v) - : mysql::query (mysql::query (v)) + : mysql::query<T> (v) { } template <typename T2> explicit query (mysql::ref_bind<T2> r) - : mysql::query (mysql::query (r)) + : mysql::query<T> (r) { } - query (const mysql::query& q) - : mysql::query (q) + query (const mysql::query_base& q) + : mysql::query<T> (q) { } template <mysql::database_type_id ID> query (const mysql::query_column<bool, ID>& qc) - : mysql::query (qc) + : mysql::query<T> (qc) { } }; |