diff --git a/Database/APR/PersistencySvc/PersistencySvc/IDatabase.h b/Database/APR/PersistencySvc/PersistencySvc/IDatabase.h index e32a36240694da8860243ff445d6680f18dbc5cf..ecb638ce4790fc3d74c654b729c975f0d7dc1f3e 100644 --- a/Database/APR/PersistencySvc/PersistencySvc/IDatabase.h +++ b/Database/APR/PersistencySvc/PersistencySvc/IDatabase.h @@ -46,12 +46,6 @@ namespace pool { /// Returns the opening mode. It can be used to check whether the database is connected. virtual OpenMode openMode() const = 0; - /** Reopens in a different mode. - * If the database was in UPDATE mode before, then all changes since - * the last commit are aborted. - */ - virtual void revertMode( OpenMode mode ) = 0; - /// Returns the file identifier of this database virtual const std::string& fid() const = 0; diff --git a/Database/APR/PersistencySvc/src/DatabaseHandler.cpp b/Database/APR/PersistencySvc/src/DatabaseHandler.cpp index 36c3b28ea9ef9f0ffa85bdb7cffb5ff66bfc8979..d7e40b61b3c969fa60a2bead419c8ab3f6420c4c 100644 --- a/Database/APR/PersistencySvc/src/DatabaseHandler.cpp +++ b/Database/APR/PersistencySvc/src/DatabaseHandler.cpp @@ -26,7 +26,6 @@ pool::PersistencySvc::DatabaseHandler::DatabaseHandler( pool::IStorageSvc& stora m_storageSvc( storageSvc ), m_storageExplorer( storageExplorer ), m_session( session ), - m_transaction( 0 ), m_fileDescriptor( fid, pfn ), m_technology( technology ), m_accessMode( accessmode ) @@ -39,115 +38,67 @@ pool::PersistencySvc::DatabaseHandler::DatabaseHandler( pool::IStorageSvc& stora } } - pool::PersistencySvc::DatabaseHandler::~DatabaseHandler() { - if ( this->isTransactionActive() ) { - this->rollBackTransaction(); - } - m_storageSvc.disconnect( m_fileDescriptor ); -} - - -bool -pool::PersistencySvc::DatabaseHandler::startTransaction() -{ - if ( m_transaction ) return false; - if ( m_storageSvc.startTransaction( m_fileDescriptor.dbc(), - m_transaction ).isSuccess() ) { - return true; - } - else return false; + rollBackTransaction(); + m_storageSvc.disconnect( m_fileDescriptor ); } bool pool::PersistencySvc::DatabaseHandler::commitTransaction() { - bool result = false; - if ( m_transaction ) { - if ( m_storageSvc.endTransaction( m_transaction, - pool::Transaction::TRANSACT_COMMIT ).isSuccess() && - m_storageSvc.startTransaction( m_fileDescriptor.dbc(), - m_transaction ).isSuccess() && - m_storageSvc.endTransaction( m_transaction, - pool::Transaction::TRANSACT_FLUSH ).isSuccess() ) { - result = true; - } - m_transaction = 0; - } - return result; + return ( m_storageSvc.endTransaction( m_fileDescriptor.dbc(), + Transaction::TRANSACT_COMMIT ).isSuccess() && + m_storageSvc.endTransaction( m_fileDescriptor.dbc(), + Transaction::TRANSACT_FLUSH ).isSuccess() ); } bool pool::PersistencySvc::DatabaseHandler::commitAndHoldTransaction() { - bool result = false; - if ( m_transaction ) { - if ( m_storageSvc.endTransaction( m_transaction, - pool::Transaction::TRANSACT_COMMIT ).isSuccess() ) { - m_transaction = 0; - if ( m_storageSvc.startTransaction( m_fileDescriptor.dbc(), - m_transaction ).isSuccess() ) { - result = true; - } - } - } - return result; + return ( m_storageSvc.endTransaction( m_fileDescriptor.dbc(), + Transaction::TRANSACT_COMMIT ).isSuccess() ); } void pool::PersistencySvc::DatabaseHandler::rollBackTransaction() { - if ( m_transaction ) { - m_storageSvc.endTransaction( m_transaction, pool::Transaction::TRANSACT_ROLLBACK ); - m_transaction = 0; - } + m_storageSvc.endTransaction( m_fileDescriptor.dbc(), Transaction::TRANSACT_ROLLBACK ); } -bool -pool::PersistencySvc::DatabaseHandler::isTransactionActive() const -{ - if ( m_transaction ) return true; - else return false; -} - std::vector< std::string > pool::PersistencySvc::DatabaseHandler::containers() { - std::vector< std::string > result; - if ( m_transaction ) { - std::vector<const Token*> containerTokens; - m_storageExplorer.containers( m_fileDescriptor, containerTokens ); - for ( std::vector<const Token*>::const_iterator iToken = containerTokens.begin(); - iToken != containerTokens.end(); ++iToken ) { + std::vector< std::string > result; + std::vector<const Token*> containerTokens; + m_storageExplorer.containers( m_fileDescriptor, containerTokens ); + for ( std::vector<const Token*>::const_iterator iToken = containerTokens.begin(); + iToken != containerTokens.end(); ++iToken ) { result.push_back( m_storageSvc.getContName(m_fileDescriptor, **iToken) ); - } - } - return result; + } + return result; } pool::IContainer* pool::PersistencySvc::DatabaseHandler::container( const std::string& containerName ) { - if ( m_transaction ) { - // Check the existence of a given container. - std::vector< std::string > allContainers = this->containers(); - for ( std::vector< std::string >::const_iterator iName = allContainers.begin(); - iName != allContainers.end(); ++iName ) { + // Check the existence of a given container. + std::vector< std::string > allContainers = this->containers(); + for ( std::vector< std::string >::const_iterator iName = allContainers.begin(); + iName != allContainers.end(); ++iName ) { if ( *iName == containerName ) { - return new pool::PersistencySvc::Container( m_fileDescriptor, - m_storageExplorer, - m_technology, - containerName ); + return new pool::PersistencySvc::Container( m_fileDescriptor, + m_storageExplorer, + m_technology, + containerName ); } - } - } - return 0; + } + return 0; } @@ -182,12 +133,10 @@ pool::PersistencySvc::DatabaseHandler::accessMode() const void pool::PersistencySvc::DatabaseHandler::reconnect( long accessMode ) { - bool activeTransaction = this->isTransactionActive(); - if ( activeTransaction ) this->rollBackTransaction(); - if ( m_storageSvc.reconnect( m_fileDescriptor, accessMode ).isSuccess() ) { - m_accessMode = accessMode; - } - if ( activeTransaction ) this->startTransaction(); + rollBackTransaction(); + if( m_storageSvc.reconnect( m_fileDescriptor, accessMode ).isSuccess() ) { + m_accessMode = accessMode; + } } @@ -198,7 +147,6 @@ pool::PersistencySvc::DatabaseHandler::writeObject( const std::string& container const RootType& type ) { Token* token = 0; - if ( ! m_transaction ) return token; if ( ! object ) return token; // Get the persistent shape. @@ -209,8 +157,7 @@ pool::PersistencySvc::DatabaseHandler::writeObject( const std::string& container } if ( shape ) { - if ( m_storageSvc.allocate( m_transaction, - m_fileDescriptor, + if ( m_storageSvc.allocate( m_fileDescriptor, containerName, minorTechnology, object, @@ -227,7 +174,6 @@ void* pool::PersistencySvc::DatabaseHandler::readObject( const Token& token, void* object ) { void* result( object ); - if ( ! m_transaction ) return result; // Get the persistent shape const pool::Shape* shape = 0; diff --git a/Database/APR/PersistencySvc/src/DatabaseHandler.h b/Database/APR/PersistencySvc/src/DatabaseHandler.h index 67134ae3c1d85dd2dd71f2c6cd74a5942d90a01d..2df46d1ac272986ad4e4eb999c18a490879bdae8 100644 --- a/Database/APR/PersistencySvc/src/DatabaseHandler.h +++ b/Database/APR/PersistencySvc/src/DatabaseHandler.h @@ -18,7 +18,6 @@ namespace pool { // forward declarations class Session; - class Transaction; class IStorageSvc; class IStorageExplorer; class IContainer; @@ -46,9 +45,6 @@ namespace pool { /// Destructor. Disconnects from the database ~DatabaseHandler(); - /// Starts the transaction - bool startTransaction(); - /// Commits the transaction bool commitTransaction(); @@ -58,9 +54,6 @@ namespace pool { /// Rolls back the transaction void rollBackTransaction(); - /// Checks if a transaction is active - bool isTransactionActive() const; - /// Gives the list of containers std::vector< std::string > containers(); @@ -113,8 +106,6 @@ namespace pool { IStorageExplorer& m_storageExplorer; /// Pointer to the session for this database Session* m_session; - /// Micro transaction handler for this database - Transaction* m_transaction; /// File descriptor for this database FileDescriptor m_fileDescriptor; /// Technology identifier diff --git a/Database/APR/PersistencySvc/src/GlobalTransaction.cpp b/Database/APR/PersistencySvc/src/GlobalTransaction.cpp index 32e395a637a2ccb09d6e29d6e008d1551b37b5d5..f1c67e6cf3b8514b9f51f78a423a34ca49cc81b3 100644 --- a/Database/APR/PersistencySvc/src/GlobalTransaction.cpp +++ b/Database/APR/PersistencySvc/src/GlobalTransaction.cpp @@ -24,34 +24,8 @@ bool pool::PersistencySvc::GlobalTransaction::start( pool::ITransaction::Type type ) { if ( this->isActive() || type == pool::ITransaction::UNDEFINED ) return false; - unsigned int successfullDatabases = 0; - bool result = false; - for ( pool::PersistencySvc::DatabaseRegistry::iterator iDb = m_databases.begin(); - iDb != m_databases.end(); ++iDb ) { - if ( ! (*iDb)->startTransaction() ) { - coral::MessageStream log( "PersistencySvc::GlobalTransaction" ); - log << coral::Error << "Could not start a transaction for the database with" << coral::MessageStream::endmsg - << "FID = " << (*iDb)->fid() << coral::MessageStream::endmsg - << "PFN = " << (*iDb)->pfn() << coral::MessageStream::endmsg; - break; - } - ++successfullDatabases; - } - - if ( successfullDatabases == m_databases.size() ) { - result = true; - } - else { // at least one database failed. Rollback the ones we started - pool::PersistencySvc::DatabaseRegistry::iterator iDb = m_databases.begin(); - while ( successfullDatabases > 0 ) { - (*iDb)->rollBackTransaction(); - --successfullDatabases; - ++iDb; - } - } - - if ( result ) m_type = type; - return result; + m_type = type; + return true; } diff --git a/Database/APR/PersistencySvc/src/MicroSessionManager.cpp b/Database/APR/PersistencySvc/src/MicroSessionManager.cpp index bb9350449c58854611c9ed87697f6ec8c2ad56d5..d9d6dad6103c2a3381e084cb20716255adfcfdcf 100644 --- a/Database/APR/PersistencySvc/src/MicroSessionManager.cpp +++ b/Database/APR/PersistencySvc/src/MicroSessionManager.cpp @@ -82,7 +82,6 @@ pool::PersistencySvc::MicroSessionManager::connect( const std::string& fid, accessMode ); m_registry.registerDatabaseHandler( db ); m_databaseHandlers.insert( db ); - db->startTransaction(); } catch( pool::PersistencySvcException& /* error */) { } diff --git a/Database/APR/PersistencySvc/src/UserDatabase.cpp b/Database/APR/PersistencySvc/src/UserDatabase.cpp index acaf39ddc97af2332ace9146e6652d1af7f7e055..0a4716004333cb1c047b50dd6b27cc739f073bda 100644 --- a/Database/APR/PersistencySvc/src/UserDatabase.cpp +++ b/Database/APR/PersistencySvc/src/UserDatabase.cpp @@ -145,7 +145,8 @@ pool::PersistencySvc::UserDatabase::connectForWrite( const pool::DatabaseConnect if ( this->checkInRegistry() ) { if ( m_openMode == pool::IDatabase::READ ) { - this->revertMode( pool::IDatabase::UPDATE ); + m_databaseHandler->reconnect( pool::UPDATE ); + m_openMode = pool::IDatabase::UPDATE; } } else { // The database is not yet connected. @@ -253,33 +254,6 @@ pool::PersistencySvc::UserDatabase::openMode() const } -void -pool::PersistencySvc::UserDatabase::revertMode( pool::IDatabase::OpenMode mode ) -{ - if ( m_databaseHandler ) { - switch ( mode ){ - case pool::IDatabase::CLOSED: - this->disconnect(); - break; - case pool::IDatabase::READ: - if ( m_openMode == pool::IDatabase::UPDATE ) { - m_databaseHandler->reconnect( pool::READ ); - m_openMode = pool::IDatabase::READ; - } - break; - case pool::IDatabase::UPDATE: - if ( m_openMode == pool::IDatabase::READ ) { - m_databaseHandler->reconnect( pool::UPDATE ); - m_openMode = pool::IDatabase::UPDATE; - } - break; - default: - break; - }; - } -} - - const std::string& pool::PersistencySvc::UserDatabase::fid() const { diff --git a/Database/APR/PersistencySvc/src/UserDatabase.h b/Database/APR/PersistencySvc/src/UserDatabase.h index fc4872b1b0ffd409a884217caab1208e91258721..6212069b7913947191fcc3883673ec9ec2157089 100644 --- a/Database/APR/PersistencySvc/src/UserDatabase.h +++ b/Database/APR/PersistencySvc/src/UserDatabase.h @@ -61,12 +61,6 @@ namespace pool { /// Returns the opening mode. It can be used to check whether the database is connected. IDatabase::OpenMode openMode() const; - /** Reopens in a different mode. - * If the database was in UPDATE mode before, then all changes since - * the last commit are aborted. - */ - void revertMode( IDatabase::OpenMode mode ); - /// Returns the file identifier of this database const std::string& fid() const; diff --git a/Database/APR/RootStorageSvc/src/RootDatabase.cpp b/Database/APR/RootStorageSvc/src/RootDatabase.cpp index e2fa30d50655c9c6f72b79d60245467c004fcc98..9ee127fd2a352c1bb872344a630b55f04d8b3762 100644 --- a/Database/APR/RootStorageSvc/src/RootDatabase.cpp +++ b/Database/APR/RootStorageSvc/src/RootDatabase.cpp @@ -35,22 +35,20 @@ using namespace pool; using namespace std; -//namespace pool { -// void patchStreamers(RootDatabase* db, TFile* file); -//} /// Standard Constuctor RootDatabase::RootDatabase(IOODatabase* idb) -: DbDatabaseImp(idb), m_file(nullptr), - m_defCompression(1), - m_defCompressionAlg(1), - m_defSplitLevel(99), - m_defAutoSave(16*1024*1024), - m_defBufferSize(16*1024), - m_defWritePolicy(TObject::kOverwrite), // On write create new versions - m_branchOffsetTabLen(0), - m_defTreeCacheLearnEvents(100), - m_fileMgr(nullptr) + : DbDatabaseImp(idb), + m_file(nullptr), + m_defCompression(1), + m_defCompressionAlg(1), + m_defSplitLevel(99), + m_defAutoSave(16*1024*1024), + m_defBufferSize(16*1024), + m_defWritePolicy(TObject::kOverwrite), // On write create new versions + m_branchOffsetTabLen(0), + m_defTreeCacheLearnEvents(100), + m_fileMgr(nullptr) { m_version = "1.1"; DbInstanceCount::increment(this); @@ -783,13 +781,14 @@ void RootDatabase::registerBranchContainer(RootTreeContainer* cont) } -/// Start/Commit/Rollback Database Transaction -DbStatus RootDatabase::transAct(DbTransaction& refTr ) +/// Execute Database Transaction action +DbStatus RootDatabase::transAct(Transaction::Action action) { + cout << "RootDatabase::transAct" << endl; // process flush to write file - if( refTr.state() == Transaction::TRANSACT_FLUSH && m_file != nullptr && m_file->IsWritable()) m_file->Write(); + if( action == Transaction::TRANSACT_FLUSH && m_file != nullptr && m_file->IsWritable()) m_file->Write(); // process commits only - if( refTr.state() != Transaction::TRANSACT_COMMIT ) + if( action != Transaction::TRANSACT_COMMIT ) return Success; // check all TTrees with branch containers, if they need Filling diff --git a/Database/APR/RootStorageSvc/src/RootDatabase.h b/Database/APR/RootStorageSvc/src/RootDatabase.h index 74a8401137714bbc794fd1fe8d58b77178b79fcf..1b7f0bef8d361107bc4c7e48426fb3add69d0028 100644 --- a/Database/APR/RootStorageSvc/src/RootDatabase.h +++ b/Database/APR/RootStorageSvc/src/RootDatabase.h @@ -39,7 +39,8 @@ namespace pool { * @date 1/8/2002 * @version 1.0 */ - class RootDatabase : public DbDatabaseImp { + class RootDatabase : public DbDatabaseImp + { public: enum { READ_COUNTER = 0, WRITE_COUNTER = 1, OTHER_COUNTER = 2 }; private: @@ -177,9 +178,8 @@ namespace pool { */ virtual DbStatus close(DbAccessMode mode); - /// Start/Commit/Rollback Database Transaction - virtual DbStatus transAct(DbTransaction& /* refTr */); - + /// Execute Database Transaction action + virtual DbStatus transAct(Transaction::Action action); }; } // End namespace pool #endif /* POOL_ROOTSTORAGESVC_ROOTDBASE_H */ diff --git a/Database/APR/RootStorageSvc/src/RootKeyContainer.cpp b/Database/APR/RootStorageSvc/src/RootKeyContainer.cpp index b59ffe950aa2fef089549840326ae99b67c493fc..2dc1b088a9ea6300362113e0cb7739c35c6b5f01 100755 --- a/Database/APR/RootStorageSvc/src/RootKeyContainer.cpp +++ b/Database/APR/RootStorageSvc/src/RootKeyContainer.cpp @@ -15,13 +15,11 @@ #include "StorageSvc/DbOption.h" #include "StorageSvc/DbSelect.h" -#include "StorageSvc/DbDatabase.h" #include "StorageSvc/DbColumn.h" #include "StorageSvc/DbTypeInfo.h" #include "StorageSvc/DataCallBack.h" #include "StorageSvc/DbInstanceCount.h" #include "StorageSvc/DbArray.h" -#include "StorageSvc/DbTransaction.h" #include "StorageSvc/DbReflex.h" // Local implementation files @@ -90,30 +88,19 @@ long long int RootKeyContainer::size() { return -1; } -/// Execute object modification requests during a transaction -DbStatus RootKeyContainer::endTransaction(DbTransaction& refTr) { - DbStatus status = Success; - switch(refTr.state()) { - case Transaction::TRANSACT_COMMIT: - break; - case Transaction::TRANSACT_FLUSH: - if ( m_dir ) { - m_dir->SaveSelf(); - } - else { - status = Error; - } - break; - case Transaction::TRANSACT_START: - break; - case Transaction::TRANSACT_ROLLBACK: - break; - default: - status = Error; - break; - } - return status; +/// Execute transaction action +DbStatus RootKeyContainer::transAct(Transaction::Action action) +{ + // execure action on the base class first + DbStatus status = DbContainerImp::transAct(action); + if( !status.isSuccess() ) return status; + + if( action != Transaction::TRANSACT_FLUSH ) return Success; + if( !m_dir ) return Error; + m_dir->SaveSelf(); + return Success; } + // Interface Implementation: Find entry in container DbStatus RootKeyContainer::fetch(const Token::OID_t& linkH, Token::OID_t& stmt) { diff --git a/Database/APR/RootStorageSvc/src/RootKeyContainer.h b/Database/APR/RootStorageSvc/src/RootKeyContainer.h index 28c20eb2d8bd309a36956a626db030dbd12c1b34..ca83f6db54682767f4facd514bd7d1fc1d63fef8 100755 --- a/Database/APR/RootStorageSvc/src/RootKeyContainer.h +++ b/Database/APR/RootStorageSvc/src/RootKeyContainer.h @@ -16,7 +16,6 @@ // Framework include files #include "StorageSvc/DbDatabase.h" #include "StorageSvc/DbContainerImp.h" -#include "StorageSvc/DbImplementation.h" // Forward declarations namespace CINT { class IOHandler; } @@ -125,7 +124,8 @@ namespace pool { * * @return DbStatus code indicating success or failure. */ - virtual DbStatus endTransaction(DbTransaction& refTr); + /// Execute transaction action + virtual DbStatus transAct(Transaction::Action action); }; } #endif //POOL_ROOTKEYCONTAINER_H diff --git a/Database/APR/RootStorageSvc/src/RootTreeContainer.cpp b/Database/APR/RootStorageSvc/src/RootTreeContainer.cpp index 69ed6538c4fd487f91eee209cb8d12c63ecac0ce..46222a23d60649544f315a1d4462bcd2c8a0d195 100755 --- a/Database/APR/RootStorageSvc/src/RootTreeContainer.cpp +++ b/Database/APR/RootStorageSvc/src/RootTreeContainer.cpp @@ -22,7 +22,7 @@ #include "StorageSvc/DataCallBack.h" #include "StorageSvc/DbArray.h" #include "POOLCore/DbPrint.h" -#include "StorageSvc/DbTransaction.h" +#include "StorageSvc/Transaction.h" #include "StorageSvc/DbReflex.h" // Local implementation files @@ -1213,44 +1213,24 @@ DbStatus RootTreeContainer::setOption(const DbOption& opt) { } -/// Execute object modification requests during a transaction -DbStatus RootTreeContainer::endTransaction(DbTransaction& refTr) { - DbStatus status = Success; - switch(refTr.state()) { - case Transaction::TRANSACT_COMMIT: - break; - case Transaction::TRANSACT_FLUSH: - if( m_tree ) { - DbPrint log(m_name); - if( isBranchContainer() ) { - log << DbPrintLvl::Debug << "endTransaction: go to finish" << DbPrint::endmsg; - status = finishTransAct(); - } else { - log << DbPrintLvl::Debug << "endTransaction: tree AutoSave" << DbPrint::endmsg; - m_tree->AutoSave(); - } - } - else { - status = Error; - } - break; - case Transaction::TRANSACT_START: - break; - case Transaction::TRANSACT_ROLLBACK: - break; - default: - status = Error; - break; - } - return status; -} - -DbStatus RootTreeContainer::finishTransAct() { +/// Execute transaction action +DbStatus RootTreeContainer::transAct(Transaction::Action action) +{ + // execure action on the base class first + DbStatus status = DbContainerImp::transAct(action); + if( !status.isSuccess() ) return status; + + if( action != Transaction::TRANSACT_FLUSH ) return Success; + if( !m_tree ) return Error; + if( !isBranchContainer() ) { + m_tree->AutoSave(); + return Success; + } + // check if all TTree branches were filled and write the TTree Branches::const_iterator k; for(k=m_branches.begin(); k !=m_branches.end(); ++k) { Long64_t branchEntries = k->branch->GetEntries(); Long64_t treeEntries = m_tree->GetEntries(); - // cout << " +++ End Transaction. Tree rows=" << treeEntries << " , Branch " << k->branch->GetName() << " " << branchEntries << endl; if (branchEntries > treeEntries) { TIter next(m_tree->GetListOfBranches()); TBranch * b = nullptr; diff --git a/Database/APR/RootStorageSvc/src/RootTreeContainer.h b/Database/APR/RootStorageSvc/src/RootTreeContainer.h index dc761b8a982e07ef00acfd22c8b5c7a362371c10..b8aaa7a0f8993b09a137303b05fd6fccddc5606a 100755 --- a/Database/APR/RootStorageSvc/src/RootTreeContainer.h +++ b/Database/APR/RootStorageSvc/src/RootTreeContainer.h @@ -248,12 +248,8 @@ namespace pool { /// Commit single entry to container virtual DbStatus writeObject(TransactionStack::value_type& entry); - /// Execute end of object modification requests during a transaction - /** @param refTr [IN] Transaction reference - * - * @return DbStatus code indicating success or failure. - */ - virtual DbStatus endTransaction(DbTransaction& refTr); + /// Execute Transaction action + virtual DbStatus transAct(Transaction::Action action); }; } #endif //POOL_ROOTTREECONTAINER_H diff --git a/Database/APR/StorageSvc/StorageSvc/DbContainer.h b/Database/APR/StorageSvc/StorageSvc/DbContainer.h index fd790f63cb049b8513436277b458f77e95668ebe..261df9a0da336eda920a0f792d4db31883291e28 100644 --- a/Database/APR/StorageSvc/StorageSvc/DbContainer.h +++ b/Database/APR/StorageSvc/StorageSvc/DbContainer.h @@ -17,6 +17,7 @@ #include "PersistentDataModel/Token.h" #include "StorageSvc/DbObject.h" #include "StorageSvc/DbHandleBase.h" +#include "StorageSvc/Transaction.h" /* * POOL namespace declaration @@ -130,12 +131,10 @@ namespace pool { const DbType& dbtyp, DbAccessMode mod) const; - /// Allow query if Transaction is active - bool transactionActive() const; /// Check if the container was opened bool isOpen() const; - /// Start/Commit/Rollback Database Transaction - DbStatus transAct(DbTransaction& refTransaction); + /// Execute Database Transaction Action + DbStatus transAct(Transaction::Action action); /// Pass options to the implementation DbStatus setOption(const DbOption& refOpt); /// Access options diff --git a/Database/APR/StorageSvc/StorageSvc/DbContainerImp.h b/Database/APR/StorageSvc/StorageSvc/DbContainerImp.h index a1a38689f0e45c215af300083dcb677c8cb07601..9e07ae190894efeea17c58e50d8afdc7b9417161 100644 --- a/Database/APR/StorageSvc/StorageSvc/DbContainerImp.h +++ b/Database/APR/StorageSvc/StorageSvc/DbContainerImp.h @@ -112,17 +112,7 @@ namespace pool { virtual DbStatus writeObject(TransactionStack::value_type& /* entry */) { return Error; } /// Execute object modification requests during a transaction - /** @param refTr [IN] Transaction reference - * - * @return DbStatus code indicating success or failure. - */ - virtual DbStatus commitTransaction(DbTransaction& refTr); - /// Execute end of object modification requests during a transaction - /** @param refTr [IN] Transaction reference - * - * @return DbStatus code indicating success or failure. - */ - virtual DbStatus endTransaction(DbTransaction& refTr); + virtual DbStatus commitTransaction(); /// Access section identifier from OID virtual const DbSection& getSection(const Token::OID_t& oid) const; @@ -155,8 +145,8 @@ namespace pool { */ virtual DbStatus setOption(const DbOption& opt); - /// Start/Commit/Rollback Database Transaction - virtual DbStatus transAct(DbTransaction& pTransaction); + /// Execute Transaction Action + virtual DbStatus transAct(Transaction::Action); /// In place allocation of raw memory for the transient object virtual void* allocate( unsigned long siz, DbContainer& cntH, diff --git a/Database/APR/StorageSvc/StorageSvc/DbDatabase.h b/Database/APR/StorageSvc/StorageSvc/DbDatabase.h index d7b3fee0a443d6f00d0e6b3ee19b4b072cf66f73..e3375122f541c7911068240c938312bf0b49bb16 100644 --- a/Database/APR/StorageSvc/StorageSvc/DbDatabase.h +++ b/Database/APR/StorageSvc/StorageSvc/DbDatabase.h @@ -19,6 +19,7 @@ #include "StorageSvc/pool.h" #include "StorageSvc/DbSection.h" #include "StorageSvc/DbHandleBase.h" +#include "StorageSvc/Transaction.h" // STL include files #include <vector> @@ -39,7 +40,6 @@ namespace pool { class DbDatabaseObj; class DbContainer; class DbContainerObj; - class DbTransaction; class DbOption; class DbTypeInfo; @@ -91,8 +91,6 @@ namespace pool { } /// Access reference counter int refCount() const; - /// Allow query if Transaction is active - bool transactionActive() const; /// Access to access mode member DbAccessMode openMode() const; /// Access to db name (FID) @@ -139,11 +137,11 @@ namespace pool { DbStatus retire() const; /// Check if the database was opened bool isOpen() const; - /// Start/Commit/Rollback Database Transaction - /** @param refTr [IN] Valid transaction handle. + /// Commit/Rollback Database Transaction + /** @param action [IN] action to perform * @return Status code indicating success or failure. */ - DbStatus transAct(DbTransaction& refTr); + DbStatus transAct(Transaction::Action action); /// Set options /** @param refOpt [IN] Reference to option object. * @return Status code indicating success or failure. diff --git a/Database/APR/StorageSvc/StorageSvc/DbDatabaseImp.h b/Database/APR/StorageSvc/StorageSvc/DbDatabaseImp.h index 659dc7f59754eb5cf716e6b94a4aab940e665adc..94a2483563f4466357d970341b159356a900f722 100644 --- a/Database/APR/StorageSvc/StorageSvc/DbDatabaseImp.h +++ b/Database/APR/StorageSvc/StorageSvc/DbDatabaseImp.h @@ -75,13 +75,6 @@ namespace pool { */ virtual DbStatus reopen(DbAccessMode mode); - /// Find container in Database: to be overridden - /** @param handle [IN] Handle to invalid container object. - * - * @return DbStatus code indicating success or failure. - */ - virtual DbStatus find(DbContainer& handle); - /// Access options /** @param opt [IN] Reference to option object. * @@ -96,12 +89,19 @@ namespace pool { */ virtual DbStatus setOption(const DbOption& opt); - /// Start/Commit/Rollback Database Transaction - /** @param refTransaction [IN/OUT] Transaction context. - * - * @return DbStatus code indicating success or failure. + /// Execute Database Transaction action + /** @param action [IN] action to perform + * @return Status code indicating success or failure. */ - virtual DbStatus transAct(DbTransaction& refTransaction); + virtual DbStatus transAct(Transaction::Action action); }; } // End namespace pool #endif // POOL_DBDATABASEIMP_H + + + + + + + + diff --git a/Database/APR/StorageSvc/StorageSvc/DbTransaction.h b/Database/APR/StorageSvc/StorageSvc/DbTransaction.h index 916aa927ce053dcef3a7e25718c4553ef910f79a..8257a9fb4f38d37d9139f753d73ce36036337b54 100644 --- a/Database/APR/StorageSvc/StorageSvc/DbTransaction.h +++ b/Database/APR/StorageSvc/StorageSvc/DbTransaction.h @@ -29,6 +29,7 @@ namespace pool { class DbDomainObj; class DbDatabaseObj; class DbContainerObj; + class DbStorageSvc; /** Definition of the Transaction class @@ -42,6 +43,7 @@ namespace pool { friend class DbDomain; friend class DbDatabase; friend class DbContainer; + friend class DbStorageSvc; private: /// Transaction type Transaction::Action m_state; diff --git a/Database/APR/StorageSvc/StorageSvc/IDbContainer.h b/Database/APR/StorageSvc/StorageSvc/IDbContainer.h index 40494d1e04b31aac2ed4872f1425a6c845c51bd2..d8b3d7fd409df82b047fc7dca17ac3ce9a3dc593 100644 --- a/Database/APR/StorageSvc/StorageSvc/IDbContainer.h +++ b/Database/APR/StorageSvc/StorageSvc/IDbContainer.h @@ -16,6 +16,7 @@ #include "PersistentDataModel/Token.h" #include "StorageSvc/DbObject.h" #include "StorageSvc/DbSection.h" +#include "StorageSvc/Transaction.h" #include <vector> @@ -29,7 +30,6 @@ namespace pool { class DbDatabase; class DbContainer; class DataCallBack; - class DbTransaction; class DbOption; class DbSelect; @@ -153,12 +153,8 @@ namespace pool { */ virtual DbStatus destroy( const Token::OID_t& linkH) = 0; - /// Start/Commit/Rollback Database Transaction - /** @param refTransaction [IN/OUT] Transaction context. - * - * @return DbStatus code indicating success or failure. - */ - virtual DbStatus transAct(DbTransaction& refTransaction) = 0; + /// Execute Transaction Action + virtual DbStatus transAct(Transaction::Action) = 0; /// Query the pending transaction stack virtual bool updatesPending() const = 0; diff --git a/Database/APR/StorageSvc/StorageSvc/IDbDatabase.h b/Database/APR/StorageSvc/StorageSvc/IDbDatabase.h index 92372aede9a054af11ce9e8515b50e3045924d53..7cdd5873fc33e9c28a2a864a63ef950306bb96bf 100644 --- a/Database/APR/StorageSvc/StorageSvc/IDbDatabase.h +++ b/Database/APR/StorageSvc/StorageSvc/IDbDatabase.h @@ -16,6 +16,7 @@ // Framework include files #include "StorageSvc/pool.h" +#include "StorageSvc/Transaction.h" /* * POOL namespace declaration @@ -27,7 +28,6 @@ namespace pool { class DbDomain; class DbDatabase; class DbContainer; - class DbTransaction; /** @class IDbDatabase IDbDatabase.h StorageSvc/IDbDatabase.h * @@ -65,13 +65,6 @@ namespace pool { */ virtual DbStatus getOption(DbOption& refOpt) const = 0; - /// Find container in Database - /** @param handle [IN] Handle to invalid container object. - * - * @return DbStatus code indicating success or failure. - */ - virtual DbStatus find(DbContainer& handle) = 0; - /// Close database access /** @param mode [IN] Desired session access mode. * @@ -107,12 +100,11 @@ namespace pool { */ virtual DbStatus reopen(DbAccessMode mode) = 0; - /// Start/Commit/Rollback Database Transaction - /** @param refTransaction [IN/OUT] Transaction context. - * - * @return DbStatus code indicating success or failure. + /// Execute Database Transaction action + /** @param action [IN] action to perform + * @return Status code indicating success or failure. */ - virtual DbStatus transAct(DbTransaction& refTransaction) = 0; - }; + virtual DbStatus transAct(Transaction::Action action) = 0; + }; } // End namespace pool #endif // POOL_IDBDATABASE_H diff --git a/Database/APR/StorageSvc/StorageSvc/IOODatabase.h b/Database/APR/StorageSvc/StorageSvc/IOODatabase.h index 9111d4d4d26214a39afd921755baf9473cd67c62..91a1a71647877d31c6f16b437e35553dcb041cdb 100644 --- a/Database/APR/StorageSvc/StorageSvc/IOODatabase.h +++ b/Database/APR/StorageSvc/StorageSvc/IOODatabase.h @@ -2,7 +2,6 @@ Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration */ -// $Id: IOODatabase.h 726071 2016-02-25 09:23:05Z krasznaa $ //==================================================================== // IOODatabase interface definition //-------------------------------------------------------------------- @@ -16,7 +15,6 @@ //==================================================================== #ifndef POOL_IOODATABASE_H #define POOL_IOODATABASE_H -// $Header: /cvs/PF/pool/StorageSvc/StorageSvc/IOODatabase.h,v 1.18 2007/11/28 16:19:33 frankb Exp $ // Framework include files #include "StorageSvc/pool.h" diff --git a/Database/APR/StorageSvc/StorageSvc/IOODatabaseFactory.h b/Database/APR/StorageSvc/StorageSvc/IOODatabaseFactory.h deleted file mode 100644 index feef04f54b5f305defafa4780a0ef6d6e8197686..0000000000000000000000000000000000000000 --- a/Database/APR/StorageSvc/StorageSvc/IOODatabaseFactory.h +++ /dev/null @@ -1,25 +0,0 @@ -/* - Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration -*/ - -#ifndef IOODATABASEFACTORY_H -#define IOODATABASEFACTORY_H - -#include "Reflex/PluginService.h" -#include "StorageSvc/IOODatabase.h" - -#include <new> - -// Reflex object factory definition -namespace { - template <typename P> class Factory<P,pool::IOODatabase*()> { - public: static void Func( void* ret, void* mem, const std::vector<void*>& arg, void*) { - void* p = (pool::IOODatabase*)(mem ? ::new(mem) P(arg[0]) : ::new P(arg[0])); - if (ret) *(void**)ret = p; - } - }; -} - -#define DECLARE_OODATABASE(x) PLUGINSVC_FACTORY(x,pool::IOODatabase*()) - -#endif diff --git a/Database/APR/StorageSvc/StorageSvc/IStorageSvc.h b/Database/APR/StorageSvc/StorageSvc/IStorageSvc.h index 1f9d0c2be703e37d494ff9213c9093b7d738f7ae..a31c7f57b9e092831d136a5925a18bda47efa228 100644 --- a/Database/APR/StorageSvc/StorageSvc/IStorageSvc.h +++ b/Database/APR/StorageSvc/StorageSvc/IStorageSvc.h @@ -27,7 +27,6 @@ namespace pool { class FileDescriptor; typedef class Session *SessionH; typedef class DatabaseConnection *ConnectionH; - typedef class Transaction *TransactionH; typedef const class Shape *ShapeH; /** @class IStorageSvc IStorageSvc.h StorageSvc/IStorageSvc.h @@ -84,9 +83,8 @@ namespace pool { virtual std::string getContName(const FileDescriptor& refDB, const Token& pToken) = 0; - /// Register object identified by its pointer with for write. + /// Register object for write /** - * @param trCxtH [IN] Handle to the Transaction context. * @param refDB [IN] Reference to Database descriptor * @param refCont [IN] Reference to container name * @param technology[IN] Specialised sub-technology @@ -97,20 +95,13 @@ namespace pool { * * @return DbStatus code indicating success or failure. */ - virtual DbStatus allocate( TransactionH trCxtH, - const FileDescriptor& refDB, + virtual DbStatus allocate( const FileDescriptor& refDB, const std::string& refCont, int technology, const void* object, ShapeH shapeH, Token*& refpTok) = 0; - /// Free a persistent object from the heap. - /** - * @param pToken [IN] Token to the persistent object. - * @return DbStatus code indicating success or failure. - */ - virtual DbStatus free( const Token& pToken) = 0; /// Read a persistent object from the medium. /** Reading an object does not create the object. @@ -128,7 +119,6 @@ namespace pool { /// In place update of an existing object. /** - * @param trCxtH [IN] Handle to the Transaction context. * @param refDB [IN] Reference to Database descriptor * @param object [IN] Pointer to persistent data object. * @param shapeH [IN] Handle to persistent type information @@ -137,23 +127,20 @@ namespace pool { * * @return DbStatus code indicating success or failure. */ - virtual DbStatus update( TransactionH trCxtH, - const FileDescriptor& refDB, + virtual DbStatus update( const FileDescriptor& refDB, const void* object, ShapeH shapeH, const Token& refToken) = 0; /// Destroy an existing persistent object. /** - * @param trCxtH [IN] Handle to the Transaction context. * @param refDB [IN] Reference to Database descriptor * @param refToken [IN] Reference to token containing the location * information of the persistent object. * * @return DbStatus code indicating success or failure. */ - virtual DbStatus destroy( TransactionH trCxtH, - const FileDescriptor& refDB, + virtual DbStatus destroy( const FileDescriptor& refDB, const Token& refToken) = 0; /// Retrieve persistent shape from Storage manager. @@ -304,25 +291,6 @@ namespace pool { virtual DbStatus openMode( FileDescriptor& refDB, int& mode ) = 0; - /// Start a new Transaction sequence. - /** When a new Transaction sequence is started, a new context is delivered - * to the user. Using this context he will then start collecting objects - * for persistency. After this excercise he will finally commit the - * objects he collected during the open Transaction. - * - * @param dbcH [IN] Handle to the Database context containing all - * information necessary to access the - * proper Database. The Database handle was - * retrieved when connecting to the Database. - * - * @param refCtxt [OUT] Handle to a location where the pointer - * of the Transaction context can be stored. - * - * @return DbStatus code indicating success or failure. - */ - virtual DbStatus startTransaction(const ConnectionH dbcH, - TransactionH& refCtxt) = 0; - /// End/Finish an existing Transaction sequence. /** At this phase all objects, which were marked for write when * the Transaction was started, are either going to be made persistent @@ -330,7 +298,7 @@ namespace pool { * is invalidated and may no longer be used independent wether the * Transaction was successful or not. * - * @param ctxtH [IN] Transaction context handle. + * @param conn [IN] Database connection * @param typ [IN] Enum indicating an action to be performed. * Valid arguments are COMMIT and ROLLBACK. * ROLLBACK can only be suported if the @@ -339,8 +307,7 @@ namespace pool { * * @return DbStatus code indicating success or failure. */ - virtual DbStatus endTransaction(TransactionH ctxtH, - Transaction::Action typ) = 0; + virtual DbStatus endTransaction( ConnectionH conn, Transaction::Action typ) = 0; /// DbStatus code definitions enum { diff --git a/Database/APR/StorageSvc/src/DbContainer.cpp b/Database/APR/StorageSvc/src/DbContainer.cpp index 25b451a9fd021aa357a8a49b6f4d014b4b9c3192..a3658253ffc4b5b3ea2e47e8bd524281bb899528 100644 --- a/Database/APR/StorageSvc/src/DbContainer.cpp +++ b/Database/APR/StorageSvc/src/DbContainer.cpp @@ -21,7 +21,6 @@ #include "StorageSvc/DbObjectCallBack.h" #include "StorageSvc/DbTypeInfo.h" #include "StorageSvc/DbContainer.h" -#include "StorageSvc/DbTransaction.h" #include "StorageSvc/DbToken.h" #include "DbContainerObj.h" @@ -106,15 +105,9 @@ bool DbContainer::isOpen() const { return isValid(); } -/// Allow query if Transaction is active -bool DbContainer::transactionActive() const { - return isValid() ? m_ptr->transactionActive() : false; -} - -/// Start/Commit/Rollback Database Transaction -DbStatus DbContainer::transAct(DbTransaction& refTr) { - return (isValid() && refTr.validate(m_ptr).isSuccess()) - ? m_ptr->transAct(refTr) : Error; +/// Execute Database Transaction Action +DbStatus DbContainer::transAct(Transaction::Action action) { + return isValid() ? m_ptr->transAct(action) : Error; } /// Pass options to the implementation @@ -268,7 +261,7 @@ DbStatus DbContainer::_load(DbObjectHandle<DbObject>& objH, Token::OID_t oid; DbCallBack call(this, &objH, typ); if ( m_ptr->load(&call, linkH, oid, mod, false).isSuccess() ) { -objH._setObject(call.object()); + objH._setObject(call.object()); objH.oid() = oid; return Success; } diff --git a/Database/APR/StorageSvc/src/DbContainerImp.cpp b/Database/APR/StorageSvc/src/DbContainerImp.cpp index 8fdadc0847a122018f5de2c19855ddd28978d932..f6c984dd499ff3edb2983912ec1303047ace86e8 100644 --- a/Database/APR/StorageSvc/src/DbContainerImp.cpp +++ b/Database/APR/StorageSvc/src/DbContainerImp.cpp @@ -122,7 +122,7 @@ DbStatus DbContainerImp::clearStack() { } /// Execute object modification requests during a transaction -DbStatus DbContainerImp::commitTransaction(DbTransaction& refTr ) { +DbStatus DbContainerImp::commitTransaction() { DbStatus iret = Success; DbStatus status = Success; TransactionStack::iterator i = m_stack.begin(); @@ -150,43 +150,18 @@ DbStatus DbContainerImp::commitTransaction(DbTransaction& refTr ) { break; } } - clearStack(); - status = endTransaction(refTr); - if ( !status.isSuccess() ) { - iret = status; - } return iret; } -/// Execute object modification requests during a transaction -DbStatus DbContainerImp::endTransaction(DbTransaction& /* refTr */ ) { - return Success; -} -/// Start/Commit/Rollback Database Transaction -DbStatus DbContainerImp::transAct(DbTransaction& refTr) { +/// Execute Database Transaction action +DbStatus DbContainerImp::transAct(Transaction::Action action) +{ DbStatus status = Success; - switch(refTr.state()) { - case Transaction::TRANSACT_COMMIT: - status = commitTransaction(refTr); - refTr.set(Transaction::TRANSACT_ENDED); - break; - case Transaction::TRANSACT_FLUSH: - status = commitTransaction(refTr); - refTr.set(Transaction::TRANSACT_ENDED); - break; - case Transaction::TRANSACT_START: - refTr.set(Transaction::TRANSACT_ACTIVE); - clearStack(); - break; - case Transaction::TRANSACT_ROLLBACK: - clearStack(); - refTr.set(Transaction::TRANSACT_ENDED); - break; - default: - status = Error; - break; + if( action==Transaction::TRANSACT_COMMIT || action==Transaction::TRANSACT_FLUSH ) { + status = commitTransaction(); } + clearStack(); return status; } diff --git a/Database/APR/StorageSvc/src/DbContainerObj.cpp b/Database/APR/StorageSvc/src/DbContainerObj.cpp index 9a2d84dcff8fc5628574311c63ace61e4ef4a6e9..cd8c7521ebef05804a864e3ec3f515e56673e830 100644 --- a/Database/APR/StorageSvc/src/DbContainerObj.cpp +++ b/Database/APR/StorageSvc/src/DbContainerObj.cpp @@ -48,12 +48,11 @@ DbContainerObj::DbContainerObj( const DbDatabase& dbH, const string& nam, const DbType& dbtyp, DbAccessMode mod) -: Base(nam, mod, dbtyp, dbH.db()), m_info(0), m_tokH(0), m_transactOpen(false) +: Base(nam, mod, dbtyp, dbH.db()), m_info(0), m_tokH(0) { DbPrint log( dbH.logon() ); m_isOpen = false; s_count->increment(); - m_transactOpen = dbH.transactionActive(); if ( 0 != db() && dbtyp == dbH.type() ) { if ( dbH.isValid() ) { @@ -202,28 +201,8 @@ bool DbContainerObj::updatesPending() const { } /// Start/Commit/Rollback Database Transaction -DbStatus DbContainerObj::transAct(DbTransaction& refTr) { - if ( m_info ) { - Transaction::Action typ = refTr.state(); - switch( typ ) { - case Transaction::TRANSACT_START: - if ( m_transactOpen ) - return Error; - m_transactOpen = true; - break; - case Transaction::TRANSACT_FLUSH: - case Transaction::TRANSACT_COMMIT: - case Transaction::TRANSACT_ROLLBACK: - if ( !m_transactOpen ) - return Error; - m_transactOpen = false; - break; - default: - break; - } - return m_info->transAct(refTr); - } - return Success; +DbStatus DbContainerObj::transAct(Transaction::Action action) { + return m_info? m_info->transAct(action) : Error; } /// Pass options to the implementation @@ -365,7 +344,7 @@ DbStatus DbContainerObj::load(DataCallBack* call, /// Perform UPDATE select DbStatus DbContainerObj::update(DbSelect& sel) { - if ( !isReadOnly() && hasAccess() && transactionActive() ) { + if ( !isReadOnly() && hasAccess() ) { m_dbH.setAge(0); return m_info->update(sel); } @@ -374,7 +353,7 @@ DbStatus DbContainerObj::update(DbSelect& sel) { /// Perform DELETE statement DbStatus DbContainerObj::destroy(DbSelect& sel) { - if ( !isReadOnly() && hasAccess() && transactionActive() ) { + if ( !isReadOnly() && hasAccess() ) { m_dbH.setAge(0); return m_info->destroy(sel); } diff --git a/Database/APR/StorageSvc/src/DbContainerObj.h b/Database/APR/StorageSvc/src/DbContainerObj.h index fd37bacc75262754004962f6684815deb3b52eae..a8d979b8252c3616f3d0e0f84c2ba51f74b35c20 100644 --- a/Database/APR/StorageSvc/src/DbContainerObj.h +++ b/Database/APR/StorageSvc/src/DbContainerObj.h @@ -61,8 +61,6 @@ namespace pool { DbDatabase m_dbH; /// Flag indication DbStatus of technology dependent container bool m_isOpen; - /// Flag to mark ongoing Transactions - bool m_transactOpen; /// Check database access bool hasAccess(); @@ -91,8 +89,6 @@ namespace pool { DbDatabase& database() { return m_dbH; } /// Access the token of the container object const Token* token() const { return m_tokH; } - /// Allow query if Transaction is active - bool transactionActive() const { return m_transactOpen; } /// Query the pending transaction stack bool updatesPending() const; /// Flag if container was opened @@ -101,7 +97,7 @@ namespace pool { bool isReadOnly() const { return !(mode()&pool::UPDATE) && !(mode()&pool::CREATE); } /// Cancel transaction flag - void cancelTransaction() { m_transactOpen = false; } + void cancelTransaction() { } /// Size of the Database container (=# of objects) long long int size(); /// Open the container @@ -110,8 +106,8 @@ namespace pool { DbStatus close(); /// Retire the container DbStatus retire(); - /// Start/Commit/Rollback Database Transaction - DbStatus transAct(DbTransaction& refTransaction); + /// Execute Database Transaction Action + DbStatus transAct(Transaction::Action); /// Pass options to the implementation DbStatus setOption(const DbOption& opt); /// Access options diff --git a/Database/APR/StorageSvc/src/DbDatabase.cpp b/Database/APR/StorageSvc/src/DbDatabase.cpp index 1d58f3a85714a798a27ee13dbaf61c82324376fa..668c21c122a5adac036945cdcdf3f03cc37480f3 100644 --- a/Database/APR/StorageSvc/src/DbDatabase.cpp +++ b/Database/APR/StorageSvc/src/DbDatabase.cpp @@ -157,13 +157,9 @@ DbStatus DbDatabase::getLink(const Token::OID_t& lnkH, Token* pTok, const DbSect std::string DbDatabase::cntName(const Token& token) const { return isValid() ? ptr()->cntName(token) : ""; } -/// Allow query if Transaction is active -bool DbDatabase::transactionActive() const -{ return isValid() ? ptr()->transactionActive() : false; } - -/// Start/Commit/Rollback Database Transaction -DbStatus DbDatabase::transAct(DbTransaction& refTr) { - return isValid() && refTr.validate(ptr()).isSuccess() ? ptr()->transAct(refTr) : Error; +/// Execute Database Transaction action +DbStatus DbDatabase::transAct(Transaction::Action action) { + return isValid()? ptr()->transAct(action) : Error; } /// Pass options to the implementation diff --git a/Database/APR/StorageSvc/src/DbDatabaseImp.cpp b/Database/APR/StorageSvc/src/DbDatabaseImp.cpp index 6da2a8359f8b0bdde5cb2dcae222738579538138..448f488a5d41e0622769969f870a7d274b8d027c 100644 --- a/Database/APR/StorageSvc/src/DbDatabaseImp.cpp +++ b/Database/APR/StorageSvc/src/DbDatabaseImp.cpp @@ -34,10 +34,6 @@ DbStatus DbDatabaseImp::onOpen(const DbDatabase& /* dbH */,DbAccessMode /* mode DbStatus DbDatabaseImp::reopen(DbAccessMode /* mode */) { return Error; } -/// Find container in Database: to be overridden -DbStatus DbDatabaseImp::find(DbContainer& /* handle */) -{ return Success; } - /// Access options DbStatus DbDatabaseImp::getOption(DbOption& /* opt */) const { return Error; } @@ -46,6 +42,6 @@ DbStatus DbDatabaseImp::getOption(DbOption& /* opt */) const DbStatus DbDatabaseImp::setOption(const DbOption& /* opt */) { return Success; } -/// Start/Commit/Rollback Database Transaction -DbStatus DbDatabaseImp::transAct(DbTransaction& /* refTr */) +/// Execute Database Transaction action +DbStatus DbDatabaseImp::transAct(Transaction::Action /*action*/) { return Success; } diff --git a/Database/APR/StorageSvc/src/DbDatabaseObj.cpp b/Database/APR/StorageSvc/src/DbDatabaseObj.cpp index 64f08fa793b1356740702e4759fb8de6fadda0c0..0a705416972abb0a0e1fa6bca4c7c2cf8b6cbc4a 100644 --- a/Database/APR/StorageSvc/src/DbDatabaseObj.cpp +++ b/Database/APR/StorageSvc/src/DbDatabaseObj.cpp @@ -24,7 +24,6 @@ #include "StorageSvc/DbReflex.h" #include "StorageSvc/DbColumn.h" #include "StorageSvc/DbTypeInfo.h" -#include "StorageSvc/DbTransaction.h" #include "StorageSvc/DbInstanceCount.h" #include "StorageSvc/IOODatabase.h" #include "StorageSvc/IDbDatabase.h" @@ -53,7 +52,7 @@ DbDatabaseObj::DbDatabaseObj( const DbDomain& dom, const string& fid, DbAccessMode mod) : Base(fid, mod, dom.type(), dom.db()), m_dom(dom), - m_info(0), m_string_t(0), m_transactOpen(false), m_fileAge(0) + m_info(0), m_string_t(0), m_fileAge(0) { DbPrint log( m_dom.name() ); DbInstanceCount::increment(this); @@ -535,7 +534,6 @@ DbStatus DbDatabaseObj::reopen(DbAccessMode mod) { (*i).second->cancelTransaction(); (*i).second->setMode(mod); } - m_transactOpen = false; return sc; } log << DbPrintLvl::Error << "Failed to reopen the database " << name() @@ -586,7 +584,7 @@ bool DbDatabaseObj::updatesPending() const { /// Close Database object DbStatus DbDatabaseObj::retire() { - if ( !updatesPending() && !transactionActive() ) { + if ( !updatesPending() ) { DbPrint log( m_logon); log << DbPrintLvl::Info << "Database being retired..." << DbPrint::endmsg; @@ -821,69 +819,32 @@ DbStatus DbDatabaseObj::associations(vector<const Token*>& assocs) { return Error; } -/// Start/Commit/Rollback Database Transaction -DbStatus DbDatabaseObj::transAct(DbTransaction& refTr) { - Transaction::Action typ = refTr.state(); +/// Execute Database Transaction action +DbStatus DbDatabaseObj::transAct(Transaction::Action action) { bool upda = (0 != (mode()&pool::CREATE) || 0 != (mode()&pool::UPDATE)); if ( 0 != m_info ) { DbStatus iret, status = Success; - switch( typ ) { - case Transaction::TRANSACT_START: - if ( m_transactOpen ) - return Error; - m_transactOpen = true; - break; - case Transaction::TRANSACT_FLUSH: - case Transaction::TRANSACT_COMMIT: - case Transaction::TRANSACT_ROLLBACK: - if ( !m_transactOpen ) - return Error; - m_transactOpen = false; - break; - default: - break; - } - for (iterator i=begin(); i != end(); ++i ) { DbContainerObj* c = (*i).second; - if ( c == m_links.ptr() ) continue; - else if ( c == m_params.ptr() ) continue; - else if ( c == m_shapes.ptr() ) continue; - else { - iret = (*i).second->transAct(refTr); - if ( !iret.isSuccess() ) { - status = iret; - } - if ( i != end() ) { - switch( typ ) { - case Transaction::TRANSACT_FLUSH: - case Transaction::TRANSACT_START: - case Transaction::TRANSACT_COMMIT: - case Transaction::TRANSACT_ROLLBACK: - refTr.set(typ); - break; - default: - status = Error; - break; - } - } + if( c == m_links.ptr() || c == m_params.ptr() || c == m_shapes.ptr() ) continue; + iret = c->transAct( action ); + if ( !iret.isSuccess() ) { + status = iret; } } + if ( status.isSuccess() ) { - status = m_params.transAct(refTr); - refTr.set(typ); + status = m_params.transAct(action); } if ( status.isSuccess() ) { - status = m_shapes.transAct(refTr); - refTr.set(typ); + status = m_shapes.transAct(action); } - if ( status.isSuccess() ) { - status = m_links.transAct(refTr); - refTr.set(typ); + if ( status.isSuccess() ) { + status = m_links.transAct(action); } + // now execute the action on the DB implementation if ( status.isSuccess() ) { - status = m_info->transAct(refTr); - refTr.set(typ); + status = m_info->transAct(action); } return status; } @@ -897,24 +858,6 @@ DbStatus DbDatabaseObj::transAct(DbTransaction& refTr) { else { // This means, that the database is retired. // Only READONLY databases may be retired. - switch( typ ) { - case Transaction::TRANSACT_START: - if ( m_transactOpen ) - return Error; - m_transactOpen = true; - refTr.set(typ); - break; - case Transaction::TRANSACT_FLUSH: - case Transaction::TRANSACT_COMMIT: - case Transaction::TRANSACT_ROLLBACK: - if ( !m_transactOpen ) - return Error; - m_transactOpen = false; - refTr.set(typ); - break; - default: - break; - } // Should be safe: Pending updates were checked on Re-open for (iterator i=begin(); i != end(); ++i ) { (*i).second->cancelTransaction(); diff --git a/Database/APR/StorageSvc/src/DbDatabaseObj.h b/Database/APR/StorageSvc/src/DbDatabaseObj.h index 7eaaf4cb3f424cf20140d6515531aa53adef4275..4e2b87dde656b1841871904d7e482ede15452e60 100644 --- a/Database/APR/StorageSvc/src/DbDatabaseObj.h +++ b/Database/APR/StorageSvc/src/DbDatabaseObj.h @@ -97,8 +97,6 @@ namespace pool { const DbTypeInfo* m_string_t; /// Physical Database login std::string m_logon; - /// Flag to mark ongoing Transactions - bool m_transactOpen; /// File age counter int m_fileAge; /// Token describing the object @@ -127,8 +125,6 @@ namespace pool { IDbDatabase* info() const { return m_info; } /// Access to domain handle (CONST) DbDomain& domain() { return m_dom; } - /// Allow query if Transaction is active - bool transactionActive() const { return m_transactOpen; } /// Access age value int age() const { return m_fileAge; } /// Access the token of the database object @@ -146,8 +142,8 @@ namespace pool { DbStatus retire(); /// Check for pending updates bool updatesPending() const; - /// Start/Commit/Rollback Database Transaction - DbStatus transAct(DbTransaction& refTransaction); + /// Execute Database Transaction action + DbStatus transAct(Transaction::Action action); /// Retrieve association link from token with redirection when file is merged. DbStatus getRedirection(const Token& token, Token::OID_t& obj_linkH); diff --git a/Database/APR/StorageSvc/src/DbDomainObj.cpp b/Database/APR/StorageSvc/src/DbDomainObj.cpp index 05fe64cecbb779663c59ff70ed71e68fb522663c..03111dd4797b0714a092832de8ea08315f68f52b 100644 --- a/Database/APR/StorageSvc/src/DbDomainObj.cpp +++ b/Database/APR/StorageSvc/src/DbDomainObj.cpp @@ -122,8 +122,7 @@ DbStatus DbDomainObj::ageOpenDbs() { for (iterator i = begin(); i != end(); ++i ) { DbDatabaseObj* pDB = (*i).second; DbAccessMode m = pDB->mode(); - bool tr = pDB->transactionActive(); - if ( false == tr && 0==(m&pool::CREATE) && 0==(m&pool::UPDATE) ) { + if( 0==(m&pool::CREATE) && 0==(m&pool::UPDATE) ) { pDB->setAge(1); } } @@ -140,8 +139,7 @@ DbStatus DbDomainObj::closeAgedDbs() { DbDatabaseObj* pDB = (*i).second; if ( pDB->age() > m_maxAge ) { DbAccessMode m = pDB->mode(); - bool tr = pDB->transactionActive(); - if ( false == tr && 0 == (m&pool::CREATE) && 0 == (m&pool::UPDATE) ) { + if( 0 == (m&pool::CREATE) && 0 == (m&pool::UPDATE) ) { aged_dbs.push_back(pDB); } } diff --git a/Database/APR/StorageSvc/src/DbStorageSvc.cpp b/Database/APR/StorageSvc/src/DbStorageSvc.cpp index 9f4bf1a550e2068d0ef14130e57e48fed9b7c2c5..17c63f52ea0ef3cd22025f93e96bfbaab6aeda04 100644 --- a/Database/APR/StorageSvc/src/DbStorageSvc.cpp +++ b/Database/APR/StorageSvc/src/DbStorageSvc.cpp @@ -24,10 +24,11 @@ #include "StorageSvc/DbObject.h" #include "StorageSvc/DbTypeInfo.h" #include "StorageSvc/DbContainer.h" -#include "StorageSvc/DbTransaction.h" +#include "StorageSvc/Transaction.h" #include "StorageSvc/DbDatabase.h" #include "StorageSvc/DbTransform.h" #include "StorageSvc/DbConnection.h" +#include "DbDatabaseObj.h" #include "StorageSvc/DbSection.h" #include "StorageSvc/IOODatabase.h" #include "StorageSvc/FileDescriptor.h" @@ -52,93 +53,7 @@ namespace pool { typedef const DbDatabaseObj *DbDatabaseH; class DbClassMap : public map<TypeH, Guid> {}; - class StorageTransaction : public Transaction { - public: - /// Internal storage - union Pointers { - DbDomain* dom; - DbDatabase* db; - DbContainer* cnt; - char* p; - }; - Pointers m_ptr; - DbTransaction m_tr; - public: - StorageTransaction() { - m_ptr.p = 0; - } - virtual ~StorageTransaction() { - switch(m_tr.type()) { - case TRANSACT_DB: - deletePtr(m_ptr.db); - break; - case TRANSACT_CNT: - deletePtr(m_ptr.cnt); - break; - case TRANSACT_DOM: - deletePtr(m_ptr.dom); - break; - default: - break; - } - } - DbTransaction& transaction() { - return m_tr; - } - /// Transaction implementation: Access to the transaction type - virtual Transaction::Type type() const { - return m_tr.type(); - } - /// Transaction implementation: Access to the transaction state - virtual Transaction::Action state() const { - return m_tr.state(); - } - /// Access to the transaction handle - void* trHandle() const { - switch( m_tr.type() ) { - case TRANSACT_DB: - return m_ptr.db->ptr(); - case TRANSACT_CNT: - return m_ptr.cnt->ptr(); - case TRANSACT_DOM: - return m_ptr.dom->ptr(); - default: - return 0; - } - } - DbStatus set(DbDatabase& dbH) { - if ( dbH.isValid() ) { - m_ptr.db = ::new DbDatabase(dbH); - m_technology = m_ptr.db->type().type(); - return m_ptr.db->transAct(m_tr); - } - return Error; - } - DbStatus set(DbContainer& cntH) { - if ( cntH.isValid() ) { - m_ptr.cnt = ::new DbContainer(cntH); - m_technology = m_ptr.cnt->type().type(); - return m_ptr.cnt->transAct(m_tr); - } - return Error; - } - DbStatus transAct(Transaction::Action typ) { - m_tr.set(typ); - switch( m_tr.type() ) { - case TRANSACT_DB: - return m_ptr.db->transAct(m_tr); - case TRANSACT_CNT: - return m_ptr.cnt->transAct(m_tr); - case TRANSACT_DOM: - default: - return Error; - } - } - bool isValid() const - { - return true; - } - }; + /// Standard Constructor. @@ -281,184 +196,120 @@ DbStatus DbStorageSvc::createShape( const FileDescriptor& /*fDesc */, return sc; } -/// Register object identified by its pointer with for write. -DbStatus DbStorageSvc::allocate( TransactionH refContext, - const FileDescriptor& fDesc, +/// Register object for write +DbStatus DbStorageSvc::allocate( const FileDescriptor& fDesc, const string& refCont, int technology, const void* object, ShapeH shape, Token*& refpToken) { - DbStatus sc = Error; - refpToken = 0; + DbStatus sc = Error; + refpToken = 0; - if ( refContext && shape && object ) { - StorageTransaction* tr = (StorageTransaction*)refContext; - if ( tr->isValid() ) { + if( shape && object ) { void* handle = fDesc.dbc()->handle(); - if (tr->m_tr.type() == Transaction::TRANSACT_DB && handle == tr->trHandle()) { - DbDatabase dbH((DbDatabaseH)handle); - if ( dbH.transactionActive() ) { - DbContainer cntH(dbH.type()); - sc = cntH.open( dbH, - refCont, - DbTypeInfoH(shape), - DbType(technology), - pool::CREATE|pool::UPDATE); - if ( sc.isSuccess() ) { - Token* t = new Token(cntH.token()); - t->setClassID(shape->shapeID()); - sc = cntH.allocate(object, shape, t->oid()); + DbDatabase dbH((DbDatabaseH)handle); + DbContainer cntH(dbH.type()); + sc = cntH.open( dbH, + refCont, + DbTypeInfoH(shape), + DbType(technology), + pool::CREATE|pool::UPDATE); + if ( sc.isSuccess() ) { + Token* t = new Token(cntH.token()); + t->setClassID(shape->shapeID()); + sc = cntH.allocate(object, shape, t->oid()); + if ( sc.isSuccess() ) { + sc = dbH.makeLink(t, t->oid()); if ( sc.isSuccess() ) { - sc = dbH.makeLink(t, t->oid()); - if ( sc.isSuccess() ) { - refpToken = t; - return Success; - } + refpToken = t; + return Success; } - t->release(); - } - } - return INVALID_CONNECTION_TOKEN; - } - else { - DbPrint log( name()); - log << DbPrintLvl::Error - << "The Transaction handle has nothing to do with " - << "the Database you wanted." - << DbPrint::endmsg; - return sc; + } + t->release(); } - } - sc = INVALID_TRANSACTION_TOKEN; - } - DbPrint err( name()); - err << DbPrintLvl::Error - << "Cannot allocate persistent object." << DbPrint::endmsg - << "Transaction Handle :" << (void*)refContext - << " Shape Handle :" << (void*)shape - << " FID=" << fDesc.FID() - << " Cnt=" << refCont - << DbPrint::endmsg; - return sc; + return INVALID_CONNECTION_TOKEN; + } + DbPrint err( name()); + err << DbPrintLvl::Error + << "Cannot allocate persistent object." << DbPrint::endmsg + << " Shape Handle :" << (void*)shape + << " FID=" << fDesc.FID() + << " Cnt=" << refCont + << DbPrint::endmsg; + return sc; } /// In place update of an existing object. -DbStatus DbStorageSvc::update( TransactionH refContext, - const FileDescriptor& fDesc, - const void* object, - ShapeH shape, - const Token& refToken) +DbStatus DbStorageSvc::update( const FileDescriptor& fDesc, + const void* object, + ShapeH shape, + const Token& refToken ) { - DbStatus sc = Error; - if ( refContext && shape && object ) { - StorageTransaction* tr = (StorageTransaction*)refContext; - if ( tr->isValid() ) { + DbStatus sc = Error; + if( shape && object ) { void* handle = fDesc.dbc()->handle(); - if (tr->m_tr.type() == Transaction::TRANSACT_DB && handle == tr->trHandle()) { - DbDatabase dbH((DbDatabaseH)handle); - if ( dbH.isValid() ) { - if ( dbH.transactionActive() ) { - DbContainer cntH(dbH.find(dbH.cntName(refToken))); - if ( !cntH.isValid() ) { - DbType db_typ(refToken.technology()); - const DbTypeInfo* db_info = dbH.objectShape(shape->shapeID()); - cntH.open(dbH, dbH.cntName(refToken), db_info, db_typ, dbH.openMode()); - } - if ( cntH.isValid() ) { - return cntH.update(object, shape, refToken.oid()); - } - DbPrint log( name()); - log << DbPrintLvl::Error << "The container " - << refToken.dbID() << "::" << dbH.cntName(refToken) - << " cannot be accessed." << DbPrint::endmsg - << "Was this object really read from the container " - << "the object token claims?" - << DbPrint::endmsg; - return INVALID_OBJ_TOKEN; - } - } - return INVALID_CONNECTION_TOKEN; - } - else { - DbPrint log( name()); - log << DbPrintLvl::Error - << "The Transaction handle has nothing to do with " - << "the Database you wanted." - << " DB:" << refToken.dbID() - << DbPrint::endmsg; + DbDatabase dbH((DbDatabaseH)handle); + if ( dbH.isValid() ) { + DbContainer cntH(dbH.find(dbH.cntName(refToken))); + if ( !cntH.isValid() ) { + DbType db_typ(refToken.technology()); + const DbTypeInfo* db_info = dbH.objectShape(shape->shapeID()); + cntH.open(dbH, dbH.cntName(refToken), db_info, db_typ, dbH.openMode()); + } + if ( cntH.isValid() ) { + return cntH.update(object, shape, refToken.oid()); + } + DbPrint log( name()); + log << DbPrintLvl::Error << "The container " + << refToken.dbID() << "::" << dbH.cntName(refToken) + << " cannot be accessed." << DbPrint::endmsg + << "Was this object really read from the container " + << "the object token claims?" + << DbPrint::endmsg; + return INVALID_OBJ_TOKEN; } - } - sc = INVALID_TRANSACTION_TOKEN; - } - DbPrint err( name()); - err << DbPrintLvl::Error - << "Cannot update persistent object." << DbPrint::endmsg - << "Transaction Handle :" << (void*)refContext - << " Shape Handle :" << (void*)shape - << " DB:" << refToken.dbID() - << DbPrint::endmsg; - return sc; + return INVALID_CONNECTION_TOKEN; + } + DbPrint err( name()); + err << DbPrintLvl::Error + << "Cannot update persistent object." << DbPrint::endmsg + << " Shape Handle :" << (void*)shape + << " DB:" << refToken.dbID() + << DbPrint::endmsg; + return sc; } /// Destroy an existing persistent object. DbStatus -DbStorageSvc::destroy(TransactionH refContext, const FileDescriptor& refDB, const Token& refToken) { - DbStatus sc = Error; - if ( refContext ) { - StorageTransaction* tr = (StorageTransaction*)refContext; - if ( tr->isValid() ) { - void* handle = refDB.dbc()->handle(); - if (tr->m_tr.type()==Transaction::TRANSACT_DB && handle==tr->trHandle()) { - DbDatabase dbH((DbDatabaseH)handle); - if ( dbH.isValid() ) { - if ( dbH.transactionActive() ) { - DbContainer cntH(dbH.find(dbH.cntName(refToken))); - if ( !cntH.isValid() ) { - DbType db_typ(refToken.technology()); - const DbTypeInfo* db_info = dbH.objectShape(refToken.classID()); - cntH.open(dbH, dbH.cntName(refToken), db_info, db_typ, dbH.openMode()); - } - if ( cntH.isValid() ) { - return cntH.destroy(refToken.oid()); - } - DbPrint log( name()); - log << DbPrintLvl::Error << "The container " - << refToken.dbID() << "::" << dbH.cntName(refToken) - << " cannot be accessed." << DbPrint::endmsg - << "Was this object really read from the container " - << "the object token claims?" - << DbPrint::endmsg; - return INVALID_OBJ_TOKEN; - } - } - return INVALID_CONNECTION_TOKEN; +DbStorageSvc::destroy( const FileDescriptor& refDB, const Token& refToken ) +{ + DbStatus sc = Error; + void* handle = refDB.dbc()->handle(); + DbDatabase dbH((DbDatabaseH)handle); + if ( dbH.isValid() ) { + DbContainer cntH(dbH.find(dbH.cntName(refToken))); + if ( !cntH.isValid() ) { + DbType db_typ(refToken.technology()); + const DbTypeInfo* db_info = dbH.objectShape(refToken.classID()); + cntH.open(dbH, dbH.cntName(refToken), db_info, db_typ, dbH.openMode()); } - else { - DbPrint log( name()); - log << DbPrintLvl::Error - << "The Transaction handle has nothing to do with " - << "the Database you wanted:" - << refToken.dbID() - << DbPrint::endmsg; + if ( cntH.isValid() ) { + return cntH.destroy(refToken.oid()); } - } - sc = INVALID_TRANSACTION_TOKEN; - } - DbPrint err( name()); - err << DbPrintLvl::Error - << "Cannot update persistent object." << DbPrint::endmsg - << "Transaction Handle :" << (void*)refContext - << " DB:" << refToken.dbID() - << DbPrint::endmsg; - return sc; + DbPrint log( name()); + log << DbPrintLvl::Error << "The container " + << refToken.dbID() << "::" << dbH.cntName(refToken) + << " cannot be accessed." << DbPrint::endmsg + << "Was this object really read from the container " + << "the object token claims?" + << DbPrint::endmsg; + return INVALID_OBJ_TOKEN; + } + return INVALID_CONNECTION_TOKEN; } -/// Free a persistent object from the heap. -DbStatus DbStorageSvc::free(const Token& /* pToken */ ) { - return Success; -} /// Read a persistent object from the medium. DbStatus DbStorageSvc::read( const FileDescriptor& fDesc, @@ -634,49 +485,11 @@ DbStatus DbStorageSvc::openMode(FileDescriptor& refDB, int& mode) { return Error; } -/// Start a new Transaction sequence. -DbStatus DbStorageSvc::startTransaction(const ConnectionH connectionH, TransactionH& transH) { - DbPrint err( name()); - if ( connectionH && connectionH->type() == m_domH.type().type() ) { - if ( connectionH->handle() != (void*)pool::INVALID ) { - DbDatabaseH handle = DbDatabaseH(connectionH->handle()); - DbDatabase dbH(handle); - transH = 0; - if ( dbH.isValid() && dbH.type() == m_domH.type() ) { - auto_ptr<StorageTransaction> tr(new StorageTransaction); - if ( tr->set(dbH).isSuccess() ) { - transH = tr.release(); - return Success; - } - err << DbPrintLvl::Error - << "Cannot start Transaction." - << "Is there an overlapping Transaction going on?" - << DbPrint::endmsg; - return Error; - } - } - } - err << DbPrintLvl::Error - << "Cannot start Transaction. Invalid Database connection handle." << DbPrint::endmsg; - return Error; -} /// End/Finish an existing Transaction sequence. -DbStatus DbStorageSvc::endTransaction(TransactionH pCtxt,Transaction::Action typ) { - if( pCtxt ) { - StorageTransaction* tr = (StorageTransaction*)pCtxt; - DbStatus status = tr->transAct(typ); - // Keep the transaction handle alive in failure. - if ( status.isSuccess() ) { - delete tr; - return status; - } - return status; - } - DbPrint err( name()); - err << DbPrintLvl::Error - << "Cannot end transaction. Invalid transaction handle." << DbPrint::endmsg; - return Error; +DbStatus DbStorageSvc::endTransaction( ConnectionH connection, Transaction::Action typ) +{ + return ( (DbDatabaseObj*)connection->handle() )->transAct( typ ); } /// Access options for a given database domain. diff --git a/Database/APR/StorageSvc/src/DbStorageSvc.h b/Database/APR/StorageSvc/src/DbStorageSvc.h index c74a02b887ab9e60849a660255b428dbe6e76240..d77448c40586c8dbb5490c353899cd9778983dc6 100644 --- a/Database/APR/StorageSvc/src/DbStorageSvc.h +++ b/Database/APR/StorageSvc/src/DbStorageSvc.h @@ -100,9 +100,8 @@ namespace pool { /**@name IStorageExplorer interface */ - /// Register object identified by its pointer with for write. + /// Register object for write /** - * @param trCxtH [IN] Handle to the Transaction context. * @param refDB [IN] Reference to Database descriptor * @param refCont [IN] Reference to container name * @param technology[IN] Specialised sub-technology @@ -113,8 +112,7 @@ namespace pool { * * @return DbStatus code indicating success or failure. */ - virtual DbStatus allocate( TransactionH trCxtH, - const FileDescriptor& refDB, + virtual DbStatus allocate( const FileDescriptor& refDB, const std::string& refCont, int technology, const void* object, @@ -123,7 +121,6 @@ namespace pool { /// In place update of an existing object. /** - * @param trCxtH [IN] Handle to the Transaction context. * @param refDB [IN] Reference to Database descriptor * @param object [IN] Pointer to persistent data object. * @param shapeH [IN] Handle to persistent type information @@ -132,31 +129,22 @@ namespace pool { * * @return DbStatus code indicating success or failure. */ - virtual DbStatus update( TransactionH trCxtH, - const FileDescriptor& refDB, + virtual DbStatus update( const FileDescriptor& refDB, const void* object, ShapeH shapeH, const Token& refToken); /// Destroy an existing persistent object. /** - * @param trCxtH [IN] Handle to the Transaction context. * @param refDB [IN] Reference to Database descriptor * @param refToken [IN] Reference to token containing the location * information of the persistent object. * * @return DbStatus code indicating success or failure. */ - virtual DbStatus destroy( TransactionH trCxtH, - const FileDescriptor& refDB, + virtual DbStatus destroy( const FileDescriptor& refDB, const Token& refToken); - /// Free a persistent object from the heap. - /** - * @param pToken [IN] Token to the persistent object. - * @return DbStatus code indicating success or failure. - */ - virtual DbStatus free( const Token& pToken); /// Read a persistent object from the medium. /** Reading an object does not create the object. @@ -329,24 +317,6 @@ namespace pool { virtual DbStatus openMode( FileDescriptor& refDB, int& mode ); - /// Start a new Transaction sequence. - /** When a new Transaction sequence is started, a new context is delivered - * to the user. Using this context he will then start collecting objects - * for persistency. After this excercise he will finally commit the - * objects he collected during the open Transaction. - * - * @param dbcH [IN] Handle to the Database context containing all - * information necessary to access the - * proper Database. The Database handle was - * retrieved when connecting to the Database. - * - * @param refCtxt [OUT] Handle to a location where the pointer - * of the Transaction context can be stored. - * - * @return DbStatus code indicating success or failure. - */ - virtual DbStatus startTransaction(const ConnectionH dbcH, - TransactionH& refCtxt); /// End/Finish an existing Transaction sequence. /** At this phase all objects, which were marked for write when @@ -355,7 +325,7 @@ namespace pool { * is invalidated and may no longer be used independent wether the * Transaction was successful or not. * - * @param ctxtH [IN] Transaction context handle. + * @param conn [IN] DB connection * @param typ [IN] Enum indicating an action to be performed. * Valid arguments are COMMIT and ROLLBACK. * ROLLBACK can only be suported if the @@ -364,8 +334,8 @@ namespace pool { * * @return DbStatus code indicating success or failure. */ - virtual DbStatus endTransaction(TransactionH ctxtH, - Transaction::Action typ); + virtual DbStatus endTransaction( ConnectionH conn, + Transaction::Action typ); /// Access options for a given database domain. /** Domain options are global options, which refer to the diff --git a/Database/APR/Tests/StorageSvc_AuxStore/TestDriver.cpp b/Database/APR/Tests/StorageSvc_AuxStore/TestDriver.cpp index 9c544a40a540655b46b3c0be2561bd946729e1f3..7c0ce96ca8dbfce7876604ccb79bfbce8c40117f 100755 --- a/Database/APR/Tests/StorageSvc_AuxStore/TestDriver.cpp +++ b/Database/APR/Tests/StorageSvc_AuxStore/TestDriver.cpp @@ -151,7 +151,7 @@ TestDriver::testWriting() cout << "Writing objects" << endl; for( int objn=0; objn <nObjects; objn++ ) { Token* token; - if( ! ( storSvc->allocate( transaction, fd, + if( ! ( storSvc->allocate( fd, container, pool::ROOTTREE_StorageType.type(), objs[objn], shape, token ).isSuccess() ) ) { throw std::runtime_error( "Could not write an object" ); diff --git a/Database/APR/Tests/StorageSvc_BasicFunctionality/TestDriver.cpp b/Database/APR/Tests/StorageSvc_BasicFunctionality/TestDriver.cpp index b2022813d14ddd6cf3241c55f82245cc273ec91c..bca576ebcbcdf976061ba4b5ddc1cce8e4d49c58 100644 --- a/Database/APR/Tests/StorageSvc_BasicFunctionality/TestDriver.cpp +++ b/Database/APR/Tests/StorageSvc_BasicFunctionality/TestDriver.cpp @@ -64,11 +64,6 @@ TestDriver::testWriting() throw std::runtime_error( "Could not start a connection." ); } pool::DatabaseConnection* connection = fd.dbc(); - pool::Transaction* transaction = 0; - cout << "startTransaction" << endl; - if ( ! ( storSvc->startTransaction( connection, transaction ).isSuccess() ) ) { - throw std::runtime_error( "Could not start a transaction." ); - } // Retrieve the dictionary RootType class_SimpleTestClass ( "SimpleTestClass" ); @@ -101,7 +96,7 @@ TestDriver::testWriting() // Writing the object. Token* token; - if ( ! ( storSvc->allocate( transaction, fd, + if ( ! ( storSvc->allocate( fd, container, pool::ROOTTREE_StorageType.type(), myObject, shape, token ).isSuccess() ) ) { throw std::runtime_error( "Could not write an object" ); @@ -111,7 +106,7 @@ TestDriver::testWriting() } // Closing the transaction. - if ( ! ( storSvc->endTransaction( transaction, pool::Transaction::TRANSACT_COMMIT ).isSuccess() ) ) { + if ( ! ( storSvc->endTransaction( connection, pool::Transaction::TRANSACT_COMMIT ).isSuccess() ) ) { throw std::runtime_error( "Could not end a transaction." ); } diff --git a/Database/APR/Tests/StorageSvc_MultipleIterators/TestDriver.cpp b/Database/APR/Tests/StorageSvc_MultipleIterators/TestDriver.cpp index fce60f2581c8f50f294a9d89e30e3e65b9af8b67..0fb958525ef19e601a0f6ce94b38bc98e51da05a 100644 --- a/Database/APR/Tests/StorageSvc_MultipleIterators/TestDriver.cpp +++ b/Database/APR/Tests/StorageSvc_MultipleIterators/TestDriver.cpp @@ -112,7 +112,7 @@ TestDriver::testWriting() // Writing the object. Token* token_SimpleTestClass; - if ( ! ( storSvc->allocate( transaction, fd, + if ( ! ( storSvc->allocate( fd, container, pool::ROOTKEY_StorageType.type(), myObject_SimpleTestClass, shape_SimpleTestClass, token_SimpleTestClass ).isSuccess() ) ) { throw std::runtime_error( "Could not write an object" ); @@ -138,7 +138,7 @@ TestDriver::testWriting() // Writing the object. Token* token_TestClassPrimitives; - if ( ! ( storSvc->allocate( transaction, fd, + if ( ! ( storSvc->allocate( fd, container, pool::ROOTKEY_StorageType.type(), myObject_TestClassPrimitives, shape_TestClassPrimitives, token_TestClassPrimitives ).isSuccess() ) ) { throw std::runtime_error( "Could not write an object" ); diff --git a/Database/APR/Tests/StorageSvc_ParallelReadWrite/TestDriver.cpp b/Database/APR/Tests/StorageSvc_ParallelReadWrite/TestDriver.cpp index 8d9ade19b36761e5dd5c0da0b8cd9d5f29a59d08..64864902813086741af7592ac6a5561ac4025c3c 100644 --- a/Database/APR/Tests/StorageSvc_ParallelReadWrite/TestDriver.cpp +++ b/Database/APR/Tests/StorageSvc_ParallelReadWrite/TestDriver.cpp @@ -100,7 +100,7 @@ TestDriver::testWriting() // Writing the object. Token* token; - if ( ! ( storSvc->allocate( transaction, fd, + if ( ! ( storSvc->allocate( fd, container, pool::ROOTTREE_StorageType.type(), myObject, shape, token ).isSuccess() ) ) { throw std::runtime_error( "Could not write an object" ); @@ -256,7 +256,7 @@ TestDriver::testParallelReadWrite() // Writing the object. Token* tokenw; - if ( ! ( storSvc->allocate( transaction2, fd2, + if ( ! ( storSvc->allocate( fd2, container, pool::ROOTTREE_StorageType.type(), myObject, shapew, tokenw ).isSuccess() ) ) { throw std::runtime_error( "Could not write an object" ); diff --git a/Database/APR/Tests/StorageSvc_TransientMembers/TestDriver.cpp b/Database/APR/Tests/StorageSvc_TransientMembers/TestDriver.cpp index 37846dd263acae89c4171b0731cb6318ddb076f6..3956bb75035ba6f8c0c3fd0729fca1e841947171 100644 --- a/Database/APR/Tests/StorageSvc_TransientMembers/TestDriver.cpp +++ b/Database/APR/Tests/StorageSvc_TransientMembers/TestDriver.cpp @@ -113,7 +113,7 @@ TestDriver::testWriting() // Writing the object. Token* token; - if ( ! ( storSvc->allocate( transaction, fd, + if ( ! ( storSvc->allocate( fd, container, pool::ROOTTREE_StorageType.type(), myObject, shape, token ).isSuccess() ) ) { throw std::runtime_error( "Could not write an object" );