aboutsummaryrefslogtreecommitdiff
path: root/odb/relational
diff options
context:
space:
mode:
authorBoris Kolpackov <boris@codesynthesis.com>2015-06-15 12:36:53 +0200
committerBoris Kolpackov <boris@codesynthesis.com>2015-06-15 12:36:53 +0200
commite78db08d98d5adb4dee3006eea8c3569e383c562 (patch)
tree4df1473c158d69ee7b53c75cc61f1a282b72da99 /odb/relational
parentbbc39ffe31c67506b4c03fc56fa3adcb925b6325 (diff)
Add points_to pragma
Currently does not support containers.
Diffstat (limited to 'odb/relational')
-rw-r--r--odb/relational/model.hxx96
-rw-r--r--odb/relational/validator.cxx4
2 files changed, 73 insertions, 27 deletions
diff --git a/odb/relational/model.hxx b/odb/relational/model.hxx
index 94f093a..77631e2 100644
--- a/odb/relational/model.hxx
+++ b/odb/relational/model.hxx
@@ -237,9 +237,6 @@ namespace relational
virtual void
traverse_pointer (semantics::data_member& m, semantics::class_& c)
{
- using sema_rel::column;
- using sema_rel::foreign_key;
-
// Ignore inverse object pointers.
//
if (inverse (m, key_prefix_))
@@ -254,6 +251,76 @@ namespace relational
return;
}
+ // Get the position of the last column.
+ //
+ sema_rel::table::names_iterator i (table_.names_end ());
+
+ while (i != table_.names_begin ())
+ {
+ --i;
+ if (i->nameable ().is_a<sema_rel::column> ())
+ break;
+ }
+
+ // Traverse the object pointer as columns.
+ //
+ object_columns_base::traverse_pointer (m, c);
+
+ // Get to the first column that we have added.
+ //
+ if (i != table_.names_end ())
+ ++i; // Next column.
+ else
+ i = table_.names_begin ();
+
+ foreign_key (m, c, i);
+ }
+
+ virtual void
+ traverse_points_to (semantics::data_member& m, semantics::class_& c)
+ {
+ if (deleted (member_path_))
+ {
+ // Still traverse it as columns so that we can populate the
+ // deleted map.
+ //
+ object_columns_base::traverse_points_to (m, c);
+ return;
+ }
+
+ // Get the position of the last column.
+ //
+ sema_rel::table::names_iterator i (table_.names_end ());
+
+ while (i != table_.names_begin ())
+ {
+ --i;
+ if (i->nameable ().is_a<sema_rel::column> ())
+ break;
+ }
+
+ // Traverse the data member as columns.
+ //
+ object_columns_base::traverse_points_to (m, c);
+
+ // Get to the first column that we have added.
+ //
+ if (i != table_.names_end ())
+ ++i; // Next column.
+ else
+ i = table_.names_begin ();
+
+ foreign_key (m, c, i);
+ }
+
+ virtual void
+ foreign_key (semantics::data_member& m,
+ semantics::class_& c,
+ sema_rel::table::names_iterator i)
+ {
+ using sema_rel::column;
+ using sema_rel::foreign_key;
+
string id (id_prefix_ +
(key_prefix_.empty () ? m.name () : key_prefix_));
@@ -287,29 +354,8 @@ namespace relational
simple = (fk.referenced_columns ().size () == 1);
}
- // Get the position of the last column.
+ // Get referencing columns.
//
- sema_rel::table::names_iterator i (table_.names_end ());
-
- while (i != table_.names_begin ())
- {
- --i;
-
- if (i->nameable ().is_a<column> ())
- break;
- }
-
- // Traverse the object pointer as columns.
- //
- object_columns_base::traverse_pointer (m, c);
-
- // Add the newly added columns to the foreign key.
- //
- if (i != table_.names_end ())
- ++i;
- else
- i = table_.names_begin ();
-
for (; i != table_.names_end (); ++i)
{
if (column* c = dynamic_cast<column*> (&i->nameable ()))
diff --git a/odb/relational/validator.cxx b/odb/relational/validator.cxx
index 47f089c..3b867f8 100644
--- a/odb/relational/validator.cxx
+++ b/odb/relational/validator.cxx
@@ -59,9 +59,9 @@ namespace relational
const char* kp (container (m) ? "value" : "");
location l (m.location ());
- // Make sure it is a pointer.
+ // Make sure it is a pointer or a member with points_to pragma.
//
- if (!object_pointer (member_utype (m, kp)))
+ if (!object_pointer (member_utype (m, kp)) && !points_to (m))
{
error (l) << "on_delete specified for non-object pointer" << endl;
valid_ = false;