aboutsummaryrefslogtreecommitdiff
path: root/odb/mysql
diff options
context:
space:
mode:
authorBoris Kolpackov <boris@codesynthesis.com>2010-12-09 10:36:15 +0200
committerBoris Kolpackov <boris@codesynthesis.com>2010-12-09 10:36:15 +0200
commit5adda85ed10d9196f4d68cc4b8fee12f6ba9cfec (patch)
tree8a97d998dd8de5a4c2dbda8a171fabbf54af6c4e /odb/mysql
parent5789a4f7c5cee94df29e37fd1c2f7c1d9e883002 (diff)
Add lazy pointer support
Built-in support is provided for raw, auto, and tr1 shared/weak pointers. New test: common/lazy-ptr.
Diffstat (limited to 'odb/mysql')
-rw-r--r--odb/mysql/common.cxx4
-rw-r--r--odb/mysql/schema.cxx2
-rw-r--r--odb/mysql/source.cxx87
3 files changed, 70 insertions, 23 deletions
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.