00001 #include "CondCore/DBCommon/interface/Exception.h" 00002 #include "CondCore/DBCommon/interface/PoolTransaction.h" 00003 #include "PoolConnectionProxy.h" 00004 //pool includes 00005 #include "DataSvc/IDataSvc.h" 00006 #include "PersistencySvc/ITransaction.h" 00007 //#include <iostream> 00008 cond::PoolTransaction::PoolTransaction(cond::PoolConnectionProxy* parentConnection):m_parentConnection(parentConnection),m_datasvc(0), m_count(0){ 00009 this->attach(m_parentConnection); 00010 } 00011 00012 cond::PoolTransaction::~PoolTransaction(){} 00013 00014 void 00015 cond::PoolTransaction::start(bool readOnly){ 00016 m_count++; 00017 if (1==m_count) { 00018 this->NotifyStartOfTransaction(); 00019 if(!m_datasvc) throw cond::Exception("PoolTransaction::start: database not connected"); 00020 if(!readOnly){ 00021 m_datasvc->transaction().start( pool::ITransaction::UPDATE ); 00022 }else{ 00023 m_datasvc->transaction().start( pool::ITransaction::READ ); 00024 } 00025 return; 00026 } 00027 if (!readOnly && isReadOnly()) upgrade(); 00028 00029 } 00030 00031 void 00032 cond::PoolTransaction::commit(){ 00033 if (0==m_count) return; 00034 m_count--; 00035 if (0==m_count) forceCommit(); 00036 } 00037 00038 void 00039 cond::PoolTransaction::upgrade() { 00040 forceCommit(); 00041 this->NotifyStartOfTransaction(); 00042 m_datasvc->transaction().start( pool::ITransaction::UPDATE ); 00043 } 00044 00045 void 00046 cond::PoolTransaction::forceCommit() { 00047 if(!m_datasvc) throw cond::Exception("PoolTransaction::commit: database not connected"); 00048 if(!m_datasvc->transaction().commit()){ 00049 m_datasvc->transaction().rollback(); 00050 throw cond::TransactionException("cond::PoolTransaction::commit","An Error ocurred, transaction rolled back"); 00051 } 00052 this->NotifyEndOfTransaction(); 00053 } 00054 00055 00056 void 00057 cond::PoolTransaction::rollback(){ 00058 if(!m_datasvc) throw cond::Exception("PoolTransaction::rollback: database not connected"); 00059 m_datasvc->transaction().rollback(); 00060 this->NotifyEndOfTransaction(); 00061 } 00062 bool 00063 cond::PoolTransaction::isReadOnly()const{ 00064 if(m_datasvc->transaction().type()==pool::ITransaction::READ) return true; 00065 return false; 00066 } 00067 cond::IConnectionProxy& 00068 cond::PoolTransaction::parentConnection(){ 00069 return *m_parentConnection; 00070 } 00071 void 00072 cond::PoolTransaction::resetPoolDataSvc(pool::IDataSvc* datasvc) const{ 00073 m_datasvc=datasvc; 00074 } 00075 pool::IDataSvc& 00076 cond::PoolTransaction::poolDataSvc(){ 00077 return *m_datasvc; 00078 }