The Gaudi Framework  v33r1 (b1225454)
MultiFileCatalog.h
Go to the documentation of this file.
1 /***********************************************************************************\
2 * (c) Copyright 1998-2019 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 #ifndef GAUDIUTILS_MULTIFILECATALOG_H
12 #define GAUDIUTILS_MULTIFILECATALOG_H
13 
14 #include "GaudiKernel/Service.h"
17 
18 /*
19  * Gaudi namespace declaration
20  */
21 namespace Gaudi {
22 
30  class MultiFileCatalog : public extends<Service, IFileCatalog, IFileCatalogMgr> {
31  public:
32  // disambiguate between Service::Factory and IFileCatalog::Factory
34 
35  protected:
36  typedef const std::string& CSTR;
39 
40  template <class A1, class F>
41  std::string _find( A1& arg1, F pmf ) const {
42  std::string result;
43  for ( const auto& i : m_catalogs ) {
44  result = ( i->*pmf )( arg1 );
45  if ( !result.empty() ) break;
46  }
47  return result;
48  }
49  template <class A1, class F>
50  void _collect( A1& arg1, F f ) const {
51  A1 tmp;
52  for ( const auto& i : m_catalogs ) {
53  f( i, tmp ); // tmp = f(i)
54  arg1.insert( arg1.end(), tmp.begin(), tmp.end() );
55  tmp.clear();
56  }
57  }
58  template <class A2, class A1, class F>
59  void _collect( const A2& arg2, A1& arg1, F f ) const {
60  A1 tmp;
61  for ( const auto& i : m_catalogs ) {
62  f( i, arg2, tmp ); // tmp = f(i,arg2)
63  arg1.insert( arg1.end(), tmp.begin(), tmp.end() );
64  tmp.clear();
65  }
66  }
67 
68  public:
70  using extends::extends;
71 
73  StatusCode initialize() override;
76  StatusCode finalize() override;
77 
79  std::string createFID() const override;
82  CSTR connectInfo() const override;
84  void init() override;
86  void commit() override;
88  void rollback() override;
90  bool readOnly() const override;
92  bool dirty() const override;
94  bool existsPFN( CSTR pfn ) const override { return !lookupPFN( pfn ).empty(); }
96  std::string lookupPFN( CSTR pfn ) const override { return _find( pfn, &IFileCatalog::lookupPFN ); }
98  bool existsLFN( CSTR lfn ) const override { return !lookupLFN( lfn ).empty(); }
100  std::string lookupLFN( CSTR lfn ) const override { return _find( lfn, &IFileCatalog::lookupLFN ); }
102  bool existsFID( CSTR fid ) const override { return 0 != getCatalog( fid, false, false, false ); }
104  void getPFN( CSTR fid, Files& files ) const override {
105  _collect( fid, files, std::mem_fn( &IFileCatalog::getPFN ) );
106  }
108  void getLFN( CSTR fid, Files& files ) const override {
109  _collect( fid, files, std::mem_fn( &IFileCatalog::getLFN ) );
110  }
111 
113  void getFID( Strings& fids ) const override { _collect( fids, std::mem_fn( &IFileCatalog::getFID ) ); }
115  void deleteFID( CSTR fid ) const override { writeCatalog( fid )->deleteFID( fid ); }
117  void registerPFN( CSTR fid, CSTR pfn, CSTR ftype ) const override;
119  void registerLFN( CSTR fid, CSTR lfn ) const override;
121  void registerFID( CSTR fid ) const override { writeCatalog()->registerFID( fid ); }
123  void renamePFN( CSTR pfn, CSTR newpfn ) const override { writeCatalog()->renamePFN( pfn, newpfn ); }
125  void deletePFN( CSTR pfn ) const override { writeCatalog()->deletePFN( pfn ); }
127  void getMetaData( CSTR fid, Attributes& attr ) const override {
129  }
131  std::string getMetaDataItem( CSTR fid, CSTR name ) const override;
133  void setMetaData( CSTR fid, CSTR attr, CSTR val ) const override {
134  writeCatalog( fid )->setMetaData( fid, attr, val );
135  }
137  void dropMetaData( CSTR fid ) const override { writeCatalog( fid )->dropMetaData( fid ); }
139  void dropMetaData( CSTR fid, CSTR attr ) const override { writeCatalog( fid )->dropMetaData( fid, attr ); }
140 
142  IFileCatalog* findCatalog( CSTR connect, bool must_be_writable ) const override;
145  void addCatalog( CSTR connect ) override;
147  void addCatalog( IFileCatalog* cat ) override;
149  void removeCatalog( CSTR connect ) override;
151  void removeCatalog( const IFileCatalog* cat ) override;
153  Catalogs& catalogs() override { return m_catalogs; }
155  const Catalogs& catalogs() const override { return m_catalogs; }
157  IFileCatalog* writeCatalog( CSTR fid = "" ) const override { return getCatalog( fid, true, true, false ); }
159  void setWriteCatalog( IFileCatalog* cat ) override;
161  void setWriteCatalog( CSTR connect ) override;
162 
163  private:
165  IFileCatalog* getCatalog( CSTR fid, bool throw_if_not, bool writable = true, bool prt = true ) const;
167  Catalogs::iterator i_findCatalog( CSTR connect, bool must_be_writable );
168 
171  void propHandler();
172 
173  void printError( CSTR msg, bool throw_exc = true ) const;
174  std::string lookupFID( CSTR lfn ) const;
175 
178 
180  this, "Catalogs", {{"xmlcatalog_file:test_catalog.xml"}}, &MultiFileCatalog::propHandler, "catalog names"};
181 
183  bool m_started = false;
186  };
187 } /* End namespace Gaudi */
188 #endif /* GAUDIUTILS_MULTIFILECATALOG_H */
virtual void setMetaData(const std::string &fid, const std::string &name, const std::string &value) const =0
Insert/update metadata item.
void setMetaData(CSTR fid, CSTR attr, CSTR val) const override
Insert/update metadata item.
virtual void getPFN(const std::string &fid, Files &files) const =0
Dump all PFNames of the catalog and their attributes associate to the FileID.
virtual void renamePFN(const std::string &pfn, const std::string &new_pfn) const =0
rename a PFN
T empty(T... args)
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.
bool m_started
Flag to indicate if catalog is started.
Implementation of property with value of concrete type.
Definition: Property.h:370
virtual std::string lookupLFN(const std::string &lfn) const =0
Lookup file identifier by physical file name.
void registerLFN(CSTR fid, CSTR lfn) const override
Create a FileID and DOM Node of the LFN with all the attributes.
virtual void registerFID(const std::string &fid) const =0
Create a Node for a FileID and DOM Node.
std::string lookupFID(CSTR lfn) const
std::string _find(A1 &arg1, F pmf) const
virtual std::string lookupPFN(const std::string &lfn) const =0
Lookup file identifier by physical file name.
void registerFID(CSTR fid) const override
Create a FileID and DOM Node.
virtual void deletePFN(const std::string &pfn) const =0
remove a PFN
virtual void getMetaData(const std::string &fid, Attributes &attr) const =0
Dump all MetaData of the catalog for a given file ID.
void deletePFN(CSTR pfn) const override
remove a PFN
void setWriteCatalog(IFileCatalog *cat) override
Define the writable catalog identified by reference.
virtual void getFID(Strings &fids) const =0
Dump all file Identifiers.
Service::Factory Factory
void getFID(Strings &fids) const override
Dump all file Identifiers.
STL class.
std::string lookupPFN(CSTR pfn) const override
Lookup file identifier by physical file name.
Catalogs::iterator i_findCatalog(CSTR connect, bool must_be_writable)
Find catalog by connect string.
const std::string & name() const override
Retrieve name of the service.
Definition: Service.cpp:284
void getPFN(CSTR fid, Files &files) const override
Dump all physical file names of the catalog and their attributes associate to the FileID.
StatusCode initialize() override
IService implementation.
bool existsLFN(CSTR lfn) const override
Return the status of a logical file name.
Catalogs m_catalogs
Container with references to known catalogs.
This class is used for returning status codes from appropriate routines.
Definition: StatusCode.h:61
virtual void getLFN(const std::string &fid, Files &files) const =0
Dump all LFNames of the catalog associate to the FileID.
Gaudi::Property< CatalogNames > m_catalogNames
void _collect(A1 &arg1, F f) const
bool existsPFN(CSTR pfn) const override
Return the status of physical file name.
bool existsFID(CSTR fid) const override
Return the status of a FileID.
const std::string & CSTR
virtual void deleteFID(const std::string &FileID) const =0
Delete FileID Node from the catalog.
File catalog interface.
Definition: IFileCatalog.h:36
std::vector< IFileCatalog * > Catalogs
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
void renamePFN(CSTR pfn, CSTR newpfn) const override
rename a PFN
void dropMetaData(CSTR fid, CSTR attr) const override
Drop specified metadata item.
MsgStream & msg() const
shortcut for the method msgStream(MSG::INFO)
Gaudi::PluginService::Factory< IService *(const std::string &, ISvcLocator *)> Factory
Definition: Service.h:48
Base class used to extend a class implementing other interfaces.
Definition: extends.h:20
CatalogNames m_oldNames
BACKUP:: Container with catalog names.
void rollback() override
Save DOM catalog to file.
StatusCode finalize() override
Finalize service object.
virtual void dropMetaData(const std::string &fid) const =0
Drop all metadata of one FID.
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.
std::vector< std::string > CatalogNames
void propHandler()
simple property handle to allow interactive modification of list of the file catalogs
Catalogs & catalogs() override
Access catalog container.
void getLFN(CSTR fid, Files &files) const override
Dump all logical file names of the catalog associate to the FileID.
std::string getMetaDataItem(CSTR fid, CSTR name) const override
Access metadata item.
T mem_fn(T... args)
std::string createFID() const override
Catalog interface.
void commit() override
Save DOM catalog to file.
void removeCatalog(CSTR connect) override
Remove catalog identified by name from the existing ones.
Header file for std:chrono::duration-based Counters.
Definition: __init__.py:1
void _collect(const A2 &arg2, A1 &arg1, F f) const
void dropMetaData(CSTR fid) const override
Drop all metadata of one FID.
void getMetaData(CSTR fid, Attributes &attr) const override
Dump all MetaData of the catalog for a given file ID.
const Catalogs & catalogs() const override
Access catalog container (CONST)
std::string lookupLFN(CSTR lfn) const override
Lookup file identifier by logical file name.
IFileCatalog * writeCatalog(CSTR fid="") const override
Access to the (first) writable file catalog.
void deleteFID(CSTR fid) const override
Delete FileID from the catalog.
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.