From e78db08d98d5adb4dee3006eea8c3569e383c562 Mon Sep 17 00:00:00 2001 From: Boris Kolpackov Date: Mon, 15 Jun 2015 12:36:53 +0200 Subject: Add points_to pragma Currently does not support containers. --- odb/relational/model.hxx | 96 ++++++++++++++++++++++++++++++++------------ odb/relational/validator.cxx | 4 +- 2 files changed, 73 insertions(+), 27 deletions(-) (limited to 'odb/relational') 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 ()) + 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 ()) + 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 ()) - 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 (&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; -- cgit v1.1