aboutsummaryrefslogtreecommitdiff
path: root/odb/mysql
diff options
context:
space:
mode:
authorBoris Kolpackov <boris@codesynthesis.com>2010-09-22 18:40:58 +0200
committerBoris Kolpackov <boris@codesynthesis.com>2010-09-22 18:40:58 +0200
commitdeb66e801114f0da21c4e381a6d9864b9dd779fe (patch)
treec78c461cd1b365d4d7cfebc97d9636368fa03bce /odb/mysql
parentf3822e168d300f0fa8149db00ce52c03632d00ac (diff)
Add database type id as value_traits template argument
Diffstat (limited to 'odb/mysql')
-rw-r--r--odb/mysql/common.cxx250
-rw-r--r--odb/mysql/common.hxx67
-rw-r--r--odb/mysql/source.cxx26
3 files changed, 140 insertions, 203 deletions
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_;
};
//