diff options
author | Boris Kolpackov <boris@codesynthesis.com> | 2012-02-17 10:08:18 +0200 |
---|---|---|
committer | Boris Kolpackov <boris@codesynthesis.com> | 2012-02-22 12:29:43 +0200 |
commit | 3a1eed21d4d5d0e7f6a9f400420fdc28d7be9b61 (patch) | |
tree | 97ba7338fb804c264c9eaaaa41085b08f6483c68 /odb/relational/mysql/source.cxx | |
parent | 3f73cc933b64d7d9a88325d33a3c33a0e28720c6 (diff) |
Add support for composite object ids
New pragma id_type (member). New test: common/composite-id. The composite
example has also been updated.
Diffstat (limited to 'odb/relational/mysql/source.cxx')
-rw-r--r-- | odb/relational/mysql/source.cxx | 361 |
1 files changed, 40 insertions, 321 deletions
diff --git a/odb/relational/mysql/source.cxx b/odb/relational/mysql/source.cxx index 91b3061..3a784af 100644 --- a/odb/relational/mysql/source.cxx +++ b/odb/relational/mysql/source.cxx @@ -68,7 +68,6 @@ namespace relational virtual void column (semantics::data_member& m, - string const& key_prefix, string const& table, string const& column) { @@ -110,10 +109,12 @@ namespace relational // to value_traits. // + string type (column_type ()); + if (sk_ != statement_select || - column_sql_type (m, key_prefix).type != sql_type::ENUM) + parse_sql_type (type, m).type != sql_type::ENUM) { - base::column (m, key_prefix, table, column); + base::column (m, table, column); return; } @@ -140,7 +141,8 @@ namespace relational r += ")"; - sc_.push_back (relational::statement_column (r, m, key_prefix)); + sc_.push_back ( + relational::statement_column (r, type, m, key_prefix_)); } }; entry<object_columns> object_columns_; @@ -154,7 +156,9 @@ namespace relational { // The same idea as in object_columns. // - if (column_sql_type (m).type != sql_type::ENUM) + string type (column_type ()); + + if (parse_sql_type (type, m).type != sql_type::ENUM) { base::column (m, column); return; @@ -168,7 +172,7 @@ namespace relational r += column; r += ")"; - sc_.push_back (relational::statement_column (r, m)); + sc_.push_back (relational::statement_column (r, type, m)); } }; entry<view_columns> view_columns_; @@ -568,188 +572,37 @@ namespace relational // init image // - struct init_image_member: relational::init_image_member, member_base + struct init_image_member: relational::init_image_member_impl<sql_type>, + member_base { init_image_member (base const& x) - : member_base::base (x), // virtual base - base (x), - member_base (x), - member_database_type_id_ (base::type_override_, - base::fq_type_override_, - base::key_prefix_) + : member_base::base (x), // virtual base + member_base::base_impl (x), // virtual base + base_impl (x), + member_base (x) { } - virtual bool - pre (member_info& mi) - { - // Ignore containers (they get their own table) and inverse - // object pointers (they are not present in this binding). - // - if (container (mi) || inverse (mi.m, key_prefix_)) - return false; - - if (!member_override_.empty ()) - member = member_override_; - else - { - // If we are generating standard init() and this member - // contains version, ignore it. - // - if (version (mi.m)) - return false; - - string const& name (mi.m.name ()); - member = "o." + name; - - os << "// " << name << endl - << "//" << endl; - - // If the whole class is readonly, then we will never be - // called with sk == statement_update. - // - if (!readonly (*context::top_object)) - { - semantics::class_* c; - - if (id (mi.m) || - readonly (mi.m) || - ((c = composite (mi.t)) && readonly (*c))) - os << "if (sk == statement_insert)"; - } - } - - // If this is a wrapped composite value, then we need to - // "unwrap" it. For simple values this is taken care of - // by the value_traits specializations. - // - if (mi.wrapper != 0 && composite (mi.t)) - { - // Here we need the wrapper type, not the wrapped type. - // - member = "wrapper_traits< " + mi.fq_type (false) + " >::" + - "get_ref (" + member + ")"; - } - - if (composite (mi.t)) - { - os << "{"; - traits = "composite_value_traits< " + mi.fq_type () + " >"; - } - else - { - // When handling a pointer, mi.t is the id type of the referenced - // object. - // - semantics::type& mt (member_utype (mi.m, key_prefix_)); - - if (semantics::class_* c = object_pointer (mt)) - { - type = "obj_traits::id_type"; - db_type_id = member_database_type_id_.database_type_id (mi.m); - - // Handle NULL pointers and extract the id. - // - os << "{" - << "typedef object_traits< " << class_fq_name (*c) << - " > obj_traits;"; - - if (weak_pointer (mt)) - { - os << "typedef pointer_traits< " << mi.fq_type () << - " > wptr_traits;" - << "typedef pointer_traits< wptr_traits::" << - "strong_pointer_type > ptr_traits;" - << endl - << "wptr_traits::strong_pointer_type sp (" << - "wptr_traits::lock (" << member << "));"; - - member = "sp"; - } - else - os << "typedef pointer_traits< " << mi.fq_type () << - " > ptr_traits;" - << endl; - - os << "bool is_null (ptr_traits::null_ptr (" << member << "));" - << "if (!is_null)" - << "{" - << "const " << type << "& id (" << endl; - - if (lazy_pointer (mt)) - os << "ptr_traits::object_id< ptr_traits::element_type > (" << - member << ")"; - else - os << "obj_traits::id (ptr_traits::get_ref (" << member << "))"; - - os << ");" - << endl; - - member = "id"; - } - else - { - type = mi.fq_type (); - db_type_id = member_database_type_id_.database_type_id (mi.m); - - os << "{" - << "bool is_null;"; - } - - traits = "mysql::value_traits<\n " - + type + ",\n " - + db_type_id + " >"; - } - - return true; - } - virtual void - post (member_info& mi) + set_null (member_info& mi) { - if (composite (mi.t)) - os << "}"; - else - { - // When handling a pointer, mi.t is the id type of the referenced - // object. - // - if (object_pointer (member_utype (mi.m, key_prefix_))) - { - os << "}"; - - if (!null (mi.m, key_prefix_)) - os << "else" << endl - << "throw null_pointer ();"; - } - - os << "i." << mi.var << "null = is_null;" - << "}"; - } - } - - virtual void - traverse_composite (member_info& mi) - { - os << "if (" << traits << "::init (" << endl - << "i." << mi.var << "value," << endl - << member << "," << endl - << "sk))" << endl - << "grew = true;"; + os << "i." << mi.var << "null = 1;"; } virtual void traverse_integer (member_info& mi) { os << traits << "::set_image (" << endl - << "i." << mi.var << "value, is_null, " << member << ");"; + << "i." << mi.var << "value, is_null, " << member << ");" + << "i." << mi.var << "null = is_null;"; } virtual void traverse_float (member_info& mi) { os << traits << "::set_image (" << endl - << "i." << mi.var << "value, is_null, " << member << ");"; + << "i." << mi.var << "value, is_null, " << member << ");" + << "i." << mi.var << "null = is_null;"; } virtual void @@ -764,6 +617,7 @@ namespace relational << "size," << endl << "is_null," << endl << member << ");" + << "i." << mi.var << "null = is_null;" << "i." << mi.var << "size = static_cast<unsigned long> (size);" << "grew = grew || (cap != i." << mi.var << "value.capacity ());"; } @@ -772,7 +626,8 @@ namespace relational traverse_date_time (member_info& mi) { os << traits << "::set_image (" << endl - << "i." << mi.var << "value, is_null, " << member << ");"; + << "i." << mi.var << "value, is_null, " << member << ");" + << "i." << mi.var << "null = is_null;"; } virtual void @@ -787,6 +642,7 @@ namespace relational << "size," << endl << "is_null," << endl << member << ");" + << "i." << mi.var << "null = is_null;" << "i." << mi.var << "size = static_cast<unsigned long> (size);" << "grew = grew || (cap != i." << mi.var << "value.capacity ());"; } @@ -801,6 +657,7 @@ namespace relational << "size," << endl << "is_null," << endl << member << ");" + << "i." << mi.var << "null = is_null;" << "i." << mi.var << "size = static_cast<unsigned long> (size);" << "grew = grew || (cap != i." << mi.var << "value.capacity ());"; } @@ -817,6 +674,7 @@ namespace relational << "size," << endl << "is_null," << endl << member << ");" + << "i." << mi.var << "null = is_null;" << "i." << mi.var << "size = static_cast<unsigned long> (size);"; } @@ -830,7 +688,9 @@ namespace relational << "i." << mi.var << "size," << endl << "is_null," << endl << member << "))" << endl - << "grew = true;"; + << "grew = true;" + << endl + << "i." << mi.var << "null = is_null;"; } virtual void @@ -845,17 +705,10 @@ namespace relational << "size," << endl << "is_null," << endl << member << ");" + << "i." << mi.var << "null = is_null;" << "i." << mi.var << "size = static_cast<unsigned long> (size);" << "grew = grew || (cap != i." << mi.var << "value.capacity ());"; } - - private: - string type; - string db_type_id; - string member; - string traits; - - member_database_type_id member_database_type_id_; }; entry<init_image_member> init_image_member_; @@ -863,147 +716,21 @@ namespace relational // init value // - struct init_value_member: relational::init_value_member, member_base + struct init_value_member: relational::init_value_member_impl<sql_type>, + member_base { init_value_member (base const& x) - : member_base::base (x), // virtual base - base (x), - member_base (x), - member_database_type_id_ (base::type_override_, - base::fq_type_override_, - base::key_prefix_) - { - } - - virtual bool - pre (member_info& mi) - { - if (container (mi)) - return false; - - if (!member_override_.empty ()) - member = member_override_; - else - { - string const& name (mi.m.name ()); - member = "o." + name; - - if (mi.cq) - member = "const_cast< " + mi.fq_type (false) + "& > (" + - member + ")"; - - os << "// " << name << endl - << "//" << endl; - } - - // If this is a wrapped composite value, then we need to - // "unwrap" it. For simple values this is taken care of - // by the value_traits specializations. - // - if (mi.wrapper != 0 && composite (mi.t)) - { - // Here we need the wrapper type, not the wrapped type. - // - member = "wrapper_traits< " + mi.fq_type (false) + " >::" + - "set_ref (\n" + member + ")"; - } - - if (composite (mi.t)) - traits = "composite_value_traits< " + mi.fq_type () + " >"; - else - { - // When handling a pointer, mi.t is the id type of the referenced - // object. - // - semantics::type& mt (member_utype (mi.m, key_prefix_)); - - if (semantics::class_* c = object_pointer (mt)) - { - type = "obj_traits::id_type"; - db_type_id = member_database_type_id_.database_type_id (mi.m); - - // Handle NULL pointers and extract the id. - // - os << "{" - << "typedef object_traits< " << class_fq_name (*c) << - " > obj_traits;" - << "typedef pointer_traits< " << mi.fq_type () << - " > ptr_traits;" - << endl - << "if (i." << mi.var << "null)" << endl; - - if (null (mi.m, key_prefix_)) - os << member << " = ptr_traits::pointer_type ();"; - else - os << "throw null_pointer ();"; - - os << "else" - << "{" - << type << " id;"; - - member = "id"; - } - else - { - type = mi.fq_type (); - db_type_id = member_database_type_id_.database_type_id (mi.m); - } - - traits = "mysql::value_traits<\n " - + type + ",\n " - + db_type_id + " >"; - } - - return true; - } - - virtual void - post (member_info& mi) + : member_base::base (x), // virtual base + member_base::base_impl (x), // virtual base + base_impl (x), + member_base (x) { - if (composite (mi.t)) - return; - - // When handling a pointer, mi.t is the id type of the referenced - // object. - // - semantics::type& mt (member_utype (mi.m, key_prefix_)); - - if (object_pointer (mt)) - { - if (!member_override_.empty ()) - member = member_override_; - else - { - member = "o." + mi.m.name (); - - if (mi.cq) - member = "const_cast< " + mi.fq_type (false) + "& > (" + - member + ")"; - } - - if (lazy_pointer (mt)) - os << member << " = ptr_traits::pointer_type (db, id);"; - else - os << "// If a compiler error points to the line below, then" << endl - << "// it most likely means that a pointer used in a member" << endl - << "// cannot be initialized from an object pointer." << endl - << "//" << endl - << member << " = ptr_traits::pointer_type (" << endl - << "db.load< obj_traits::object_type > (id));"; - - os << "}" - << "}"; - } } virtual void - traverse_composite (member_info& mi) + get_null (member_info& mi) { - os << traits << "::init (" << endl - << member << "," << endl - << "i." << mi.var << "value," << endl - << "db);" - << endl; + os << "i." << mi.var << "null"; } virtual void @@ -1107,14 +834,6 @@ namespace relational << "i." << mi.var << "null);" << endl; } - - private: - string type; - string db_type_id; - string traits; - string member; - - member_database_type_id member_database_type_id_; }; entry<init_value_member> init_value_member_; |