From 1e209501899626bdd991bdcf237de062b5665e7f Mon Sep 17 00:00:00 2001 From: Boris Kolpackov Date: Tue, 21 Sep 2010 19:55:14 +0200 Subject: Redesign value_traits --- odb/mysql/common.cxx | 133 ++++++++++++++++++++++++++++++++++++++++----------- odb/mysql/common.hxx | 65 ++++++++++++++++++++++--- odb/mysql/header.cxx | 58 ++++++++++------------ odb/mysql/source.cxx | 94 +++++++++++++++++++++++------------- 4 files changed, 251 insertions(+), 99 deletions(-) (limited to 'odb/mysql') 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_) { diff --git a/odb/mysql/common.hxx b/odb/mysql/common.hxx index f1d81d9..0e0962f 100644 --- a/odb/mysql/common.hxx +++ b/odb/mysql/common.hxx @@ -52,13 +52,20 @@ namespace mysql } virtual void - traverse_short_string (type&, sql_type const&) + traverse_string (type&, sql_type const&) { } virtual void - traverse_long_string (type&, sql_type const&) + traverse_short_string (type& t, sql_type const& st) { + traverse_string (t, st); + } + + virtual void + traverse_long_string (type& t, sql_type const& st) + { + traverse_string (t, st); } virtual void @@ -81,6 +88,41 @@ namespace mysql string var; }; + struct member_image_type: member_base + { + member_image_type (context&, bool id); + + string + image_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) @@ -95,12 +137,24 @@ namespace mysql } virtual void + traverse_decimal (type&, sql_type const& t) + { + r_ = true; + } + + virtual void traverse_long_string (type&, sql_type const& t) { r_ = true; } virtual void + traverse_short_string (type&, sql_type const& t) + { + r_ = true; // @@ Short string optimization disabled. + } + + virtual void traverse_enum (type&, sql_type const&) { r_ = true; @@ -137,10 +191,7 @@ namespace mysql traverse_date_time (type&, sql_type const&); virtual void - traverse_short_string (type&, sql_type const&); - - virtual void - traverse_long_string (type&, sql_type const&); + traverse_string (type&, sql_type const&); virtual void traverse_bit (type&, sql_type const&); @@ -158,6 +209,8 @@ namespace mysql string table_; string column_; bool decl_; + + member_image_type member_image_type_; }; } diff --git a/odb/mysql/header.cxx b/odb/mysql/header.cxx index 870698f..97df10c 100644 --- a/odb/mysql/header.cxx +++ b/odb/mysql/header.cxx @@ -10,31 +10,18 @@ namespace mysql { namespace { - const char* integer_types[] = - { - "char", - "short", - "int", - "int", - "long long" - }; - - const char* float_types[] = - { - "float", - "double" - }; - struct image_member: member_base { image_member (context& c, bool id) - : member_base (c, id) + : member_base (c, id), member_image_type_ (c, id) { } virtual void pre (type& m) { + image_type = member_image_type_.image_type (m); + if (!id_) os << "// " << m.name () << endl << "//" << endl; @@ -43,13 +30,7 @@ namespace mysql virtual void traverse_integer (type&, sql_type const& t) { - if (t.unsign) - os << "unsigned "; - else if (t.type == sql_type::TINYINT) - os << "signed "; - - os << integer_types[t.type - sql_type::TINYINT] << " " << - var << "value;" + os << image_type << " " << var << "value;" << "my_bool " << var << "null;" << endl; } @@ -57,7 +38,7 @@ namespace mysql virtual void traverse_float (type&, sql_type const& t) { - os << float_types[t.type - sql_type::FLOAT] << " " << var << "value;" + os << image_type << " " << var << "value;" << "my_bool " << var << "null;" << endl; } @@ -68,8 +49,14 @@ namespace mysql // Exchanged as strings. Can have up to 65 digits not counting // '-' and '.'. If range is not specified, the default is 10. // + + /* + @@ Disabled. os << "char " << var << "value[" << (t.range ? t.range_value : 10) + 3 << "];" + */ + + os << image_type << " " << var << "value;" << "unsigned long " << var << "size;" << "my_bool " << var << "null;" << endl; @@ -78,12 +65,7 @@ namespace mysql virtual void traverse_date_time (type&, sql_type const& t) { - if (t.type == sql_type::YEAR) - os << "short "; - else - os << "MYSQL_TIME "; - - os << var << "value;" + os << image_type << " " << var << "value;" << "my_bool " << var << "null;" << endl; @@ -94,8 +76,13 @@ namespace mysql { // If range is not specified, the default buffer size is 255. // + /* + @@ Disabled. os << "char " << var << "value[" << (t.range ? t.range_value : 255) + 1 << "];" + */ + + os << image_type << " " << var << "value;" << "unsigned long " << var << "size;" << "my_bool " << var << "null;" << endl; @@ -104,7 +91,7 @@ namespace mysql virtual void traverse_long_string (type&, sql_type const& t) { - os << "details::buffer " << var << "value;" + os << image_type << " " << var << "value;" << "unsigned long " << var << "size;" << "my_bool " << var << "null;" << endl; @@ -128,7 +115,7 @@ namespace mysql { // Represented as string. // - os << "details::buffer " << var << "value;" + os << image_type << " " << var << "value;" << "unsigned long " << var << "size;" << "my_bool " << var << "null;" << endl; @@ -139,11 +126,16 @@ namespace mysql { // Represented as string. // - os << "details::buffer " << var << "value;" + os << image_type << " " << var << "value;" << "unsigned long " << var << "size;" << "my_bool " << var << "null;" << endl; } + + private: + string image_type; + + member_image_type member_image_type_; }; struct image_type: traversal::class_, context diff --git a/odb/mysql/source.cxx b/odb/mysql/source.cxx index b9f51c8..5b97651 100644 --- a/odb/mysql/source.cxx +++ b/odb/mysql/source.cxx @@ -136,9 +136,9 @@ namespace mysql traverse_decimal (type&, sql_type const& t) { os << b << ".buffer_type = MYSQL_TYPE_NEWDECIMAL;" - << b << ".buffer = i." << var << "value;" + << b << ".buffer = i." << var << "value.data ();" << b << ".buffer_length = static_cast (" << endl - << "sizeof (i." << var << "value));" + << "i." << var << "value.capacity ());" << b << ".length = &i." << var << "size;" << b << ".is_null = &i." << var << "null;" << endl; @@ -168,9 +168,9 @@ namespace mysql // os << b << ".buffer_type = " << char_bin_buffer_types[t.type - sql_type::CHAR] << ";" - << b << ".buffer = i." << var << "value;" + << b << ".buffer = i." << var << "value.data ();" << b << ".buffer_length = static_cast (" << endl - << "sizeof (i." << var << "value));" + << "i." << var << "value.capacity ());" << b << ".length = &i." << var << "size;" << b << ".is_null = &i." << var << "null;" << endl; @@ -277,8 +277,13 @@ namespace mysql virtual void traverse_decimal (type&, sql_type const& t) { - os << e << " = 0;" - << endl; + // @@ Optimization disabled. + // + os << "if (" << e << ")" << endl + << "{" + << "i." << var << "value.capacity (i." << var << "size);" + << "r = true;" + << "}"; } virtual void @@ -291,8 +296,13 @@ namespace mysql virtual void traverse_short_string (type&, sql_type const& t) { - os << e << " = 0;" - << endl; + // @@ Optimization disabled. + // + os << "if (" << e << ")" << endl + << "{" + << "i." << var << "value.capacity (i." << var << "size);" + << "r = true;" + << "}"; } virtual void @@ -346,7 +356,7 @@ namespace mysql struct init_image_member: member_base { init_image_member (context& c, bool id) - : member_base (c, id) + : member_base (c, id), member_image_type_ (c, id) { } @@ -354,6 +364,8 @@ namespace mysql pre (type& m) { type = m.type ().fq_name (m.belongs ().hint ()); + image_type = member_image_type_.image_type (m); + traits = "mysql::value_traits< " + type + ", " + image_type + " >"; if (id_) member = "id"; @@ -370,7 +382,7 @@ namespace mysql virtual void traverse_integer (type& m, sql_type const&) { - os << "mysql::value_traits< " << type << " >::set_image (" << endl + os << traits << "::set_image (" << endl << "i." << var << "value, is_null, " << member << ");" << "i." << var << "null = is_null;" << endl; @@ -379,7 +391,7 @@ namespace mysql virtual void traverse_float (type& m, sql_type const&) { - os << "mysql::value_traits< " << type << " >::set_image (" << endl + os << traits << "::set_image (" << endl << "i." << var << "value, is_null, " << member << ");" << "i." << var << "null = is_null;" << endl; @@ -388,23 +400,26 @@ namespace mysql virtual void traverse_decimal (type& m, sql_type const&) { + // @@ Optimization: can remove growth check if buffer is fixed. + // os << "{" << "std::size_t size;" - << "mysql::value_traits< " << type << " >::set_image (" << endl + << "std::size_t cap (i." << var << "value.capacity ());" + << traits << "::set_image (" << endl << "i." << var << "value," << endl - << "sizeof (i." << var << "value)," << endl << "size," << endl << "is_null," << endl << member << ");" << "i." << var << "size = static_cast (size);" << "i." << var << "null = is_null;" + << "grew = grew || (cap != i." << var << "value.capacity ());" << "}"; } virtual void traverse_date_time (type& m, sql_type const&) { - os << "mysql::value_traits< " << type << " >::set_image (" << endl + os << traits << "::set_image (" << endl << "i." << var << "value, is_null, " << member << ");" << "i." << var << "null = is_null;" << endl; @@ -413,16 +428,19 @@ namespace mysql virtual void traverse_short_string (type& m, sql_type const&) { + // @@ Optimization: can remove growth check if buffer is fixed. + // os << "{" << "std::size_t size;" - << "mysql::value_traits< " << type << " >::set_image (" << endl + << "std::size_t cap (i." << var << "value.capacity ());" + << traits << "::set_image (" << endl << "i." << var << "value," << endl - << "sizeof (i." << var << "value)," << endl << "size," << endl << "is_null," << endl << member << ");" << "i." << var << "size = static_cast (size);" << "i." << var << "null = is_null;" + << "grew = grew || (cap != i." << var << "value.capacity ());" << "}"; } @@ -432,7 +450,7 @@ namespace mysql os << "{" << "std::size_t size;" << "std::size_t cap (i." << var << "value.capacity ());" - << "mysql::value_traits< " << type << " >::set_image (" << endl + << traits << "::set_image (" << endl << "i." << var << "value," << endl << "size," << endl << "is_null," << endl @@ -450,7 +468,7 @@ namespace mysql // os << "{" << "std::size_t size;" - << "mysql::value_traits< " << type << " >::set_image (" << endl + << traits << "::set_image (" << endl << "i." << var << "value," << endl << "sizeof (i." << var << "value)," << endl << "size," << endl @@ -469,7 +487,7 @@ namespace mysql os << "{" << "std::size_t size;" << "std::size_t cap (i." << var << "value.capacity ());" - << "mysql::value_traits< " << type << " >::set_image (" << endl + << traits << "::set_image (" << endl << "i." << var << "value," << endl << "size," << endl << "is_null," << endl @@ -488,7 +506,7 @@ namespace mysql os << "{" << "std::size_t size;" << "std::size_t cap (i." << var << "value.capacity ());" - << "mysql::value_traits< " << type << " >::set_image (" << endl + << traits << "::set_image (" << endl << "i." << var << "value," << endl << "size," << endl << "is_null," << endl @@ -502,6 +520,10 @@ namespace mysql private: string type; string member; + string image_type; + string traits; + + member_image_type member_image_type_; }; // @@ -509,7 +531,7 @@ namespace mysql struct init_value_member: member_base { init_value_member (context& c) - : member_base (c, false) + : member_base (c, false), member_image_type_ (c, false) { } @@ -517,6 +539,8 @@ namespace mysql pre (type& m) { type = m.type ().fq_name (m.belongs ().hint ()); + image_type = member_image_type_.image_type (m); + traits = "mysql::value_traits< " + type + ", " + image_type + " >"; os << "// " << m.name () << endl << "//" << endl; @@ -525,7 +549,7 @@ namespace mysql virtual void traverse_integer (type& m, sql_type const&) { - os << "mysql::value_traits< " << type << " >::set_value (" << endl + os << traits << "::set_value (" << endl << "o." << m.name () << ", i." << var << "value, " << "i." << var << "null);" << endl; @@ -534,7 +558,7 @@ namespace mysql virtual void traverse_float (type& m, sql_type const&) { - os << "mysql::value_traits< " << type << " >::set_value (" << endl + os << traits << "::set_value (" << endl << "o." << m.name () << ", i." << var << "value, " << "i." << var << "null);" << endl; @@ -543,7 +567,7 @@ namespace mysql virtual void traverse_decimal (type& m, sql_type const&) { - os << "mysql::value_traits< " << type << " >::set_value (" << endl + os << traits << "::set_value (" << endl << "o." << m.name () << "," << endl << "i." << var << "value," << endl << "i." << var << "size," << endl @@ -554,7 +578,7 @@ namespace mysql virtual void traverse_date_time (type& m, sql_type const&) { - os << "mysql::value_traits< " << type << " >::set_value (" << endl + os << traits << "::set_value (" << endl << "o." << m.name () << ", i." << var << "value, " << "i." << var << "null);" << endl; @@ -563,7 +587,7 @@ namespace mysql virtual void traverse_short_string (type& m, sql_type const&) { - os << "mysql::value_traits< " << type << " >::set_value (" << endl + os << traits << "::set_value (" << endl << "o." << m.name () << "," << endl << "i." << var << "value," << endl << "i." << var << "size," << endl @@ -574,9 +598,9 @@ namespace mysql virtual void traverse_long_string (type& m, sql_type const&) { - os << "mysql::value_traits< " << type << " >::set_value (" << endl + os << traits << "::set_value (" << endl << "o." << m.name () << "," << endl - << "i." << var << "value.data ()," << endl + << "i." << var << "value," << endl << "i." << var << "size," << endl << "i." << var << "null);" << endl; @@ -587,7 +611,7 @@ namespace mysql { // Represented as a BLOB. // - os << "mysql::value_traits< " << type << " >::set_value (" << endl + os << traits << "::set_value (" << endl << "o." << m.name () << "," << endl << "i." << var << "value," << endl << "i." << var << "size," << endl @@ -600,9 +624,9 @@ namespace mysql { // Represented as a string. // - os << "mysql::value_traits< " << type << " >::set_value (" << endl + os << traits << "::set_value (" << endl << "o." << m.name () << "," << endl - << "i." << var << "value.data ()," << endl + << "i." << var << "value," << endl << "i." << var << "size," << endl << "i." << var << "null);" << endl; @@ -613,9 +637,9 @@ namespace mysql { // Represented as a string. // - os << "mysql::value_traits< " << type << " >::set_value (" << endl + os << traits << "::set_value (" << endl << "o." << m.name () << "," << endl - << "i." << var << "value.data ()," << endl + << "i." << var << "value," << endl << "i." << var << "size," << endl << "i." << var << "null);" << endl; @@ -623,6 +647,10 @@ namespace mysql private: string type; + string image_type; + string traits; + + member_image_type member_image_type_; }; // -- cgit v1.1