10 using namespace Gaudi;
14 template <
typename C,
typename F>
25 printError(
"Failed to initialize service base class.",
false );
30 for (
const auto& i : m_catalogNames ) {
36 }
catch (
const std::exception& ) { printError(
"Cannot add file catalog:" + current,
false ); }
52 static const string s(
"MultiCatalog" );
57 for (
const auto&
c : m_catalogs ) {
58 if ( !
c || ( writable &&
c->readOnly() ) )
continue;
59 if ( fid.
empty() || ( !fid.
empty() &&
c->existsFID( fid ) ) )
return c;
62 printError(
"No writable file catalog found which contains FID:" + fid, throw_if_not );
64 debug() <<
"No writable file catalog found which contains FID:" << fid <<
endmsg;
70 auto i =
std::find_if( m_catalogs.begin(), m_catalogs.end(),
71 [&](
const IFileCatalog* f ) {
return connect == f->connectInfo(); } );
72 return ( i != m_catalogs.end() && ( !must_be_writable || !( *i )->readOnly() ) ) ? *i :
nullptr;
76 auto i =
std::find_if( m_catalogs.begin(), m_catalogs.end(),
77 [&](
const IFileCatalog* f ) {
return connect == f->connectInfo(); } );
78 if ( i != m_catalogs.end() && must_be_writable && ( *i )->readOnly() ) { i = m_catalogs.end(); }
92 if ( !findCatalog( con,
false ) ) {
93 static const string xml_typ =
"Gaudi::XMLFileCatalog";
94 auto id0 = con.
find(
"_" );
95 string typ = con.
substr( 0, id0 );
96 string url = con.
substr( id0 + 1 );
98 if ( strncasecmp(
"xml", typ.
c_str(), 3 ) == 0 ) {
99 cat = IFileCatalog::Factory::create( xml_typ, url,
msgSvc().
get() ).
release();
101 using Gaudi::PluginService::Details::Registry;
102 Registry&
registry = Registry::instance();
103 if (
registry.getInfo( typ ).factory.type() ==
typeid( Service::Factory::FactoryType ) ) {
104 cat = Service::Factory::create( typ, url, serviceLocator().
get() ).
release();
105 }
else if (
registry.getInfo( typ ).factory.type() ==
typeid( IFileCatalog::Factory::FactoryType ) ) {
112 addCatalog( fileCat.get() );
116 printError(
"Failed to create catalog connection:" + con,
true );
121 printError(
"Got invalid (empty) catalog connection string.",
true );
127 m_catalogs.push_back( cat );
130 printError(
"Got invalid catalog to be added to multi catalog.",
true );
134 if ( con.
empty() || con ==
"*" ) {
144 auto i =
find( m_catalogs.begin(), m_catalogs.end(), cat );
145 if ( i != m_catalogs.end() ) {
147 m_catalogs.erase( i );
150 printError(
"Unknown file catalog -- cannot be removed.",
true );
152 printError(
"Invalid file catalog.",
true );
158 auto i =
find( m_catalogs.begin(), m_catalogs.end(), cat );
159 if ( i != m_catalogs.end() ) {
160 m_catalogs.erase( i );
161 m_catalogs.insert( m_catalogs.begin(), cat );
164 printError(
"The catalog " + cat->
connectInfo() +
" is not known.", true );
166 printError(
"The catalog " + cat->
connectInfo() +
" is not writable.", true );
168 printError(
"Invalid file catalog.",
true );
172 auto i = i_findCatalog( connect,
true );
173 if ( i == m_catalogs.end() ) {
174 addCatalog( connect );
175 setWriteCatalog( findCatalog( connect,
true ) );
178 setWriteCatalog( *i );
183 for (
const auto& i : m_catalogs ) {
184 result = i->getMetaDataItem( fid, attr );
185 if ( !result.
empty() )
break;
192 if ( !
c )
c = getCatalog(
"",
true,
true,
true );
193 c->registerPFN( fid, pfn, ftype );
198 if ( !
c )
c = getCatalog(
"",
true,
true,
true );
199 c->registerLFN( fid, lfn );
228 m_oldNames = m_catalogNames;
232 if ( m_catalogNames == m_oldNames ) {
return; }
233 m_oldNames = m_catalogNames;
237 for (
const auto& inew : m_catalogNames ) addCatalog( inew );
StatusCode initialize() override
Small smart pointer class with automatic reference counting for IInterface.
IFileCatalog * getCatalog(CSTR fid, bool throw_if_not, bool writable=true, bool prt=true) const
Find catalog containing a given file identifier.
IFileCatalog * findCatalog(CSTR connect, bool must_be_writable) const override
Catalog management.
StatusCode finalize() override
void registerLFN(CSTR fid, CSTR lfn) const override
Create a FileID and DOM Node of the LFN with all the attributes.
std::string toString(const TYPE &obj)
the generic implementation of the type conversion to the string
constexpr static const auto SUCCESS
virtual void commit()=0
Save catalog to file.
void setWriteCatalog(IFileCatalog *cat) override
Define the writable catalog identified by reference.
auto get(const Handle &handle, const Algo &, const EventContext &) -> decltype(details::deref(handle.get()))
virtual const std::string & connectInfo() const =0
Access to connect string.
#define DECLARE_COMPONENT(type)
Catalogs::iterator i_findCatalog(CSTR connect, bool must_be_writable)
Find catalog by connect string.
This class is used for returning status codes from appropriate routines.
Definition of the basic interface.
void registerPFN(CSTR fid, CSTR pfn, CSTR ftype) const override
Create a FileID and DOM Node of the PFN with all the attributes.
CSTR connectInfo() const override
Access to connect string.
void printError(CSTR msg, bool throw_exc=true) const
virtual unsigned long release()=0
Release Interface instance.
std::string createGuidAsString()
Helper function creating file identifier using the UUID mechanism.
void rollback() override
Save DOM catalog to file.
StatusCode finalize() override
Finalize service object.
void init() override
Parse the DOM tree of the XML catalog.
bool readOnly() const override
Check if the catalog is read-only.
void addCatalog(CSTR connect) override
Add new catalog identified by name to the existing ones.
virtual void rollback()=0
Save catalog to file.
constexpr static const auto FAILURE
void propHandler()
simple property handle to allow interactive modification of list of the file catalogs
virtual unsigned long addRef()=0
Increment the reference count of Interface instance.
std::string getMetaDataItem(CSTR fid, CSTR name) const override
Access metadata item.
virtual bool readOnly() const =0
Check if the catalog is read-only.
std::string createFID() const override
Catalog interface.
virtual void init()=0
Parse the DOM tree of the XML catalog.
void commit() override
Save DOM catalog to file.
virtual bool dirty() const =0
Check if the catalog should be updated.
void removeCatalog(CSTR connect) override
Remove catalog identified by name from the existing ones.
Header file for std:chrono::duration-based Counters.
MsgStream & endmsg(MsgStream &s)
MsgStream Modifier: endmsg. Calls the output method of the MsgStream.
bool dirty() const override
Check if the catalog should be updated.
This class constitutes the core of the XML based FileCatalog API for using POOL within Gaudi.