summaryrefslogtreecommitdiff
path: root/odb/mysql/common.cxx
diff options
context:
space:
mode:
Diffstat (limited to 'odb/mysql/common.cxx')
-rw-r--r--odb/mysql/common.cxx158
1 files changed, 98 insertions, 60 deletions
diff --git a/odb/mysql/common.cxx b/odb/mysql/common.cxx
index 372d08e..17cae9e 100644
--- a/odb/mysql/common.cxx
+++ b/odb/mysql/common.cxx
@@ -11,29 +11,47 @@ using namespace std;
namespace mysql
{
+ //
+ // member_base
+ //
+
void member_base::
- traverse (type& m)
+ traverse (semantics::data_member& m)
{
- if (m.count ("transient") || (id_ && !m.count ("id")))
+ if (m.count ("transient"))
return;
- if (id_)
- var = "id_";
+ string var;
+
+ if (!var_override_.empty ())
+ var = var_override_;
else
{
string const& name (m.name ());
var = name + (name[name.size () - 1] == '_' ? "" : "_");
}
- pre (m);
+ semantics::type& t (type_override_ != 0 ? *type_override_ : m.type ());
+
+ member_info mi (m, t, var, fq_type_override_);
- if (comp_value (m.type ()))
- traverse_composite (m);
+ if (comp_value (t))
+ {
+ pre (mi);
+ traverse_composite (mi);
+ }
+ else if (container (t))
+ {
+ pre (mi);
+ traverse_container (mi);
+ }
else
{
- sql_type const& t (db_type (m));
+ sql_type const& st (db_type (m, key_prefix_));
+ mi.st = &st;
+ pre (mi);
- switch (t.type)
+ switch (st.type)
{
// Integral types.
//
@@ -43,7 +61,7 @@ namespace mysql
case sql_type::INT:
case sql_type::BIGINT:
{
- traverse_integer (m, t);
+ traverse_integer (mi);
break;
}
@@ -52,12 +70,12 @@ namespace mysql
case sql_type::FLOAT:
case sql_type::DOUBLE:
{
- traverse_float (m, t);
+ traverse_float (mi);
break;
}
case sql_type::DECIMAL:
{
- traverse_decimal (m, t);
+ traverse_decimal (mi);
break;
}
@@ -69,7 +87,7 @@ namespace mysql
case sql_type::TIMESTAMP:
case sql_type::YEAR:
{
- traverse_date_time (m, t);
+ traverse_date_time (mi);
break;
}
@@ -88,7 +106,7 @@ namespace mysql
// To support this we will need the character encoding
// in sql_type.
//
- traverse_long_string (m, t);
+ traverse_long_string (mi);
break;
}
case sql_type::BINARY:
@@ -97,7 +115,7 @@ namespace mysql
// BINARY's range is always 255 or less from MySQL 5.0.3.
// TINYBLOB can only store up to 255 bytes.
//
- traverse_short_string (m, t);
+ traverse_short_string (mi);
break;
}
case sql_type::VARBINARY:
@@ -105,10 +123,10 @@ namespace mysql
case sql_type::MEDIUMBLOB:
case sql_type::LONGBLOB:
{
- if (t.range && t.range_value <= 255)
- traverse_short_string (m, t);
+ if (st.range && st.range_value <= 255)
+ traverse_short_string (mi);
else
- traverse_long_string (m, t);
+ traverse_long_string (mi);
break;
}
@@ -117,17 +135,17 @@ namespace mysql
//
case sql_type::BIT:
{
- traverse_bit (m, t);
+ traverse_bit (mi);
break;
}
case sql_type::ENUM:
{
- traverse_enum (m, t);
+ traverse_enum (mi);
break;
}
case sql_type::SET:
{
- traverse_set (m, t);
+ traverse_set (mi);
break;
}
case sql_type::invalid:
@@ -138,7 +156,7 @@ namespace mysql
}
}
- post (m);
+ post (mi);
}
//
@@ -164,13 +182,22 @@ namespace mysql
}
member_image_type::
- member_image_type (context& c, bool id)
- : member_base (c, id)
+ member_image_type (context& c)
+ : member_base (c)
+ {
+ }
+
+ member_image_type::
+ member_image_type (context& c,
+ semantics::type& type,
+ string const& fq_type,
+ string const& key_prefix)
+ : member_base (c, "", type, fq_type, key_prefix)
{
}
string member_image_type::
- image_type (type& m)
+ image_type (semantics::data_member& m)
{
type_.clear ();
member_base::traverse (m);
@@ -178,58 +205,57 @@ namespace mysql
}
void member_image_type::
- traverse_composite (type& m)
+ traverse_composite (member_info& mi)
{
- type_ = "composite_value_traits< " + m.type ().fq_name () +
- " >::image_type";
+ type_ = "composite_value_traits< " + mi.fq_type () + " >::image_type";
}
void member_image_type::
- traverse_integer (type&, sql_type const& t)
+ traverse_integer (member_info& mi)
{
- if (t.unsign)
+ if (mi.st->unsign)
type_ = "unsigned ";
- else if (t.type == sql_type::TINYINT)
+ else if (mi.st->type == sql_type::TINYINT)
type_ = "signed ";
- type_ += integer_types[t.type - sql_type::TINYINT];
+ type_ += integer_types[mi.st->type - sql_type::TINYINT];
}
void member_image_type::
- traverse_float (type&, sql_type const& t)
+ traverse_float (member_info& mi)
{
- type_ = float_types[t.type - sql_type::FLOAT];
+ type_ = float_types[mi.st->type - sql_type::FLOAT];
}
void member_image_type::
- traverse_decimal (type&, sql_type const&)
+ traverse_decimal (member_info&)
{
type_ = "details::buffer";
}
void member_image_type::
- traverse_date_time (type&, sql_type const& t)
+ traverse_date_time (member_info& mi)
{
- if (t.type == sql_type::YEAR)
+ if (mi.st->type == sql_type::YEAR)
type_ = "short";
else
type_ = "MYSQL_TIME";
}
void member_image_type::
- traverse_string (type&, sql_type const&)
+ traverse_string (member_info&)
{
type_ = "details::buffer";
}
void member_image_type::
- traverse_bit (type&, sql_type const&)
+ traverse_bit (member_info&)
{
type_ = "unsigned char*";
}
void member_image_type::
- traverse_enum (type&, sql_type const&)
+ traverse_enum (member_info&)
{
// Represented as string.
//
@@ -237,7 +263,7 @@ namespace mysql
}
void member_image_type::
- traverse_set (type&, sql_type const&)
+ traverse_set (member_info&)
{
// Represented as string.
//
@@ -298,7 +324,16 @@ namespace mysql
member_database_type::
member_database_type (context& c)
- : member_base (c, false)
+ : member_base (c)
+ {
+ }
+
+ member_database_type::
+ member_database_type (context& c,
+ semantics::type& type,
+ string const& fq_type,
+ string const& key_prefix)
+ : member_base (c, "", type, fq_type, key_prefix)
{
}
@@ -311,56 +346,59 @@ namespace mysql
}
void member_database_type::
- traverse_composite (type&)
+ traverse_composite (member_info&)
{
assert (false);
}
void member_database_type::
- traverse_integer (type&, sql_type const& t)
+ traverse_integer (member_info& mi)
{
- size_t i ((t.type - sql_type::TINYINT) * 2 + (t.unsign ? 1 : 0));
+ size_t i ((mi.st->type - sql_type::TINYINT) * 2 + (mi.st->unsign ? 1 : 0));
type_ = string ("mysql::") + integer_database_id[i];
}
void member_database_type::
- traverse_float (type&, sql_type const& t)
+ traverse_float (member_info& mi)
{
- type_ = string ("mysql::") + float_database_id[t.type - sql_type::FLOAT];
+ type_ = string ("mysql::") +
+ float_database_id[mi.st->type - sql_type::FLOAT];
}
void member_database_type::
- traverse_decimal (type&, sql_type const&)
+ traverse_decimal (member_info&)
{
type_ = "mysql::id_decimal";
}
void member_database_type::
- traverse_date_time (type&, sql_type const& t)
+ traverse_date_time (member_info& mi)
{
- type_ = string ("mysql::") + date_time_database_id[t.type - sql_type::DATE];
+ type_ = string ("mysql::") +
+ date_time_database_id[mi.st->type - sql_type::DATE];
}
void member_database_type::
- traverse_string (type&, sql_type const& t)
+ traverse_string (member_info& mi)
{
- type_ = string ("mysql::") + char_bin_database_id[t.type - sql_type::CHAR];
+ type_ = string ("mysql::") +
+ char_bin_database_id[mi.st->type - sql_type::CHAR];
}
void member_database_type::
- traverse_bit (type&, sql_type const&)
+ traverse_bit (member_info&)
{
type_ = "mysql::id_bit";
}
void member_database_type::
- traverse_enum (type&, sql_type const&)
+ traverse_enum (member_info&)
{
type_ = "mysql::id_enum";
}
void member_database_type::
- traverse_set (type&, sql_type const&)
+ traverse_set (member_info&)
{
type_ = "mysql::id_set";
}
@@ -374,7 +412,7 @@ namespace mysql
: object_columns_base (c),
context (c),
decl_ (true),
- member_image_type_ (c, false),
+ member_image_type_ (c),
member_database_type_ (c)
{
}
@@ -384,7 +422,7 @@ namespace mysql
: object_columns_base (c),
context (c),
decl_ (false),
- member_image_type_ (c, false),
+ member_image_type_ (c),
member_database_type_ (c)
{
scope_ = "access::object_traits< " + cl.fq_name () + " >::query_type";
@@ -392,7 +430,7 @@ namespace mysql
}
void query_columns::
- composite (semantics::data_member& m)
+ composite (semantics::data_member& m, semantics::type& t)
{
string name (public_name (m));
@@ -403,7 +441,7 @@ namespace mysql
<< "struct " << name
<< "{";
- object_columns_base::composite (m);
+ object_columns_base::composite (m, t);
os << "};";
}
@@ -412,7 +450,7 @@ namespace mysql
string old_scope (scope_);
scope_ += "::" + name;
- object_columns_base::composite (m);
+ object_columns_base::composite (m, t);
scope_ = old_scope;
}