CMS 3D CMS Logo

PoolConnectionProxy.cc

Go to the documentation of this file.
00001 //local includes
00002 #include "PoolConnectionProxy.h"
00003 #include "CondCore/DBCommon/interface/PoolTransaction.h"
00004 #include "CondCore/DBCommon/interface/Exception.h"
00005 //connection service includes
00006 #include "RelationalAccess/IConnectionService.h"
00007 #include "RelationalAccess/IConnectionServiceConfiguration.h"
00008 //pool includes
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 //#include <iostream>
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   //std::cout<<"PoolConnectionProxy::~PoolConnectionProxy"<<std::endl;
00035   // disconnect(); (at the moment crashes)
00036   m_catalog->commit();
00037   m_catalog->disconnect();
00038   //m_datasvc->session().disconnectAll();
00039   if(m_transaction) delete m_transaction;
00040   //delete m_datasvc;
00041   delete m_catalog;
00042   //m_datasvc=0;
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   /*m_datasvc=pool::DataSvcFactory::instance(m_catalog);
00066   pool::DatabaseConnectionPolicy policy;
00067   policy.setWriteModeForNonExisting(pool::DatabaseConnectionPolicy::CREATE);
00068   policy.setWriteModeForExisting(pool::DatabaseConnectionPolicy::UPDATE);
00069   policy.setReadMode(pool::DatabaseConnectionPolicy::READ);
00070   m_datasvc->session().setDefaultConnectionPolicy(policy);
00071   */
00072   //if(m_connectionTimeOut>0){
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   //std::cout<<"pool connectedTime "<<connectedTime<<std::endl;
00097   //std::cout<<"isPoolAutimaticCleanUpEnabled() "<<m_connectionSvcHandle->configuration().isPoolAutomaticCleanUpEnabled()<<std::endl;
00098   if(!m_connectionSvcHandle->configuration().isPoolAutomaticCleanUpEnabled()){
00099     //std::cout<<"idlepoolcleanupPeriod "<<m_idleConnectionCleanupPeriod<<std::endl;
00100     //std::cout<<"pool connected time "<<connectedTime<<std::endl;
00101     if(connectedTime>=m_idleConnectionCleanupPeriod){
00102       m_connectionSvcHandle->purgeConnectionPool();
00103       //std::cout<<"idle connection pool purged"<<std::endl;
00104     }
00105   }
00106   if(m_connectionTimeOut==0){
00107     this->disconnect();
00108   }else{
00109     if(m_transactionCounter==1 && connectedTime>= m_connectionTimeOut){
00110       //if I'm the last open transaction and I'm beyond the connection timeout, close connection
00111       this->disconnect();
00112     }
00113   }
00114   --m_transactionCounter;
00115 }

Generated on Tue Jun 9 17:26:06 2009 for CMSSW by  doxygen 1.5.4