00001
00002 #include "PoolConnectionProxy.h"
00003 #include "CondCore/DBCommon/interface/PoolTransaction.h"
00004 #include "CondCore/DBCommon/interface/Exception.h"
00005
00006 #include "RelationalAccess/IConnectionService.h"
00007 #include "RelationalAccess/IConnectionServiceConfiguration.h"
00008
00009 #include "PersistencySvc/DatabaseConnectionPolicy.h"
00010 #include "PersistencySvc/ISession.h"
00011 #include "PersistencySvc/ITransaction.h"
00012 #include "DataSvc/DataSvcFactory.h"
00013 #include "DataSvc/IDataSvc.h"
00014 #include "FileCatalog/IFileCatalog.h"
00015
00016 cond::PoolConnectionProxy::PoolConnectionProxy(
00017 coral::IConnectionService* connectionServiceHandle,
00018 const std::string& con,
00019 int connectionTimeOut,
00020 int idleConnectionCleanupPeriod):
00021 cond::IConnectionProxy(connectionServiceHandle,con,connectionTimeOut,idleConnectionCleanupPeriod),
00022 m_datasvc(0),
00023 m_transaction( 0 ),
00024 m_transactionCounter( 0 ),
00025 m_catalog( new pool::IFileCatalog )
00026 {
00027 std::string catconnect("pfncatalog_memory://POOL_RDBMS?");
00028 catconnect.append(con);
00029 m_catalog->setWriteCatalog(catconnect);
00030 m_catalog->connect();
00031 m_catalog->start();
00032 }
00033 cond::PoolConnectionProxy::~PoolConnectionProxy(){
00034
00035
00036 m_catalog->commit();
00037 m_catalog->disconnect();
00038
00039 if(m_transaction) delete m_transaction;
00040
00041 delete m_catalog;
00042
00043 }
00044 cond::ITransaction&
00045 cond::PoolConnectionProxy::transaction(){
00046 if(!m_transaction){
00047 m_transaction=new cond::PoolTransaction(this);
00048 }
00049 return *m_transaction;
00050 }
00051 pool::IDataSvc*
00052 cond::PoolConnectionProxy::poolDataSvc(){
00053 return m_datasvc;
00054 }
00055 void
00056 cond::PoolConnectionProxy::connect(){
00057 if(!m_datasvc){
00058 m_datasvc=pool::DataSvcFactory::instance(m_catalog);
00059 pool::DatabaseConnectionPolicy policy;
00060 policy.setWriteModeForNonExisting(pool::DatabaseConnectionPolicy::CREATE);
00061 policy.setWriteModeForExisting(pool::DatabaseConnectionPolicy::UPDATE);
00062 policy.setReadMode(pool::DatabaseConnectionPolicy::READ);
00063 m_datasvc->session().setDefaultConnectionPolicy(policy);
00064 }
00065
00066
00067
00068
00069
00070
00071
00072
00073 m_timer.restart();
00074
00075 }
00076 void
00077 cond::PoolConnectionProxy::disconnect(){
00078 if (0==m_datasvc) return;
00079 m_datasvc->transaction().commit();
00080 m_datasvc->session().disconnectAll();
00081 delete m_datasvc;
00082 m_datasvc=0;
00083 }
00084 void
00085 cond::PoolConnectionProxy::reactOnStartOfTransaction( const ITransaction* transactionSubject ){
00086 if(m_transactionCounter==0){
00087 this->connect();
00088 static_cast<const cond::PoolTransaction*>(transactionSubject)->resetPoolDataSvc(m_datasvc);
00089 }
00090 ++m_transactionCounter;
00091 }
00092 void
00093 cond::PoolConnectionProxy::reactOnEndOfTransaction( const ITransaction* transactionSubject ){
00094 if(!m_connectionSvcHandle) throw cond::Exception("PoolConnectionProxy::reactOnStartOfTransaction: cannot start transaction database is not connected.");
00095 int connectedTime=(int)m_timer.elapsed();
00096
00097
00098 if(!m_connectionSvcHandle->configuration().isPoolAutomaticCleanUpEnabled()){
00099
00100
00101 if(connectedTime>=m_idleConnectionCleanupPeriod){
00102 m_connectionSvcHandle->purgeConnectionPool();
00103
00104 }
00105 }
00106 if(m_connectionTimeOut==0){
00107 this->disconnect();
00108 }else{
00109 if(m_transactionCounter==1 && connectedTime>= m_connectionTimeOut){
00110
00111 this->disconnect();
00112 }
00113 }
00114 --m_transactionCounter;
00115 }