From 5b0430fdf4617b396e462872d438a663b174a3a8 Mon Sep 17 00:00:00 2001 From: Boris Kolpackov Date: Fri, 12 Oct 2012 17:24:44 +0200 Subject: Completion of prepared query support --- odb/connection.hxx | 76 +++++++++++++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 72 insertions(+), 4 deletions(-) (limited to 'odb/connection.hxx') diff --git a/odb/connection.hxx b/odb/connection.hxx index f274b39..b4a9d5b 100644 --- a/odb/connection.hxx +++ b/odb/connection.hxx @@ -7,14 +7,20 @@ #include +#include #include -#include // std::size_t +#include // std::auto_ptr, std::unique_ptr +#include // std::size_t +#include #include +#include #include #include +#include // ODB_CXX11 #include +#include #include namespace odb @@ -57,15 +63,37 @@ namespace odb public: template prepared_query - prepare_query (const char* name, const char* q); + prepare_query (const char* name, const char*); template prepared_query - prepare_query (const char* name, const std::string& q); + prepare_query (const char* name, const std::string&); template prepared_query - prepare_query (const char* name, const query& q); + prepare_query (const char* name, const query&); + + template + void + cache_query (const prepared_query&); + + template + void + cache_query (const prepared_query&, std::auto_ptr

params); + +#ifdef ODB_CXX11 + template + void + cache_query (const prepared_query&, std::unique_ptr

params); +#endif + + template + prepared_query + lookup_query (const char* name) const; + + template + prepared_query + lookup_query (const char* name, P*& params) const; // SQL statement tracing. // @@ -98,10 +126,50 @@ namespace odb protected: connection (database_type&); + template ::kind> + struct query_; + + virtual void + cache_query_ (details::shared_ptr pq, + const std::type_info& ti, + void* params, + const std::type_info* params_info, + void (*params_deleter) (void*)); + + details::shared_ptr + lookup_query_ (const char* name, + const std::type_info& ti, + void** params, // out + const std::type_info* params_info) const; + + template + static void + params_deleter (void*); + private: connection (const connection&); connection& operator= (const connection&); + // Prepared query cache. + // + protected: + struct prepared_entry_type + { + details::shared_ptr prep_query; + const std::type_info* type_info; + void* params; + const std::type_info* params_info; + void (*params_deleter) (void*); + }; + + typedef + std::map + prepared_map_type; + + prepared_map_type prepared_map_; + protected: database_type& database_; tracer_type* tracer_; -- cgit v1.1