From 791b94b894f93bc037637907616efc844f3d9414 Mon Sep 17 00:00:00 2001 From: Boris Kolpackov Date: Tue, 17 Sep 2013 11:11:43 +0200 Subject: Add support for defining composite values inside persistent classes, etc --- odb/relational/header.hxx | 66 ++++++++++++++++++++++++++++++++------------ odb/relational/inline.hxx | 30 ++++++++++++++------ odb/relational/processor.cxx | 12 ++++++-- odb/relational/source.hxx | 30 ++++++++++++++------ odb/relational/validator.cxx | 35 +++++++++++++++++------ 5 files changed, 129 insertions(+), 44 deletions(-) (limited to 'odb/relational') diff --git a/odb/relational/header.hxx b/odb/relational/header.hxx index 12ed8ab..de152ca 100644 --- a/odb/relational/header.hxx +++ b/odb/relational/header.hxx @@ -1156,37 +1156,49 @@ namespace relational typedef class1 base; class1 () - : id_image_member_ ("id_"), + : typedefs_ (false), + id_image_member_ ("id_"), version_image_member_ ("version_"), discriminator_image_member_ ("discriminator_"), query_columns_type_ (false, true, false), pointer_query_columns_type_ (true, true, false) { + *this >> defines_ >> *this; + *this >> typedefs_ >> *this; } - class1 (class_ const&) + class1 (class1 const&) : root_context (), //@@ -Wextra context (), + typedefs_ (false), id_image_member_ ("id_"), version_image_member_ ("version_"), discriminator_image_member_ ("discriminator_"), query_columns_type_ (false, true, false), pointer_query_columns_type_ (true, true, false) { + *this >> defines_ >> *this; + *this >> typedefs_ >> *this; } virtual void traverse (type& c) { - if (!options.at_once () && class_file (c) != unit.file ()) + class_kind_type ck (class_kind (c)); + + if (ck == class_other || + (!options.at_once () && class_file (c) != unit.file ())) return; - if (object (c)) - traverse_object (c); - else if (view (c)) - traverse_view (c); - else if (composite (c)) - traverse_composite (c); + names (c); + + switch (ck) + { + case class_object: traverse_object (c); break; + case class_view: traverse_view (c); break; + case class_composite: traverse_composite (c); break; + default: break; + } } virtual void @@ -1219,6 +1231,9 @@ namespace relational traverse_composite (type&); private: + traversal::defines defines_; + typedefs typedefs_; + instance image_type_; instance id_image_member_; instance version_image_member_; @@ -1235,33 +1250,45 @@ namespace relational typedef class2 base; class2 () - : query_columns_type_ (false, true, false), + : typedefs_ (false), + query_columns_type_ (false, true, false), query_columns_type_inst_ (false, false, true), view_query_columns_type_ (true) { + *this >> defines_ >> *this; + *this >> typedefs_ >> *this; } - class2 (class_ const&) + class2 (class2 const&) : root_context (), //@@ -Wextra context (), + typedefs_ (false), query_columns_type_ (false, true, false), query_columns_type_inst_ (false, false, true), view_query_columns_type_ (true) { + *this >> defines_ >> *this; + *this >> typedefs_ >> *this; } virtual void traverse (type& c) { - if (!options.at_once () && class_file (c) != unit.file ()) + class_kind_type ck (class_kind (c)); + + if (ck == class_other || + (!options.at_once () && class_file (c) != unit.file ())) return; - if (object (c)) - traverse_object (c); - else if (view (c)) - traverse_view (c); - else if (composite (c)) - traverse_composite (c); + names (c); + + switch (ck) + { + case class_object: traverse_object (c); break; + case class_view: traverse_view (c); break; + case class_composite: traverse_composite (c); break; + default: break; + } } virtual void @@ -1311,6 +1338,9 @@ namespace relational } private: + traversal::defines defines_; + typedefs typedefs_; + instance query_columns_type_; instance query_columns_type_inst_; instance view_query_columns_type_; diff --git a/odb/relational/inline.hxx b/odb/relational/inline.hxx index ed5081d..95b4328 100644 --- a/odb/relational/inline.hxx +++ b/odb/relational/inline.hxx @@ -148,7 +148,8 @@ namespace relational typedef class_ base; class_ () - : get_null_base_ (true), + : typedefs_ (false), + get_null_base_ (true), get_null_member_ (true), set_null_base_ (false), set_null_member_ (false) @@ -159,6 +160,7 @@ namespace relational class_ (class_ const&) : root_context (), //@@ -Wextra context (), + typedefs_ (false), get_null_base_ (true), get_null_member_ (true), set_null_base_ (false), @@ -170,6 +172,9 @@ namespace relational void init () { + *this >> defines_ >> *this; + *this >> typedefs_ >> *this; + get_null_base_inherits_ >> get_null_base_; get_null_member_names_ >> get_null_member_; @@ -180,17 +185,23 @@ namespace relational virtual void traverse (type& c) { - if (!options.at_once () && class_file (c) != unit.file ()) + class_kind_type ck (class_kind (c)); + + if (ck == class_other || + (!options.at_once () && class_file (c) != unit.file ())) return; + names (c); + context::top_object = context::cur_object = &c; - if (object (c)) - traverse_object (c); - else if (view (c)) - traverse_view (c); - else if (composite (c)) - traverse_composite (c); + switch (ck) + { + case class_object: traverse_object (c); break; + case class_view: traverse_view (c); break; + case class_composite: traverse_composite (c); break; + default: break; + } context::top_object = context::cur_object = 0; } @@ -640,6 +651,9 @@ namespace relational } private: + traversal::defines defines_; + typedefs typedefs_; + instance get_null_base_; traversal::inherits get_null_base_inherits_; instance get_null_member_; diff --git a/odb/relational/processor.cxx b/odb/relational/processor.cxx index 231e4f0..633f4b0 100644 --- a/odb/relational/processor.cxx +++ b/odb/relational/processor.cxx @@ -992,8 +992,12 @@ namespace relational struct class_: traversal::class_, context { class_ () + : typedefs_ (true) { - *this >> member_names_ >> member_; + *this >> defines_ >> *this; + *this >> typedefs_ >> *this; + + member_names_ >> member_; } virtual void @@ -1004,7 +1008,8 @@ namespace relational if (k == class_other) return; - names (c); + names (c); // Process nested classes. + names (c, member_names_); if (k == class_object) traverse_object (c); @@ -1537,6 +1542,9 @@ namespace relational private: cxx_string_lexer lex_; + traversal::defines defines_; + typedefs typedefs_; + data_member member_; traversal::names member_names_; }; diff --git a/odb/relational/source.hxx b/odb/relational/source.hxx index ded4781..d4bc7a8 100644 --- a/odb/relational/source.hxx +++ b/odb/relational/source.hxx @@ -5294,7 +5294,8 @@ namespace relational typedef class_ base; class_ () - : query_columns_type_ (false, false, false), + : typedefs_ (false), + query_columns_type_ (false, false, false), view_query_columns_type_ (false), grow_base_ (index_), grow_member_ (index_), @@ -5318,6 +5319,7 @@ namespace relational class_ (class_ const&) : root_context (), //@@ -Wextra context (), + typedefs_ (false), query_columns_type_ (false, false, false), view_query_columns_type_ (false), grow_base_ (index_), @@ -5342,6 +5344,9 @@ namespace relational void init () { + *this >> defines_ >> *this; + *this >> typedefs_ >> *this; + if (generate_grow) { grow_base_inherits_ >> grow_base_; @@ -5379,17 +5384,23 @@ namespace relational virtual void traverse (type& c) { - if (!options.at_once () && class_file (c) != unit.file ()) + class_kind_type ck (class_kind (c)); + + if (ck == class_other || + (!options.at_once () && class_file (c) != unit.file ())) return; + names (c); + context::top_object = context::cur_object = &c; - if (object (c)) - traverse_object (c); - else if (view (c)) - traverse_view (c); - else if (composite (c)) - traverse_composite (c); + switch (ck) + { + case class_object: traverse_object (c); break; + case class_view: traverse_view (c); break; + case class_composite: traverse_composite (c); break; + default: break; + } context::top_object = context::cur_object = 0; } @@ -5692,6 +5703,9 @@ namespace relational } private: + traversal::defines defines_; + typedefs typedefs_; + instance query_columns_type_; instance view_query_columns_type_; diff --git a/odb/relational/validator.cxx b/odb/relational/validator.cxx index 2a8e04e..c620a58 100644 --- a/odb/relational/validator.cxx +++ b/odb/relational/validator.cxx @@ -237,27 +237,43 @@ namespace relational { class2 (bool& valid) : valid_ (valid), + typedefs_ (true), data_member_ (valid), object_no_id_members_ (valid), composite_id_members_ (valid), view_members_ (valid) { - *this >> data_member_names_ >> data_member_; + *this >> defines_ >> *this; + *this >> typedefs_ >> *this; + + data_member_names_ >> data_member_; } virtual void traverse (type& c) { - if (object (c)) + class_kind_type ck (class_kind (c)); + switch (ck) + { + case class_object: + names (c); traverse_object (c); - else if (view (c)) + break; + case class_view: + names (c); traverse_view (c); - else if (composite (c)) + break; + case class_composite: + names (c); traverse_composite (c); + break; + case class_other: + break; + } // Make sure indexes are not defined for anything other than objects. // - if (c.count ("index") && !object (c)) + if (c.count ("index") && ck != class_object) { indexes& ins (c.get ("index")); @@ -331,7 +347,7 @@ namespace relational } } - names (c); + names (c, data_member_names_); // Validate indexes. // @@ -373,18 +389,21 @@ namespace relational // view_members_.traverse (c); - names (c); + names (c, data_member_names_); } virtual void traverse_composite (type& c) { - names (c); + names (c, data_member_names_); } public: bool& valid_; + traversal::defines defines_; + typedefs typedefs_; + data_member2 data_member_; traversal::names data_member_names_; -- cgit v1.1