diff options
author | Boris Kolpackov <boris@codesynthesis.com> | 2021-04-30 10:03:56 +0200 |
---|---|---|
committer | Boris Kolpackov <boris@codesynthesis.com> | 2021-04-30 10:37:35 +0200 |
commit | f1d06b7994d8b0aa31f86288183f46509bb78c19 (patch) | |
tree | 468b44ecedf0566fcf4c279064446d0ef661c293 | |
parent | d4be234991f2a2e6abd8b2c0d585eb4ae6216979 (diff) |
Add transaction::connection(database&) overload
-rw-r--r-- | odb/connection.hxx | 9 | ||||
-rw-r--r-- | odb/connection.ixx | 4 | ||||
-rw-r--r-- | odb/database.cxx | 2 | ||||
-rw-r--r-- | odb/database.hxx | 4 | ||||
-rw-r--r-- | odb/database.ixx | 16 | ||||
-rw-r--r-- | odb/database.txx | 4 | ||||
-rw-r--r-- | odb/transaction.cxx | 26 | ||||
-rw-r--r-- | odb/transaction.hxx | 22 | ||||
-rw-r--r-- | odb/transaction.ixx | 17 |
9 files changed, 71 insertions, 33 deletions
diff --git a/odb/connection.hxx b/odb/connection.hxx index 57d9dc3..8ce4544 100644 --- a/odb/connection.hxx +++ b/odb/connection.hxx @@ -89,11 +89,11 @@ namespace odb template <typename T> prepared_query<T> - lookup_query (const char* name) const; + lookup_query (const char* name); template <typename T, typename P> prepared_query<T> - lookup_query (const char* name, P*& params) const; + lookup_query (const char* name, P*& params); // SQL statement tracing. // @@ -199,8 +199,9 @@ namespace odb friend class prepared_query_impl; prepared_query_impl* prepared_queries_; - protected: - friend class transaction; + // Implementation details. + // + public: tracer_type* transaction_tracer_; }; diff --git a/odb/connection.ixx b/odb/connection.ixx index ba1353e..d19390a 100644 --- a/odb/connection.ixx +++ b/odb/connection.ixx @@ -89,14 +89,14 @@ namespace odb template <typename T> inline prepared_query<T> connection:: - lookup_query (const char* name) const + lookup_query (const char* name) { return prepared_query<T> (lookup_query_ (name, typeid (T), 0, 0)); } template <typename T, typename P> inline prepared_query<T> connection:: - lookup_query (const char* name, P*& params) const + lookup_query (const char* name, P*& params) { return prepared_query<T> ( lookup_query_ (name, diff --git a/odb/database.cxx b/odb/database.cxx index 3ad3716..9e098c7 100644 --- a/odb/database.cxx +++ b/odb/database.cxx @@ -19,7 +19,7 @@ namespace odb unsigned long long database:: execute (const char* st, std::size_t n) { - connection_type& c (transaction::current ().connection ()); + connection_type& c (transaction::current ().connection (*this)); return c.execute (st, n); } diff --git a/odb/database.hxx b/odb/database.hxx index dba56c6..485cf52 100644 --- a/odb/database.hxx +++ b/odb/database.hxx @@ -377,11 +377,11 @@ namespace odb template <typename T> prepared_query<T> - lookup_query (const char* name) const; + lookup_query (const char* name); template <typename T, typename P> prepared_query<T> - lookup_query (const char* name, P*& params) const; + lookup_query (const char* name, P*& params); // Prepared query factory. // diff --git a/odb/database.ixx b/odb/database.ixx index 5f874bc..c3cf2e2 100644 --- a/odb/database.ixx +++ b/odb/database.ixx @@ -674,7 +674,7 @@ namespace odb inline prepared_query<T> database:: prepare_query (const char* n, const odb::query<T>& q) { - connection_type& c (transaction::current ().connection ()); + connection_type& c (transaction::current ().connection (*this)); return c.prepare_query (n, q); } @@ -682,7 +682,7 @@ namespace odb inline void database:: cache_query (const prepared_query<T>& pq) { - connection_type& c (transaction::current ().connection ()); + connection_type& c (transaction::current ().connection (*this)); c.cache_query (pq); } @@ -691,7 +691,7 @@ namespace odb inline void database:: cache_query (const prepared_query<T>& pq, std::unique_ptr<P> params) { - connection_type& c (transaction::current ().connection ()); + connection_type& c (transaction::current ().connection (*this)); c.cache_query (pq, std::move (params)); } #else @@ -699,24 +699,24 @@ namespace odb inline void database:: cache_query (const prepared_query<T>& pq, std::auto_ptr<P> params) { - connection_type& c (transaction::current ().connection ()); + connection_type& c (transaction::current ().connection (*this)); c.cache_query (pq, params); } #endif template <typename T> inline prepared_query<T> database:: - lookup_query (const char* name) const + lookup_query (const char* name) { - connection_type& c (transaction::current ().connection ()); + connection_type& c (transaction::current ().connection (*this)); return c.lookup_query<T> (name); } template <typename T, typename P> inline prepared_query<T> database:: - lookup_query (const char* name, P*& params) const + lookup_query (const char* name, P*& params) { - connection_type& c (transaction::current ().connection ()); + connection_type& c (transaction::current ().connection (*this)); return c.lookup_query<T, P> (name, params); } diff --git a/odb/database.txx b/odb/database.txx index 8e69e6a..5659b6f 100644 --- a/odb/database.txx +++ b/odb/database.txx @@ -255,7 +255,7 @@ namespace odb void database:: load_ (T& obj, section& s) { - connection_type& c (transaction::current ().connection ()); + connection_type& c (transaction::current ().connection (*this)); // T is always object_type. // @@ -349,7 +349,7 @@ namespace odb // T is always object_type. // - if (object_traits_impl<T, DB>::update (t.connection (), obj, s)) + if (object_traits_impl<T, DB>::update (t.connection (*this), obj, s)) { if (s.changed ()) s.reset (true, false, &t); // Clear the change flag. diff --git a/odb/transaction.cxx b/odb/transaction.cxx index 1dc68e5..f75cf32 100644 --- a/odb/transaction.cxx +++ b/odb/transaction.cxx @@ -94,7 +94,7 @@ namespace odb finalized_ = true; rollback_guard rg (*this); - impl_->connection ().transaction_tracer_ = 0; + impl_->tracer (0); if (tls_get (current_transaction) == this) { @@ -118,7 +118,7 @@ namespace odb finalized_ = true; rollback_guard rg (*this); - impl_->connection ().transaction_tracer_ = 0; + impl_->tracer (0); if (tls_get (current_transaction) == this) { @@ -331,4 +331,26 @@ namespace odb ~transaction_impl () { } + + connection& transaction_impl:: + connection (database_type* db) + { + assert (db == 0 || db == &database_); + return *connection_; + } + + // The transaction-specific tracer is stored in the connection. See the + // connection class for the reason. + // + void transaction_impl:: + tracer (tracer_type* t) + { + connection_->transaction_tracer_ = t; + } + + tracer* transaction_impl:: + tracer () const + { + return connection_->transaction_tracer_; + } } diff --git a/odb/transaction.hxx b/odb/transaction.hxx index 1298760..1958df3 100644 --- a/odb/transaction.hxx +++ b/odb/transaction.hxx @@ -61,9 +61,17 @@ namespace odb // Return the connection this transaction is on. // + // The second version verifies the connection is to the specified + // database. For database implementations that support attaching multiple + // databases it may also select the connection corresponding to the + // specified database. + // connection_type& connection (); + connection_type& + connection (database_type&); + bool finalized () const {return finalized_;} @@ -215,6 +223,7 @@ namespace odb class LIBODB_EXPORT transaction_impl { public: + typedef odb::tracer tracer_type; typedef odb::database database_type; typedef odb::connection connection_type; @@ -236,11 +245,14 @@ namespace odb return database_; } - connection_type& - connection () - { - return *connection_; - } + virtual connection_type& + connection (database_type*); + + virtual void + tracer (tracer_type*); + + virtual tracer_type* + tracer () const; protected: transaction_impl (database_type& db) diff --git a/odb/transaction.ixx b/odb/transaction.ixx index 16a0633..cc1ce5e 100644 --- a/odb/transaction.ixx +++ b/odb/transaction.ixx @@ -33,7 +33,13 @@ namespace odb inline transaction::connection_type& transaction:: connection () { - return impl_->connection (); + return impl_->connection (0); + } + + inline transaction::connection_type& transaction:: + connection (database_type& db) + { + return impl_->connection (&db); } inline transaction_impl& transaction:: @@ -42,24 +48,21 @@ namespace odb return *impl_; } - // The transaction-specific tracer is stored in the connection. See - // the connection class for the reason. - // inline void transaction:: tracer (tracer_type& t) { - impl_->connection ().transaction_tracer_ = &t; + impl_->tracer (&t); } inline void transaction:: tracer (tracer_type* t) { - impl_->connection ().transaction_tracer_ = t; + impl_->tracer (t); } inline transaction::tracer_type* transaction:: tracer () const { - return impl_->connection ().transaction_tracer_; + return impl_->tracer (); } } |