summaryrefslogtreecommitdiff
path: root/odb/oracle/connection-factory.cxx
diff options
context:
space:
mode:
Diffstat (limited to 'odb/oracle/connection-factory.cxx')
-rw-r--r--odb/oracle/connection-factory.cxx159
1 files changed, 0 insertions, 159 deletions
diff --git a/odb/oracle/connection-factory.cxx b/odb/oracle/connection-factory.cxx
deleted file mode 100644
index 9ad9474..0000000
--- a/odb/oracle/connection-factory.cxx
+++ /dev/null
@@ -1,159 +0,0 @@
-// file : odb/oracle/connection-factory.cxx
-// license : ODB NCUEL; see accompanying LICENSE file
-
-#include <odb/oracle/connection-factory.hxx>
-#include <odb/oracle/exceptions.hxx>
-
-#include <odb/details/lock.hxx>
-
-using namespace std;
-
-namespace odb
-{
- using namespace details;
-
- namespace oracle
- {
- // new_connection_factory
- //
- connection_ptr new_connection_factory::
- connect ()
- {
- return connection_ptr (new (shared) connection (*this));
- }
-
- // connection_pool_factory
- //
- connection_pool_factory::pooled_connection_ptr connection_pool_factory::
- create ()
- {
- return pooled_connection_ptr (new (shared) pooled_connection (*this));
- }
-
- connection_pool_factory::
- ~connection_pool_factory ()
- {
- // Wait for all the connections currently in use to return to
- // the pool.
- //
- lock l (mutex_);
- while (in_use_ != 0)
- {
- waiters_++;
- cond_.wait (l);
- waiters_--;
- }
- }
-
- connection_ptr connection_pool_factory::
- connect ()
- {
- lock l (mutex_);
-
- while (true)
- {
- // See if we have a spare connection.
- //
- if (connections_.size () != 0)
- {
- shared_ptr<pooled_connection> c (connections_.back ());
- connections_.pop_back ();
-
- c->callback_ = &c->cb_;
- in_use_++;
- return c;
- }
-
- // See if we can create a new one.
- //
- if (max_ == 0 || in_use_ < max_)
- {
- shared_ptr<pooled_connection> c (create ());
- c->callback_ = &c->cb_;
- in_use_++;
- return c;
- }
-
- // Wait until someone releases a connection.
- //
- waiters_++;
- cond_.wait (l);
- waiters_--;
- }
- }
-
- void connection_pool_factory::
- database (database_type& db)
- {
- bool first (db_ == 0);
-
- connection_factory::database (db);
-
- if (!first)
- return;
-
- if (min_ > 0)
- {
- connections_.reserve (min_);
-
- for (size_t i (0); i < min_; ++i)
- connections_.push_back (create ());
- }
- }
-
- bool connection_pool_factory::
- release (pooled_connection* c)
- {
- c->callback_ = 0;
-
- lock l (mutex_);
-
- // Determine if we need to keep or free this connection.
- //
- bool keep (!c->failed () &&
- (waiters_ != 0 ||
- min_ == 0 ||
- (connections_.size () + in_use_ <= min_)));
-
- in_use_--;
-
- if (keep)
- {
- connections_.push_back (pooled_connection_ptr (inc_ref (c)));
- connections_.back ()->recycle ();
- }
-
- if (waiters_ != 0)
- cond_.signal ();
-
- return !keep;
- }
-
- //
- // connection_pool_factory::pooled_connection
- //
-
- connection_pool_factory::pooled_connection::
- pooled_connection (connection_pool_factory& f)
- : connection (f)
- {
- cb_.arg = this;
- cb_.zero_counter = &zero_counter;
- }
-
- connection_pool_factory::pooled_connection::
- pooled_connection (connection_pool_factory& f, OCISvcCtx* handle)
- : connection (f, handle)
- {
- 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 static_cast<connection_pool_factory&> (c->factory_).release (c);
- }
- }
-}