CMS 3D CMS Logo

 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Pages
SessionImpl.cc
Go to the documentation of this file.
2 #include "SessionImpl.h"
3 #include "DbConnectionString.h"
4 // for the ORA bridge
5 #include "OraDbSchema.h"
8 //
9 #include "RelationalAccess/ISessionProxy.h"
10 #include "RelationalAccess/ITransaction.h"
11 
12 namespace cond {
13 
14  namespace persistency {
15 
17  public:
18  CondDBTransaction( const boost::shared_ptr<coral::ISessionProxy>& coralSession ):
19  m_session( coralSession ){
20  }
21  virtual ~CondDBTransaction(){}
22 
23  void commit(){
24  m_session->transaction().commit();
25  }
26 
27  void rollback(){
28  m_session->transaction().rollback();
29  }
30 
31  bool isActive(){
32  return m_session->transaction().isActive();
33  }
34  private:
35  boost::shared_ptr<coral::ISessionProxy> m_session;
36  };
37 
38  class OraTransaction : public ITransaction {
39  public:
41  m_session( session ){
42  isOra = true;
43  }
44  virtual ~OraTransaction(){}
45 
46  void commit(){
48  }
49 
50  void rollback(){
52  }
53  bool isActive() {
54  return m_session.transaction().isActive();
55  }
56  private:
58  };
59 
61  coralSession(){
62  }
63 
64  SessionImpl::SessionImpl( boost::shared_ptr<coral::ISessionProxy>& session, const std::string& connectionStr ):
65  coralSession( session ),
66  connectionString( connectionStr ){
67  }
68 
70  close();
71  }
72 
74  if( coralSession.get() ){
75  if( coralSession->transaction().isActive() ){
76  coralSession->transaction().rollback();
77  }
78  coralSession.reset();
79  }
80  transaction.reset();
81  }
82 
83  bool SessionImpl::isActive() const {
84  return coralSession.get();
85  }
86 
87  void SessionImpl::startTransaction( bool readOnly ){
88  if( !transaction.get() ){
89  cond::DbConnection oraConnection;
90  cond::DbSession oraSession = oraConnection.createSession();
91  oraSession.open( coralSession, connectionString );
92  transaction.reset( new OraTransaction( oraSession ) );
93  oraSession.transaction().start( readOnly );
94  iovSchemaHandle.reset( new OraIOVSchema( oraSession ) );
95  gtSchemaHandle.reset( new OraGTSchema( oraSession ) );
96  if( !iovSchemaHandle->exists() && !gtSchemaHandle->exists() ){
97  std::unique_ptr<IIOVSchema> iovSchema( new IOVSchema( coralSession->nominalSchema() ) );
98  std::unique_ptr<IGTSchema> gtSchema( new GTSchema( coralSession->nominalSchema() ) );
99  if( iovSchema->exists() ){
100  iovSchemaHandle = std::move(iovSchema);
101  gtSchemaHandle = std::move(gtSchema);
103  }
104  }
105  } else {
106  if(!readOnly ) throwException( "An update transaction is already active.",
107  "SessionImpl::startTransaction" );
108  }
109  transaction->clients++;
110  }
111 
113  if( transaction ) {
114  transaction->clients--;
115  if( !transaction->clients ){
116  transaction->commit();
117  transaction.reset();
118  iovSchemaHandle.reset();
119  gtSchemaHandle.reset();
120  }
121  }
122  }
123 
125  if( transaction ) {
126  transaction->rollback();
127  transaction.reset();
128  iovSchemaHandle.reset();
129  gtSchemaHandle.reset();
130  }
131  }
132 
133  bool SessionImpl::isTransactionActive( bool deep ) const {
134  if( !transaction ) return false;
135  if( !deep ) return true;
136  return transaction->isActive();
137  }
138 
140  if(!transaction.get()) throwException( "The transaction is not active.","SessionImpl::openIovDb" );
141  if( !transaction->iovDbOpen ){
142  transaction->iovDbExists = iovSchemaHandle->exists();
143  transaction->iovDbOpen = true;
144  }
145  if( !transaction->iovDbExists ){
146  if( policy==CREATE ){
147  iovSchemaHandle->create();
148  transaction->iovDbExists = true;
149  } else {
150  if( policy==THROW) throwException( "IOV Database does not exist.","SessionImpl::openIovDb");
151  }
152  }
153  }
154 
156  if(!transaction.get()) throwException( "The transaction is not active.","SessionImpl::open" );
157  if( !transaction->gtDbOpen ){
158  transaction->gtDbExists = gtSchemaHandle->exists();
159  transaction->gtDbOpen = true;
160  }
161  if( !transaction->gtDbExists ){
162  throwException( "GT Database does not exist.","SessionImpl::openGTDb");
163  }
164  }
165 
167  return *iovSchemaHandle;
168  }
169 
171  return *gtSchemaHandle;
172  }
173 
175  if(!transaction.get()) throwException( "The transaction is not active.","SessionImpl::open" );
176  return transaction->isOra;
177  }
178 
179  }
180 }
bool rollback()
rollback transaction
OraTransaction(const cond::DbSession &session)
Definition: SessionImpl.cc:40
DbTransaction & transaction()
Definition: DbSession.cc:208
int isActive() const
current transaction is active
void open(const std::string &connectionString, bool readOnly=false)
Definition: DbSession.cc:159
int commit()
commit transaction.
void openIovDb(FailureOnOpeningPolicy policy=THROW)
Definition: SessionImpl.cc:139
std::unique_ptr< IIOVSchema > iovSchemaHandle
Definition: SessionImpl.h:67
int start(bool readOnly=false)
start transaction
CondDBTransaction(const boost::shared_ptr< coral::ISessionProxy > &coralSession)
Definition: SessionImpl.cc:18
boost::shared_ptr< coral::ISessionProxy > m_session
Definition: SessionImpl.cc:35
boost::shared_ptr< coral::ISessionProxy > coralSession
Definition: SessionImpl.h:63
std::unique_ptr< IGTSchema > gtSchemaHandle
Definition: SessionImpl.h:68
void startTransaction(bool readOnly=true)
Definition: SessionImpl.cc:87
DbSession createSession() const
Definition: DbConnection.cc:66
bool isTransactionActive(bool deep=true) const
Definition: SessionImpl.cc:133
std::unique_ptr< ITransaction > transaction
Definition: SessionImpl.h:66
void throwException(const std::string &message, const std::string &methodName)
Definition: Exception.cc:11