From 5adda85ed10d9196f4d68cc4b8fee12f6ba9cfec Mon Sep 17 00:00:00 2001 From: Boris Kolpackov Date: Thu, 9 Dec 2010 10:36:15 +0200 Subject: Add lazy pointer support Built-in support is provided for raw, auto, and tr1 shared/weak pointers. New test: common/lazy-ptr. --- odb/mysql/common.cxx | 4 +-- odb/mysql/schema.cxx | 2 +- odb/mysql/source.cxx | 87 ++++++++++++++++++++++++++++++++++++++++------------ 3 files changed, 70 insertions(+), 23 deletions(-) (limited to 'odb/mysql') diff --git a/odb/mysql/common.cxx b/odb/mysql/common.cxx index 3cec95c..830407d 100644 --- a/odb/mysql/common.cxx +++ b/odb/mysql/common.cxx @@ -55,7 +55,7 @@ namespace mysql { sql_type const& st (db_type (m, key_prefix_)); - if (semantics::class_* c = object_pointer (m, key_prefix_)) + if (semantics::class_* c = object_pointer (t)) { member_info mi (m, id_member (*c).type (), var, fq_type_override_); mi.st = &st; @@ -490,7 +490,7 @@ namespace mysql { string name (public_name (m)); - if (semantics::class_* c = object_pointer (m)) + if (semantics::class_* c = object_pointer (m.type ())) { // We cannot just typedef the query_type from the referenced // object for two reasons: (1) it may not be defined yet and diff --git a/odb/mysql/schema.cxx b/odb/mysql/schema.cxx index e02dde6..f99cf40 100644 --- a/odb/mysql/schema.cxx +++ b/odb/mysql/schema.cxx @@ -40,7 +40,7 @@ namespace mysql os << " PRIMARY KEY"; using semantics::class_; - if (class_* c = object_pointer (m, prefix_)) + if (class_* c = object_pointer (member_type (m, prefix_))) { os << " REFERENCES `" << table_name (*c) << "` (`" << column_name (id_member (*c)) << "`)"; diff --git a/odb/mysql/source.cxx b/odb/mysql/source.cxx index e09cbc3..3841208 100644 --- a/odb/mysql/source.cxx +++ b/odb/mysql/source.cxx @@ -65,7 +65,7 @@ namespace mysql // if (im != 0) { - semantics::class_* c (object_pointer (m)); + semantics::class_* c (object_pointer (m.type ())); if (container (im->type ())) { @@ -140,7 +140,7 @@ namespace mysql virtual bool column (semantics::data_member& m, string const& col_name, bool) { - semantics::class_* c (object_pointer (m)); + semantics::class_* c (object_pointer (m.type ())); if (c == 0) return true; @@ -758,7 +758,12 @@ namespace mysql traits = "composite_value_traits< " + mi.fq_type () + " >"; else { - if (semantics::class_* c = object_pointer (mi.m, key_prefix_)) + // When handling a pointer, mi.t is the id type of the referenced + // object. + // + semantics::type& mt (member_type (mi.m, key_prefix_)); + + if (semantics::class_* c = object_pointer (mt)) { type = "obj_traits::id_type"; image_type = member_image_type_.image_type (mi.m); @@ -768,15 +773,37 @@ namespace mysql // os << "{" << "typedef object_traits< " << c->fq_name () << - " > obj_traits;" - << "typedef pointer_traits< " << mi.fq_type () << + " > 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 - << "bool is_null (ptr_traits::null_ptr (" << member << "));" + << endl; + + os << "bool is_null (ptr_traits::null_ptr (" << member << "));" << "if (!is_null)" << "{" - << "const " << type << "& id (" << endl - << "obj_traits::id (ptr_traits::get_ref (" << member << ")));" + << "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"; @@ -805,7 +832,10 @@ namespace mysql { if (!comp_value (mi.t)) { - if (object_pointer (mi.m, key_prefix_)) + // When handling a pointer, mi.t is the id type of the referenced + // object. + // + if (object_pointer (member_type (mi.m, key_prefix_))) { os << "}"; @@ -1029,7 +1059,12 @@ namespace mysql traits = "composite_value_traits< " + mi.fq_type () + " >"; else { - if (semantics::class_* c = object_pointer (mi.m, key_prefix_)) + // When handling a pointer, mi.t is the id type of the referenced + // object. + // + semantics::type& mt (member_type (mi.m, key_prefix_)); + + if (semantics::class_* c = object_pointer (mt)) { type = "obj_traits::id_type"; image_type = member_image_type_.image_type (mi.m); @@ -1075,19 +1110,31 @@ namespace mysql virtual void post (member_info& mi) { - if (!comp_value (mi.t) && object_pointer (mi.m, key_prefix_)) + if (comp_value (mi.t)) + return; + + // When handling a pointer, mi.t is the id type of the referenced + // object. + // + semantics::type& mt (member_type (mi.m, key_prefix_)); + + if (object_pointer (mt)) { member = member_override_.empty () ? "o." + mi.m.name () : member_override_; - 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< ptr_traits::element_type > (id));" - << "}" + 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< ptr_traits::element_type > (id));"; + + os << "}" << "}"; } } @@ -1316,7 +1363,7 @@ namespace mysql if (inverse) { - semantics::class_* c (object_pointer (m, "value")); + semantics::class_* c (object_pointer (vt)); string inv_table; // Other table name. string inv_id; // Other id column. -- cgit v1.1