diff options
-rw-r--r-- | odb/pgsql/polymorphic-object-statements.hxx | 5 | ||||
-rw-r--r-- | odb/pgsql/polymorphic-object-statements.txx | 1 | ||||
-rw-r--r-- | odb/pgsql/simple-object-statements.hxx | 57 | ||||
-rw-r--r-- | odb/pgsql/simple-object-statements.txx | 1 |
4 files changed, 58 insertions, 6 deletions
diff --git a/odb/pgsql/polymorphic-object-statements.hxx b/odb/pgsql/polymorphic-object-statements.hxx index 43dd55e..8a85e3c 100644 --- a/odb/pgsql/polymorphic-object-statements.hxx +++ b/odb/pgsql/polymorphic-object-statements.hxx @@ -378,7 +378,7 @@ namespace odb container_statement_cache_type& container_statment_cache () { - return container_statement_cache_; + return container_statement_cache_.get (conn_); } public: @@ -410,7 +410,8 @@ namespace odb root_statements_type& root_statements_; base_statements_type& base_statements_; - container_statement_cache_type container_statement_cache_; + container_statement_cache_ptr<container_statement_cache_type> + container_statement_cache_; image_type image_; diff --git a/odb/pgsql/polymorphic-object-statements.txx b/odb/pgsql/polymorphic-object-statements.txx index 2f10b22..2a3ad7a 100644 --- a/odb/pgsql/polymorphic-object-statements.txx +++ b/odb/pgsql/polymorphic-object-statements.txx @@ -81,7 +81,6 @@ namespace odb : statements_base (conn), root_statements_ (conn.statement_cache ().find_object<root_type> ()), base_statements_ (conn.statement_cache ().find_object<base_type> ()), - container_statement_cache_ (conn), insert_image_binding_ (insert_image_bind_, insert_column_count), insert_image_native_binding_ (insert_image_values_, insert_image_lengths_, diff --git a/odb/pgsql/simple-object-statements.hxx b/odb/pgsql/simple-object-statements.hxx index e6de345..cba8598 100644 --- a/odb/pgsql/simple-object-statements.hxx +++ b/odb/pgsql/simple-object-statements.hxx @@ -29,6 +29,58 @@ namespace odb { namespace pgsql { + // The container_statement_cache class is only defined (and used) in + // the generated source file. However, object_statements may be + // referenced from another source file in the case of a polymorphic + // hierarchy (though in this case the container statement cache is + // not used). As a result, we cannot have a by-value member and + // instead will store a pointer and lazily allocate the cache if + // and when needed. We will also need to store a pointer to the + // deleter function which will be initialized during allocation + // (at that point we know that the cache class is defined). + // + template <typename T> + struct container_statement_cache_ptr + { + typedef pgsql::connection connection_type; + + container_statement_cache_ptr (): p_ (0) {} + ~container_statement_cache_ptr () {if (p_ != 0) (this->*deleter_) (0);} + + T& + get (connection_type& c) + { + if (p_ == 0) + allocate (&c); + + return *p_; + } + + private: + void + allocate (connection_type*); + + private: + T* p_; + void (container_statement_cache_ptr::*deleter_) (connection_type*); + }; + + template <typename T> + void container_statement_cache_ptr<T>:: + allocate (connection_type* c) + { + // To reduce object code size, this function acts as both allocator + // and deleter. + // + if (p_ == 0) + { + p_ = new T (*c); + deleter_ = &container_statement_cache_ptr<T>::allocate; + } + else + delete p_; + } + // // Implementation for objects with object id. // @@ -380,7 +432,7 @@ namespace odb container_statement_cache_type& container_statment_cache () { - return container_statement_cache_; + return container_statement_cache_.get (conn_); } public: @@ -416,7 +468,8 @@ namespace odb clear_delayed_ (); protected: - container_statement_cache_type container_statement_cache_; + container_statement_cache_ptr<container_statement_cache_type> + container_statement_cache_; image_type image_; diff --git a/odb/pgsql/simple-object-statements.txx b/odb/pgsql/simple-object-statements.txx index 1fcd104..fe9fe9b 100644 --- a/odb/pgsql/simple-object-statements.txx +++ b/odb/pgsql/simple-object-statements.txx @@ -46,7 +46,6 @@ namespace odb object_statements<T>:: object_statements (connection_type& conn) : object_statements_base (conn), - container_statement_cache_ (conn), // select select_image_binding_ (select_image_bind_, select_column_count), // insert |