aboutsummaryrefslogtreecommitdiff
path: root/odb/sqlite/connection-factory.cxx
diff options
context:
space:
mode:
authorBoris Kolpackov <boris@codesynthesis.com>2015-11-09 18:14:37 +0200
committerBoris Kolpackov <boris@codesynthesis.com>2015-11-09 18:14:37 +0200
commit2bf2944a844d002267d3508ce81a2128ccbb8af7 (patch)
tree32732629cdd48b789242e6a8dc1673c593f6fb8f /odb/sqlite/connection-factory.cxx
parent857fabab0c537a286e8a39503bf987029669d854 (diff)
Make database class move-constructible
This means it can be returned by value from a function in C++11.
Diffstat (limited to 'odb/sqlite/connection-factory.cxx')
-rw-r--r--odb/sqlite/connection-factory.cxx86
1 files changed, 42 insertions, 44 deletions
diff --git a/odb/sqlite/connection-factory.cxx b/odb/sqlite/connection-factory.cxx
index c40190a..317d048 100644
--- a/odb/sqlite/connection-factory.cxx
+++ b/odb/sqlite/connection-factory.cxx
@@ -18,15 +18,6 @@ namespace odb
namespace sqlite
{
//
- // connection_factory
- //
-
- connection_factory::
- ~connection_factory ()
- {
- }
-
- //
// single_connection_factory
//
@@ -43,14 +34,14 @@ namespace odb
single_connection_factory::
create ()
{
- return single_connection_ptr (new (shared) single_connection (*db_));
+ return single_connection_ptr (new (shared) single_connection (*this));
}
connection_ptr single_connection_factory::
connect ()
{
mutex_.lock ();
- connection_->factory_ = this;
+ connection_->callback_ = &connection_->cb_;
connection_ptr r (connection_);
connection_.reset ();
return r;
@@ -59,14 +50,16 @@ namespace odb
void single_connection_factory::
database (database_type& db)
{
- db_ = &db;
- connection_ = create ();
+ connection_factory::database (db);
+
+ if (!connection_)
+ connection_ = create ();
}
bool single_connection_factory::
release (single_connection* c)
{
- c->factory_ = 0;
+ c->callback_ = 0;
connection_.reset (inc_ref (c));
connection_->recycle ();
mutex_.unlock ();
@@ -78,28 +71,26 @@ namespace odb
//
single_connection_factory::single_connection::
- single_connection (database_type& db, int extra_flags)
- : connection (db, extra_flags), factory_ (0)
+ single_connection (single_connection_factory& f, int extra_flags)
+ : connection (f, extra_flags)
{
- callback_.arg = this;
- callback_.zero_counter = &zero_counter;
- shared_base::callback_ = &callback_;
+ cb_.arg = this;
+ cb_.zero_counter = &zero_counter;
}
single_connection_factory::single_connection::
- single_connection (database_type& db, sqlite3* handle)
- : connection (db, handle), factory_ (0)
+ single_connection (single_connection_factory& f, sqlite3* handle)
+ : connection (f, handle)
{
- callback_.arg = this;
- callback_.zero_counter = &zero_counter;
- shared_base::callback_ = &callback_;
+ cb_.arg = this;
+ cb_.zero_counter = &zero_counter;
}
bool single_connection_factory::single_connection::
zero_counter (void* arg)
{
single_connection* c (static_cast<single_connection*> (arg));
- return c->factory_ ? c->factory_->release (c) : true;
+ return static_cast<single_connection_factory&> (c->factory_).release (c);
}
//
@@ -109,14 +100,18 @@ namespace odb
connection_ptr new_connection_factory::
connect ()
{
- return connection_ptr (
- new (shared) connection (*db_, extra_flags_));
+ return connection_ptr (new (shared) connection (*this, extra_flags_));
}
void new_connection_factory::
database (database_type& db)
{
- db_ = &db;
+ bool first (db_ == 0);
+
+ connection_factory::database (db);
+
+ if (!first)
+ return;
// Unless explicitly disabled, enable shared cache.
//
@@ -134,7 +129,7 @@ namespace odb
create ()
{
return pooled_connection_ptr (
- new (shared) pooled_connection (*db_, extra_flags_));
+ new (shared) pooled_connection (*this, extra_flags_));
}
connection_pool_factory::
@@ -165,7 +160,7 @@ namespace odb
shared_ptr<pooled_connection> c (connections_.back ());
connections_.pop_back ();
- c->pool_ = this;
+ c->callback_ = &c->cb_;
in_use_++;
return c;
}
@@ -175,7 +170,7 @@ namespace odb
if(max_ == 0 || in_use_ < max_)
{
shared_ptr<pooled_connection> c (create ());
- c->pool_ = this;
+ c->callback_ = &c->cb_;
in_use_++;
return c;
}
@@ -191,7 +186,12 @@ namespace odb
void connection_pool_factory::
database (database_type& db)
{
- db_ = &db;
+ bool first (db_ == 0);
+
+ connection_factory::database (db);
+
+ if (!first)
+ return;
// Unless explicitly disabled, enable shared cache.
//
@@ -212,7 +212,7 @@ namespace odb
bool connection_pool_factory::
release (pooled_connection* c)
{
- c->pool_ = 0;
+ c->callback_ = 0;
lock l (mutex_);
@@ -241,28 +241,26 @@ namespace odb
//
connection_pool_factory::pooled_connection::
- pooled_connection (database_type& db, int extra_flags)
- : connection (db, extra_flags), pool_ (0)
+ pooled_connection (connection_pool_factory& f, int extra_flags)
+ : connection (f, extra_flags)
{
- callback_.arg = this;
- callback_.zero_counter = &zero_counter;
- shared_base::callback_ = &callback_;
+ cb_.arg = this;
+ cb_.zero_counter = &zero_counter;
}
connection_pool_factory::pooled_connection::
- pooled_connection (database_type& db, sqlite3* handle)
- : connection (db, handle), pool_ (0)
+ pooled_connection (connection_pool_factory& f, sqlite3* handle)
+ : connection (f, handle)
{
- callback_.arg = this;
- callback_.zero_counter = &zero_counter;
- shared_base::callback_ = &callback_;
+ cb_.arg = this;
+ cb_.zero_counter = &zero_counter;
}
bool connection_pool_factory::pooled_connection::
zero_counter (void* arg)
{
pooled_connection* c (static_cast<pooled_connection*> (arg));
- return c->pool_ ? c->pool_->release (c) : true;
+ return static_cast<connection_pool_factory&> (c->factory_).release (c);
}
}
}