aboutsummaryrefslogtreecommitdiff
path: root/odb/relational/source.hxx
diff options
context:
space:
mode:
Diffstat (limited to 'odb/relational/source.hxx')
-rw-r--r--odb/relational/source.hxx42
1 files changed, 32 insertions, 10 deletions
diff --git a/odb/relational/source.hxx b/odb/relational/source.hxx
index 6546670..7d0c079 100644
--- a/odb/relational/source.hxx
+++ b/odb/relational/source.hxx
@@ -773,7 +773,7 @@ namespace relational
{
instance<object_columns> t (table, false, false);
- if (semantics::class_* ckt = comp_value (*kt))
+ if (semantics::class_* ckt = comp_value_wrapper (*kt))
t->traverse_composite (m, *ckt, "key", "key");
else
{
@@ -792,7 +792,7 @@ namespace relational
instance<object_columns> t (table, false);
- if (semantics::class_* cvt = comp_value (vt))
+ if (semantics::class_* cvt = comp_value_wrapper (vt))
t->traverse_composite (m, *cvt, "value", "value");
else
{
@@ -849,7 +849,7 @@ namespace relational
{
instance<object_columns> t (false, false);
- if (semantics::class_* ckt = comp_value (*kt))
+ if (semantics::class_* ckt = comp_value_wrapper (*kt))
t->traverse_composite (m, *ckt, "key", "key");
else
{
@@ -867,7 +867,7 @@ namespace relational
instance<object_columns> t (false);
- if (semantics::class_* cvt = comp_value (vt))
+ if (semantics::class_* cvt = comp_value_wrapper (vt))
t->traverse_composite (m, *cvt, "value", "value");
else
{
@@ -1025,7 +1025,7 @@ namespace relational
instance<bind_member> bm ("key_", "d", *kt, "key_type", "key");
bm->traverse (m);
- if (semantics::class_* c = comp_value (*kt))
+ if (semantics::class_* c = comp_value_wrapper (*kt))
os << "n += " << in_column_count (*c) << "UL;"
<< endl;
else
@@ -1689,12 +1689,16 @@ namespace relational
};
container_calls (call_type call)
- : object_members_base (true, false), call_ (call)
+ : object_members_base (true, false),
+ call_ (call),
+ obj_prefix_ ("obj.")
{
}
virtual void
- composite (semantics::data_member* m, semantics::class_& c)
+ composite_wrapper (semantics::data_member* m,
+ semantics::class_& c,
+ semantics::type* w)
{
if (m == 0)
{
@@ -1704,7 +1708,25 @@ namespace relational
string old (obj_prefix_);
obj_prefix_ += m->name ();
+
+ // If this is a wrapped composite value, then we need to
+ // "unwrap" it.
+ //
+ if (w != 0)
+ {
+ // Because we cannot have nested containers, m.type () should
+ // be the same as w.
+ //
+ assert (m != 0 && &m->type () == w);
+ string const& type (m->type ().fq_name (m->belongs ().hint ()));
+
+ obj_prefix_ = "wrapper_traits< " + type + " >::" +
+ (call_ == load_call ? "set_ref" : "get_ref") +
+ " (" + obj_prefix_ + ")";
+ }
+
obj_prefix_ += '.';
+
object_members_base::composite (m, c);
obj_prefix_ = old;
}
@@ -1727,7 +1749,7 @@ namespace relational
{
if (!inverse)
os << traits << "::persist (" << endl
- << "obj." << obj_name << "," << endl
+ << obj_name << "," << endl
<< "idb," << endl
<< "sts.container_statment_cache ()." << sts_name << ");"
<< endl;
@@ -1736,7 +1758,7 @@ namespace relational
case load_call:
{
os << traits << "::load (" << endl
- << "obj." << obj_name << "," << endl
+ << obj_name << "," << endl
<< "idb," << endl
<< "sts.container_statment_cache ()." << sts_name << ");"
<< endl;
@@ -1746,7 +1768,7 @@ namespace relational
{
if (!inverse)
os << traits << "::update (" << endl
- << "obj." << obj_name << "," << endl
+ << obj_name << "," << endl
<< "idb," << endl
<< "sts.container_statment_cache ()." << sts_name << ");"
<< endl;