From deb66e801114f0da21c4e381a6d9864b9dd779fe Mon Sep 17 00:00:00 2001 From: Boris Kolpackov Date: Wed, 22 Sep 2010 18:40:58 +0200 Subject: Add database type id as value_traits template argument --- odb/mysql/common.cxx | 250 +++++++++++++++++---------------------------------- odb/mysql/common.hxx | 67 ++++++++------ odb/mysql/source.cxx | 26 +++++- 3 files changed, 140 insertions(+), 203 deletions(-) (limited to 'odb/mysql') diff --git a/odb/mysql/common.cxx b/odb/mysql/common.cxx index a50a517..5253ed2 100644 --- a/odb/mysql/common.cxx +++ b/odb/mysql/common.cxx @@ -226,12 +226,12 @@ namespace mysql } // - // query_column + // member_database_type // namespace { - const char* integer_image_id[] = + const char* integer_database_id[] = { "id_tiny", "id_utiny", @@ -245,13 +245,13 @@ namespace mysql "id_ulonglong" }; - const char* float_image_id[] = + const char* float_database_id[] = { "id_float", "id_double" }; - const char* date_time_image_id[] = + const char* date_time_database_id[] = { "id_date", "id_time", @@ -260,7 +260,7 @@ namespace mysql "id_year" }; - const char* char_bin_image_id[] = + const char* char_bin_database_id[] = { "id_string", // CHAR "id_blob", // BINARY, @@ -277,215 +277,125 @@ namespace mysql }; } - query_column:: - query_column (context& c) - : member_base (c, false), - decl_ (true), - member_image_type_ (c, false) + member_database_type:: + member_database_type (context& c) + : member_base (c, false) { } - query_column:: - query_column (context& c, semantics::class_& cl) - : member_base (c, false), - decl_ (false), - member_image_type_ (c, false) + string member_database_type:: + database_type (type& m) { - scope_ = "access::object_traits< " + cl.fq_name () + " >::query_type"; - table_ = table_name (cl); - } - - void query_column:: - pre (type& m) - { - type_ = "mysql::value_traits< " - + m.type ().fq_name (m.belongs ().hint ()) + ", " - + member_image_type_.image_type (m) - + " >::query_type"; - - name_ = escape (public_name (m)); - - if (decl_) - os << "// " << name_ << endl - << "//" << endl; - else - column_ = "\"`" + table_ + "`.`" + column_name (m) + "`\""; + type_.clear (); + member_base::traverse (m); + return type_; } - void query_column:: + void member_database_type:: traverse_integer (type& m, sql_type const& t) { size_t i ((t.type - sql_type::TINYINT) * 2 + (t.unsign ? 1 : 0)); - - if (decl_) - { - os << "static const mysql::query_column<" << endl - << " " << type_ << "," << endl - << " mysql::" << integer_image_id[i] << ">" << endl - << name_ << ";" - << endl; - } - else - { - os << "const mysql::query_column<" << endl - << " " << type_ << "," << endl - << " mysql::" << integer_image_id[i] << ">" << endl - << scope_ << "::" << name_ << " (" << endl - << column_ << ");" - << endl; - } + type_ = string ("mysql::") + integer_database_id[i]; } - void query_column:: + void member_database_type:: traverse_float (type& m, sql_type const& t) { - if (decl_) - { - os << "static const mysql::query_column<" << endl - << " " << type_ << "," << endl - << " mysql::" << float_image_id[t.type - sql_type::FLOAT] << ">" << endl - << name_ << ";" - << endl; - } - else - { - os << "const mysql::query_column<" << endl - << " " << type_ << "," << endl - << " mysql::" << float_image_id[t.type - sql_type::FLOAT] << ">" << endl - << scope_ << "::" << name_ << " (" << endl - << column_ << ");" - << endl; - } + type_ = string ("mysql::") + float_database_id[t.type - sql_type::FLOAT]; } - void query_column:: + void member_database_type:: traverse_decimal (type& m, sql_type const& t) { - if (decl_) - { - os << "static const mysql::query_column<" << endl - << " " << type_ << "," << endl - << " mysql::id_string>" << endl - << name_ << ";" - << endl; - } - else - { - os << "const mysql::query_column<" << endl - << " " << type_ << "," << endl - << " mysql::id_string>" << endl - << scope_ << "::" << name_ << " (" << endl - << column_ << ");" - << endl; - } + type_ = "mysql::id_decimal"; } - void query_column:: + void member_database_type:: traverse_date_time (type& m, sql_type const& t) { - if (decl_) - { - os << "static const mysql::query_column<" << endl - << " " << type_ << "," << endl - << " mysql::" << date_time_image_id[t.type - sql_type::DATE] << ">" << endl - << name_ << ";" - << endl; - } - else - { - os << "const mysql::query_column<" << endl - << " " << type_ << "," << endl - << " mysql::" << date_time_image_id[t.type - sql_type::DATE] << ">" << endl - << scope_ << "::" << name_ << " (" << endl - << column_ << ");" - << endl; - } + type_ = string ("mysql::") + date_time_database_id[t.type - sql_type::DATE]; } - void query_column:: + void member_database_type:: traverse_string (type& m, sql_type const& t) { - if (decl_) - { - os << "static const mysql::query_column<" << endl - << " " << type_ << "," << endl - << " mysql::" << char_bin_image_id[t.type - sql_type::CHAR] << ">" << endl - << name_ << ";" - << endl; - } - else - { - os << "const mysql::query_column<" << endl - << " " << type_ << "," << endl - << " mysql::" << char_bin_image_id[t.type - sql_type::CHAR] << ">" << endl - << scope_ << "::" << name_ << " (" << endl - << column_ << ");" - << endl; - } + type_ = string ("mysql::") + char_bin_database_id[t.type - sql_type::CHAR]; } - void query_column:: + void member_database_type:: traverse_bit (type& m, sql_type const& t) { - if (decl_) - { - os << "static const mysql::query_column<" << endl - << " " << type_ << "," << endl - << " mysql::id_blob>" << endl - << name_ << ";" - << endl; - } - else - { - os << "const mysql::query_column<" << endl - << " " << type_ << "," << endl - << " mysql::id_blob>" << endl - << scope_ << "::" << name_ << " (" << endl - << column_ << ");" - << endl; - } + type_ = "mysql::id_bit"; } - void query_column:: + void member_database_type:: traverse_enum (type& m, sql_type const&) { - if (decl_) - { - os << "static const mysql::query_column<" << endl - << " " << type_ << "," << endl - << " mysql::id_string>" << endl - << name_ << ";" - << endl; - } - else - { - os << "const mysql::query_column<" << endl - << " " << type_ << "," << endl - << " mysql::id_string>" << endl - << scope_ << "::" << name_ << " (" << endl - << column_ << ");" - << endl; - } + type_ = "mysql::id_enum"; } - void query_column:: + void member_database_type:: traverse_set (type& m, sql_type const&) { + type_ = "mysql::id_set"; + } + + // + // query_column + // + + query_column:: + query_column (context& c) + : context (c), + decl_ (true), + member_image_type_ (c, false), + member_database_type_ (c) + { + } + + query_column:: + query_column (context& c, semantics::class_& cl) + : context (c), + decl_ (false), + member_image_type_ (c, false), + member_database_type_ (c) + { + scope_ = "access::object_traits< " + cl.fq_name () + " >::query_type"; + table_ = table_name (cl); + } + + void query_column:: + traverse (type& m) + { + string name (escape (public_name (m))); + string db_type (member_database_type_.database_type (m)); + + string type ( + "mysql::value_traits< " + + m.type ().fq_name (m.belongs ().hint ()) + ", " + + member_image_type_.image_type (m) + ", " + + db_type + + " >::query_type"); + if (decl_) { - os << "static const mysql::query_column<" << endl - << " " << type_ << "," << endl - << " mysql::id_string>" << endl - << name_ << ";" + os << "// " << name << endl + << "//" << endl + << "static const mysql::query_column<" << endl + << " " << type << "," << endl + << " " << db_type << ">" << endl + << name << ";" << endl; } else { + string column ("\"`" + table_ + "`.`" + column_name (m) + "`\""); + os << "const mysql::query_column<" << endl - << " " << type_ << "," << endl - << " mysql::id_string>" << endl - << scope_ << "::" << name_ << " (" << endl - << column_ << ");" + << " " << type << "," << endl + << " " << db_type << ">" << endl + << scope_ << "::" << name << " (" << endl + << column << ");" << endl; } } diff --git a/odb/mysql/common.hxx b/odb/mysql/common.hxx index 0e0962f..5016843 100644 --- a/odb/mysql/common.hxx +++ b/odb/mysql/common.hxx @@ -123,6 +123,41 @@ namespace mysql string type_; }; + struct member_database_type: member_base + { + member_database_type (context&); + + string + database_type (type&); + + virtual void + traverse_integer (type&, sql_type const&); + + virtual void + traverse_float (type&, sql_type const&); + + virtual void + traverse_decimal (type&, sql_type const&); + + virtual void + traverse_date_time (type&, sql_type const&); + + virtual void + traverse_string (type&, sql_type const&); + + virtual void + traverse_bit (type&, sql_type const&); + + virtual void + traverse_enum (type&, sql_type const&); + + virtual void + traverse_set (type&, sql_type const&); + + private: + string type_; + }; + struct has_grow_member: member_base { has_grow_member (context& c) @@ -170,47 +205,21 @@ namespace mysql bool r_; }; - struct query_column: member_base + struct query_column: traversal::data_member, context { query_column (context&); query_column (context&, semantics::class_&); virtual void - pre (type&); - - virtual void - traverse_integer (type&, sql_type const&); - - virtual void - traverse_float (type&, sql_type const&); - - virtual void - traverse_decimal (type&, sql_type const&); - - virtual void - traverse_date_time (type&, sql_type const&); - - virtual void - traverse_string (type&, sql_type const&); - - virtual void - traverse_bit (type&, sql_type const&); - - virtual void - traverse_enum (type&, sql_type const&); - - virtual void - traverse_set (type&, sql_type const&); + traverse (type&); private: - string type_; - string name_; string scope_; string table_; - string column_; bool decl_; member_image_type member_image_type_; + member_database_type member_database_type_; }; } diff --git a/odb/mysql/source.cxx b/odb/mysql/source.cxx index 5b97651..92933e3 100644 --- a/odb/mysql/source.cxx +++ b/odb/mysql/source.cxx @@ -356,7 +356,9 @@ namespace mysql struct init_image_member: member_base { init_image_member (context& c, bool id) - : member_base (c, id), member_image_type_ (c, id) + : member_base (c, id), + member_image_type_ (c, id), + member_database_type_ (c) { } @@ -365,7 +367,12 @@ namespace mysql { type = m.type ().fq_name (m.belongs ().hint ()); image_type = member_image_type_.image_type (m); - traits = "mysql::value_traits< " + type + ", " + image_type + " >"; + db_type = member_database_type_.database_type (m); + + traits = "mysql::value_traits< " + + type + ", " + + image_type + ", " + + db_type + " >"; if (id_) member = "id"; @@ -519,11 +526,13 @@ namespace mysql private: string type; + string db_type; string member; string image_type; string traits; member_image_type member_image_type_; + member_database_type member_database_type_; }; // @@ -531,7 +540,9 @@ namespace mysql struct init_value_member: member_base { init_value_member (context& c) - : member_base (c, false), member_image_type_ (c, false) + : member_base (c, false), + member_image_type_ (c, false), + member_database_type_ (c) { } @@ -540,7 +551,12 @@ namespace mysql { type = m.type ().fq_name (m.belongs ().hint ()); image_type = member_image_type_.image_type (m); - traits = "mysql::value_traits< " + type + ", " + image_type + " >"; + db_type = member_database_type_.database_type (m); + + traits = "mysql::value_traits< " + + type + ", " + + image_type + ", " + + db_type + " >"; os << "// " << m.name () << endl << "//" << endl; @@ -647,10 +663,12 @@ namespace mysql private: string type; + string db_type; string image_type; string traits; member_image_type member_image_type_; + member_database_type member_database_type_; }; // -- cgit v1.1