diff options
Diffstat (limited to 'odb/relational/common.hxx')
-rw-r--r-- | odb/relational/common.hxx | 350 |
1 files changed, 7 insertions, 343 deletions
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 <map> #include <set> -#include <cstddef> // std::size_t #include <cassert> -#include <typeinfo> #include <odb/common.hxx> #include <odb/relational/context.hxx> @@ -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 <typename B> - 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 <typename> - friend struct entry; - - static void - init () - { - if (factory<B>::count_++ == 0) - factory<B>::map_ = new typename factory<B>::map; - } - - static void - term () - { - if (--factory<B>::count_ == 0) - delete factory<B>::map_; - } - - typedef B* (*create_func) (B const&); - typedef std::map<database, create_func> map; - static map* map_; - static std::size_t count_; + database_type_id (semantics::data_member&); }; - - template <typename B> - typename factory<B>::map* factory<B>::map_; - - template <typename B> - std::size_t factory<B>::count_; - - struct entry_base - { - static database - db (std::type_info const&); - }; - - template <typename D> - struct entry: entry_base - { - typedef typename D::base base; - - entry () - { - factory<base>::init (); - (*factory<base>::map_)[db (typeid (D))] = &create; - } - - ~entry () - { - factory<base>::term (); - } - - static base* - create (base const& prototype) - { - return new D (prototype); - } - }; - - template <typename B> - struct instance - { - typedef relational::factory<B> factory; - - ~instance () - { - delete x_; - } - - instance () - { - B prototype; - x_ = factory::create (prototype); - } - - template <typename A1> - instance (A1& a1) - { - B prototype (a1); - x_ = factory::create (prototype); - } - - template <typename A1> - instance (A1 const& a1) - { - B prototype (a1); - x_ = factory::create (prototype); - } - - template <typename A1, typename A2> - instance (A1& a1, A2& a2) - { - B prototype (a1, a2); - x_ = factory::create (prototype); - } - - template <typename A1, typename A2> - instance (A1 const& a1, A2 const& a2) - { - B prototype (a1, a2); - x_ = factory::create (prototype); - } - - template <typename A1, typename A2, typename A3> - instance (A1& a1, A2& a2, A3& a3) - { - B prototype (a1, a2, a3); - x_ = factory::create (prototype); - } - - template <typename A1, typename A2, typename A3> - instance (A1 const& a1, A2 const& a2, A3 const& a3) - { - B prototype (a1, a2, a3); - x_ = factory::create (prototype); - } - - template <typename A1, typename A2, typename A3, typename A4> - instance (A1& a1, A2& a2, A3& a3, A4& a4) - { - B prototype (a1, a2, a3, a4); - x_ = factory::create (prototype); - } - - template <typename A1, typename A2, typename A3, typename A4> - instance (A1 const& a1, A2 const& a2, A3 const& a3, A4 const& a4) - { - B prototype (a1, a2, a3, a4); - x_ = factory::create (prototype); - } - - template <typename A1, typename A2, typename A3, typename A4, typename A5> - instance (A1& a1, A2& a2, A3& a3, A4& a4, A5& a5) - { - B prototype (a1, a2, a3, a4, a5); - x_ = factory::create (prototype); - } - - template <typename A1, typename A2, typename A3, typename A4, typename A5> - 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 <typename T> - inline traversal::edge_base& - operator>> (instance<T>& n, traversal::edge_base& e) - { - n->edge_traverser (e); - return e; - } - - template <typename T> - inline traversal::relational::edge_base& - operator>> (instance<T>& n, traversal::relational::edge_base& e) - { - n->edge_traverser (e); - return e; - } - - template <typename T> - inline traversal::node_base& - operator>> (traversal::edge_base& e, instance<T>& n) - { - e.node_traverser (*n); - return *n; - } - - template <typename T> - inline traversal::relational::node_base& - operator>> (traversal::relational::edge_base& e, instance<T>& n) - { - e.node_traverser (*n); - return *n; - } } #include <odb/relational/common.txx> +// Other common parts. +// +#include <odb/relational/common-query.hxx> + #endif // ODB_RELATIONAL_COMMON_HXX |