From 9ad0acf37561de9bf359a561faed53de17c2ca3b Mon Sep 17 00:00:00 2001 From: Boris Kolpackov Date: Wed, 21 Nov 2012 13:11:43 +0200 Subject: Add dynamic multi-database query support --- odb/common-query.hxx | 239 +++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 239 insertions(+) create mode 100644 odb/common-query.hxx (limited to 'odb/common-query.hxx') diff --git a/odb/common-query.hxx b/odb/common-query.hxx new file mode 100644 index 0000000..4fa9fe1 --- /dev/null +++ b/odb/common-query.hxx @@ -0,0 +1,239 @@ +// file : odb/common-query.hxx +// copyright : Copyright (c) 2009-2012 Code Synthesis Tools CC +// license : GNU GPL v3; see accompanying LICENSE file + +#ifndef ODB_COMMON_QUERY_HXX +#define ODB_COMMON_QUERY_HXX + +#include +#include + +// +// Query-related generators. +// + +// Generate query tags for pointers in this objects. +// +struct query_tags: object_columns_base, virtual context +{ + typedef query_tags base; + + query_tags (): nl_ (false) {} + + virtual void + traverse (semantics::class_&); + + virtual void + traverse_object (semantics::class_&); + + virtual void + traverse_composite (semantics::data_member*, semantics::class_&); + + virtual void + traverse_pointer (semantics::data_member&, semantics::class_&); + + virtual void + generate (string const& name); + +private: + bool nl_; +}; + +// Generate alias_traits specializations for pointers in this objects. +// +struct query_alias_traits: object_columns_base, virtual context +{ + typedef query_alias_traits base; + + query_alias_traits (semantics::class_&, bool decl); + + virtual void + traverse_object (semantics::class_&); + + virtual void + traverse_composite (semantics::data_member*, semantics::class_&); + + virtual void + traverse_pointer (semantics::data_member&, semantics::class_&); + + virtual void + generate_decl (string const& tag, semantics::class_&); + + virtual void + generate_decl_body (); + + virtual void + generate_def (semantics::data_member&, semantics::class_&); + + virtual void + generate_def (string const& tag, semantics::class_&, string const& alias); + +protected: + bool decl_; + string scope_; +}; + +// Generate query columns in the query_columns_base class. +// +struct query_columns_base: object_columns_base, virtual context +{ + typedef query_columns_base base; + + query_columns_base (semantics::class_&, bool decl); + + virtual void + traverse_object (semantics::class_&); + + virtual void + traverse_composite (semantics::data_member*, semantics::class_&); + + virtual void + traverse_pointer (semantics::data_member&, semantics::class_&); + +protected: + bool decl_; + string const_; // Const prefix or empty. + string scope_; +}; + +// Generate query columns in the query_columns or pointer_query_columns +// class. +// +struct query_columns: object_columns_base, virtual context +{ + typedef query_columns base; + + query_columns (bool ptr); + query_columns (bool ptr, semantics::class_&); + + virtual void + column_ctor (string const& type, string const& name, string const& base); + + virtual void + traverse_object (semantics::class_&); + + virtual void + traverse_composite (semantics::data_member*, semantics::class_&); + + virtual void + column_common (semantics::data_member&, + string const& type, + string const& column, + string const& suffix = "_type_"); + + virtual bool + traverse_column (semantics::data_member&, string const&, bool); + + virtual void + traverse_pointer (semantics::data_member&, semantics::class_&); + +protected: + bool ptr_; + bool decl_; + string const_; // Const prefix or empty. + bool in_ptr_; // True while we are "inside" an object pointer. + string fq_name_; + string scope_; +}; + +// Generate the list of base classes for the query_columns or +// pointer_query_columns class. +// +struct query_columns_bases: traversal::class_, virtual context +{ + typedef query_columns_bases base; + + query_columns_bases (bool ptr, bool first = true) + : ptr_ (ptr), first_ (first) {} + + virtual void + traverse (type&); + +private: + bool ptr_; + bool first_; +}; + +// Generate the base class aliases (typedefs). These can be used to +// resolve member ambiguities. +// +struct query_columns_base_aliases: traversal::class_, virtual context +{ + typedef query_columns_base_aliases base; + + query_columns_base_aliases (bool ptr): ptr_ (ptr) {} + + virtual void + traverse (type&); + +private: + bool ptr_; +}; + +// Generate explicit instantiations of base classes (reuse inheritance). +// +struct query_columns_base_insts: traversal::class_, virtual context +{ + typedef query_columns_base_insts base; + + query_columns_base_insts (bool ptr, string const& alias); + query_columns_base_insts (query_columns_base_insts const&); + + virtual void + traverse (type&); + +private: + bool ptr_; + string alias_; + traversal::inherits inherits_; +}; + +// Generate the query_columns_base/query_columns or pointer_query_columns +// classes for objects. +// +struct query_columns_type: traversal::class_, virtual context +{ + typedef query_columns_type base; + + // Depending on the ptr argument, generate query_columns or + // pointer_query_columns specialization. The latter is used + // for object pointers where we don't support nested pointers. + // + // If decl is false then generate definitions (only needed for + // query_columns so ptr should be false). + // + query_columns_type (bool ptr, bool decl): ptr_ (ptr), decl_ (decl) {} + + virtual void + traverse (type&); + + virtual void + generate_impl (type&); + +public: + bool ptr_; + bool decl_; +}; + +// Generate the query_columns class for views. +// +struct view_query_columns_type: traversal::class_, virtual context +{ + typedef view_query_columns_type base; + + view_query_columns_type (bool decl): decl_ (decl) {} + + virtual void + traverse (type&); + + void + generate_decl (type&); + + void + generate_def (type&); + +public: + bool decl_; +}; + +#endif // ODB_COMMON_QUERY_HXX -- cgit v1.1