The Gaudi Framework  v30r0 (c919700c)
MultiStoreSvc.cpp
Go to the documentation of this file.
1 //====================================================================
2 // MultiStoreSvc.cpp
3 //--------------------------------------------------------------------
4 //
5 // Package : System ( The LHCb Offline System)
6 //
7 // Description: implementation of the Transient event data service.
8 //
9 // Author : M.Frank
10 // History :
11 // +---------+----------------------------------------------+---------
12 // | Date | Comment | Who
13 // +---------+----------------------------------------------+---------
14 // | 29/10/98| Initial version | MF
15 // +---------+----------------------------------------------+---------
16 //
17 //====================================================================
18 #define DATASVC_MULTISTORESVC_CPP
19 
20 // Include files
22 #include "GaudiKernel/DataObject.h"
31 #include "GaudiKernel/MsgStream.h"
32 #include "GaudiKernel/Service.h"
33 #include "GaudiKernel/SmartIF.h"
35 #include "GaudiKernel/compose.h"
36 #include "boost/variant.hpp"
37 #include <map>
38 
39 // Forward declarations
40 // This class
42 
43 typedef const std::string CSTR;
48 
49 namespace
50 {
51  struct Partition final {
52  SmartIF<IDataProviderSvc> dataProvider;
53  SmartIF<IDataManagerSvc> dataManager;
55 
56  template <typename T>
57  T* get();
58  };
59  template <>
60  IDataProviderSvc* Partition::get<IDataProviderSvc>()
61  {
62  return dataProvider.get();
63  }
64  template <>
65  IDataManagerSvc* Partition::get<IDataManagerSvc>()
66  {
67  return dataManager.get();
68  }
69 
70  namespace detail
71  {
72  template <typename lambda>
73  struct arg_helper : public arg_helper<decltype( &lambda::operator() )> {
74  };
75  template <typename T, typename Ret, typename Arg>
76  struct arg_helper<Ret ( T::* )( Arg ) const> {
77  using type = Arg;
78  };
79 
80  // given a unary lambda whose argument is of type Arg_t,
81  // argument_t<lambda> will be equal to Arg_t
82  template <typename lambda>
83  using argument_t = typename arg_helper<lambda>::type;
84  }
85  auto dispatch_variant = []( auto&& variant, auto&&... lambdas ) -> decltype( auto ) {
86  return boost::apply_visitor( compose( std::forward<decltype( lambdas )>( lambdas )... ),
87  std::forward<decltype( variant )>( variant ) );
88  };
89 }
90 
102 class MultiStoreSvc : public extends<Service, IDataProviderSvc, IDataManagerSvc, IPartitionControl>
103 {
104 protected:
107 
108  Gaudi::Property<CLID> m_rootCLID{this, "RootCLID", 110, "CLID of root entry"};
109  Gaudi::Property<std::string> m_rootName{this, "RootName", "/Event", "name of root entry"};
110  Gaudi::Property<PartitionDefs> m_partitionDefs{this, "Partitions", {}, "datastore partition definitions"};
111  Gaudi::Property<std::string> m_loader{this, "DataLoader", "EventPersistencySvc", "data loader name"};
112  Gaudi::Property<std::string> m_defaultPartition{this, "DefaultPartition", "Default", "default partition name"};
113 
119  struct tagROOT {
121  boost::variant<boost::blank, ADDRESS*, OBJECT*> root;
122  } m_root;
124  Partition m_current;
126  Partitions m_partitions;
127 
128  // member templates to help writing the function calls
129  template <typename Fun>
130  STATUS fwd( Fun f )
131  {
132  auto* svc = m_current.get<std::decay_t<detail::argument_t<Fun>>>();
133  return svc ? f( *svc ) : static_cast<StatusCode>( IDataProviderSvc::INVALID_ROOT );
134  }
135 
136 public:
138  CLID rootCLID() const override { return m_rootCLID; }
140  const std::string& rootName() const override { return m_rootName; }
141 
143  STATUS registerAddress( boost::string_ref path, ADDRESS* pAddr ) override
144  {
145  return fwd( [&]( IDataManagerSvc& svc ) { return svc.registerAddress( path, pAddr ); } );
146  }
148  STATUS registerAddress( OBJECT* parent, boost::string_ref path, ADDRESS* pAddr ) override
149  {
150  return fwd( [&]( IDataManagerSvc& svc ) { return svc.registerAddress( parent, path, pAddr ); } );
151  }
153  STATUS registerAddress( IRegistry* parent, boost::string_ref path, ADDRESS* pAddr ) override
154  {
155  return fwd( [&]( IDataManagerSvc& svc ) { return svc.registerAddress( parent, path, pAddr ); } );
156  }
158  STATUS unregisterAddress( boost::string_ref path ) override
159  {
160  return fwd( [&]( IDataManagerSvc& svc ) { return svc.unregisterAddress( path ); } );
161  }
163  STATUS unregisterAddress( OBJECT* pParent, boost::string_ref path ) override
164  {
165  return fwd( [&]( IDataManagerSvc& svc ) { return svc.unregisterAddress( pParent, path ); } );
166  }
168  STATUS unregisterAddress( IRegistry* pParent, boost::string_ref path ) override
169  {
170  return fwd( [&]( IDataManagerSvc& svc ) { return svc.unregisterAddress( pParent, path ); } );
171  }
173  STATUS objectLeaves( const OBJECT* pObject, std::vector<IRegistry*>& leaves ) override
174  {
175  return fwd( [&]( IDataManagerSvc& svc ) { return svc.objectLeaves( pObject, leaves ); } );
176  }
178  STATUS objectLeaves( const IRegistry* pObject, std::vector<IRegistry*>& leaves ) override
179  {
180  return fwd( [&]( IDataManagerSvc& svc ) { return svc.objectLeaves( pObject, leaves ); } );
181  }
183  STATUS objectParent( const OBJECT* pObject, IRegistry*& refpParent ) override
184  {
185  return fwd( [&]( IDataManagerSvc& svc ) { return svc.objectParent( pObject, refpParent ); } );
186  }
188  STATUS objectParent( const IRegistry* pObject, IRegistry*& refpParent ) override
189  {
190  return fwd( [&]( IDataManagerSvc& svc ) { return svc.objectParent( pObject, refpParent ); } );
191  }
193  STATUS clearSubTree( boost::string_ref path ) override
194  {
195  return fwd( [&]( IDataManagerSvc& svc ) { return svc.clearSubTree( path ); } );
196  }
198  STATUS clearSubTree( OBJECT* pObject ) override
199  {
200  return fwd( [&]( IDataManagerSvc& svc ) { return svc.clearSubTree( pObject ); } );
201  }
203  STATUS clearStore() override
204  {
205  for ( auto& i : m_partitions ) {
206  i.second.dataManager->clearStore().ignore();
207  }
208  dispatch_variant( m_root.root,
209  []( auto* p ) {
210  if ( p ) p->release();
211  },
212  []( boost::blank ) {} );
213  m_root.root = {};
214  m_root.path.clear();
215  return STATUS::SUCCESS;
216  }
218  STATUS traverseSubTree( boost::string_ref path, AGENT* pAgent ) override
219  {
220  return fwd( [&]( IDataManagerSvc& svc ) { return svc.traverseSubTree( path, pAgent ); } );
221  }
223  STATUS traverseSubTree( OBJECT* pObject, AGENT* pAgent ) override
224  {
225  return fwd( [&]( IDataManagerSvc& svc ) { return svc.traverseSubTree( pObject, pAgent ); } );
226  }
228  STATUS traverseTree( AGENT* pAgent ) override
229  {
230  return fwd( [&]( IDataManagerSvc& svc ) { return svc.traverseTree( pAgent ); } );
231  }
234  STATUS setRoot( std::string path, OBJECT* pObj ) override
235  {
236  dispatch_variant( m_root.root,
237  []( auto* p ) {
238  if ( p ) p->release();
239  },
240  []( boost::blank ) {} );
241  m_root.path = std::move( path );
242  m_root.root = pObj;
243  preparePartitions();
244  return activate( m_defaultPartition );
245  }
246 
249  STATUS setRoot( std::string path, ADDRESS* pAddr ) override
250  {
251  dispatch_variant( m_root.root,
252  []( auto* p ) {
253  if ( p ) p->release();
254  },
255  []( boost::blank ) {} );
256  m_root.path = std::move( path );
257  m_root.root = pAddr;
258  if ( !pAddr ) return STATUS::FAILURE;
259  pAddr->addRef();
260  preparePartitions();
261  return activate( m_defaultPartition );
262  }
264  STATUS setDataLoader( IConversionSvc* pDataLoader, IDataProviderSvc* dpsvc = nullptr ) override
265  {
266  m_dataLoader = pDataLoader;
267  if ( m_dataLoader ) m_dataLoader->setDataProvider( dpsvc ? dpsvc : this );
268  for ( auto& i : m_partitions ) {
269  i.second.dataManager->setDataLoader( m_dataLoader.get() ).ignore();
270  }
271  return SUCCESS;
272  }
274  STATUS addPreLoadItem( const DataStoreItem& item ) override
275  {
276  return fwd( [&]( IDataProviderSvc& svc ) { return svc.addPreLoadItem( item ); } );
277  }
280  {
281  return fwd( [&]( IDataProviderSvc& svc ) { return svc.addPreLoadItem( std::move( item ) ); } );
282  }
284  STATUS removePreLoadItem( const DataStoreItem& item ) override
285  {
286  return fwd( [&]( IDataProviderSvc& svc ) { return svc.removePreLoadItem( item ); } );
287  }
290  {
291  return fwd( [&]( IDataProviderSvc& svc ) { return svc.removePreLoadItem( std::move( item ) ); } );
292  }
294  STATUS resetPreLoad() override
295  {
296  return fwd( [&]( IDataProviderSvc& svc ) { return svc.resetPreLoad(); } );
297  }
299  STATUS preLoad() override
300  {
301  return fwd( [&]( IDataProviderSvc& svc ) { return svc.preLoad(); } );
302  }
304  STATUS registerObject( boost::string_ref path, OBJECT* pObj ) override
305  {
306  return registerObject( nullptr, path, pObj );
307  }
309  STATUS registerObject( boost::string_ref parent, boost::string_ref obj, OBJECT* pObj ) override
310  {
311  return fwd( [&]( IDataProviderSvc& svc ) { return svc.registerObject( parent, obj, pObj ); } );
312  }
314  STATUS registerObject( boost::string_ref parent, int item, OBJECT* pObj ) override
315  {
316  return fwd( [&]( IDataProviderSvc& svc ) { return svc.registerObject( parent, item, pObj ); } );
317  }
319  STATUS registerObject( OBJECT* parent, boost::string_ref obj, OBJECT* pObj ) override
320  {
321  return fwd( [&]( IDataProviderSvc& svc ) { return svc.registerObject( parent, obj, pObj ); } );
322  }
324  STATUS registerObject( OBJECT* parent, int obj, OBJECT* pObj ) override
325  {
326  return fwd( [&]( IDataProviderSvc& svc ) { return svc.registerObject( parent, obj, pObj ); } );
327  }
329  STATUS unregisterObject( boost::string_ref path ) override
330  {
331  return fwd( [&]( IDataProviderSvc& svc ) { return svc.unregisterObject( path ); } );
332  }
334  STATUS unregisterObject( boost::string_ref parent, boost::string_ref obj ) override
335  {
336  return fwd( [&]( IDataProviderSvc& svc ) { return svc.unregisterObject( parent, obj ); } );
337  }
339  STATUS unregisterObject( boost::string_ref parent, int obj ) override
340  {
341  return fwd( [&]( IDataProviderSvc& svc ) { return svc.unregisterObject( parent, obj ); } );
342  }
344  STATUS unregisterObject( OBJECT* pObj ) override
345  {
346  return fwd( [&]( IDataProviderSvc& svc ) { return svc.unregisterObject( pObj ); } );
347  }
349  STATUS unregisterObject( OBJECT* pObj, boost::string_ref path ) override
350  {
351  return fwd( [&]( IDataProviderSvc& svc ) { return svc.unregisterObject( pObj, path ); } );
352  }
354  STATUS unregisterObject( OBJECT* pObj, int item ) override
355  {
356  return fwd( [&]( IDataProviderSvc& svc ) { return svc.unregisterObject( pObj, item ); } );
357  }
359  STATUS retrieveObject( IRegistry* parent, boost::string_ref path, OBJECT*& pObj ) override
360  {
361  return fwd( [&]( IDataProviderSvc& svc ) { return svc.retrieveObject( parent, path, pObj ); } );
362  }
364  STATUS retrieveObject( boost::string_ref path, OBJECT*& pObj ) override
365  {
366  return fwd( [&]( IDataProviderSvc& svc ) { return svc.retrieveObject( path, pObj ); } );
367  }
369  STATUS retrieveObject( boost::string_ref parent, boost::string_ref path, OBJECT*& pObj ) override
370  {
371  return fwd( [&]( IDataProviderSvc& svc ) { return svc.retrieveObject( parent, path, pObj ); } );
372  }
374  STATUS retrieveObject( boost::string_ref parent, int item, OBJECT*& pObj ) override
375  {
376  return fwd( [&]( IDataProviderSvc& svc ) { return svc.retrieveObject( parent, item, pObj ); } );
377  }
379  STATUS retrieveObject( OBJECT* parent, boost::string_ref path, OBJECT*& pObj ) override
380  {
381  return fwd( [&]( IDataProviderSvc& svc ) { return svc.retrieveObject( parent, path, pObj ); } );
382  }
384  STATUS retrieveObject( OBJECT* parent, int item, OBJECT*& pObj ) override
385  {
386  return fwd( [&]( IDataProviderSvc& svc ) { return svc.retrieveObject( parent, item, pObj ); } );
387  }
389  STATUS findObject( boost::string_ref path, OBJECT*& pObj ) override
390  {
391  return fwd( [&]( IDataProviderSvc& svc ) { return svc.retrieveObject( path, pObj ); } );
392  }
394  STATUS findObject( IRegistry* parent, boost::string_ref path, OBJECT*& pObj ) override
395  {
396  return fwd( [&]( IDataProviderSvc& svc ) { return svc.findObject( parent, path, pObj ); } );
397  }
399  STATUS findObject( boost::string_ref parent, boost::string_ref path, OBJECT*& pObj ) override
400  {
401  return fwd( [&]( IDataProviderSvc& svc ) { return svc.retrieveObject( parent, path, pObj ); } );
402  }
404  STATUS findObject( boost::string_ref parent, int item, OBJECT*& pObject ) override
405  {
406  return fwd( [&]( IDataProviderSvc& svc ) { return svc.findObject( parent, item, pObject ); } );
407  }
409  STATUS findObject( OBJECT* parent, boost::string_ref path, OBJECT*& pObject ) override
410  {
411  return fwd( [&]( IDataProviderSvc& svc ) { return svc.findObject( parent, path, pObject ); } );
412  }
414  STATUS findObject( OBJECT* parent, int item, OBJECT*& pObject ) override
415  {
416  return fwd( [&]( IDataProviderSvc& svc ) { return svc.findObject( parent, item, pObject ); } );
417  }
419  STATUS linkObject( IRegistry* from, boost::string_ref objPath, OBJECT* to ) override
420  {
421  return fwd( [&]( IDataProviderSvc& svc ) { return svc.linkObject( from, objPath, to ); } );
422  }
424  STATUS linkObject( boost::string_ref from, boost::string_ref objPath, OBJECT* to ) override
425  {
426  return fwd( [&]( IDataProviderSvc& svc ) { return svc.linkObject( from, objPath, to ); } );
427  }
429  STATUS linkObject( OBJECT* from, boost::string_ref objPath, OBJECT* to ) override
430  {
431  return fwd( [&]( IDataProviderSvc& svc ) { return svc.linkObject( from, objPath, to ); } );
432  }
434  STATUS linkObject( boost::string_ref fullPath, OBJECT* to ) override
435  {
436  return fwd( [&]( IDataProviderSvc& svc ) { return svc.linkObject( fullPath, to ); } );
437  }
439  STATUS unlinkObject( IRegistry* from, boost::string_ref objPath ) override
440  {
441  return fwd( [&]( IDataProviderSvc& svc ) { return svc.unlinkObject( from, objPath ); } );
442  }
444  STATUS unlinkObject( boost::string_ref from, boost::string_ref objPath ) override
445  {
446  return fwd( [&]( IDataProviderSvc& svc ) { return svc.unlinkObject( from, objPath ); } );
447  }
449  STATUS unlinkObject( OBJECT* from, boost::string_ref objPath ) override
450  {
451  return fwd( [&]( IDataProviderSvc& svc ) { return svc.unlinkObject( from, objPath ); } );
452  }
454  STATUS unlinkObject( boost::string_ref path ) override
455  {
456  return fwd( [&]( IDataProviderSvc& svc ) { return svc.unlinkObject( path ); } );
457  }
459  STATUS updateObject( IRegistry* pDirectory ) override
460  {
461  return fwd( [&]( IDataProviderSvc& svc ) { return svc.updateObject( pDirectory ); } );
462  }
464  STATUS updateObject( boost::string_ref path ) override
465  {
466  return fwd( [&]( IDataProviderSvc& svc ) { return svc.updateObject( path ); } );
467  }
469  STATUS updateObject( OBJECT* pObj ) override
470  {
471  return fwd( [&]( IDataProviderSvc& svc ) { return svc.updateObject( pObj ); } );
472  }
474  STATUS updateObject( boost::string_ref parent, boost::string_ref updatePath ) override
475  {
476  return fwd( [&]( IDataProviderSvc& svc ) { return svc.updateObject( parent, updatePath ); } );
477  }
479  STATUS updateObject( OBJECT* parent, boost::string_ref updatePath ) override
480  {
481  return fwd( [&]( IDataProviderSvc& svc ) { return svc.updateObject( parent, updatePath ); } );
482  }
483 
485  STATUS create( CSTR& nam, CSTR& typ ) override
486  {
487  IInterface* pPartition = nullptr;
488  return create( nam, typ, pPartition );
489  }
491  STATUS create( CSTR& nam, CSTR& typ, IInterface*& pPartition ) override
492  {
493  if ( get( nam, pPartition ).isSuccess() ) return PARTITION_EXISTS;
495  auto isvc = serviceLocator()->service<IService>( typ );
496  if ( !isvc ) return NO_INTERFACE;
497  auto dataMgr = isvc.as<IDataManagerSvc>();
498  auto dataProv = isvc.as<IDataProviderSvc>();
499  if ( !dataMgr || !dataProv ) return NO_INTERFACE;
500  m_partitions.emplace( nam, Partition{dataProv, dataMgr, nam} );
501  return STATUS::SUCCESS;
502  }
503 
505  STATUS drop( CSTR& nam ) override
506  {
507  auto i = m_partitions.find( nam );
508  if ( i == m_partitions.end() ) return PARTITION_NOT_PRESENT;
509  if ( i->second.dataManager == m_current.dataManager ) {
510  m_current = Partition();
511  }
512  i->second.dataManager->clearStore().ignore();
513  m_partitions.erase( i );
514  return STATUS::SUCCESS;
515  }
516 
518  STATUS drop( IInterface* pPartition ) override
519  {
520  auto provider = SmartIF<IDataProviderSvc>( pPartition );
521  if ( !provider ) return NO_INTERFACE;
522  auto i = std::find_if( std::begin( m_partitions ), std::end( m_partitions ),
523  [&]( Partitions::const_reference p ) { return p.second.dataProvider == provider; } );
524  if ( i == std::end( m_partitions ) ) return PARTITION_NOT_PRESENT;
525  i->second.dataManager->clearStore().ignore();
526  m_partitions.erase( i );
527  return STATUS::SUCCESS;
528  }
529 
531  STATUS activate( CSTR& nam ) override
532  {
533  auto i = m_partitions.find( nam );
534  if ( i != m_partitions.end() ) {
535  m_current = i->second;
536  return STATUS::SUCCESS;
537  }
538  m_current = {};
539  return PARTITION_NOT_PRESENT;
540  }
541 
543  STATUS activate( IInterface* pPartition ) override
544  {
545  auto provider = SmartIF<IDataProviderSvc>( pPartition );
546  m_current = Partition();
547  if ( !provider ) return NO_INTERFACE;
548  auto i = std::find_if( std::begin( m_partitions ), std::end( m_partitions ),
549  [&]( Partitions::const_reference p ) { return p.second.dataProvider == provider; } );
550  if ( i == std::end( m_partitions ) ) return PARTITION_NOT_PRESENT;
551  m_current = i->second;
552  return STATUS::SUCCESS;
553  }
554 
556  STATUS get( CSTR& nam, IInterface*& pPartition ) const override
557  {
558  auto i = m_partitions.find( nam );
559  if ( i != m_partitions.end() ) {
560  pPartition = i->second.dataProvider;
561  return STATUS::SUCCESS;
562  }
563  pPartition = nullptr;
564  return PARTITION_NOT_PRESENT;
565  }
566 
568  StatusCode activePartition( std::string& nam, IInterface*& pPartition ) const override
569  {
570  if ( m_current.dataProvider ) {
571  nam = m_current.name;
572  pPartition = m_current.dataProvider;
573  return STATUS::SUCCESS;
574  }
575  nam.clear();
576  pPartition = nullptr;
577  return NO_ACTIVE_PARTITION;
578  }
579 
581  {
582  // Attach address creator facility
583  m_addrCreator = service( m_loader, true );
584  if ( !m_addrCreator ) {
585  error() << "Failed to retrieve data loader "
586  << "\"" << m_loader << "\"" << endmsg;
587  return StatusCode::FAILURE;
588  }
589  // Attach data loader facility
590  auto dataLoader = service<IConversionSvc>( m_loader, true );
591  if ( !dataLoader ) {
592  error() << "Failed to retrieve data loader "
593  << "\"" << m_loader << "\"" << endmsg;
594  return StatusCode::FAILURE;
595  }
596  auto sc = setDataLoader( dataLoader.get() );
597  if ( !sc.isSuccess() ) {
598  error() << "Failed to set data loader "
599  << "\"" << m_loader << "\"" << endmsg;
600  }
601  return sc;
602  }
603 
605  {
606  m_addrCreator.reset();
607  m_dataLoader.reset();
608  return STATUS::SUCCESS;
609  }
610 
612  STATUS initialize() override
613  {
614  // Nothing to do: just call base class initialisation
616  if ( !sc.isSuccess() ) return sc;
617  sc = makePartitions();
618  if ( !sc.isSuccess() ) {
619  error() << "Failed to connect to all store partitions." << endmsg;
620  return sc;
621  }
622  return attachServices();
623  }
624 
626  STATUS reinitialize() override
627  {
629  if ( !sc.isSuccess() ) {
630  error() << "Enable to reinitialize base class" << endmsg;
631  return sc;
632  }
633  detachServices();
634  sc = attachServices();
635  if ( !sc.isSuccess() ) {
636  error() << "Failed to attach necessary services." << endmsg;
637  return sc;
638  }
639  sc = makePartitions();
640  if ( !sc.isSuccess() ) {
641  error() << "Failed to connect to store partitions." << endmsg;
642  return sc;
643  }
644  // return
645  return STATUS::SUCCESS;
646  }
647 
649  STATUS finalize() override
650  {
651  setDataLoader( nullptr ).ignore();
652  clearStore().ignore();
653  clearPartitions().ignore();
654  m_current = Partition();
655  detachServices();
656  return Service::finalize();
657  }
658 
659  // protected:
660 
662  using extends::extends;
663 
665  ~MultiStoreSvc() override
666  {
667  setDataLoader( nullptr ).ignore();
668  resetPreLoad().ignore();
669  clearStore().ignore();
670  clearPartitions().ignore();
671  }
672 
675  {
676  STATUS iret = STATUS::SUCCESS;
677  for ( auto& i : m_partitions ) {
678  STATUS sc = dispatch_variant( m_root.root,
679  [&]( ADDRESS* address ) -> STATUS {
680  if ( !address ) return STATUS::FAILURE;
681  ADDRESS* pAdd = nullptr;
682  ADDRESS* p = address;
683  auto sc = m_addrCreator->createAddress( p->svcType(), p->clID(), p->par(),
684  p->ipar(), pAdd );
685  return sc.isSuccess() ? i.second.dataManager->setRoot( m_root.path, pAdd ) : sc;
686  },
687  [&]( OBJECT* object ) -> STATUS {
688  if ( object && object->clID() == CLID_DataObject ) {
689  return i.second.dataManager->setRoot( m_root.path, new DataObject() );
690  }
691  return STATUS::FAILURE;
692  },
693  []( boost::blank ) -> STATUS { return STATUS::FAILURE; } );
694  if ( !sc.isSuccess() ) iret = sc;
695  }
696  return iret;
697  }
698 
701  {
702  for ( auto& i : m_partitions ) i.second.dataManager->clearStore().ignore();
703  m_partitions.clear();
704  return STATUS::SUCCESS;
705  }
706 
709  {
710  using Parser = Gaudi::Utils::AttribStringParser;
711  std::string typ, nam;
712  clearPartitions().ignore();
713  for ( auto part : m_partitionDefs ) {
714  for ( auto attrib : Parser( std::move( part ) ) ) {
715  switch (::toupper( attrib.tag[0] ) ) {
716  case 'N':
717  nam = std::move( attrib.value );
718  break;
719  case 'T':
720  typ = std::move( attrib.value );
721  break;
722  }
723  }
724  STATUS sc = create( nam, typ );
725  if ( !sc.isSuccess() ) return sc;
726  if ( m_defaultPartition.empty() ) m_defaultPartition = nam;
727  }
728  return STATUS::SUCCESS;
729  }
730 };
731 
732 // Instantiation of a static factory class used by clients to create
733 // instances of this service
virtual StatusCode traverseTree(IDataStoreAgent *pAgent)=0
Analyse by traversing all data objects in the data store.
STATUS findObject(boost::string_ref parent, boost::string_ref path, OBJECT *&pObj) override
Find object in the data store.
STATUS registerObject(boost::string_ref parent, int item, OBJECT *pObj) override
Register object with the data store.
Parse attribute strings allowing iteration over the various attributes.
STATUS objectLeaves(const IRegistry *pObject, std::vector< IRegistry * > &leaves) override
Explore the object store: retrieve all leaves attached to the object.
StatusCode initialize() override
Definition: Service.cpp:64
STATUS unlinkObject(boost::string_ref path) override
Remove a link to another object.
STATUS updateObject(boost::string_ref parent, boost::string_ref updatePath) override
Update object.
STATUS preLoad() override
load all preload items of the list
STATUS unregisterAddress(boost::string_ref path) override
IDataManagerSvc: Unregister object address from the data store.
virtual StatusCode objectLeaves(const DataObject *pObject, std::vector< IRegistry * > &refLeaves)=0
Explore the object store: retrieve all leaves attached to the object The object is identified by its ...
STATUS registerObject(boost::string_ref parent, boost::string_ref obj, OBJECT *pObj) override
Register object with the data store.
virtual StatusCode unlinkObject(IRegistry *from, boost::string_ref objPath)=0
Remove a link to another object.
Partitions m_partitions
Datastore partitions.
STATUS finalize() override
Service initialisation.
STATUS unregisterObject(OBJECT *pObj, boost::string_ref path) override
Unregister object from the data store.
StatusCode finalize() override
Definition: Service.cpp:174
Implementation of property with value of concrete type.
Definition: Property.h:319
virtual StatusCode addPreLoadItem(const DataStoreItem &item)=0
Add an item to the preload list.
const std::string & rootName() const override
Name for root Event.
CLID rootCLID() const override
IDataManagerSvc: Accessor for root event CLID.
STATUS updateObject(OBJECT *pObj) override
Update object.
Invalid root path object cannot be retrieved or stored.
STATUS objectParent(const OBJECT *pObject, IRegistry *&refpParent) override
IDataManagerSvc: Explore the object store: retrieve the object&#39;s parent.
STATUS findObject(OBJECT *parent, int item, OBJECT *&pObject) override
Find object in the data store.
STATUS fwd(Fun f)
auto dispatch_variant
Definition: FunAdapters.h:77
virtual StatusCode findObject(IRegistry *pDirectory, boost::string_ref path, DataObject *&pObject)=0
Find object identified by its directory entry.
STATUS retrieveObject(IRegistry *parent, boost::string_ref path, OBJECT *&pObj) override
Retrieve object from data store.
bool isSuccess() const
Test for a status code of SUCCESS.
Definition: StatusCode.h:50
STATUS removePreLoadItem(std::string item) override
Add an item to the preload list.
STATUS registerObject(boost::string_ref path, OBJECT *pObj) override
Register object with the data store.
Root type (address or object)
STATUS detachServices()
STATUS findObject(boost::string_ref path, OBJECT *&pObj) override
Find object identified by its full path in the data store.
STATUS traverseSubTree(boost::string_ref path, AGENT *pAgent) override
Analyze by traversing all data objects below the sub tree.
virtual StatusCode setDataProvider(IDataProviderSvc *pService)=0
Set Data provider service.
boost::variant< boost::blank, ADDRESS *, OBJECT * > root
STATUS unregisterObject(boost::string_ref parent, int obj) override
Unregister object from the data store.
virtual StatusCode preLoad()=0
Load all preload items of the list.
STATUS clearSubTree(boost::string_ref path) override
Remove all data objects below the sub tree identified.
StatusCode STATUS
virtual StatusCode resetPreLoad()=0
Clear the preload list.
T end(T...args)
STATUS create(CSTR &nam, CSTR &typ, IInterface *&pPartition) override
Create a partition object. The name identifies the partition uniquely.
Data service base class.
STATUS unlinkObject(IRegistry *from, boost::string_ref objPath) override
Remove a link to another object.
STATUS reinitialize() override
Service initialisation.
Data provider interface definition.
STATUS removePreLoadItem(const DataStoreItem &item) override
Remove an item from the preload list.
Description of the DataStoreItem class.
Definition: DataStoreItem.h:17
STATUS addPreLoadItem(std::string item) override
Add an item to the preload list.
STATUS unlinkObject(boost::string_ref from, boost::string_ref objPath) override
Remove a link to another object.
virtual StatusCode objectParent(const DataObject *pObject, IRegistry *&refpParent)=0
IDataManagerSvc: Explore the object store: retrieve the object&#39;s parent.
SmartIF< IConversionSvc > m_dataLoader
Pointer to data loader service.
#define DECLARE_COMPONENT(type)
Definition: PluginService.h:33
STATUS linkObject(boost::string_ref from, boost::string_ref objPath, OBJECT *to) override
Add a link to another object.
STATUS create(CSTR &nam, CSTR &typ) override
Create a partition object. The name identifies the partition uniquely.
STATUS setDataLoader(IConversionSvc *pDataLoader, IDataProviderSvc *dpsvc=nullptr) override
IDataManagerSvc: Pass a default data loader to the service.
STL class.
virtual StatusCode linkObject(IRegistry *from, boost::string_ref objPath, DataObject *toObj)=0
Add a link to another object.
std::vector< std::string > PartitionDefs
virtual StatusCode removePreLoadItem(const DataStoreItem &item)=0
Remove an item from the preload list.
TYPE * get() const
Get interface pointer.
Definition: SmartIF.h:82
virtual StatusCode traverseSubTree(boost::string_ref sub_path, IDataStoreAgent *pAgent)=0
Analyse by traversing all data objects below the sub tree identified by its full path name...
STATUS makePartitions()
Create all partitions according to job options.
STATUS linkObject(IRegistry *from, boost::string_ref objPath, OBJECT *to) override
Add a link to another object.
TupleObj.h GaudiAlg/TupleObj.h namespace with few technical implementations.
STATUS registerAddress(IRegistry *parent, boost::string_ref path, ADDRESS *pAddr) override
IDataManagerSvc: Register object address with the data store.
STATUS setRoot(std::string path, OBJECT *pObj) override
Initialize data store for new event by giving new event path and root object.
STATUS unregisterAddress(OBJECT *pParent, boost::string_ref path) override
IDataManagerSvc: Unregister object address from the data store.
STATUS addPreLoadItem(const DataStoreItem &item) override
Add an item to the preload list.
STATUS unlinkObject(OBJECT *from, boost::string_ref objPath) override
Remove a link to another object.
STATUS findObject(OBJECT *parent, boost::string_ref path, OBJECT *&pObject) override
Find object in the data store.
General service interface definition.
Definition: IService.h:18
STATUS clearSubTree(OBJECT *pObject) override
Remove all data objects below the sub tree identified.
This class is used for returning status codes from appropriate routines.
Definition: StatusCode.h:26
virtual StatusCode updateObject(IRegistry *pDirectory)=0
Update object identified by its directory entry.
STATUS unregisterAddress(IRegistry *pParent, boost::string_ref path) override
IDataManagerSvc: Unregister object address from the data store.
STATUS activate(CSTR &nam) override
Activate a partition object. The name identifies the partition uniquely.
STATUS linkObject(boost::string_ref fullPath, OBJECT *to) override
Add a link to another object.
Definition of the basic interface.
Definition: IInterface.h:277
STATUS updateObject(OBJECT *parent, boost::string_ref updatePath) override
Update object.
T erase(T...args)
STATUS registerObject(OBJECT *parent, boost::string_ref obj, OBJECT *pObj) override
Register object with the data store.
The IRegistry represents the entry door to the environment any data object residing in a transient da...
Definition: IRegistry.h:22
const std::string CSTR
DataObject OBJECT
StatusCode reinitialize() override
Definition: Service.cpp:250
STATUS clearPartitions()
Clear all partitions.
virtual StatusCode retrieveObject(IRegistry *pDirectory, boost::string_ref path, DataObject *&pObject)=0
Retrieve object identified by its directory entry.
unsigned int CLID
Class ID definition.
Definition: ClassID.h:8
virtual StatusCode clearSubTree(boost::string_ref sub_path)=0
Remove all data objects below the sub tree identified by its full path name.
T clear(T...args)
STATUS findObject(boost::string_ref parent, int item, OBJECT *&pObject) override
Find object in the data store.
T move(T...args)
Partition m_current
Current partition.
STATUS preparePartitions()
Prepare partition for usage.
STATUS registerAddress(OBJECT *parent, boost::string_ref path, ADDRESS *pAddr) override
IDataManagerSvc: Register object address with the data store.
STATUS objectLeaves(const OBJECT *pObject, std::vector< IRegistry * > &leaves) override
Explore the object store: retrieve all leaves attached to the object.
STATUS unregisterObject(OBJECT *pObj) override
Unregister object from the data store.
STATUS setRoot(std::string path, ADDRESS *pAddr) override
Initialize data store for new event by giving new event path and address of root object.
STATUS resetPreLoad() override
Clear the preload list.
virtual StatusCode unregisterAddress(boost::string_ref fullPath)=0
Unregister object address from the data store.
T find(T...args)
STATUS unregisterObject(OBJECT *pObj, int item) override
Unregister object from the data store.
STATUS findObject(IRegistry *parent, boost::string_ref path, OBJECT *&pObj) override
Find object identified by its full path in the data store.
virtual StatusCode unregisterObject(boost::string_ref fullPath)=0
Unregister object from the data store.
STATUS initialize() override
Service initialisation.
Generic data agent interface.
STATUS drop(CSTR &nam) override
Drop a partition object. The name identifies the partition uniquely.
STATUS unregisterObject(boost::string_ref path) override
Unregister object from the data store.
Base class used to extend a class implementing other interfaces.
Definition: extends.h:10
T begin(T...args)
virtual StatusCode registerObject(boost::string_ref fullPath, DataObject *pObject)=0
Register object with the data store.
STATUS activate(IInterface *pPartition) override
Activate a partition object.
SmartIF< IAddressCreator > m_addrCreator
Reference to address creator.
STATUS retrieveObject(boost::string_ref path, OBJECT *&pObj) override
Retrieve object identified by its full path from the data store.
virtual StatusCode registerAddress(boost::string_ref fullPath, IOpaqueAddress *pAddress)=0
Register object address with the data store.
StatusCode activePartition(std::string &nam, IInterface *&pPartition) const override
Access the active partition object.
T emplace(T...args)
STATUS retrieveObject(OBJECT *parent, boost::string_ref path, OBJECT *&pObj) override
Retrieve object from data store.
STATUS retrieveObject(OBJECT *parent, int item, OBJECT *&pObj) override
Retrieve object from data store.
STATUS updateObject(boost::string_ref path) override
Update object.
STATUS unregisterObject(boost::string_ref parent, boost::string_ref obj) override
Unregister object from the data store.
void reset(TYPE *ptr=nullptr)
Set the internal pointer to the passed one disposing of the old one.
Definition: SmartIF.h:92
Opaque address interface definition.
void ignore() const
Definition: StatusCode.h:84
IOpaqueAddress ADDRESS
STATUS linkObject(OBJECT *from, boost::string_ref objPath, OBJECT *to) override
Add a link to another object.
details::composer_t< std::decay_t< lambda_ts >... > compose(lambda_ts &&...lambdas)
Definition: compose.h:54
STATUS traverseSubTree(OBJECT *pObject, AGENT *pAgent) override
IDataManagerSvc: Analyze by traversing all data objects below the sub tree.
std::map< std::string, Partition > Partitions
A DataObject is the base class of any identifiable object on any data store.
Definition: DataObject.h:30
STATUS clearStore() override
IDataManagerSvc: Remove all data objects in the data store.
STATUS updateObject(IRegistry *pDirectory) override
Update object identified by its directory entry.
T forward(T...args)
STATUS retrieveObject(boost::string_ref parent, int item, OBJECT *&pObj) override
Retrieve object from data store.
void toupper(std::string &s)
STATUS drop(IInterface *pPartition) override
Drop a partition object. The name identifies the partition uniquely.
STATUS registerAddress(boost::string_ref path, ADDRESS *pAddr) override
IDataManagerSvc: Register object address with the data store.
STATUS traverseTree(AGENT *pAgent) override
IDataManagerSvc: Analyze by traversing all data objects in the data store.
MsgStream & endmsg(MsgStream &s)
MsgStream Modifier: endmsg. Calls the output method of the MsgStream.
Definition: MsgStream.h:209
STATUS retrieveObject(boost::string_ref parent, boost::string_ref path, OBJECT *&pObj) override
Retrieve object from data store.
IDataStoreAgent AGENT
STATUS objectParent(const IRegistry *pObject, IRegistry *&refpParent) override
IDataManagerSvc: Explore the object store: retrieve the object&#39;s parent.
STATUS attachServices()
STATUS registerObject(OBJECT *parent, int obj, OBJECT *pObj) override
Register object with the data store.
~MultiStoreSvc() override
Standard Destructor.
virtual unsigned long addRef()=0
Add reference to object.