CMS 3D CMS Logo

PoolTransaction.cc

Go to the documentation of this file.
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 }

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