10 using namespace Gaudi;
16 template <
class V,
class F>
17 bool _findX0Bool(V&
array, F pmf,
bool invert) {
18 for(
typename V::const_iterator
i=array.begin();
i != array.end(); ++
i) {
19 bool res = invert ? !((*i)->*pmf)() : ((*i)->*pmf)();
20 if ( !res )
return false;
26 MultiFileCatalog::MultiFileCatalog(
const std::string& nam,
ISvcLocator* svc)
27 :
base_class(nam, svc), m_started(false), m_oldNames()
34 MultiFileCatalog::~MultiFileCatalog() {
38 CatalogNames::const_iterator
i;
39 std::string current =
"";
41 printError(
"Failed to initialize service base class.",
false);
45 for(i=m_catalogNames.begin(); i != m_catalogNames.end(); ++
i) {
52 catch(
const std::exception& ) {
53 printError(
"Cannot add file catalog:"+current,
false);
60 _exec(&IFileCatalog::release);
67 std::string MultiFileCatalog::createFID()
const {
72 static string s(
"MultiCatalog");
81 for(Catalogs::const_iterator
i=m_catalogs.begin();
i != m_catalogs.end(); ++
i) {
86 else if ( fid.empty() )
88 else if ( !fid.empty() && c->
existsFID(fid) )
93 printError(
"No writable file catalog found which contains FID:"+fid,throw_if_not);
97 log <<
MSG::DEBUG <<
"No writable file catalog found which contains FID:" << fid <<
endmsg;
103 for(Catalogs::const_iterator
i=m_catalogs.begin();
i != m_catalogs.end(); ++
i) {
104 if ( connect == (*i)->connectInfo() )
105 return (must_be_writable && (*i)->readOnly()) ? 0 : *
i;
110 MultiFileCatalog::Catalogs::iterator
111 MultiFileCatalog::i_findCatalog(
CSTR connect,
bool must_be_writable) {
112 for(Catalogs::iterator
i=m_catalogs.begin();
i != m_catalogs.end(); ++
i) {
113 if ( connect == (*i)->connectInfo() ) {
114 return (must_be_writable && (*i)->readOnly()) ? m_catalogs.end() :
i;
117 return m_catalogs.end();
120 void MultiFileCatalog::printError(
CSTR msg,
bool rethrow)
const {
124 throw runtime_error(
"Catalog> "+msg);
129 void MultiFileCatalog::addCatalog(
CSTR con) {
130 if ( !con.empty() ) {
131 if ( 0 == findCatalog(con,
false) ) {
132 static const string xml_typ =
"Gaudi::XMLFileCatalog";
133 string::size_type id0 = con.find(
"_");
134 string typ = con.substr(0,id0);
135 string url = con.substr(id0+1);
137 if ( strncasecmp(
"xml",typ.c_str(),3) == 0 ) {
138 cat = IFileCatalog::Factory::create(xml_typ,url,msgSvc().
get());
141 using Gaudi::PluginService::Details::Registry;
142 Registry&
registry = Registry::instance();
143 if (registry.getInfo(typ).type ==
144 typeid(Service::Factory::FuncType).name()) {
145 cat = Service::Factory::create(typ,url,serviceLocator().
get());
146 }
else if (registry.getInfo(typ).type ==
147 typeid(IFileCatalog::Factory::FuncType).name()) {
148 cat = IFileCatalog::Factory::create(typ,url,msgSvc().
get());
159 printError(
"Failed to create catalog connection:"+con,
true);
164 printError(
"Got invalid (empty) catalog connection string.",
true);
170 m_catalogs.push_back(cat);
173 printError(
"Got invalid catalog to be added to multi catalog.",
true);
176 void MultiFileCatalog::removeCatalog(
CSTR con) {
177 if ( con.empty() || con ==
"*" ) {
178 _exec(&IFileCatalog::release);
182 removeCatalog(findCatalog(con,
false));
187 Catalogs::iterator
i=find(m_catalogs.begin(),m_catalogs.end(),cat);
188 if ( i != m_catalogs.end() ) {
193 printError(
"Unknown file catalog -- cannot be removed.",
true);
195 printError(
"Invalid file catalog.",
true);
201 Catalogs::iterator
i=find(m_catalogs.begin(),m_catalogs.end(),cat);
202 if ( i != m_catalogs.end() ) {
204 m_catalogs.insert(m_catalogs.begin(),cat);
207 printError(
"The catalog "+cat->
connectInfo()+
" is not known.",
true);
209 printError(
"The catalog "+cat->
connectInfo()+
" is not writable.",
true);
211 printError(
"Invalid file catalog.",
true);
214 void MultiFileCatalog::setWriteCatalog(
CSTR connect) {
215 Catalogs::iterator
i = i_findCatalog(connect,
true);
216 if ( i == m_catalogs.end() ) {
218 setWriteCatalog(findCatalog(connect,
true));
224 string MultiFileCatalog::getMetaDataItem(
CSTR fid,
CSTR attr)
const {
226 for(Catalogs::const_iterator
i=m_catalogs.begin();
i != m_catalogs.end(); ++
i)
227 if ( !(result= (*i)->getMetaDataItem(fid,attr)).
empty() )
break;
231 void MultiFileCatalog::registerPFN(
CSTR fid,
CSTR pfn,
CSTR ftype)
const {
233 if ( !c ) c = getCatalog(
"",
true,
true,
true);
237 void MultiFileCatalog::registerLFN(
CSTR fid,
CSTR lfn)
const {
239 if ( !c ) c = getCatalog(
"",
true,
true,
true);
243 bool MultiFileCatalog::readOnly()
const
244 {
return _findX0Bool(m_catalogs,&IFileCatalog::readOnly,
false); }
246 bool MultiFileCatalog::dirty()
const
247 {
return _findX0Bool(m_catalogs,&IFileCatalog::dirty,
true); }
252 if ( !m_started ) { m_oldNames = m_catalogNames;
return; }
254 if ( m_catalogNames == m_oldNames ) {
return; }
255 m_oldNames = m_catalogNames ;
259 for ( CatalogNames::const_iterator inew = m_catalogNames.begin() ;
260 m_catalogNames.end() != inew ; ++inew ) { addCatalog ( *inew ) ; }
266 <<
"New catalogs to be used: "