The Gaudi Framework  master (37c0b60a)
DataSvc.cpp
Go to the documentation of this file.
1 /***********************************************************************************\
2 * (c) Copyright 1998-2024 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 //====================================================================
12 // DataSvc.cpp
13 //--------------------------------------------------------------------
14 //
15 // Package : System ( The LHCb Offline System)
16 //
17 // Description: implementation of the Transient data service: DataSvc
18 //
19 // Author : M.Frank
20 // History :
21 // +---------+----------------------------------------------+---------
22 // | Date | Comment | Who
23 // +---------+----------------------------------------------+---------
24 // | 29/10/98| Initial version | M.Frank
25 // | 20/2/99 | Automatic data preloading introduced. | M.Frank
26 // +---------+----------------------------------------------+---------
27 //
28 //====================================================================
29 #define DATASVC_DATASVC_CPP
30 
31 // Framework include files
33 #include <GaudiKernel/IConverter.h>
35 
36 #include <GaudiKernel/DataObject.h>
38 
40 #include <GaudiKernel/DataSvc.h>
43 
44 // Include files
45 #include <algorithm>
46 #include <cassert>
47 #include <cstdlib>
48 #include <sstream>
49 #include <vector>
50 
51 namespace {
52  std::string operator+( char c, std::string_view sr ) {
53  std::string s{ c };
54  s.append( sr.data(), sr.size() );
55  return s;
56  }
57 
58  std::string_view::size_type find( std::string_view s, char c, size_t o ) {
59  if ( !s.empty() ) s.remove_prefix( o );
60  auto r = s.find( c );
61  return r == std::string_view::npos ? r : ( r + o );
62  }
63 
64  std::string to_string( std::string_view sr ) { return { sr.data(), sr.size() }; }
65 } // namespace
66 
67 // If you absolutely need optimization: switch off dynamic_cast.
68 // This improves access to the data store roughly by 10 %
69 // for balanced trees.
70 //
71 // M.Frank
72 #define CAST_REGENTRY( x, y ) dynamic_cast<x>( y )
73 // #define CAST_REGENTRY(x,y) (x)(y)
75 
76 #define ON_DEBUG if ( msgLevel( MSG::DEBUG ) )
77 #define ON_VERBOSE if ( msgLevel( MSG::VERBOSE ) )
78 
79 #define DEBMSG ON_DEBUG debug()
80 #define VERMSG ON_VERBOSE verbose()
81 
85 StatusCode DataSvc::clearSubTree( std::string_view sub_tree_path ) {
86  DataObject* pObject = nullptr;
87  StatusCode status = findObject( sub_tree_path, pObject );
88  if ( !status.isSuccess() ) return status;
89  RegEntry* node_entry = CAST_REGENTRY( RegEntry*, pObject->registry() );
90  if ( !node_entry ) return Status::INVALID_OBJECT;
91  RegEntry* parent = node_entry->parentEntry();
92  if ( !parent ) return Status::INVALID_PARENT;
93  parent->remove( node_entry );
94  return StatusCode::SUCCESS;
95 }
96 
101  if ( !checkRoot() ) return Status::INVALID_ROOT;
102  RegEntry* entry = CAST_REGENTRY( RegEntry*, pObject->registry() );
103  if ( !entry ) return Status::INVALID_OBJECT;
104  RegEntry* parent = entry->parentEntry();
105  if ( !parent ) return Status::INVALID_PARENT;
106  parent->remove( entry );
107  return StatusCode::SUCCESS;
108 }
109 
112  if ( checkRoot() ) m_root.reset();
113  return StatusCode::SUCCESS;
114 }
115 
119 StatusCode DataSvc::traverseSubTree( std::string_view sub_tree_path, IDataStoreAgent* pAgent ) {
120  DataObject* pO = nullptr;
121  StatusCode status = findObject( sub_tree_path, pO );
122  return status.isSuccess() ? traverseSubTree( pO, pAgent ) : status;
123 }
124 
127  RegEntry* entry = CAST_REGENTRY( RegEntry*, pObject->registry() );
128  return entry ? entry->traverseTree( pAgent ) : Status::INVALID_OBJECT;
129 }
130 
133  if ( !checkRoot() ) return Status::INVALID_ROOT;
134  return m_root->traverseTree( pAgent );
135 }
136 
142  clearStore().ignore();
143  return i_setRoot( std::move( root_path ), pRootObj );
144 }
145 
152  if ( pRootObj ) {
153  m_root = std::make_unique<RegEntry>( std::move( root_path ) );
154  m_root->makeHard( pRootObj );
155  m_root->setDataSvc( this );
156  // No done with GaudiHive. preLoad().ignore();
157  }
158  return StatusCode::SUCCESS;
159 }
160 
166  clearStore().ignore();
167  return i_setRoot( std::move( root_path ), pRootAddr );
168 }
169 
176  if ( pRootAddr ) {
177  m_root = std::make_unique<RegEntry>( std::move( root_path ) );
178  m_root->makeHard( pRootAddr );
179  m_root->setDataSvc( this );
180  // Not done with GaudiHive. preLoad().ignore();
181  }
182  return StatusCode::SUCCESS;
183 }
184 
187  m_dataLoader = pDataLoader;
188  if ( m_dataLoader ) m_dataLoader->setDataProvider( dpsvc ? dpsvc : this ).ignore();
189  return StatusCode::SUCCESS;
190 }
191 
193 StatusCode DataSvc::objectParent( const DataObject* pObject, IRegistry*& refpParent ) {
194  if ( !pObject ) return Status::INVALID_OBJECT;
195  return objectParent( pObject->registry(), refpParent );
196 }
198 StatusCode DataSvc::objectParent( const IRegistry* pRegistry, IRegistry*& refpParent ) {
199  if ( !checkRoot() ) return Status::INVALID_ROOT;
200  const RegEntry* node_entry = CAST_REGENTRY( const RegEntry*, pRegistry );
201  if ( !node_entry ) return Status::INVALID_OBJECT;
202  refpParent = node_entry->parent();
203  return StatusCode::SUCCESS;
204 }
205 
208  if ( !pObject ) return Status::INVALID_OBJECT;
209  return objectLeaves( pObject->registry(), leaves );
210 }
211 
216  if ( !checkRoot() ) return Status::INVALID_ROOT;
217  const RegEntry* node_entry = CAST_REGENTRY( const RegEntry*, pRegistry );
218  if ( !node_entry ) return Status::INVALID_OBJECT;
219  leaves = node_entry->leaves();
220  return StatusCode::SUCCESS;
221 }
222 
224 StatusCode DataSvc::registerAddress( std::string_view fullPath, IOpaqueAddress* pAddress ) {
225  if ( fullPath.empty() ) return Status::INVALID_OBJ_PATH;
226  return registerAddress( fullPath.front() != SEPARATOR ? m_root.get() : nullptr, fullPath, pAddress );
227 }
228 
230 StatusCode DataSvc::registerAddress( IRegistry* parentObj, std::string_view objPath, IOpaqueAddress* pAddress ) {
231  if ( !checkRoot() ) return Status::INVALID_ROOT;
232  if ( objPath.empty() ) return Status::INVALID_OBJ_PATH;
233 
234  if ( !parentObj ) {
235  if ( objPath.front() != SEPARATOR ) { return registerAddress( m_root.get(), objPath, pAddress ); }
236  auto sep = find( objPath, SEPARATOR, 1 );
237  if ( sep == std::string_view::npos || objPath.substr( 0, sep ) != m_rootName.value() ) {
238  return Status::INVALID_PARENT;
239  }
240  return registerAddress( m_root.get(), objPath.substr( sep ), pAddress );
241  }
242  if ( objPath.front() != SEPARATOR ) { return registerAddress( parentObj, char( SEPARATOR ) + objPath, pAddress ); }
243  RegEntry* par_entry = CAST_REGENTRY( RegEntry*, parentObj );
244  if ( !par_entry ) return Status::INVALID_PARENT;
245 
246  auto sep = objPath.rfind( SEPARATOR );
247  if ( sep > 0 && sep != std::string_view::npos ) {
248  auto p_path = objPath.substr( 0, sep );
249  auto o_path = objPath.substr( sep );
250  RegEntry* p_entry = par_entry->findLeaf( p_path );
251  // Create default object leafs if the
252  // intermediate nodes are not present
253  if ( !p_entry && m_forceLeaves ) {
254  DataObject* pLeaf = createDefaultObject();
255  StatusCode sc = registerObject( par_entry->identifier(), p_path, pLeaf );
256  if ( sc.isFailure() ) delete pLeaf;
257  p_entry = par_entry->findLeaf( p_path );
258  }
259  if ( !p_entry ) return Status::INVALID_PARENT;
260  return registerAddress( p_entry, o_path, pAddress );
261  }
262  StatusCode status = par_entry->add( to_string( objPath ), pAddress );
263  return status.isSuccess() ? status : Status::DOUBL_OBJ_PATH;
264 }
265 
267 StatusCode DataSvc::unregisterAddress( std::string_view fullPath ) {
268  if ( fullPath.empty() ) return Status::INVALID_OBJ_PATH;
269  return unregisterAddress( fullPath.front() != SEPARATOR ? m_root.get() : nullptr, fullPath );
270 }
271 
273 StatusCode DataSvc::unregisterAddress( IRegistry* pParent, std::string_view objPath ) {
274  if ( !checkRoot() ) return Status::INVALID_ROOT;
275  if ( objPath.empty() ) return Status::INVALID_OBJ_PATH;
276 
277  if ( !pParent ) {
278  if ( objPath.front() != SEPARATOR ) return unregisterAddress( m_root.get(), objPath );
279  auto sep = find( objPath, SEPARATOR, 1 );
280  if ( sep != std::string_view::npos && objPath.substr( 0, sep ) == m_rootName.value() ) {
281  return unregisterAddress( m_root.get(), objPath.substr( sep ) );
282  }
283  return Status::INVALID_PARENT;
284  }
285  if ( objPath.front() != SEPARATOR ) { return unregisterAddress( pParent, char( SEPARATOR ) + objPath ); }
286  RegEntry* node_entry = CAST_REGENTRY( RegEntry*, pParent );
287  if ( node_entry ) {
288  RegEntry* leaf_entry = node_entry->findLeaf( objPath );
289  if ( leaf_entry ) {
290  auto sep = objPath.rfind( SEPARATOR );
291  if ( sep > 0 && sep != std::string_view::npos ) {
292  return unregisterAddress( leaf_entry->parent(), objPath.substr( sep ) );
293  }
294  StatusCode status = node_entry->remove( objPath );
295  if ( status.isSuccess() ) return status;
296  }
297  }
298  return Status::INVALID_PARENT;
299 }
300 
302 StatusCode DataSvc::registerObject( std::string_view parentPath, std::string_view objPath, DataObject* pObject ) {
303  DataObject* pO = nullptr;
304  StatusCode status = retrieveObject( parentPath, pO );
305  if ( !status.isSuccess() && m_forceLeaves ) {
306  pO = createDefaultObject();
307  status = registerObject( parentPath, pO );
308  if ( !status.isSuccess() ) pO->release();
309  }
310  return status.isSuccess() ? registerObject( pO, objPath, pObject ) : status;
311 }
312 
314 StatusCode DataSvc::registerObject( DataObject* parentObj, std::string_view objPath, DataObject* pObject ) {
315  if ( !checkRoot() ) return Status::INVALID_ROOT;
316 
317  if ( !parentObj ) {
318  if ( !objPath.empty() ) {
319  if ( objPath.front() != SEPARATOR ) { return registerObject( m_rootName.value(), objPath, pObject ); }
320  auto sep = find( objPath, SEPARATOR, 1 );
321  if ( sep != std::string_view::npos ) {
322  return registerObject( objPath.substr( 0, sep ), objPath.substr( sep ), pObject );
323  }
324  }
325  return Status::INVALID_OBJ_PATH;
326  }
327  RegEntry* node_entry = CAST_REGENTRY( RegEntry*, parentObj->registry() );
328  if ( node_entry ) {
329  StatusCode status = Status::INVALID_PARENT;
330  auto sep = find( objPath, SEPARATOR, 1 );
331  if ( sep != std::string_view::npos ) {
332  auto p_path = objPath.substr( 0, sep );
333  auto o_path = objPath.substr( sep );
334  RegEntry* par_entry = node_entry->findLeaf( p_path );
335  // Create default object leafs if the
336  // intermediate nodes are not present
337  if ( !par_entry && m_forceLeaves ) {
338  DataObject* pLeaf = createDefaultObject();
339  StatusCode sc = registerObject( parentObj, p_path, pLeaf );
340  if ( !sc.isSuccess() ) delete pLeaf;
341  par_entry = node_entry->findLeaf( p_path );
342  } else if ( par_entry && !par_entry->object() ) {
343  status = i_retrieveEntry( node_entry, p_path, par_entry );
344  if ( !status.isSuccess() && !par_entry->address() && m_forceLeaves ) {
345  DataObject* pLeaf = createDefaultObject();
346  StatusCode sc = registerObject( parentObj, p_path, pLeaf );
347  if ( !sc.isSuccess() ) delete pLeaf;
348  par_entry = node_entry->findLeaf( p_path );
349  }
350  }
351  node_entry = par_entry;
352  if ( node_entry ) {
353  DataObject* obj = node_entry->object();
354  if ( obj ) status = registerObject( obj, o_path, pObject );
355  }
356  } else {
357  RegEntry* leaf = node_entry->findLeaf( objPath );
358  if ( !leaf ) {
359  status = node_entry->add( to_string( objPath ), pObject );
360  } else {
361  DataObject* obj = leaf->object();
362  if ( !obj ) {
363  if ( !pObject ) {
364  error() << "registerObject: trying to register null DataObject" << endmsg;
365  return StatusCode::FAILURE;
366  }
367  pObject->setRegistry( leaf );
368  leaf->setAddress( nullptr );
369  leaf->setObject( pObject );
370  status = StatusCode::SUCCESS;
371  } else {
372  status = Status::DOUBL_OBJ_PATH;
373  }
374  }
375  }
376  return status;
377  }
378  return Status::INVALID_PARENT;
379 }
380 
382 StatusCode DataSvc::unregisterObject( std::string_view fullPath ) {
383  DataObject* pObject = nullptr;
384  StatusCode status = findObject( fullPath, pObject );
385  if ( status.isFailure() ) return status;
386  RegEntry* pEntry = CAST_REGENTRY( RegEntry*, pObject->registry() );
387  if ( !pEntry ) return Status::INVALID_ROOT;
388  if ( !pEntry->isEmpty() ) return Status::DIR_NOT_EMPTY;
389  RegEntry* pParent = pEntry->parentEntry();
390  if ( !pParent ) return Status::INVALID_PARENT;
391  pObject->addRef();
392  pParent->remove( pEntry );
393  return StatusCode::SUCCESS;
394 }
395 
398  if ( !checkRoot() ) return Status::INVALID_ROOT;
399  RegEntry* entry = m_root->findLeaf( pObject );
400  if ( !entry ) return Status::INVALID_OBJECT;
401  RegEntry* parent = entry->parentEntry();
402  if ( !parent ) return Status::INVALID_PARENT;
403  if ( !entry->isEmpty() ) return Status::DIR_NOT_EMPTY;
404  if ( entry->object() ) entry->object()->addRef();
405  if ( parent ) parent->remove( entry );
406  return StatusCode::SUCCESS;
407 }
408 
410 StatusCode DataSvc::unregisterObject( DataObject* pParentObj, std::string_view objectPath ) {
411  if ( checkRoot() ) {
412  try {
413  RegEntry* parent = CAST_REGENTRY( RegEntry*, pParentObj->registry() );
414  if ( parent ) {
415  RegEntry* entry = parent->findLeaf( objectPath );
416  if ( entry ) {
417  if ( entry->isEmpty() ) {
418  if ( entry->object() ) { entry->object()->addRef(); }
419  parent->remove( entry );
420  return StatusCode::SUCCESS;
421  }
422  return Status::DIR_NOT_EMPTY;
423  }
424  return Status::INVALID_OBJECT;
425  }
426  } catch ( ... ) {}
427  return Status::INVALID_PARENT;
428  }
429  return Status::INVALID_ROOT;
430 }
431 
434 DataObject* DataSvc::handleDataFault( IRegistry* pReg, std::string_view path ) {
435  return i_handleDataFault( pReg, path );
436 }
437 
439  if ( m_enableFaultHdlr ) {
440  IRegistry* pLeaf = nullptr;
441  if ( pReg && path.empty() ) {
442  DataIncident incident( name(), m_faultName, pReg->identifier() );
443  m_incidentSvc->fireIncident( incident );
444  return pReg->object();
445  }
446  if ( pReg ) {
447  std::string p = pReg->identifier();
448  if ( path.front() != SEPARATOR ) p += SEPARATOR;
449  p.append( path.data(), path.size() );
450  DataIncident incident( name(), m_faultName, p );
451  m_incidentSvc->fireIncident( incident );
452  pLeaf = m_root->findLeaf( p );
453  } else {
455  if ( path.front() != SEPARATOR ) p += SEPARATOR;
456  p.append( path.data(), path.size() );
457  DataIncident incident( name(), m_faultName, p );
458  m_incidentSvc->fireIncident( incident );
459  pLeaf = m_root->findLeaf( p );
460  }
461  if ( pLeaf ) { return pLeaf->object(); }
462  }
463  return nullptr;
464 }
465 
470  IConversionSvc* pLoader = getDataLoader( pRegistry );
471  return loadObject( pLoader, pRegistry );
472 }
473 
478  StatusCode status = Status::INVALID_OBJ_ADDR;
479  DataObject* pObject = nullptr;
480  if ( !pLoader ) { // Precondition: Data loader must be present
481  return handleDataFault( pRegistry ) ? StatusCode::SUCCESS : StatusCode( Status::NO_DATA_LOADER );
482  }
483  if ( !pRegistry ) { // Precondition: Directory must be valid
484  return handleDataFault( pRegistry ) ? StatusCode::SUCCESS : StatusCode( Status::INVALID_OBJ_ADDR );
485  }
486 
487  VERMSG << "Requested object " << pRegistry->identifier() << endmsg;
488 
489  if ( m_enableAccessHdlr ) {
490  // Fire data access incident
491  DataIncident incident( name(), m_accessName, pRegistry->identifier() );
492  m_incidentSvc->fireIncident( incident );
493  }
494  if ( !m_inhibitPathes.empty() ) {
495  auto inhibit = std::find( m_inhibitPathes.begin(), m_inhibitPathes.end(), pRegistry->identifier() );
496  if ( inhibit != m_inhibitPathes.end() ) { return Status::NO_ACCESS; }
497  }
498  IOpaqueAddress* pAddress = pRegistry->address();
499  if ( !pAddress ) { // Precondition:
500  return Status::INVALID_OBJ_ADDR; // Address must be valid
501  }
502  try {
503  status = pLoader->createObj( pAddress, pObject ); // Call data loader
504  if ( status.isSuccess() ) {
505 
506  VERMSG << "Object " << pRegistry->identifier() << " created" << endmsg;
507 
508  RegEntry* pEntry = CAST_REGENTRY( RegEntry*, pRegistry );
509  pEntry->setObject( pObject );
510 
511  VERMSG << "Filling object " << pRegistry->identifier() << endmsg;
512  status = pLoader->fillObjRefs( pAddress, pObject );
513  }
514  } catch ( const GaudiException& exc ) {
515  if ( handleDataFault( pRegistry ) ) { return StatusCode::SUCCESS; }
516  throw GaudiException( "GaudiException in loadObject() " + pRegistry->identifier(), name(), StatusCode::FAILURE,
517  exc );
518  } catch ( const std::exception& x ) {
519  if ( handleDataFault( pRegistry ) ) { return StatusCode::SUCCESS; }
520  throw GaudiException( "std::exception in loadObject() " + pRegistry->identifier() + ": " +
521  System::typeinfoName( typeid( x ) ) + ", " + x.what(),
523  } catch ( ... ) {
524  if ( handleDataFault( pRegistry ) ) { return StatusCode::SUCCESS; }
525  throw GaudiException( "UNKN exception in loadObject() " + pRegistry->identifier(), name(), StatusCode::FAILURE );
526  }
527  if ( !status.isSuccess() ) {
528  if ( handleDataFault( pRegistry ) ) { return StatusCode::SUCCESS; }
529  }
530  ON_VERBOSE if ( status.isSuccess() ) {
531  verbose() << "Object " << pRegistry->identifier() << " successfully loaded" << endmsg;
532  }
533  return status;
534 }
535 
537 StatusCode DataSvc::retrieveEntry( RegEntry* parentObj, std::string_view path, RegEntry*& pEntry ) {
538  return i_retrieveEntry( parentObj, path, pEntry );
539 }
540 
541 StatusCode DataSvc::i_retrieveEntry( RegEntry* parentObj, std::string_view path, RegEntry*& pEntry ) {
542  // A.Valassi 16.08.2001 avoid core dump if store is empty
543  if ( !checkRoot() ) return Status::INVALID_ROOT;
544 
545  static constexpr auto empty = std::string_view{};
546  auto sep = find( path, SEPARATOR, 1 );
547  pEntry = nullptr;
548 
549  if ( !parentObj ) {
550  if ( path.empty() || path == m_rootName.value() ) {
551  parentObj = m_root.get();
552  path = empty;
553  } else if ( path.front() != SEPARATOR ) {
554  parentObj = m_root.get();
555  } else if ( sep != std::string_view::npos ) {
556  if ( !m_root->object() ) {
557  RegEntry* r = nullptr;
558  auto status = i_retrieveEntry( m_root.get(), empty, r );
559  if ( !status.isSuccess() ) return status;
560  }
561  parentObj = m_root.get();
562  path = path.substr( sep );
563  } else {
564  return Status::INVALID_OBJ_PATH;
565  }
566  sep = find( path, SEPARATOR, 1 );
567  }
568 
569  StatusCode status{ Status::INVALID_ROOT };
570  if ( sep != std::string_view::npos ) { // the string contains a separator (after pos 0)
571  if ( !parentObj->object() ) { // if the parent object has not been loaded yet, load it now
572  status = loadObject( parentObj );
573  if ( !status.isSuccess() ) return status;
574  }
575  auto p_path = path.substr( 0, sep );
576  RegEntry* root_entry = parentObj->findLeaf( p_path );
577  if ( !root_entry && m_enableFaultHdlr ) {
578  // If not even the parent is there, an incident
579  // to load the parent must be fired...
580  i_handleDataFault( parentObj, p_path );
581  root_entry = parentObj->findLeaf( p_path );
582  }
583  if ( root_entry ) {
584  DataObject* pO = root_entry->object();
585  if ( !pO ) {
586  // Object is not loaded: load the object if at all possible
587  status = loadObject( root_entry );
588  if ( !status.isSuccess() ) return status;
589  }
590  if ( root_entry->isSoft() ) { root_entry = CAST_REGENTRY( RegEntry*, pO->registry() ); }
591  return i_retrieveEntry( root_entry, path.substr( sep ), pEntry );
592  }
593  return Status::INVALID_OBJ_PATH;
594  } else if ( path.empty() ) {
595  pEntry = parentObj;
596  } else {
597  if ( !parentObj->object() ) { // if the parent object has not been loaded yet, load it now
598  status = loadObject( parentObj );
599  if ( !status.isSuccess() ) return status;
600  }
601  // last leave in search: find leaf and load
602  pEntry = parentObj->findLeaf( path );
603  // If no registry entry was found, trigger incident for action-on-demand
604  if ( !pEntry && m_enableFaultHdlr ) {
605  i_handleDataFault( parentObj, path );
606  pEntry = ( path.empty() ? parentObj : parentObj->findLeaf( path ) );
607  }
608  }
609 
610  // Check results and return
611  if ( !pEntry ) return Status::INVALID_OBJ_PATH;
612  if ( !pEntry->object() ) return loadObject( pEntry );
613 
614  if ( m_enableAccessHdlr ) {
615  // Fire data access incident
616  // I do not know if this is a good idea....
617  // This fires too often!
618  //
619  // DataIncident incident(name(), m_accessName, pEntry->identifier());
620  // m_incidentSvc->fireIncident(incident);
621  return StatusCode::SUCCESS;
622  }
623  return StatusCode::SUCCESS;
624 }
625 
627 StatusCode DataSvc::retrieveObject( IRegistry* pRegistry, std::string_view path, DataObject*& pObject ) {
628  pObject = nullptr;
629  RegEntry * result = nullptr, *parent = CAST_REGENTRY( RegEntry*, pRegistry );
630  StatusCode status = i_retrieveEntry( parent, path, result );
631  if ( status.isSuccess() ) pObject = result->object();
632  return status;
633 }
634 
636 StatusCode DataSvc::findObject( IRegistry* pRegistry, std::string_view path, DataObject*& pObject ) {
637  pObject = nullptr;
638  IRegistry* pReg = ( pRegistry ? pRegistry : m_root.get() );
639  RegEntry* root_entry = CAST_REGENTRY( RegEntry*, pReg );
640  if ( root_entry ) {
641  if ( !path.empty() ) pReg = root_entry->find( path );
642  if ( !pReg ) return Status::INVALID_OBJ_PATH;
643  pObject = pReg->object();
644  }
645  return ( !pObject ) ? Status::OBJ_NOT_LOADED : Status::IDataProviderSvc_NO_ERROR;
646 }
647 
649 StatusCode DataSvc::findObject( std::string_view path, DataObject*& pObject ) {
650  pObject = nullptr;
651  if ( !checkRoot() ) return Status::INVALID_ROOT;
652  if ( path.empty() || path == m_rootName.value() ) {
653  pObject = m_root->object();
654  return !pObject ? Status::OBJ_NOT_LOADED : Status::IDataProviderSvc_NO_ERROR;
655  }
656  return findObject( path.front() != SEPARATOR ? m_root.get() : nullptr, path, pObject );
657 }
658 
661  if ( !pRegistry ) { // Precondition:
662  return Status::INVALID_OBJ_ADDR; // Addres must be valid
663  }
664  DataObject* toUpdate = pRegistry->object();
665  if ( !toUpdate ) { // Try first to load
666  return loadObject( pRegistry );
667  }
668  return updateObject( toUpdate );
669 }
670 
673  StatusCode status = Status::INVALID_OBJ_ADDR;
674  if ( !toUpdate ) { // Precondition:
675  return Status::INVALID_OBJECT; // Address must be valid
676  }
677  IRegistry* pRegistry = toUpdate->registry(); // Precondition:
678  if ( !pRegistry ) { // Need valid registry
679  return Status::INVALID_OBJECT;
680  }
681  IOpaqueAddress* pAddress = pRegistry->address(); // Precondition:
682  if ( !pAddress ) { // Need valid address
683  return Status::INVALID_OBJ_ADDR;
684  }
685  IConversionSvc* pLoader = getDataLoader( pRegistry );
686  if ( !pLoader ) { // Precondition:
687  return Status::NO_DATA_LOADER; // Data loader must be present
688  }
689  if ( !m_inhibitPathes.empty() ) {
690  auto inhibit = std::find( m_inhibitPathes.begin(), m_inhibitPathes.end(), pRegistry->identifier() );
691  if ( inhibit != m_inhibitPathes.end() ) { return Status::NO_ACCESS; }
692  }
693  try {
694  status = pLoader->updateObj( pAddress, toUpdate ); // Call data loader
695  if ( status.isSuccess() ) { status = pLoader->updateObjRefs( pAddress, toUpdate ); }
696  } catch ( const GaudiException& exc ) {
697  throw GaudiException( "GaudiException in updateObject() " + pRegistry->name(), name(), StatusCode::FAILURE, exc );
698  } catch ( const std::exception& x ) {
699  throw GaudiException( "std::exception in updateObject() " + pRegistry->name() + ": " +
700  System::typeinfoName( typeid( x ) ) + ", " + x.what(),
702  } catch ( ... ) {
703  throw GaudiException( "UNKN exception in updateObject() " + pRegistry->name(), name(), StatusCode::FAILURE );
704  }
705  return status;
706 }
707 
708 // Link object
709 StatusCode DataSvc::linkObject( IRegistry* from, std::string_view objPath, DataObject* to ) {
710  if ( !checkRoot() ) return Status::INVALID_ROOT;
711  try {
712  RegEntry* from_entry = CAST_REGENTRY( RegEntry*, from );
713  if ( from_entry ) {
714  // First check if both objects are already registered to the store
715  RegEntry* to_entry = m_root->findLeaf( to );
716  if ( !to_entry ) return Status::INVALID_OBJECT;
717  auto sep = objPath.rfind( SEPARATOR );
718  if ( sep > 0 && sep != std::string_view::npos ) { // in case the objPath is a sub-directory itself
719  DataObject* pO = nullptr;
720  StatusCode sc = retrieveObject( from, objPath.substr( 0, sep ), pO );
721  return sc.isSuccess() ? linkObject( pO->registry(), objPath.substr( sep ), to ) : sc;
722  }
723  // Now register the soft link
724  StatusCode status = from_entry->add( to_string( objPath ), to, true );
725  return status.isSuccess() ? Status::IDataProviderSvc_NO_ERROR : Status::DOUBL_OBJ_PATH;
726  }
727  } catch ( ... ) {}
728  return Status::INVALID_PARENT;
729 }
730 
732 StatusCode DataSvc::linkObject( std::string_view fullPath, DataObject* to ) {
733  if ( fullPath.empty() ) return Status::INVALID_OBJ_PATH;
734  if ( fullPath.front() != SEPARATOR ) { return linkObject( m_rootName.value(), fullPath, to ); }
735  auto sep = fullPath.rfind( SEPARATOR );
736  return linkObject( fullPath.substr( 0, sep ), fullPath.substr( sep ), to );
737 }
738 
740 StatusCode DataSvc::unlinkObject( IRegistry* from, std::string_view objPath ) {
741  if ( !checkRoot() ) return Status::INVALID_ROOT;
742  try {
743  RegEntry* from_entry = CAST_REGENTRY( RegEntry*, from );
744  if ( from_entry ) {
745  auto sep = objPath.rfind( SEPARATOR );
746  if ( sep > 0 && sep != std::string_view::npos ) { // in case the objPath is a sub-directory itself
747  DataObject* pO = nullptr;
748  StatusCode sc = findObject( from, objPath.substr( 0, sep ), pO );
749  return sc.isSuccess() ? unlinkObject( pO->registry(), objPath.substr( sep ) ) : sc;
750  }
751  StatusCode status = from_entry->remove( objPath );
752  if ( status.isSuccess() ) return status;
753  return Status::INVALID_OBJ_PATH;
754  }
755  } catch ( ... ) {}
756  return Status::INVALID_PARENT;
757 }
758 
760 StatusCode DataSvc::unlinkObject( std::string_view fullPath ) {
761  if ( fullPath.empty() ) return Status::INVALID_OBJ_PATH;
762  if ( fullPath.front() != SEPARATOR ) return unlinkObject( m_rootName.value(), fullPath );
763  auto sep = fullPath.rfind( SEPARATOR );
764  return unlinkObject( fullPath.substr( 0, sep ), fullPath.substr( sep ) );
765 }
766 
768 StatusCode DataSvc::unlinkObject( DataObject* from, std::string_view objPath ) {
769  if ( !checkRoot() ) return Status::INVALID_ROOT;
770  IRegistry* from_entry = m_root->findLeaf( from );
771  return unlinkObject( from_entry, objPath );
772 }
773 
776  auto i = std::find( begin( m_preLoads ), end( m_preLoads ), item );
777  if ( i == end( m_preLoads ) ) m_preLoads.push_back( item );
778  return StatusCode::SUCCESS;
779 }
780 
784  return StatusCode::SUCCESS;
785 }
786 
790  return StatusCode::SUCCESS;
791 }
792 
794 StatusCode DataSvc::preLoad( int depth, int load_depth, DataObject* pObject ) {
795  // unused: StatusCode sc = StatusCode::FAILURE;
796  if ( pObject && depth++ < load_depth ) {
797  RegEntry* dir = CAST_REGENTRY( RegEntry*, pObject->registry() );
798  if ( dir ) {
799  for ( const auto& i : *dir ) {
800  DataObject* pObj = nullptr;
801  StatusCode status = retrieveObject( pObject, i->name(), pObj );
802  if ( status.isSuccess() && depth < load_depth ) { preLoad( depth, load_depth, pObj ).ignore(); }
803  }
804  }
805  }
806  return StatusCode::SUCCESS;
807 }
808 
811  DataObject* pObj = nullptr;
812  for ( const auto& i : m_preLoads ) {
813  StatusCode sc = retrieveObject( i.path(), pObj );
814  int load_depth = i.depth();
815  if ( sc.isSuccess() && load_depth > 1 ) { preLoad( 1, load_depth, pObj ).ignore(); }
816  }
817  return StatusCode::SUCCESS;
818 }
819 
822  // Nothing to do: just call base class initialisation
824  if ( !sc.isSuccess() ) return sc;
825  m_incidentSvc = service( "IncidentSvc", true );
826  if ( !m_incidentSvc ) { error() << "Failed to access incident service." << endmsg; }
827  return sc;
828 }
829 
832  // the finalize part is copied here
833  setDataLoader( nullptr ).ignore();
834  resetPreLoad().ignore();
835  clearStore().ignore();
837  // re-initialize the base class
839  if ( !sc.isSuccess() ) {
840  error() << "Unable to reinitialize base class" << endmsg;
841  return sc;
842  }
843  // the initialize part is copied here
844  m_incidentSvc = service( "IncidentSvc", true );
845  if ( !m_incidentSvc ) {
846  error() << "Failed to access incident service." << endmsg;
847  return StatusCode::FAILURE;
848  }
849  // return
850  return StatusCode::SUCCESS;
851 }
852 
855  // Nothing to do: just call base class initialisation
856  setDataLoader( nullptr ).ignore();
857  resetPreLoad().ignore();
858  clearStore().ignore();
860  return Service::finalize();
861 }
862 
864 CLID DataSvc::rootCLID() const { return (CLID)m_rootCLID; }
865 
867 const std::string& DataSvc::rootName() const { return m_rootName; }
868 
871 
DataSvc::reinitialize
StatusCode reinitialize() override
Service initialization.
Definition: DataSvc.cpp:831
DataSvc::addPreLoadItem
StatusCode addPreLoadItem(const DataStoreItem &item) override
Add an item to the preload list.
Definition: DataSvc.cpp:775
DataSvcHelpers::RegistryEntry::find
IRegistry * find(const IRegistry *obj) const
Try to find an object identified by its pointer.
Definition: RegistryEntry.h:149
DataObject::setRegistry
void setRegistry(IRegistry *pRegistry)
Set pointer to Registry.
Definition: DataObject.h:76
GaudiPython.Bindings.DataObject
DataObject
Definition: Bindings.py:82
Service::initialize
StatusCode initialize() override
Definition: Service.cpp:118
DataSvcHelpers::RegistryEntry::setAddress
void setAddress(IOpaqueAddress *pAddress) override
Set/Update Opaque address.
Definition: RegistryEntry.cpp:119
DataObject::name
const std::string & name() const
Retreive DataObject name. It is the name when registered in the store.
Definition: DataObject.cpp:72
std::string
STL class.
std::exception
STL class.
std::move
T move(T... args)
DataSvcHelpers::RegistryEntry::findLeaf
RegistryEntry * findLeaf(std::string_view path) const
Find identified leaf in this registry node.
Definition: RegistryEntry.h:103
AtlasMCRecoFullPrecedenceDump.path
path
Definition: AtlasMCRecoFullPrecedenceDump.py:49
StatusCode::isSuccess
bool isSuccess() const
Definition: StatusCode.h:314
DataSvcHelpers::RegistryEntry::isSoft
bool isSoft() const
Is the link soft or hard.
Definition: RegistryEntry.h:137
GaudiException.h
gaudirun.s
string s
Definition: gaudirun.py:346
IOpaqueAddress
Definition: IOpaqueAddress.h:33
DataSvc::resetPreLoad
StatusCode resetPreLoad() override
Clear the preload list.
Definition: DataSvc.cpp:788
std::vector< IRegistry * >
SmartIF::reset
void reset(TYPE *ptr=nullptr)
Set the internal pointer to the passed one disposing of the old one.
Definition: SmartIF.h:96
std::find
T find(T... args)
CAST_REGENTRY
#define CAST_REGENTRY(x, y)
Definition: DataSvc.cpp:72
DataObject::release
virtual unsigned long release()
release reference to object
Definition: DataObject.cpp:56
DataSvc::rootCLID
CLID rootCLID() const override
IDataManagerSvc: Accessor for root event CLID.
Definition: DataSvc.cpp:864
DataSvc::setDataLoader
StatusCode setDataLoader(IConversionSvc *svc, IDataProviderSvc *dpsvc=nullptr) override
IDataManagerSvc: IDataManagerSvc: Pass a default data loader to the service and optionally a data pro...
Definition: DataSvc.cpp:186
GaudiException
Definition: GaudiException.h:31
std::unique_ptr::get
T get(T... args)
DataIncident.h
DataSvc::unlinkObject
StatusCode unlinkObject(IRegistry *from, std::string_view objPath) override
Remove a link to another object.
Definition: DataSvc.cpp:740
DataSvc::i_retrieveEntry
StatusCode i_retrieveEntry(DataSvcHelpers::RegistryEntry *parentObj, std::string_view path, DataSvcHelpers::RegistryEntry *&pEntry)
Definition: DataSvc.cpp:541
IConverter::createObj
virtual StatusCode createObj(IOpaqueAddress *pAddress, DataObject *&refpObject)=0
Create the transient representation of an object.
DataSvcHelpers::RegistryEntry::makeHard
void makeHard(DataObject *pObject)
Initialize link as hard link.
Definition: RegistryEntry.cpp:105
gaudirun.c
c
Definition: gaudirun.py:525
IRegistry
Definition: IRegistry.h:32
RegEntry
DataSvcHelpers::RegistryEntry RegEntry
Definition: DataSvc.cpp:74
System::typeinfoName
GAUDI_API const std::string typeinfoName(const std::type_info &)
Get platform independent information about the class type.
Definition: System.cpp:315
DataSvc::findObject
StatusCode findObject(std::string_view fullPath, DataObject *&pObject) override
Find object identified by its full path in the data store.
Definition: DataSvc.cpp:649
DataSvc::retrieveObject
StatusCode retrieveObject(IRegistry *pDirectory, std::string_view path, DataObject *&pObject) override
Retrieve object from data store.
Definition: DataSvc.cpp:627
std::unique_ptr::reset
T reset(T... args)
Service::finalize
StatusCode finalize() override
Definition: Service.cpp:222
RegistryEntry.h
DataSvc::clearStore
StatusCode clearStore() override
IDataManagerSvc: Remove all data objects in the data store.
Definition: DataSvc.cpp:111
IIncidentSvc.h
std::vector::push_back
T push_back(T... args)
DataSvc::i_handleDataFault
DataObject * i_handleDataFault(IRegistry *pReg, std::string_view path=std::string_view{})
Definition: DataSvc.cpp:438
DataSvc::m_dataLoader
SmartIF< IConversionSvc > m_dataLoader
Pointer to data loader service.
Definition: DataSvc.h:55
DataSvc::traverseTree
StatusCode traverseTree(IDataStoreAgent *pAgent) override
IDataManagerSvc: Analyze by traversing all data objects in the data store.
Definition: DataSvc.cpp:132
DataSvcHelpers::RegistryEntry::address
IOpaqueAddress * address() const override
Retrieve opaque storage address.
Definition: RegistryEntry.h:133
IRegistry::name
virtual const name_type & name() const =0
Name of the directory (or key)
DataSvcHelpers::RegistryEntry::leaves
const Store & leaves() const
Access the leaves of the object.
Definition: RegistryEntry.h:139
Gaudi::Utils::begin
AttribStringParser::Iterator begin(const AttribStringParser &parser)
Definition: AttribStringParser.h:136
DataSvc::createDefaultObject
virtual DataObject * createDefaultObject() const
Create default objects in case forced creation of leaves is requested.
Definition: DataSvc.cpp:870
DataSvcHelpers::RegistryEntry::object
DataObject * object() const override
Retrive object behind the link.
Definition: RegistryEntry.h:131
Service::name
const std::string & name() const override
Retrieve name of the service
Definition: Service.cpp:332
StatusCode
Definition: StatusCode.h:65
DataSvc::handleDataFault
DataObject * handleDataFault(IRegistry *pReg, std::string_view path="")
Invoke data fault handling if enabled.
Definition: DataSvc.cpp:434
DataSvc::m_rootName
Gaudi::Property< std::string > m_rootName
Definition: DataSvc.h:62
DataStoreItem
Definition: DataStoreItem.h:27
DataSvc::traverseSubTree
StatusCode traverseSubTree(std::string_view sub_tree_path, IDataStoreAgent *pAgent) override
IDataManagerSvc: Analyze by traversing all data objects below the sub tree identified by its full pat...
Definition: DataSvc.cpp:119
DataIncident
IOpaqueAddress.h
DataSvc::retrieveEntry
StatusCode retrieveEntry(DataSvcHelpers::RegistryEntry *pNode, std::string_view path, DataSvcHelpers::RegistryEntry *&pEntry)
Retrieve registry entry from store.
Definition: DataSvc.cpp:537
ON_VERBOSE
#define ON_VERBOSE
Definition: DataSvc.cpp:77
DataSvcHelpers::RegistryEntry::remove
StatusCode remove(std::string_view name)
Remove an entry from the store.
Definition: RegistryEntry.cpp:152
DataSvcHelpers::RegistryEntry::setObject
void setObject(DataObject *obj)
Set/Update object address.
Definition: RegistryEntry.cpp:129
DataSvc::i_setRoot
virtual StatusCode i_setRoot(std::string root_name, DataObject *pRootObj)
Initialize data store for new event by giving new event path and root object.
Definition: DataSvc.cpp:151
IConverter::updateObj
virtual StatusCode updateObj(IOpaqueAddress *pAddress, DataObject *refpObject)=0
Update the transient object from the other representation.
DataSvc::m_enableFaultHdlr
Gaudi::Property< bool > m_enableFaultHdlr
Definition: DataSvc.h:69
Gaudi::Property::value
const ValueType & value() const
Definition: Property.h:237
DataSvc::clearSubTree
StatusCode clearSubTree(std::string_view sub_tree_path) override
IDataManagerSvc: Remove all data objects below the sub tree identified by its full path name.
Definition: DataSvc.cpp:85
std::vector::erase
T erase(T... args)
DataSvcHelpers::RegistryEntry::isEmpty
bool isEmpty() const
Simple check if the Container is empty.
Definition: RegistryEntry.h:143
DataSvc::rootName
const std::string & rootName() const override
IDataManagerSvc: Accessor for root event name.
Definition: DataSvc.cpp:867
DataSvc::removePreLoadItem
StatusCode removePreLoadItem(const DataStoreItem &item) override
Remove an item from the preload list.
Definition: DataSvc.cpp:782
CLID
unsigned int CLID
Class ID definition.
Definition: ClassID.h:18
genconfuser.verbose
verbose
Definition: genconfuser.py:28
endmsg
MsgStream & endmsg(MsgStream &s)
MsgStream Modifier: endmsg. Calls the output method of the MsgStream.
Definition: MsgStream.h:202
DataSvcHelpers::RegistryEntry::parent
IRegistry * parent() const
Pointer to parent directory entry.
Definition: RegistryEntry.h:135
std::remove
T remove(T... args)
DataSvcHelpers::RegistryEntry::setDataSvc
void setDataSvc(IDataProviderSvc *s)
Set the transient data store.
Definition: RegistryEntry.h:99
DataSvc::unregisterAddress
StatusCode unregisterAddress(std::string_view fullPath) override
IDataManagerSvc: Unregister object address from the data store.
Definition: DataSvc.cpp:267
std::string::append
T append(T... args)
DataSvc::m_faultName
Gaudi::Property< std::string > m_faultName
Definition: DataSvc.h:71
DataSvc::m_inhibitPathes
Gaudi::Property< std::vector< std::string > > m_inhibitPathes
Definition: DataSvc.h:67
DataSvc::preLoad
StatusCode preLoad() override
load all preload items of the list
Definition: DataSvc.cpp:810
IConverter.h
StatusCode::ignore
const StatusCode & ignore() const
Allow discarding a StatusCode without warning.
Definition: StatusCode.h:139
SEPARATOR
constexpr char SEPARATOR
Definition: RegistryEntry.cpp:50
DataSvc::m_root
std::unique_ptr< DataSvcHelpers::RegistryEntry > m_root
Pointer to root entry.
Definition: DataSvc.h:82
IRegistry::address
virtual IOpaqueAddress * address() const =0
Retrieve opaque storage address.
StatusCode::isFailure
bool isFailure() const
Definition: StatusCode.h:129
DataSvc::checkRoot
bool checkRoot()
Check if root path is valid.
Definition: DataSvc.h:264
DataSvc::m_incidentSvc
SmartIF< IIncidentSvc > m_incidentSvc
Pointer to incident service.
Definition: DataSvc.h:59
DataSvc::m_forceLeaves
Gaudi::Property< bool > m_forceLeaves
Definition: DataSvc.h:65
StatusCode::SUCCESS
constexpr static const auto SUCCESS
Definition: StatusCode.h:100
DataSvc::objectLeaves
StatusCode objectLeaves(const DataObject *pObject, std::vector< IRegistry * > &refLeaves) override
IDataManagerSvc: Explore the object store: retrieve all leaves attached to the object.
Definition: DataSvc.cpp:207
VERMSG
#define VERMSG
Definition: DataSvc.cpp:80
DataObject.h
SmartIF::get
TYPE * get() const
Get interface pointer.
Definition: SmartIF.h:86
Gaudi::Units::sr
constexpr double sr
Definition: SystemOfUnits.h:132
IConverter::updateObjRefs
virtual StatusCode updateObjRefs(IOpaqueAddress *pAddress, DataObject *pObject)=0
Update the references of an updated transient object.
DataSvcHelpers::RegistryEntry
Definition: RegistryEntry.h:46
DataSvc::getDataLoader
virtual IConversionSvc * getDataLoader(IRegistry *pReg)
Retrieve customizable data loader according to registry entry to be retrieved.
Definition: DataSvc.cpp:875
DataSvc::setRoot
StatusCode setRoot(std::string root_name, DataObject *pRootObj) override
Initialize data store for new event by giving new event path and root object.
Definition: DataSvc.cpp:141
IRegistry::object
virtual DataObject * object() const =0
Retrieve object behind the link.
DataSvc::linkObject
StatusCode linkObject(IRegistry *from, std::string_view objPath, DataObject *to) override
Add a link to another object.
Definition: DataSvc.cpp:709
DataSvcHelpers::RegistryEntry::add
StatusCode add(std::string name, DataObject *pObject, bool is_soft=false)
Add entry to data store.
Definition: RegistryEntry.cpp:198
IRegistry::identifier
virtual const id_type & identifier() const =0
Full identifier (or key)
DataObject
Definition: DataObject.h:36
DataSvc::objectParent
StatusCode objectParent(const DataObject *pObject, IRegistry *&refpParent) override
IDataManagerSvc: Explore the object store: retrieve the object's parent.
Definition: DataSvc.cpp:193
Service::reinitialize
StatusCode reinitialize() override
Definition: Service.cpp:295
DataSvc::registerObject
StatusCode registerObject(std::string_view parentPath, std::string_view objPath, DataObject *pObject) override
Register object with the data store.
Definition: DataSvc.cpp:302
DataSvcHelpers::RegistryEntry::identifier
const std::string & identifier() const override
Full identifier (or key)
Definition: RegistryEntry.h:127
DataSvc::initialize
StatusCode initialize() override
Service initialization.
Definition: DataSvc.cpp:821
IConverter::fillObjRefs
virtual StatusCode fillObjRefs(IOpaqueAddress *pAddress, DataObject *pObject)=0
Resolve the references of the created transient object.
IDataProviderSvc
Definition: IDataProviderSvc.h:53
DataSvc::m_accessName
Gaudi::Property< std::string > m_accessName
Definition: DataSvc.h:75
IOTest.end
end
Definition: IOTest.py:125
DataSvc::unregisterObject
StatusCode unregisterObject(std::string_view fullPath) override
Unregister object from the data store.
Definition: DataSvc.cpp:382
StatusCode::FAILURE
constexpr static const auto FAILURE
Definition: StatusCode.h:101
IConversionSvc.h
DataSvc::m_rootCLID
Gaudi::Property< CLID > m_rootCLID
Definition: DataSvc.h:61
DataSvc::m_enableAccessHdlr
Gaudi::Property< bool > m_enableAccessHdlr
Definition: DataSvc.h:73
DataSvcHelpers::RegistryEntry::traverseTree
StatusCode traverseTree(IDataStoreAgent *pAgent, int level=0)
traverse data tree
Definition: RegistryEntry.cpp:281
DataSvc.h
DataSvc::updateObject
StatusCode updateObject(IRegistry *pDirectory) override
Update object identified by its directory entry.
Definition: DataSvc.cpp:660
Gaudi::operator+
decltype(auto) operator+(const T &v, const Property< TP, V, H > &p)
implemantation of (value + property)
Definition: Property.h:441
Service::service
StatusCode service(const std::string &name, const T *&psvc, bool createIf=true) const
Access a service by name, creating it if it doesn't already exist.
Definition: Service.h:89
DataObject::registry
IRegistry * registry() const
Get pointer to Registry.
Definition: DataObject.h:78
DataSvc::m_preLoads
std::vector< DataStoreItem > m_preLoads
Items to be pre-loaded.
Definition: DataSvc.h:78
DataSvc::registerAddress
StatusCode registerAddress(std::string_view fullPath, IOpaqueAddress *pAddress) override
IDataManagerSvc: Register object address with the data store.
Definition: DataSvc.cpp:224
DataObject::addRef
virtual unsigned long addRef()
Add reference to object.
Definition: DataObject.cpp:63
std::exception::what
T what(T... args)
DataSvc::loadObject
virtual StatusCode loadObject(IRegistry *pNode)
Invoke Persistency service to create transient object from its persistent representation.
Definition: DataSvc.cpp:469
IDataStoreAgent
Definition: IDataStoreAgent.h:27
DataSvcHelpers::RegistryEntry::parentEntry
RegistryEntry * parentEntry()
Pointer to parent registry entry.
Definition: RegistryEntry.h:101
DataSvc::finalize
StatusCode finalize() override
Service initialization.
Definition: DataSvc.cpp:854
IConversionSvc
Definition: IConversionSvc.h:47