aboutsummaryrefslogtreecommitdiff
path: root/odb/mysql
diff options
context:
space:
mode:
authorBoris Kolpackov <boris@codesynthesis.com>2010-09-21 19:55:14 +0200
committerBoris Kolpackov <boris@codesynthesis.com>2010-09-21 19:55:14 +0200
commit1e209501899626bdd991bdcf237de062b5665e7f (patch)
treedd867a188cf59b88a7a5cc1e9c0bcaa99132f51b /odb/mysql
parent884d14f1ea07d5d827554c3a1989e10ba033bafa (diff)
Redesign value_traits
Diffstat (limited to 'odb/mysql')
-rw-r--r--odb/mysql/common.cxx133
-rw-r--r--odb/mysql/common.hxx65
-rw-r--r--odb/mysql/header.cxx58
-rw-r--r--odb/mysql/source.cxx94
4 files changed, 251 insertions, 99 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_)
{
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<unsigned long> (" << 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<unsigned long> (" << 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<unsigned long> (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<unsigned long> (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_;
};
//