From ce696c26d2c9dd5a5813fd865082ab19ac49bcfa Mon Sep 17 00:00:00 2001 From: Boris Kolpackov Date: Sat, 6 Nov 2010 18:05:19 +0200 Subject: Add support for container persistence --- odb/mysql/common.cxx | 158 ++++++++++++++++++++++++++++++++------------------- 1 file changed, 98 insertions(+), 60 deletions(-) (limited to 'odb/mysql/common.cxx') 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; } -- cgit v1.1