aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBoris Kolpackov <boris@codesynthesis.com>2012-11-07 09:48:11 +0200
committerBoris Kolpackov <boris@codesynthesis.com>2012-11-21 13:13:50 +0200
commitd01c8e22abea35477f21488613f2474a2e4e8fc7 (patch)
tree9d08d4dfbfbe4535f5cf2829c01fe81d4d7668ea
parentcc3979f34a886ae4c89d4e3e86a5b0db1669585f (diff)
Generate query tags in object_traits for dynamic multi-database support
-rw-r--r--odb/common.hxx94
-rw-r--r--odb/header.cxx24
-rw-r--r--odb/relational/header.cxx41
-rw-r--r--odb/relational/header.hxx56
4 files changed, 129 insertions, 86 deletions
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<size_t> ("object-count") != 0) // View.
+ {
+ view_objects& objs (c.get<view_objects> ("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<string> ("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<query_tags> 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<view_objects> ("objects"));
-
- {
- instance<query_tags> 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
//