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/relational/common.hxx | 350 +--------------------------------------------- 1 file changed, 7 insertions(+), 343 deletions(-) (limited to 'odb/relational/common.hxx') diff --git a/odb/relational/common.hxx b/odb/relational/common.hxx index 1e7143f..a077d6f 100644 --- a/odb/relational/common.hxx +++ b/odb/relational/common.hxx @@ -5,11 +5,8 @@ #ifndef ODB_RELATIONAL_COMMON_HXX #define ODB_RELATIONAL_COMMON_HXX -#include #include -#include // std::size_t #include -#include #include #include @@ -215,350 +212,17 @@ namespace relational { } + // Has to be overriden. + // virtual string - database_type_id (semantics::data_member&) - { - assert (false); - } - }; - - // 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_def (string const& tag, semantics::class_&, string const& alias); - - protected: - bool decl_; - string scope_; - }; - - // - // - 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 scope_; - string tag_scope_; - }; - - // - // - struct query_columns: object_columns_base, virtual context - { - typedef query_columns base; - - query_columns (bool ptr); - query_columns (bool ptr, semantics::class_&); - - virtual string - database_type_id (semantics::data_member&) - { - assert (false); - } - - virtual void - column_ctor (string const& type, string const& base); - - virtual void - column_ctor_extra (semantics::data_member&) - { - } - - 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_; - - bool in_ptr_; // True if we are "inside" an object pointer. - - string scope_; - string table_; - string default_table_; - }; - - // - // Dynamic traversal support. - // - - template - struct factory - { - static B* - create (B const& prototype) - { - database db (context::current ().options.database ()[0]); - - if (map_ != 0) - { - typename map::const_iterator i (map_->find (db)); - - if (i != map_->end ()) - return i->second (prototype); - } - - return new B (prototype); - } - - private: - template - friend struct entry; - - static void - init () - { - if (factory::count_++ == 0) - factory::map_ = new typename factory::map; - } - - static void - term () - { - if (--factory::count_ == 0) - delete factory::map_; - } - - typedef B* (*create_func) (B const&); - typedef std::map map; - static map* map_; - static std::size_t count_; + database_type_id (semantics::data_member&); }; - - template - typename factory::map* factory::map_; - - template - std::size_t factory::count_; - - struct entry_base - { - static database - db (std::type_info const&); - }; - - template - struct entry: entry_base - { - typedef typename D::base base; - - entry () - { - factory::init (); - (*factory::map_)[db (typeid (D))] = &create; - } - - ~entry () - { - factory::term (); - } - - static base* - create (base const& prototype) - { - return new D (prototype); - } - }; - - template - struct instance - { - typedef relational::factory factory; - - ~instance () - { - delete x_; - } - - instance () - { - B prototype; - x_ = factory::create (prototype); - } - - template - instance (A1& a1) - { - B prototype (a1); - x_ = factory::create (prototype); - } - - template - instance (A1 const& a1) - { - B prototype (a1); - x_ = factory::create (prototype); - } - - template - instance (A1& a1, A2& a2) - { - B prototype (a1, a2); - x_ = factory::create (prototype); - } - - template - instance (A1 const& a1, A2 const& a2) - { - B prototype (a1, a2); - x_ = factory::create (prototype); - } - - template - instance (A1& a1, A2& a2, A3& a3) - { - B prototype (a1, a2, a3); - x_ = factory::create (prototype); - } - - template - instance (A1 const& a1, A2 const& a2, A3 const& a3) - { - B prototype (a1, a2, a3); - x_ = factory::create (prototype); - } - - template - instance (A1& a1, A2& a2, A3& a3, A4& a4) - { - B prototype (a1, a2, a3, a4); - x_ = factory::create (prototype); - } - - template - instance (A1 const& a1, A2 const& a2, A3 const& a3, A4 const& a4) - { - B prototype (a1, a2, a3, a4); - x_ = factory::create (prototype); - } - - template - instance (A1& a1, A2& a2, A3& a3, A4& a4, A5& a5) - { - B prototype (a1, a2, a3, a4, a5); - x_ = factory::create (prototype); - } - - template - instance (A1 const& a1, A2 const& a2, A3 const& a3, A4 const& a4, - A5 const& a5) - { - B prototype (a1, a2, a3, a4, a5); - x_ = factory::create (prototype); - } - - instance (instance const& i) - { - // This is tricky: use the other instance as a prototype. - // - x_ = factory::create (*i.x_); - } - - B* - operator-> () const - { - return x_; - } - - B& - operator* () const - { - return *x_; - } - - B* - get () const - { - return x_; - } - - private: - instance& operator= (instance const&); - - private: - B* x_; - }; - - template - inline traversal::edge_base& - operator>> (instance& n, traversal::edge_base& e) - { - n->edge_traverser (e); - return e; - } - - template - inline traversal::relational::edge_base& - operator>> (instance& n, traversal::relational::edge_base& e) - { - n->edge_traverser (e); - return e; - } - - template - inline traversal::node_base& - operator>> (traversal::edge_base& e, instance& n) - { - e.node_traverser (*n); - return *n; - } - - template - inline traversal::relational::node_base& - operator>> (traversal::relational::edge_base& e, instance& n) - { - e.node_traverser (*n); - return *n; - } } #include +// Other common parts. +// +#include + #endif // ODB_RELATIONAL_COMMON_HXX -- cgit v1.1