13#include "GaudiKernel/IIoComponentMgr.h"
14#include "GaudiKernel/ConcurrencyFlags.h"
38 return !s.empty() && (std::isdigit(s[0]) || s[0] ==
'+' || s[0] ==
'-');
52 if (catalog.starts_with(
"xmlcatalog_file:")) {
53 const std::string fileName = catalog.substr(16);
54 if (!iomgr->io_register(
this, IIoComponentMgr::IoMode::READ, fileName, fileName).isSuccess()) {
55 ATH_MSG_FATAL(
"could not register [" << catalog <<
"] for input !");
58 ATH_MSG_INFO(
"io_register[" << this->name() <<
"](" << catalog <<
") [ok]");
64 if (!iomgr->io_register(
this, IIoComponentMgr::IoMode::WRITE, fileName, fileName).isSuccess()) {
72 return(StatusCode::FAILURE);
75 MSG::Level athLvl =
msg().level();
85 if (!iomgr.retrieve().isSuccess()) {
87 return(StatusCode::FAILURE);
89 if (!iomgr->io_hasitem(
this)) {
91 return(StatusCode::FAILURE);
94 for (std::size_t icat = 0,
imax = readcat.size(); icat <
imax; icat++) {
95 if (readcat[icat].starts_with(
"xmlcatalog_file:")) {
96 std::string fileName = readcat[icat].substr(16);
97 if (iomgr->io_contains(
this, fileName)) {
98 if (!iomgr->io_retrieve(
this, fileName).isSuccess()) {
99 ATH_MSG_FATAL(
"Could not retrieve new value for [" << fileName <<
"] !");
100 return(StatusCode::FAILURE);
102 readcat[icat] =
"xmlcatalog_file:" + fileName;
110 if (iomgr->io_contains(
this, fileName)) {
111 if (!iomgr->io_retrieve(
this, fileName).isSuccess()) {
112 ATH_MSG_FATAL(
"Could not retrieve new value for [" << fileName <<
"] !");
113 return(StatusCode::FAILURE);
131 return(StatusCode::FAILURE);
136 const bool& atttibuteValue =
true;
138 ATH_MSG_FATAL(
"Failed to enable thread safety in ROOT via PersistencySvc.");
139 return(StatusCode::FAILURE);
144 return(StatusCode::FAILURE);
149 return(StatusCode::SUCCESS);
154 if (
m_useROOTIMT && Gaudi::Concurrency::ConcurrencyFlags::numThreads() > 1) {
155 const int& atttibuteValue = Gaudi::Concurrency::ConcurrencyFlags::numThreads() - 1;
157 ATH_MSG_FATAL(
"Failed to enable implicit multithreading in ROOT via PersistencySvc.");
158 return(StatusCode::FAILURE);
160 ATH_MSG_INFO(
"Enabled implicit multithreading in ROOT via PersistencySvc to: " << Gaudi::Concurrency::ConcurrencyFlags::numThreads() - 1);
162 return(StatusCode::SUCCESS);
167 bool retError =
false;
174 return(retError ? StatusCode::FAILURE : StatusCode::SUCCESS);
185 for (
const auto& persistencyMutex :
m_pers_mut) {
186 delete persistencyMutex;
200 return(::AthService::finalize());
212 return(StatusCode::SUCCESS);
219 const std::string& auxString = placement->
auxString();
220 if (!auxString.empty()) {
221 if (auxString.starts_with(
"[CTXT=")) {
222 ::sscanf(auxString.c_str(),
"[CTXT=%08X]", &contextId);
223 }
else if (auxString.starts_with(
"[CLABEL=")) {
227 ATH_MSG_WARNING(
"registerForWrite: Using default output Stream instead of id = " << contextId);
233 if (token ==
nullptr) {
241 const std::string& auxString = token->
auxString();
242 if (!auxString.empty()) {
243 if (auxString.starts_with(
"[CTXT=")) {
244 ::sscanf(auxString.c_str(),
"[CTXT=%08X]", &contextId);
245 }
else if (auxString.starts_with(
"[CLABEL=")) {
249 ATH_MSG_WARNING(
"setObjPtr: Using default input Stream instead of id = " << contextId);
253 ATH_MSG_VERBOSE(
"setObjPtr: token=" << token->
toString() <<
", auxString=" << auxString <<
", contextID=" << contextId);
257 std::map<unsigned int, unsigned int>::const_iterator maxFileIter =
m_contextMaxFile.find(contextId);
259 m_guidLists[contextId].remove(token->
dbID());
260 m_guidLists[contextId].push_back(token->
dbID());
261 while (m_guidLists[contextId].
size() > maxFileIter->second) {
262 this->
disconnectDb(
"FID:" + m_guidLists[contextId].begin()->toString(), contextId).ignore();
278 return(contextIter->second);
289 if (!
label.empty()) {
295 return(contextIter->second);
301 if (!
connect(Io::READ,
id).isSuccess()) {
305 if (!
label.empty()) {
324 ATH_MSG_WARNING(
"getInputContextSession: Using default input Stream instead of id = " << contextId);
348 if (token.starts_with(
"PFN:")) {
350 }
else if (token.starts_with(
"LFN:")) {
351 dbID =
m_catalog->lookupLFN(token.substr(4));
352 }
else if (token.starts_with(
"FID:")) {
353 dbID = token.substr(4);
365 std::string dbID,
type;
380 const std::string& collectionName,
381 unsigned int contextId)
const
383 ATH_MSG_DEBUG(
"connectCollection() connection=" << connection
384 <<
", name=" << collectionName <<
", contextID=" << contextId);
386 ATH_MSG_WARNING(
"connectCollection: Using default input Stream instead of id = " << contextId);
392 bool insertFile =
false;
393 if (connection.starts_with(
"PFN:")) {
394 std::string fid, fileType;
395 m_catalog->lookupFileByPFN(connection.substr(4), fid, fileType);
398 ATH_MSG_INFO(
"File is not in Catalog! Attempt to open it anyway.");
403 std::unique_ptr<pool::IDatabase> dbH =
getDbHandle(contextId, connection);
405 ATH_MSG_INFO(
"connectCollection(): Failed to get Database Handle for: " << connection);
406 return StatusCode::FAILURE;
409 if (dbH->openMode() == Io::INVALID) {
410 dbH->connectForRead();
412 std::map<unsigned int, unsigned int>::const_iterator maxFileIter =
m_contextMaxFile.find(contextId);
413 if (maxFileIter !=
m_contextMaxFile.end() && maxFileIter->second > 0 && !dbH->fid().empty()) {
414 const Guid guid(dbH->fid());
415 m_guidLists[contextId].remove(guid);
416 m_guidLists[contextId].push_back(guid);
417 while (m_guidLists[contextId].
size() > maxFileIter->second + 1) {
418 this->
disconnectDb(
"FID:" + m_guidLists[contextId].begin()->toString(), contextId).ignore();
421 }
catch (std::exception& e) {
422 ATH_MSG_INFO(
"connectCollection() failed to open '" << connection <<
"' - trying.");
427 ATH_MSG_DEBUG(
"connectCollection(): Increasing virtual TTree size for: " << connection);
429 ATH_MSG_DEBUG(
"Failed to increase maximum virtual TTree size.");
432 if (insertFile)
return(StatusCode::RECOVERABLE);
434 return(StatusCode::SUCCESS);
438 unsigned int contextId,
439 bool noContainer)
const {
441 std::unique_ptr<pool::IDatabase> dbH =
getDbHandle(contextId, connection);
442 if (dbH !=
nullptr && !dbH->fid().empty()) {
444 return(StatusCode::SUCCESS);
449 return(StatusCode::SUCCESS);
451 return(StatusCode::FAILURE);
457 std::string fid = dbH.
fid();
459 catalog_locked->registerPFN(pfn,
"ROOT_All", fid);
463 const std::string& collection,
464 const unsigned long ientry)
const {
467 if (dbH ==
nullptr) {
470 if (dbH->openMode() == Io::INVALID) {
471 dbH->connectForRead();
474 if (contH ==
nullptr) {
477 auto tokenIter = std::unique_ptr<pool::ITokenIterator>(contH->tokens());
479 return tokenIter->seek(ientry)? tokenIter->next() :
nullptr;
483 if (
type != Io::READ) {
485 ATH_MSG_WARNING(
"connect: Using default output Stream instead of id = " << contextId);
490 ATH_MSG_WARNING(
"connect: Using default input Stream instead of id = " << contextId);
493 ATH_MSG_INFO(
"Connecting to InputStream for: " << contextId);
498 return(StatusCode::FAILURE);
503 if (session !=
nullptr && session->type() != Io::INVALID) {
504 return(StatusCode::SUCCESS);
506 if (session ==
nullptr || !session->start(
type)) {
508 return(StatusCode::FAILURE);
511 return(StatusCode::SUCCESS);
516 return(StatusCode::FAILURE);
520 if (session !=
nullptr && session->type() != Io::INVALID) {
521 if (!session->commit()) {
523 return(StatusCode::FAILURE);
525 if (session->type() == Io::READ) {
526 session->disconnectAll();
529 return(StatusCode::SUCCESS);
534 return(StatusCode::FAILURE);
538 if (session !=
nullptr && session->
type() != Io::INVALID) {
541 return(StatusCode::FAILURE);
544 return(StatusCode::SUCCESS);
548 ATH_MSG_DEBUG(
"Disconnect request for contextId=" << contextId);
550 return(StatusCode::SUCCESS);
554 if (session !=
nullptr && session->
type() != Io::INVALID) {
555 if (!
commit(contextId).isSuccess()) {
557 return(StatusCode::FAILURE);
562 ATH_MSG_ERROR(
"disconnect failed to diconnect PersistencySvc");
563 return(StatusCode::FAILURE);
566 return(StatusCode::SUCCESS);
571 return(StatusCode::SUCCESS);
574 std::unique_ptr<pool::IDatabase> dbH =
getDbHandle(contextId, connection);
575 if (dbH ==
nullptr) {
577 return(StatusCode::FAILURE);
579 std::map<unsigned int, unsigned int>::const_iterator maxFileIter =
m_contextMaxFile.find(contextId);
581 m_guidLists[contextId].remove(
Guid(dbH->fid()));
584 return(StatusCode::SUCCESS);
590 unsigned int contextId)
const {
592 ATH_MSG_WARNING(
"getAttribute: Using default input Stream instead of id = " << contextId);
597 std::ostringstream oss;
598 if (data ==
"DbLonglong") {
599 long long int attr_data;
601 }
else if (data ==
"double") {
609 ATH_MSG_INFO(
"Domain attribute [" << optName <<
"]" <<
": " << data);
610 return(StatusCode::SUCCESS);
616 const std::string& dbName,
617 const std::string& contName,
618 unsigned int contextId)
const {
620 std::unique_ptr<pool::IDatabase> dbH =
getDbHandle(contextId, dbName);
621 if (dbH ==
nullptr) {
622 ATH_MSG_DEBUG(
"getAttribute: Failed to get Session/DatabaseHandle to get POOL property.");
623 return(StatusCode::FAILURE);
625 if (dbH->openMode() == Io::INVALID) {
627 dbH->setTechnology(tech);
628 dbH->connectForWrite();
630 dbH->connectForRead();
633 std::ostringstream oss;
634 if (contName.empty()) {
635 if (data ==
"DbLonglong") {
636 long long int attr_data;
637 oss << std::dec << dbH->attributeOfType(optName,
static_cast<void*
>(&attr_data),
typeid(
long long int),
"");
638 }
else if (data ==
"double") {
640 oss << std::dec << dbH->attributeOfType(optName,
static_cast<void*
>(&attr_data),
typeid(
double),
"");
641 }
else if (data ==
"string") {
643 oss << std::dec << dbH->attributeOfType(optName,
static_cast<void*
>(&attr_data),
typeid(
char*),
"");
646 oss << std::dec << dbH->attributeOfType(optName,
static_cast<void*
>(&attr_data),
typeid(
int),
"");
648 ATH_MSG_INFO(
"Database (" << dbH->pfn() <<
") attribute [" << optName <<
"]" <<
": " << oss.str());
651 if (contH ==
nullptr) {
652 ATH_MSG_DEBUG(
"Failed to get ContainerHandle to get POOL property.");
653 return(StatusCode::FAILURE);
655 if (data ==
"DbLonglong") {
656 long long int attr_data;
657 oss << std::dec << contH->attributeOfType(optName,
static_cast<void*
>(&attr_data),
typeid(
long long int),
"");
658 }
else if (data ==
"double") {
660 oss << std::dec << contH->attributeOfType(optName,
static_cast<void*
>(&attr_data),
typeid(
double),
"");
663 oss << std::dec << contH->attributeOfType(optName,
static_cast<void*
>(&attr_data),
typeid(
int),
"");
665 ATH_MSG_INFO(
"Container attribute [" << contName <<
"." << optName <<
"]: " << oss.str());
668 return(StatusCode::SUCCESS);
672 const std::string& data,
674 unsigned int contextId)
const {
676 ATH_MSG_WARNING(
"setAttribute: Using default output Stream instead of id = " << contextId);
681 if (data[data.size() - 1] ==
'L') {
682 const long long int& atttibuteValue = atoll(data.c_str());
684 ATH_MSG_DEBUG(
"Failed to set POOL property, " << optName <<
" to " << data);
685 return(StatusCode::FAILURE);
688 const int& atttibuteValue = atoi(data.c_str());
690 ATH_MSG_DEBUG(
"Failed to set POOL property, " << optName <<
" to " << data);
691 return(StatusCode::FAILURE);
694 return(StatusCode::SUCCESS);
698 const std::string& data,
700 const std::string& dbName,
701 const std::string& contName,
702 unsigned int contextId)
const {
704 ATH_MSG_WARNING(
"setAttribute: Using default output Stream instead of id = " << contextId);
708 std::unique_ptr<pool::IDatabase> dbH =
getDbHandle(contextId, dbName);
709 if (dbH ==
nullptr) {
710 ATH_MSG_DEBUG(
"Failed to get Session/DatabaseHandle to set POOL property.");
711 return(StatusCode::FAILURE);
713 if (dbH->openMode() == Io::INVALID) {
715 dbH->setTechnology(tech);
716 dbH->connectForWrite();
718 dbH->connectForRead();
721 bool retError =
false;
723 bool hasTTreeName = contName.starts_with(
"TTree=");
724 if (contName.empty() || hasTTreeName ||
m_dbSessionVec[contextId]->type() == Io::READ) {
725 objName = hasTTreeName ? contName.substr(6) : contName;
727 const char* atttibuteValue = data.c_str();
728 retError = dbH->setAttributeOfType(optName,
static_cast<const void*
>(&atttibuteValue),
typeid(
char*), objName);
729 }
else if( data[data.size() - 1] ==
'L' ) {
730 const long long int& atttibuteValue = atoll(data.c_str());
731 retError = dbH->setAttributeOfType(optName,
static_cast<const void*
>(&atttibuteValue),
typeid(
long long int), objName);
733 const int& atttibuteValue = atoi(data.c_str());
734 retError = dbH->setAttributeOfType(optName,
static_cast<const void*
>(&atttibuteValue),
typeid(
int), objName);
737 ATH_MSG_DEBUG(
"Failed to set POOL property, " << optName <<
" to " << data);
738 return(StatusCode::FAILURE);
742 if (contH ==
nullptr) {
743 ATH_MSG_DEBUG(
"Failed to get ContainerHandle to set POOL property.");
744 return(StatusCode::FAILURE);
746 if (
auto p = contName.find(
'('); p != std::string::npos) {
747 objName = contName.substr(p + 1);
748 objName.erase(objName.find(
')'));
749 }
else if (
auto p = contName.find(
"::"); p != std::string::npos) {
750 objName = contName.substr(p + 2);
751 }
else if (
auto p = contName.find(
'_'); p != std::string::npos) {
752 objName = contName.substr(p + 1);
753 objName.erase(objName.find(
'/'));
755 std::string::size_type off = 0;
756 while ((off = objName.find_first_of(
"<>/")) != std::string::npos) {
759 if (data[data.size() - 1] ==
'L') {
760 const long long int& atttibuteValue = atoll(data.c_str());
761 retError = contH->setAttributeOfType(optName,
static_cast<const void*
>(&atttibuteValue),
typeid(
long long int), objName);
763 const int& atttibuteValue = atoi(data.c_str());
764 retError = contH->setAttributeOfType(optName,
static_cast<const void*
>(&atttibuteValue),
typeid(
int), objName);
767 ATH_MSG_DEBUG(
"Failed to set POOL container property, " << optName <<
" for " << contName <<
" : " << objName <<
" to " << data);
768 return(StatusCode::FAILURE);
771 return(StatusCode::SUCCESS);
780 if (catalog.starts_with(
"apcfile:") || catalog.starts_with(
"prfile:")) {
781 std::string::size_type cpos = catalog.find(
':');
796 <<
" in $ATLAS_POOLCOND_PATH and $DATAPATH");
806 }
catch(std::exception& e) {
807 ATH_MSG_ERROR(
"setWriteCatalog - caught exception: " << e.what());
817std::unique_ptr<pool::IDatabase>
PoolSvc::getDbHandle(
unsigned int contextId,
const std::string& dbName)
const {
819 ATH_MSG_WARNING(
"getDbHandle: Using default input Stream instead of id = " << contextId);
827 if (sesH->
type() == Io::INVALID) {
828 Io::IoFlag transMode = Io::READ;
830 if (!sesH->
start(transMode)) {
835 if (dbName.starts_with(
"PFN:")) {
837 }
else if (dbName.starts_with(
"LFN:")) {
839 }
else if (dbName.starts_with(
"FID:")) {
847 if (dbH ==
nullptr) {
851 if (contName.find(
"DataHeader") != std::string::npos) {
856 return(std::unique_ptr<pool::IContainer>(contH));
862 const char* cpath = std::getenv(
"ATLAS_POOLCOND_PATH");
863 if (cpath && strcmp(cpath,
"") != 0) {
864 const std::string testpath = std::string(cpath) +
"/" + leaf;
868 if (FILE* fp = std::fopen(testpath.c_str(),
"r")) {
#define ATH_CHECK
Evaluate an expression and check for errors.
#define ATH_MSG_DEBUG(x,...)
#define ATH_MSG_ERROR(x,...)
#define ATH_MSG_WARNING(x,...)
#define ATH_MSG_VERBOSE(x,...)
#define ATH_MSG_INFO(x,...)
#define ATH_MSG_FATAL(x,...)
virtual void lock()=0
Interface to allow an object to lock itself when made const in SG.
This file contains the class definition for the Placement class (migrated from POOL).
bool isNumber(const std::string &s)
This file contains the class definition for the PoolSvc class.
size_t size() const
Number of registered mappings.
This file contains the class definition for the Token class (migrated from POOL).
This class provides a encapsulation of a GUID/UUID/CLSID/IID data structure (128 bit number).
constexpr void toString(std::span< char, StrLen > buf, bool uppercase=true) const noexcept
Automatic conversion to string representation.
static constexpr int stringSize()
static std::string find_file(const std::string &logical_file_name, const std::string &search_path)
This class holds all the necessary information to guide the writing of an object in a physical place.
const std::string & auxString() const
Access auxiliary string.
const std::string & containerName() const
Access container name.
virtual StatusCode io_reinit() override
pool::IFileCatalog * createCatalog()
virtual Token * registerForWrite(const Placement *placement, const void *obj, const RootType &classDesc) override
virtual ~PoolSvc()
Destructor.
virtual void startCatalog() override
virtual void renamePfn(const std::string &pf, const std::string &newpf) override
pool::IFileCatalog * m_catalog
virtual StatusCode connect(Io::IoFlag type, unsigned int contextId=IPoolSvc::kInputStream) override
Connect to a logical database unit; PersistencySvc is chosen according to transaction type (accessmod...
std::string poolCondPath(const std::string &leaf)
Resolve a file using ATLAS_POOLCOND_PATH.
virtual unsigned int getInputContextMapSize() const override
void patchCatalog(const std::string &pfn, pool::IDatabase &dbH) const
virtual unsigned int getInputContext(const std::string &label, unsigned int maxFile=0) override
virtual void lookupBestPfn(const std::string &token, std::string &pfn, std::string &type) const override
virtual StatusCode setAttribute(const std::string &optName, const std::string &data, long tech, unsigned int contextId=IPoolSvc::kOutputStream) const override
Set POOL attributes - domain.
std::vector< pool::ISession * > m_dbSessionVec
Gaudi::Property< bool > m_useROOTIMT
Use ROOT Implicit MultiThreading, default = true.
virtual StatusCode commit(unsigned int contextId=IPoolSvc::kInputStream) const override
Commit data for a given contextId and flush buffer.
std::unique_ptr< pool::IContainer > getContainerHandle(pool::IDatabase *dbH, const std::string &contName) const
Get Container handle.
virtual Token * getToken(const std::string &connection, const std::string &collection, const unsigned long ientry) const override
virtual StatusCode start() override
Required of all Gaudi services:
virtual StatusCode connectCollection(const std::string &connection, const std::string &collectionName, unsigned int contextId=IPoolSvc::kInputStream) const override
StatusCode setupPersistencySvc()
virtual pool::ISession * getInputContextSession(unsigned int contextId) const override
virtual StatusCode io_finalize() override
virtual StatusCode checkCollection(const std::string &connection, unsigned int contextId, bool noContainer) const override
Gaudi::Property< int > m_dbAgeLimit
MaxFilesOpen, option to have PoolSvc limit the number of open Input Files: default = 0 (No files are ...
Gaudi::Property< bool > m_useROOTMaxTree
Increase virtual TTree size to avoid backreads in multithreading, default = false.
std::map< std::string, unsigned int > m_outputContextLabel
virtual StatusCode disconnectDb(const std::string &connection, unsigned int contextId=IPoolSvc::kInputStream) const override
Disconnect single Database.
std::recursive_mutex CallMutex
virtual void commitCatalog() override
std::vector< CallMutex * > m_pers_mut
std::map< std::string, unsigned int > m_inputContextLabel
virtual void setObjPtr(void *&obj, const Token *token) override
Gaudi::Property< std::vector< std::string > > m_readCatalog
ReadCatalog, the list of additional POOL input file catalogs to consult: default = empty vector.
std::string m_mainOutputLabel
std::map< unsigned int, unsigned int > m_contextMaxFile
virtual void setShareMode(bool shareCat) override
std::unique_ptr< pool::IDatabase > getDbHandle(unsigned int contextId, const std::string &dbName) const
Get Database handle.
virtual StatusCode commitAndHold(unsigned int contextId=IPoolSvc::kInputStream) const override
Commit data for a given contextId and hold buffer.
virtual StatusCode disconnect(unsigned int contextId=IPoolSvc::kInputStream) const override
Disconnect PersistencySvc associated with a contextId.
virtual StatusCode finalize() override
Required of all Gaudi services:
virtual StatusCode initialize() override
Required of all Gaudi services:
virtual std::map< std::string, unsigned int > getInputContextMap() const override
virtual unsigned int getOutputContext(const std::string &label) override
Gaudi::Property< std::string > m_writeCatalog
WriteCatalog, the file catalog to be used to register output files (also default input catalog): defa...
virtual StatusCode stop() override
Gaudi::Property< bool > m_attemptCatalogPatch
AttemptCatalogPatch, option to create catalog: default = false.
std::map< unsigned int, std::list< Guid > > m_guidLists ATLAS_THREAD_SAFE
virtual StatusCode getAttribute(const std::string &optName, std::string &data, long tech, unsigned int contextId=IPoolSvc::kInputStream) const override
Get POOL attributes - domain.
This class provides a token that identifies in a unique way objects on the persistent storage.
const std::string & auxString() const
Access auxiliary string.
const std::string toString() const
Retrieve the string representation of the token.
Token & fromString(const std::string_view from)
Build from the string representation of a token.
const Guid & dbID() const
Access database identifier.
IContainer is the base class for container objects.
IDatabase is the base class for database objects.
virtual bool setTechnology(long technology)=0
Sets the technology identifier for this database.
virtual const std::string & fid()=0
Returns the file identifier of this database.
virtual IContainer * containerHandle(const std::string &name)=0
Returns a pointer to a container object. The user acquires ownership of that object.
void addReadCatalog(const std::string &connect)
Add new catalog, identified by name, to the existing ones.
void removeCatalog(const std::string &connect)
Remove catalog identified by name from the existing ones. * or '' removes all.
void setWriteCatalog(const std::string &connect)
Establish the writable catalog, identified by name.
ISession is the interface class for user (macroscopic) sessions Every connection to a database and ob...
virtual Io::IoFlag type() const =0
Returns the transaction type.
virtual std::unique_ptr< IDatabase > databaseHandle(const std::string &dbName, DatabaseSpecification::NameType dbNameType)=0
Returns a pointer to a database object. The user acquires ownership of that object.
virtual MicroSessionManager & microSessionManager(long technology)=0
Returns the technology given a technology type.
virtual bool start(Io::IoFlag type=Io::READ)=0
Starts a new transaction. Returns the success of the operation.
virtual bool commitAndHold()=0
Commits the holds transaction.
virtual bool disconnectAll()=0
Explicitly disconnects all the databases.
virtual bool attributeOfType(const std::string &attributeName, void *data, const std::type_info &typeInfo, const std::string &option)
virtual bool setAttributeOfType(const std::string &attributeName, const void *data, const std::type_info &typeInfo, const std::string &option)
static std::string release
std::string label(const std::string &format, int i)
static const DbType ROOT_StorageType
std::unique_ptr< ISession > createSession(IFileCatalog &catalog, int ageLimit=-1)
static void setLevel(MSG::Level l)