From d01c8e22abea35477f21488613f2474a2e4e8fc7 Mon Sep 17 00:00:00 2001 From: Boris Kolpackov Date: Wed, 7 Nov 2012 09:48:11 +0200 Subject: Generate query tags in object_traits for dynamic multi-database support --- odb/common.hxx | 94 +++++++++++++++++++++++++++++++++++++++++++++++ odb/header.cxx | 24 ++++++++++++ odb/relational/header.cxx | 41 ++++++--------------- odb/relational/header.hxx | 56 ---------------------------- 4 files changed, 129 insertions(+), 86 deletions(-) (limited to 'odb') diff --git a/odb/common.hxx b/odb/common.hxx index 082d78f..b351d3d 100644 --- a/odb/common.hxx +++ b/odb/common.hxx @@ -426,4 +426,98 @@ private: bool included_; }; +// Generate query tags for object pointers. +// +struct query_tags: object_columns_base, virtual context +{ + typedef query_tags base; + + query_tags (): nl_ (false) {} + + virtual void + traverse (semantics::class_& c) + { + if (object (c)) + { + object_columns_base::traverse (c); + } + else if (c.get ("object-count") != 0) // View. + { + view_objects& objs (c.get ("objects")); + + for (view_objects::const_iterator i (objs.begin ()); + i < objs.end (); + ++i) + { + if (i->kind != view_object::object) + continue; // Skip tables. + + if (i->alias.empty ()) + continue; + + generate (i->alias); + } + } + + if (nl_) + os << endl; + } + + virtual void + traverse_object (semantics::class_& c) + { + names (c); // We don't want to traverse bases. + } + + virtual void + traverse_composite (semantics::data_member* m, semantics::class_& c) + { + // Base type. + // + if (m == 0) + { + object_columns_base::traverse_composite (m, c); + return; + } + + // Don't generate an empty struct if we don't have any pointers. + // + if (!has_a (c, test_pointer)) + return; + + if (nl_) + os << endl; + + os << "struct " << public_name (*m) << "_tag" + << "{"; + + object_columns_base::traverse_composite (m, c); + + os << "};"; + + nl_ = false; + } + + virtual void + traverse_pointer (semantics::data_member& m, semantics::class_&) + { + // Ignore polymorphic id references. + // + if (m.count ("polymorphic-ref")) + return; + + generate (public_name (m)); + } + + virtual void + generate (string const& name) + { + os << "struct " << name << "_tag;"; + nl_ = true; + } + +private: + bool nl_; +}; + #endif // ODB_COMMON_HXX diff --git a/odb/header.cxx b/odb/header.cxx index 7e0a377..66248d2 100644 --- a/odb/header.cxx +++ b/odb/header.cxx @@ -203,6 +203,21 @@ traverse_object (type& c) << endl; } + // Query. + // + if (options.generate_query ()) + { + // Generate object pointer tags here if we are generating dynamic + // multi-database support. + // + if (options.multi_database () == multi_database::dynamic && + has_a (c, test_pointer | exclude_base)) + { + query_tags t; + t.traverse (c); + } + } + // The rest does not apply to reuse-abstract objects. // if (reuse_abst) @@ -410,6 +425,15 @@ traverse_view (type& c) << "typedef " << c.get ("object-pointer") << " pointer_type;" << endl; + // Generate associated object tags here if we are generating dynamic + // multi-database support. + // + if (options.multi_database () == multi_database::dynamic) + { + query_tags t; + t.traverse (c); + } + // callback () // os << "static void" << endl diff --git a/odb/relational/header.cxx b/odb/relational/header.cxx index 3c9cd5a..099dc33 100644 --- a/odb/relational/header.cxx +++ b/odb/relational/header.cxx @@ -152,13 +152,14 @@ traverse_object (type& c) if (options.generate_query ()) { - // Generate object pointer tags. + // Generate object pointer tags here unless we are generating dynamic + // multi-database support, in which case they generated in object_traits. // - if (has_a (c, test_pointer | exclude_base)) + if (options.multi_database () != multi_database::dynamic && + has_a (c, test_pointer | exclude_base)) { - instance t; - t->traverse (c); - os << endl; + query_tags t; // Not customizable. + t.traverse (c); } } @@ -673,33 +674,13 @@ traverse_view (type& c) // Query. // - // Generate associated object tags. + // Generate associated object tags here unless we are generating dynamic + // multi-database support, in which case they generated in object_traits. // - if (obj_count != 0) + if (options.multi_database () != multi_database::dynamic) { - view_objects& objs (c.get ("objects")); - - { - instance t; - - bool gen (false); - for (view_objects::const_iterator i (objs.begin ()); - i < objs.end (); - ++i) - { - if (i->kind != view_object::object) - continue; // Skip tables. - - if (i->alias.empty ()) - continue; - - t->generate (i->alias); - gen = true; - } - - if (gen) - os << endl; - } + query_tags t; // Not customizable. + t.traverse (c); } // query_base_type and query_columns (definition generated by class2). diff --git a/odb/relational/header.hxx b/odb/relational/header.hxx index c2bf73e..1ca87c6 100644 --- a/odb/relational/header.hxx +++ b/odb/relational/header.hxx @@ -142,62 +142,6 @@ namespace relational }; // - // query_tags - // - - struct query_tags: object_columns_base, virtual context - { - typedef query_tags base; - - virtual void - traverse_object (semantics::class_& c) - { - names (c); // We don't want to traverse bases. - } - - virtual void - traverse_composite (semantics::data_member* m, semantics::class_& c) - { - // Base type. - // - if (m == 0) - { - object_columns_base::traverse_composite (m, c); - return; - } - - // Don't generate an empty struct if we don't have any pointers. - // - if (!has_a (c, test_pointer)) - return; - - os << "struct " << public_name (*m) << "_tag" - << "{"; - - object_columns_base::traverse_composite (m, c); - - os << "};"; - } - - virtual void - traverse_pointer (semantics::data_member& m, semantics::class_&) - { - // Ignore polymorphic id references. - // - if (m.count ("polymorphic-ref")) - return; - - generate (public_name (m)); - } - - virtual void - generate (string const& name) - { - os << "struct " << name << "_tag;"; - } - }; - - // // query_columns_type // -- cgit v1.1