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.cxx | 79 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 79 insertions(+) (limited to 'odb/connection.cxx') diff --git a/odb/connection.cxx b/odb/connection.cxx index d14e510..f479131 100644 --- a/odb/connection.cxx +++ b/odb/connection.cxx @@ -2,12 +2,91 @@ // copyright : Copyright (c) 2009-2012 Code Synthesis Tools CC // license : GNU GPL v2; see accompanying LICENSE file +#include #include +#include // prepared_* + +using namespace std; namespace odb { connection:: ~connection () { + for (prepared_map_type::iterator i (prepared_map_.begin ()), + e (prepared_map_.end ()); i != e; ++i) + { + if (i->second.params != 0) + i->second.params_deleter (i->second.params); + } + } + + void connection:: + cache_query_ (details::shared_ptr pq, + const type_info& ti, + void* params, + const type_info* params_info, + void (*params_deleter) (void*)) + { + pair r ( + prepared_map_.insert ( + prepared_map_type::value_type (pq->name, prepared_entry_type ()))); + + if (!r.second) + throw prepared_already_cached (pq->name); + + prepared_entry_type& e (r.first->second); + + e.prep_query = pq; + e.type_info = &ti; + + // Mark the statement as cached. + // + pq->stmt->cached (true); + + e.params = params; + e.params_info = params_info; + e.params_deleter = params_deleter; + } + + details::shared_ptr connection:: + lookup_query_ (const char* name, + const type_info& ti, + void** params, + const type_info* params_info) const + { + prepared_map_type::const_iterator i (prepared_map_.find (name)); + + if (i == prepared_map_.end ()) + { + // See if there is a factory. + // + database_type::query_factory_type f ( + database_.lookup_query_factory (name)); + + if (f) + { + f (name, const_cast (*this)); + i = prepared_map_.find (name); + } + } + + if (i == prepared_map_.end ()) + return details::shared_ptr (); + + // Make sure the types match. + // + if (*i->second.type_info != ti) + throw prepared_type_mismatch (name); + + if (params != 0) + { + if (*i->second.params_info != *params_info) + throw prepared_type_mismatch (name); + + *params = i->second.params; + } + + return i->second.prep_query; } } -- cgit v1.1