CMS 3D CMS Logo

All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Pages
DatabaseSession.cc
Go to the documentation of this file.
2 #include "DatabaseSession.h"
3 #include "IDatabaseSchema.h"
4 #include "Sequences.h"
5 #include "MappingDatabase.h"
6 #include "TransactionCache.h"
7 #include "DatabaseContainer.h"
8 #include "ClassUtils.h"
9 #include "MappingRules.h"
10 #include "DatabaseUtilitySession.h"
11 // externals
12 #include "RelationalAccess/IConnectionServiceConfiguration.h"
13 #include "RelationalAccess/ISessionProxy.h"
14 #include "RelationalAccess/ITransaction.h"
15 
17  m_table(){
18 }
19 
21 }
22 
24  unsigned int size ){
25  std::map<int, unsigned int>::iterator iC = m_table.find( contId );
26  if( iC == m_table.end() ){
27  iC = m_table.insert( std::make_pair( contId, 0 ) ).first;
28  }
29  iC->second = size;
30 }
31 
32 const std::map<int, unsigned int>& ora::ContainerUpdateTable::table(){
33  return m_table;
34 }
35 
37  m_table.clear();
38 }
39 
41  m_connectionPool( new ConnectionPool ),
42  m_dbSession(),
43  m_connectionString( "" ),
44  m_schema(),
45  m_contIdSequence(),
46  m_mappingDb(),
47  m_transactionCache(),
48  m_containerUpdateTable(),
49  m_configuration(){
50  // for the private connection pool does not make sense to have a real pool...
51  m_connectionPool->configuration().setConnectionTimeOut(0);
52 }
53 
54 ora::DatabaseSession::DatabaseSession(boost::shared_ptr<ConnectionPool>& connectionPool ):
55  m_connectionPool( connectionPool ),
56  m_dbSession(),
57  m_connectionString( "" ),
58  m_schema(),
59  m_contIdSequence(),
60  m_mappingDb(),
61  m_transactionCache(),
62  m_containerUpdateTable(),
63  m_configuration(){
64 }
65 
67  disconnect();
68 }
69 
70 bool ora::DatabaseSession::connect( const std::string& connectionString,
71  bool readOnly ){
72  m_dbSession = m_connectionPool->connect( connectionString, readOnly?coral::ReadOnly:coral::Update );
73  if(m_dbSession.isValid()) {
74  m_connectionString = connectionString;
75  }
76  return isConnected();
77 }
78 
80  m_transactionCache.reset();
81  m_mappingDb.reset();
82  m_contIdSequence.reset();
83  m_schema.reset();
84  m_containerUpdateTable.clear();
85 }
86 
88  if( isConnected() ){
89  if( isTransactionActive()) rollbackTransaction();
90  }
91  clearTransaction();
92  m_dbSession.close();
93  m_connectionString.clear();
94 }
95 
97  return m_dbSession.isValid();
98 }
99 
101  return m_connectionString;
102 }
103 
105  if( !m_transactionCache.get() ){
106  m_dbSession.get().transaction().start( readOnly );
107  m_schema.reset( IDatabaseSchema::createSchemaHandle( m_dbSession.get().nominalSchema() ));
108  m_contIdSequence.reset( new NamedSequence( MappingRules::sequenceNameForContainerId(), *m_schema ));
109  m_mappingDb.reset( new MappingDatabase( *m_schema ));
110  m_transactionCache.reset( new TransactionCache );
111  }
112 }
113 
115  if( m_transactionCache.get() ){
116  m_schema->containerHeaderTable().updateNumberOfObjects( m_containerUpdateTable.table() );
117  m_dbSession.get().transaction().commit();
118  clearTransaction();
119  }
120 }
121 
123  if( m_transactionCache.get() ){
124  m_dbSession.get().transaction().rollback();
125  clearTransaction();
126  }
127 }
128 
129 bool ora::DatabaseSession::isTransactionActive( bool checkIfReadOnly ){
130  bool ret = false;
131  if( m_dbSession.get().transaction().isActive() ){
132  if( checkIfReadOnly ){
133  if( m_dbSession.get().transaction().isReadOnly() ) ret = true;
134  } else {
135  ret = true;
136  }
137  }
138  return ret;
139 }
140 
142  if(!m_transactionCache->dbExistsLoaded()){
143  m_transactionCache->setDbExists( m_schema->exists() );
144  }
145  return m_transactionCache->dbExists();
146 }
147 
149  m_schema->create();
150  m_transactionCache->setDbExists( true );
151 }
152 
154  m_schema->drop();
155  m_transactionCache->setDbExists( false );
156 }
157 
159  if(!m_transactionCache->isLoaded()){
160  std::map<std::string, ContainerHeaderData> containersData;
161  m_schema->containerHeaderTable().getContainerData( containersData );
162  for(std::map<std::string, ContainerHeaderData>::iterator iC = containersData.begin();
163  iC != containersData.end(); ++iC){
164  Handle<DatabaseContainer> container( new DatabaseContainer( iC->second.id, iC->first,
165  iC->second.className,
166  iC->second.numberOfObjects, *this ) );
167  m_transactionCache->addContainer( iC->second.id, iC->first, container );
168  }
169  m_transactionCache->setLoaded();
170  }
171 }
172 
174  const std::string& className ){
175  int newContId = m_contIdSequence->getNextId( true );
176  m_schema->containerHeaderTable().addContainer( newContId, containerName, className );
177  Handle<DatabaseContainer> container( new DatabaseContainer( newContId, containerName,
178  className, 0, *this ) );
179  m_transactionCache->addContainer( newContId, containerName, container );
180  return container;
181 }
182 
184  const Reflex::Type& type ){
185  // create the container
186  int newContId = m_contIdSequence->getNextId( true );
187  Handle<DatabaseContainer> newCont ( new DatabaseContainer( newContId, containerName, type, *this ) );
188  m_transactionCache->addContainer( newContId, containerName, newCont );
189  m_schema->containerHeaderTable().addContainer( newContId, containerName, newCont->className() );
190  newCont->create();
191  return newCont;
192 }
193 
194 void ora::DatabaseSession::dropContainer( const std::string& name ){
195  Handle<DatabaseContainer> cont = m_transactionCache->getContainer( name );
196  cont->drop();
197  m_transactionCache->eraseContainer( cont->id(), name );
198  m_schema->containerHeaderTable().removeContainer( cont->id() );
199 }
200 
202  return m_transactionCache->getContainer( name );
203 }
204 
206  return m_transactionCache->getContainer( contId );
207 }
208 
209 const std::map<int, ora::Handle<ora::DatabaseContainer> >& ora::DatabaseSession::containers(){
210  return m_transactionCache->containers();
211 }
212 
213 void ora::DatabaseSession::setObjectName( const std::string& name,
214  int containerId,
215  int itemId ){
216  m_schema->namingServiceTable().setObjectName( name, containerId, itemId );
217 }
218 
219 bool ora::DatabaseSession::eraseObjectName( const std::string& name ){
220  return m_schema->namingServiceTable().eraseObjectName( name );
221 }
222 
224  return m_schema->namingServiceTable().eraseAllNames();
225 }
226 
229  std::pair<int,int> oid;
230  if( m_schema->namingServiceTable().getObjectByName( name, oid ) ){
231  ora::Handle<ora::DatabaseContainer> cont = containerHandle( oid.first );
232  if( cont ) ret = Object( cont->fetchItem( oid.second ), cont->type() );
233  }
234  return ret;
235 }
236 
237 bool ora::DatabaseSession::getItemId( const std::string& name, ora::OId& destination ){
238  std::pair<int,int> oidData;
239  if( m_schema->namingServiceTable().getObjectByName( name, oidData ) ){
240  destination = OId( oidData.first, oidData.second );
241  return true;
242  }
243  return false;
244 }
245 
246 boost::shared_ptr<void> ora::DatabaseSession::fetchTypedObjectByName( const std::string& name,
247  const Reflex::Type& asType ){
248  boost::shared_ptr<void> ret = m_transactionCache->getNamedReference( name );
249  if( !ret.get() ){
250  std::pair<int,int> oid;
251  if( m_schema->namingServiceTable().getObjectByName( name, oid ) ){
252  ora::Handle<ora::DatabaseContainer> cont = containerHandle( oid.first );
253  void* ptr = 0;
254  if( cont ) {
255  ptr = cont->fetchItemAsType( oid.second, asType );
256  if( ptr) ret = boost::shared_ptr<void>( ptr, RflxDeleter( cont->type() ) );
257  }
258  }
259  if( ret.get() ) m_transactionCache->setNamedReference( name, ret );
260  }
261  return ret;
262 }
263 
265  std::vector<std::string>& destination ){
266  return m_schema->namingServiceTable().getNamesForContainer( containerId, destination );
267 }
268 
270  int itemId,
271  std::vector<std::string>& destination ){
272  return m_schema->namingServiceTable().getNamesForObject( containerId, itemId, destination );
273 }
274 
275 bool ora::DatabaseSession::listObjectNames( std::vector<std::string>& destination ){
276 
277  return m_schema->namingServiceTable().getAllNames( destination );
278 }
279 
281  if( !m_transactionCache->utility() ){
283  m_transactionCache->setUtility( util );
284  }
285  return m_transactionCache->utility();
286 }
287 
289  return *m_schema;
290 }
291 
293  return *m_contIdSequence;
294 }
295 
297  return *m_mappingDb;
298 }
299 
301  return m_configuration;
302 }
303 
305  return m_dbSession;
306 }
307 
308 boost::shared_ptr<ora::ConnectionPool>& ora::DatabaseSession::connectionPool(){
309  return m_connectionPool;
310 }
311 
313  return m_containerUpdateTable;
314 }
Handle< DatabaseContainer > containerHandle(const std::string &name)
const std::string & connectionString()
type
Definition: HCALResponse.h:22
To be moved in DBCommon, has to serve also the pure coral use case.
const Reflex::Type & type()
Object fetchObjectByName(const std::string &name)
bool listObjectNames(std::vector< std::string > &destination)
void takeNote(int contId, unsigned int size)
SharedSession & storageAccessSession()
boost::shared_ptr< ConnectionPool > & connectionPool()
bool getItemId(const std::string &name, OId &destination)
void dropContainer(const std::string &name)
boost::shared_ptr< void > fetchTypedObjectByName(const std::string &name, const Reflex::Type &asType)
Definition: OId.h:8
const std::map< int, unsigned int > & table()
bool eraseObjectName(const std::string &name)
bool connect(const std::string &connectionString, bool readOnly)
IDatabaseSchema & schema()
bool getNamesForContainer(int containerId, std::vector< std::string > &destination)
Handle< DatabaseUtilitySession > utility()
ContainerUpdateTable & containerUpdateTable()
void setObjectName(const std::string &name, int containerId, int itemId)
bool getNamesForObject(int containerId, int itemId, std::vector< std::string > &destination)
const std::map< int, Handle< DatabaseContainer > > & containers()
static IDatabaseSchema * createSchemaHandle(coral::ISchema &schema)
const std::string & className()
void startTransaction(bool readOnly)
NamedSequence & containerIdSequence()
MappingDatabase & mappingDatabase()
bool isTransactionActive(bool checkIfReadOnly=false)
Handle< DatabaseContainer > createContainer(const std::string &containerName, const Reflex::Type &type)
void * fetchItem(int itemId)
int cont
Configuration & configuration()
void * fetchItemAsType(int itemId, const Reflex::Type &asType)
static std::string sequenceNameForContainerId()
sequence names
Definition: MappingRules.cc:9
tuple size
Write out results.
std::string className(const T &t)
Definition: ClassName.h:30
boost::shared_ptr< ConnectionPool > m_connectionPool
Handle< ora::DatabaseContainer > addContainer(const std::string &containerName, const std::string &className)