diff options
author | Boris Kolpackov <boris@codesynthesis.com> | 2010-09-21 19:55:14 +0200 |
---|---|---|
committer | Boris Kolpackov <boris@codesynthesis.com> | 2010-09-21 19:55:14 +0200 |
commit | 1e209501899626bdd991bdcf237de062b5665e7f (patch) | |
tree | dd867a188cf59b88a7a5cc1e9c0bcaa99132f51b /odb/mysql/common.cxx | |
parent | 884d14f1ea07d5d827554c3a1989e10ba033bafa (diff) |
Redesign value_traits
Diffstat (limited to 'odb/mysql/common.cxx')
-rw-r--r-- | odb/mysql/common.cxx | 133 |
1 files changed, 106 insertions, 27 deletions
diff --git a/odb/mysql/common.cxx b/odb/mysql/common.cxx index 895c857..a50a517 100644 --- a/odb/mysql/common.cxx +++ b/odb/mysql/common.cxx @@ -130,6 +130,102 @@ namespace mysql } // + // member_image_type + // + + namespace + { + const char* integer_types[] = + { + "char", + "short", + "int", + "int", + "long long" + }; + + const char* float_types[] = + { + "float", + "double" + }; + } + + member_image_type:: + member_image_type (context& c, bool id) + : member_base (c, id) + { + } + + string member_image_type:: + image_type (type& m) + { + type_.clear (); + member_base::traverse (m); + return type_; + } + + void member_image_type:: + traverse_integer (type&, sql_type const& t) + { + if (t.unsign) + type_ = "unsigned "; + else if (t.type == sql_type::TINYINT) + type_ = "signed "; + + type_ += integer_types[t.type - sql_type::TINYINT]; + } + + void member_image_type:: + traverse_float (type&, sql_type const& t) + { + type_ = float_types[t.type - sql_type::FLOAT]; + } + + void member_image_type:: + traverse_decimal (type&, sql_type const&) + { + type_ = "details::buffer"; + } + + void member_image_type:: + traverse_date_time (type&, sql_type const& t) + { + if (t.type == sql_type::YEAR) + type_ = "short"; + else + type_ = "MYSQL_TIME"; + } + + void member_image_type:: + traverse_string (type&, sql_type const&) + { + type_ = "details::buffer"; + } + + void member_image_type:: + traverse_bit (type&, sql_type const&) + { + type_ = "unsigned char*"; + } + + void member_image_type:: + traverse_enum (type&, sql_type const&) + { + // Represented as string. + // + type_ = "details::buffer"; + } + + void member_image_type:: + traverse_set (type&, sql_type const&) + { + // Represented as string. + // + type_ = "details::buffer"; + } + + // // query_column // @@ -183,13 +279,17 @@ namespace mysql query_column:: query_column (context& c) - : member_base (c, false), decl_ (true) + : member_base (c, false), + decl_ (true), + member_image_type_ (c, false) { } query_column:: query_column (context& c, semantics::class_& cl) - : member_base (c, false), decl_ (false) + : member_base (c, false), + decl_ (false), + member_image_type_ (c, false) { scope_ = "access::object_traits< " + cl.fq_name () + " >::query_type"; table_ = table_name (cl); @@ -199,8 +299,9 @@ namespace mysql pre (type& m) { type_ = "mysql::value_traits< " - + m.type ().fq_name (m.belongs ().hint ()) - + " >::value_type"; + + m.type ().fq_name (m.belongs ().hint ()) + ", " + + member_image_type_.image_type (m) + + " >::query_type"; name_ = escape (public_name (m)); @@ -302,29 +403,7 @@ namespace mysql } void query_column:: - traverse_short_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; - } - } - - void query_column:: - traverse_long_string (type& m, sql_type const& t) + traverse_string (type& m, sql_type const& t) { if (decl_) { |