The Gaudi Framework  master (d98a2936)
MultiFileCatalog.h
Go to the documentation of this file.
1 /***********************************************************************************\
2 * (c) Copyright 1998-2025 CERN for the benefit of the LHCb and ATLAS collaborations *
3 * *
4 * This software is distributed under the terms of the Apache version 2 licence, *
5 * copied verbatim in the file "LICENSE". *
6 * *
7 * In applying this licence, CERN does not waive the privileges and immunities *
8 * granted to it by virtue of its status as an Intergovernmental Organization *
9 * or submit itself to any jurisdiction. *
10 \***********************************************************************************/
11 #pragma once
12 
13 #include <GaudiKernel/Service.h>
16 
17 /*
18  * Gaudi namespace declaration
19  */
20 namespace Gaudi {
21 
29  class MultiFileCatalog : public extends<Service, IFileCatalog, IFileCatalogMgr> {
30  public:
31  // disambiguate between Service::Factory and IFileCatalog::Factory
33 
34  protected:
35  typedef const std::string& CSTR;
36  typedef std::vector<IFileCatalog*> Catalogs;
37  typedef std::vector<std::string> CatalogNames;
38 
39  template <class A1, class F>
40  std::string _find( A1& arg1, F pmf ) const {
41  std::string result;
42  for ( const auto& i : m_catalogs ) {
43  result = ( i->*pmf )( arg1 );
44  if ( !result.empty() ) break;
45  }
46  return result;
47  }
48  template <class A1, class F>
49  void _collect( A1& arg1, F f ) const {
50  A1 tmp;
51  for ( const auto& i : m_catalogs ) {
52  f( i, tmp ); // tmp = f(i)
53  arg1.insert( arg1.end(), tmp.begin(), tmp.end() );
54  tmp.clear();
55  }
56  }
57  template <class A2, class A1, class F>
58  void _collect( const A2& arg2, A1& arg1, F f ) const {
59  A1 tmp;
60  for ( const auto& i : m_catalogs ) {
61  f( i, arg2, tmp ); // tmp = f(i,arg2)
62  arg1.insert( arg1.end(), tmp.begin(), tmp.end() );
63  tmp.clear();
64  }
65  }
66 
67  public:
69  using extends::extends;
70 
72  StatusCode initialize() override;
75  StatusCode finalize() override;
76 
78  std::string createFID() const override;
81  CSTR connectInfo() const override;
83  void init() override;
85  void commit() override;
87  void rollback() override;
89  bool readOnly() const override;
91  bool dirty() const override;
93  bool existsPFN( CSTR pfn ) const override { return !lookupPFN( pfn ).empty(); }
95  std::string lookupPFN( CSTR pfn ) const override { return _find( pfn, &IFileCatalog::lookupPFN ); }
97  bool existsLFN( CSTR lfn ) const override { return !lookupLFN( lfn ).empty(); }
99  std::string lookupLFN( CSTR lfn ) const override { return _find( lfn, &IFileCatalog::lookupLFN ); }
101  bool existsFID( CSTR fid ) const override { return 0 != getCatalog( fid, false, false, false ); }
103  void getPFN( CSTR fid, Files& files ) const override {
104  _collect( fid, files, std::mem_fn( &IFileCatalog::getPFN ) );
105  }
107  void getLFN( CSTR fid, Files& files ) const override {
108  _collect( fid, files, std::mem_fn( &IFileCatalog::getLFN ) );
109  }
110 
112  void getFID( Strings& fids ) const override { _collect( fids, std::mem_fn( &IFileCatalog::getFID ) ); }
114  void deleteFID( CSTR fid ) const override { writeCatalog( fid )->deleteFID( fid ); }
116  void registerPFN( CSTR fid, CSTR pfn, CSTR ftype ) const override;
118  void registerLFN( CSTR fid, CSTR lfn ) const override;
120  void registerFID( CSTR fid ) const override { writeCatalog()->registerFID( fid ); }
122  void renamePFN( CSTR pfn, CSTR newpfn ) const override { writeCatalog()->renamePFN( pfn, newpfn ); }
124  void deletePFN( CSTR pfn ) const override { writeCatalog()->deletePFN( pfn ); }
126  void getMetaData( CSTR fid, Attributes& attr ) const override {
127  _collect( fid, attr, std::mem_fn( &IFileCatalog::getMetaData ) );
128  }
130  std::string getMetaDataItem( CSTR fid, CSTR name ) const override;
132  void setMetaData( CSTR fid, CSTR attr, CSTR val ) const override {
133  writeCatalog( fid )->setMetaData( fid, attr, val );
134  }
136  void dropMetaData( CSTR fid ) const override { writeCatalog( fid )->dropMetaData( fid ); }
138  void dropMetaData( CSTR fid, CSTR attr ) const override { writeCatalog( fid )->dropMetaData( fid, attr ); }
139 
141  IFileCatalog* findCatalog( CSTR connect, bool must_be_writable ) const override;
144  void addCatalog( CSTR connect ) override;
146  void addCatalog( IFileCatalog* cat ) override;
148  void removeCatalog( CSTR connect ) override;
150  void removeCatalog( const IFileCatalog* cat ) override;
152  Catalogs& catalogs() override { return m_catalogs; }
154  const Catalogs& catalogs() const override { return m_catalogs; }
156  IFileCatalog* writeCatalog( CSTR fid = "" ) const override { return getCatalog( fid, true, true, false ); }
158  void setWriteCatalog( IFileCatalog* cat ) override;
160  void setWriteCatalog( CSTR connect ) override;
161 
162  private:
164  IFileCatalog* getCatalog( CSTR fid, bool throw_if_not, bool writable = true, bool prt = true ) const;
166  Catalogs::iterator i_findCatalog( CSTR connect, bool must_be_writable );
167 
170  void propHandler();
171 
172  void printError( CSTR msg, bool throw_exc = true ) const;
173  std::string lookupFID( CSTR lfn ) const;
174 
177 
179  this, "Catalogs", { { "xmlcatalog_file:test_catalog.xml" } }, &MultiFileCatalog::propHandler, "catalog names" };
180 
182  bool m_started = false;
185  };
186 } /* End namespace Gaudi */
Gaudi::MultiFileCatalog::CatalogNames
std::vector< std::string > CatalogNames
Definition: MultiFileCatalog.h:37
Gaudi::MultiFileCatalog::registerFID
void registerFID(CSTR fid) const override
Create a FileID and DOM Node.
Definition: MultiFileCatalog.h:120
Gaudi::MultiFileCatalog::commit
void commit() override
Save DOM catalog to file.
Definition: MultiFileCatalog.cpp:227
Gaudi::MultiFileCatalog::getLFN
void getLFN(CSTR fid, Files &files) const override
Dump all logical file names of the catalog associate to the FileID.
Definition: MultiFileCatalog.h:107
Gaudi::MultiFileCatalog::deletePFN
void deletePFN(CSTR pfn) const override
remove a PFN
Definition: MultiFileCatalog.h:124
Gaudi::MultiFileCatalog
Definition: MultiFileCatalog.h:29
Gaudi::IFileCatalog::lookupPFN
virtual std::string lookupPFN(const std::string &lfn) const =0
Lookup file identifier by physical file name.
Gaudi::IFileCatalog
Definition: IFileCatalog.h:35
Gaudi::MultiFileCatalog::i_findCatalog
Catalogs::iterator i_findCatalog(CSTR connect, bool must_be_writable)
Find catalog by connect string.
Definition: MultiFileCatalog.cpp:85
Gaudi::IFileCatalog::renamePFN
virtual void renamePFN(const std::string &pfn, const std::string &new_pfn) const =0
rename a PFN
Gaudi::MultiFileCatalog::removeCatalog
void removeCatalog(CSTR connect) override
Remove catalog identified by name from the existing ones.
Definition: MultiFileCatalog.cpp:143
Gaudi::MultiFileCatalog::setMetaData
void setMetaData(CSTR fid, CSTR attr, CSTR val) const override
Insert/update metadata item.
Definition: MultiFileCatalog.h:132
Gaudi::MultiFileCatalog::initialize
StatusCode initialize() override
IService implementation
Definition: MultiFileCatalog.cpp:33
GaudiMP.FdsRegistry.msg
msg
Definition: FdsRegistry.py:19
Gaudi::MultiFileCatalog::m_catalogNames
Gaudi::Property< CatalogNames > m_catalogNames
Definition: MultiFileCatalog.h:178
Gaudi::MultiFileCatalog::getPFN
void getPFN(CSTR fid, Files &files) const override
Dump all physical file names of the catalog and their attributes associate to the FileID.
Definition: MultiFileCatalog.h:103
Gaudi::MultiFileCatalog::findCatalog
IFileCatalog * findCatalog(CSTR connect, bool must_be_writable) const override
Catalog management
Definition: MultiFileCatalog.cpp:79
Gaudi::MultiFileCatalog::_find
std::string _find(A1 &arg1, F pmf) const
Definition: MultiFileCatalog.h:40
Gaudi::MultiFileCatalog::m_catalogs
Catalogs m_catalogs
Container with references to known catalogs.
Definition: MultiFileCatalog.h:176
Gaudi::MultiFileCatalog::existsFID
bool existsFID(CSTR fid) const override
Return the status of a FileID.
Definition: MultiFileCatalog.h:101
Gaudi::IFileCatalog::lookupLFN
virtual std::string lookupLFN(const std::string &lfn) const =0
Lookup file identifier by physical file name.
Gaudi::MultiFileCatalog::printError
void printError(CSTR msg, bool throw_exc=true) const
Definition: MultiFileCatalog.cpp:92
Gaudi::MultiFileCatalog::CSTR
const std::string & CSTR
Definition: MultiFileCatalog.h:35
Gaudi::MultiFileCatalog::renamePFN
void renamePFN(CSTR pfn, CSTR newpfn) const override
rename a PFN
Definition: MultiFileCatalog.h:122
Service::name
const std::string & name() const override
Retrieve name of the service
Definition: Service.cpp:333
Gaudi::IFileCatalog::registerFID
virtual void registerFID(const std::string &fid) const =0
Create a Node for a FileID and DOM Node.
StatusCode
Definition: StatusCode.h:64
Gaudi::IFileCatalog::dropMetaData
virtual void dropMetaData(const std::string &fid) const =0
Drop all metadata of one FID.
Gaudi::MultiFileCatalog::registerPFN
void registerPFN(CSTR fid, CSTR pfn, CSTR ftype) const override
Create a FileID and DOM Node of the PFN with all the attributes.
Definition: MultiFileCatalog.cpp:200
Gaudi::MultiFileCatalog::readOnly
bool readOnly() const override
Check if the catalog is read-only.
Definition: MultiFileCatalog.cpp:212
Gaudi::MultiFileCatalog::setWriteCatalog
void setWriteCatalog(IFileCatalog *cat) override
Define the writable catalog identified by reference.
Definition: MultiFileCatalog.cpp:165
Gaudi::MultiFileCatalog::getFID
void getFID(Strings &fids) const override
Dump all file Identifiers.
Definition: MultiFileCatalog.h:112
Gaudi::MultiFileCatalog::lookupPFN
std::string lookupPFN(CSTR pfn) const override
Lookup file identifier by physical file name.
Definition: MultiFileCatalog.h:95
Gaudi::MultiFileCatalog::finalize
StatusCode finalize() override
Finalize service object.
Definition: MultiFileCatalog.cpp:50
Gaudi::MultiFileCatalog::Factory
Service::Factory Factory
Definition: MultiFileCatalog.h:32
extends
Base class used to extend a class implementing other interfaces.
Definition: extends.h:19
Gaudi::MultiFileCatalog::init
void init() override
Parse the DOM tree of the XML catalog.
Definition: MultiFileCatalog.cpp:222
Gaudi::IFileCatalog::getLFN
virtual void getLFN(const std::string &fid, Files &files) const =0
Dump all LFNames of the catalog associate to the FileID.
Gaudi
This file provides a Grammar for the type Gaudi::Accumulators::Axis It allows to use that type from p...
Definition: __init__.py:1
Gaudi::MultiFileCatalog::existsLFN
bool existsLFN(CSTR lfn) const override
Return the status of a logical file name.
Definition: MultiFileCatalog.h:97
Gaudi::MultiFileCatalog::catalogs
Catalogs & catalogs() override
Access catalog container.
Definition: MultiFileCatalog.h:152
BoostArrayProperties.Strings
Strings
Definition: BoostArrayProperties.py:36
Service.h
Gaudi::MultiFileCatalog::getMetaDataItem
std::string getMetaDataItem(CSTR fid, CSTR name) const override
Access metadata item.
Definition: MultiFileCatalog.cpp:191
Gaudi::MultiFileCatalog::_collect
void _collect(A1 &arg1, F f) const
Definition: MultiFileCatalog.h:49
Gaudi::MultiFileCatalog::dropMetaData
void dropMetaData(CSTR fid) const override
Drop all metadata of one FID.
Definition: MultiFileCatalog.h:136
Gaudi::MultiFileCatalog::catalogs
const Catalogs & catalogs() const override
Access catalog container (CONST)
Definition: MultiFileCatalog.h:154
Gaudi::IFileCatalog::setMetaData
virtual void setMetaData(const std::string &fid, const std::string &name, const std::string &value) const =0
Insert/update metadata item.
Gaudi::IFileCatalog::getMetaData
virtual void getMetaData(const std::string &fid, Attributes &attr) const =0
Dump all MetaData of the catalog for a given file ID.
Gaudi::IFileCatalog::getPFN
virtual void getPFN(const std::string &fid, Files &files) const =0
Dump all PFNames of the catalog and their attributes associate to the FileID.
Gaudi::MultiFileCatalog::Catalogs
std::vector< IFileCatalog * > Catalogs
Definition: MultiFileCatalog.h:36
Gaudi::MultiFileCatalog::_collect
void _collect(const A2 &arg2, A1 &arg1, F f) const
Definition: MultiFileCatalog.h:58
Service::Factory
Gaudi::PluginService::Factory< IService *(const std::string &, ISvcLocator *)> Factory
Definition: Service.h:41
Gaudi::MultiFileCatalog::connectInfo
CSTR connectInfo() const override
Access to connect string.
Definition: MultiFileCatalog.cpp:61
Gaudi::MultiFileCatalog::getMetaData
void getMetaData(CSTR fid, Attributes &attr) const override
Dump all MetaData of the catalog for a given file ID.
Definition: MultiFileCatalog.h:126
Gaudi::MultiFileCatalog::existsPFN
bool existsPFN(CSTR pfn) const override
Return the status of physical file name.
Definition: MultiFileCatalog.h:93
Gaudi::MultiFileCatalog::lookupLFN
std::string lookupLFN(CSTR lfn) const override
Lookup file identifier by logical file name.
Definition: MultiFileCatalog.h:99
Gaudi::MultiFileCatalog::writeCatalog
IFileCatalog * writeCatalog(CSTR fid="") const override
Access to the (first) writable file catalog.
Definition: MultiFileCatalog.h:156
IFileCatalog.h
Gaudi::MultiFileCatalog::deleteFID
void deleteFID(CSTR fid) const override
Delete FileID from the catalog.
Definition: MultiFileCatalog.h:114
Gaudi::MultiFileCatalog::dirty
bool dirty() const override
Check if the catalog should be updated.
Definition: MultiFileCatalog.cpp:217
Gaudi::IFileCatalog::getFID
virtual void getFID(Strings &fids) const =0
Dump all file Identifiers.
Gaudi::MultiFileCatalog::registerLFN
void registerLFN(CSTR fid, CSTR lfn) const override
Create a FileID and DOM Node of the LFN with all the attributes.
Definition: MultiFileCatalog.cpp:206
Gaudi::MultiFileCatalog::rollback
void rollback() override
Save DOM catalog to file.
Definition: MultiFileCatalog.cpp:231
Gaudi::IFileCatalog::deleteFID
virtual void deleteFID(const std::string &FileID) const =0
Delete FileID Node from the catalog.
Gaudi::MultiFileCatalog::getCatalog
IFileCatalog * getCatalog(CSTR fid, bool throw_if_not, bool writable=true, bool prt=true) const
Find catalog containing a given file identifier.
Definition: MultiFileCatalog.cpp:66
Gaudi::MultiFileCatalog::m_started
bool m_started
Flag to indicate if catalog is started.
Definition: MultiFileCatalog.h:182
Gaudi::IFileCatalog::deletePFN
virtual void deletePFN(const std::string &pfn) const =0
remove a PFN
CSTR
const std::string CSTR
Definition: MultiStoreSvc.cpp:51
Gaudi::MultiFileCatalog::addCatalog
void addCatalog(CSTR connect) override
Add new catalog identified by name to the existing ones.
Definition: MultiFileCatalog.cpp:100
Gaudi::MultiFileCatalog::propHandler
void propHandler()
simple property handle to allow interactive modification of list of the file catalogs
Definition: MultiFileCatalog.cpp:235
Gaudi::MultiFileCatalog::dropMetaData
void dropMetaData(CSTR fid, CSTR attr) const override
Drop specified metadata item.
Definition: MultiFileCatalog.h:138
Gaudi::Property< CatalogNames >
IFileCatalogMgr.h
Gaudi::MultiFileCatalog::m_oldNames
CatalogNames m_oldNames
BACKUP:: Container with catalog names.
Definition: MultiFileCatalog.h:184
Gaudi::MultiFileCatalog::createFID
std::string createFID() const override
Catalog interface
Definition: MultiFileCatalog.cpp:59
Gaudi::MultiFileCatalog::lookupFID
std::string lookupFID(CSTR lfn) const