TsDataSvc.cpp
Go to the documentation of this file.
1 //====================================================================
2 // TsDataSvc.cpp
3 //--------------------------------------------------------------------
4 //
5 // Package : System ( The LHCb Offline System)
6 //
7 // Description: implementation of the Transient data service: TsDataSvc
8 //
9 // Author : M.Frank
10 // History :
11 // +---------+----------------------------------------------+---------
12 // | Date | Comment | Who
13 // +---------+----------------------------------------------+---------
14 // | 29/10/98| Initial version | M.Frank
15 // | 20/2/99 | Automatic data preloading introduced. | M.Frank
16 // | 25/4/13 | Locking for concurrent access introduced. | D.Piparo
17 // +---------+----------------------------------------------+---------
18 //
19 //====================================================================
20 #define TSDATASVC_DATASVC_CPP
21 
22 // Framework include files
23 #include "GaudiKernel/IConverter.h"
26 
27 #include "GaudiKernel/xtoa.h"
28 #include "GaudiKernel/SvcFactory.h"
29 #include "GaudiKernel/DataObject.h"
31 
33 #include "GaudiKernel/TsDataSvc.h"
36 
37 // Include files
38 #include <cassert>
39 #include <cstdlib>
40 #include <vector>
41 #include <algorithm>
42 #include <sstream>
43 #include <mutex>
44 
45 // Macro to lock a scope
46 #define STD_LOCK_GUARD_MACRO std::lock_guard<tsDataSvcMutex> lock(m_accessMutex);
47 
48 
49 namespace {
52  inline std::string itemToPath(int item) {
54  path << '/' << item;
55  return path.str();
56  }
57 }
58 
59 // If you absolutely need optimization: switch off dynamic_cast.
60 // This improves access to the data store roughly by 10 %
61 // for balanced trees.
62 //
63 // M.Frank
64 #define CAST_REGENTRY(x,y) dynamic_cast<x>(y)
65 //#define CAST_REGENTRY(x,y) (x)(y)
67 
68 #define ON_DEBUG if (msgLevel(MSG::DEBUG))
69 #define ON_VERBOSE if (msgLevel(MSG::VERBOSE))
70 
71 #define DEBMSG ON_DEBUG debug()
72 #define VERMSG ON_VERBOSE verbose()
73 
78  DataObject* pObject = 0;
79  StatusCode status = findObject(sub_tree_path, pObject);
80  if ( status.isSuccess() ) {
81  RegEntry* node_entry = CAST_REGENTRY(RegEntry*,pObject->registry());
82  if ( 0 != node_entry ) {
83  RegEntry* parent = node_entry->parentEntry();
84  if ( 0 != parent ) {
85  parent->remove(node_entry);
86  return StatusCode::SUCCESS;
87  }
88  return INVALID_PARENT;
89  }
90  return INVALID_OBJECT;
91  }
92  return status;
93 }
94 
99  if ( checkRoot() ) {
100  RegEntry* entry = CAST_REGENTRY(RegEntry*,pObject->registry());
101  if ( 0 != entry ) {
102  RegEntry* parent = entry->parentEntry();
103  if ( 0 != parent ) {
104  parent->remove(entry);
105  return SUCCESS;
106  }
107  return INVALID_PARENT;
108  }
109  return INVALID_OBJECT;
110  }
111  return INVALID_ROOT;
112 }
113 
116  if ( checkRoot() ) {
117  m_root->release();
118  m_root = 0;
119  return SUCCESS;
120  }
121  return INVALID_ROOT;
122 }
123 
128  IDataStoreAgent* pAgent) {
130  DataObject* pO = 0;
131  StatusCode status = findObject(sub_tree_path, pO);
132  if ( status.isSuccess() ) {
133  status = traverseSubTree(pO, pAgent);
134  }
135  return status;
136 }
137 
140  IDataStoreAgent* pAgent ) {
142  if ( checkRoot() ) {
143  RegEntry* entry = CAST_REGENTRY(RegEntry*,pObject->registry());
144  if ( 0 != entry ) {
145  return entry->traverseTree(pAgent);
146  }
147  return INVALID_OBJECT;
148  }
149  return INVALID_ROOT;
150 }
151 
155  if ( checkRoot() ) {
156  return m_root->traverseTree(pAgent);
157  }
158  return INVALID_ROOT;
159 }
160 
166  DataObject* pRootObj) {
167  clearStore().ignore();
168  return i_setRoot (std::move(root_path), pRootObj);
169 }
170 
177  DataObject* pRootObj) {
178  if ( 0 != pRootObj ) {
179  m_root = new RegEntry(root_path);
180  m_root->makeHard(pRootObj);
181  m_root->setDataSvc(this);
182  // No done with GaudiHive. preLoad().ignore();
183  }
184  return SUCCESS;
185 }
186 
192  IOpaqueAddress* pRootAddr) {
193  clearStore().ignore();
194  return i_setRoot (std::move(root_path), pRootAddr);
195 }
196 
203  IOpaqueAddress* pRootAddr) {
204  if ( 0 != pRootAddr ) {
205  m_root = new RegEntry(std::move(root_path));
206  m_root->makeHard(pRootAddr);
207  m_root->setDataSvc(this);
208  // Not done with GaudiHive. preLoad().ignore();
209  }
210  return SUCCESS;
211 }
212 
215  if ( 0 != pDataLoader ) pDataLoader->addRef();
216  if ( 0 != m_dataLoader ) m_dataLoader->release();
217  if ( 0 != pDataLoader ) {
218  pDataLoader->setDataProvider(dpsvc == nullptr ? this : dpsvc).ignore();
219  }
220  m_dataLoader = pDataLoader;
221  return SUCCESS;
222 }
223 
226  IRegistry*& refpParent) {
228  if ( pObject ) {
229  return objectParent(pObject->registry(), refpParent);
230  }
231  return INVALID_OBJECT;
232 }
235  IRegistry*& refpParent) {
237  if ( checkRoot() ) {
238  const RegEntry* node_entry = CAST_REGENTRY(const RegEntry*,pRegistry);
239  if ( node_entry ) {
240  refpParent = node_entry->parent();
241  return StatusCode::SUCCESS;
242  }
243  return INVALID_OBJECT;
244  }
245  return INVALID_ROOT;
246 }
247 
250  std::vector<IRegistry*>& leaves) {
252  if ( pObject ) {
253  return objectLeaves(pObject->registry(), leaves);
254  }
255  return INVALID_OBJECT;
256 }
257 
262  std::vector<IRegistry*>& leaves) {
264  if ( checkRoot() ) {
265  const RegEntry* node_entry = CAST_REGENTRY(const RegEntry*,pRegistry);
266  if ( node_entry ) {
267  std::copy(node_entry->leaves().begin(),node_entry->leaves().end(),back_inserter(leaves));
268  //leaves = node_entry->leaves();
269  return StatusCode::SUCCESS;
270  }
271  return INVALID_OBJECT;
272  }
273  return INVALID_ROOT;
274 }
275 
278  IOpaqueAddress* pAddress) {
279  if ( fullPath.length() > 0 ) {
280  if ( fullPath[0] != SEPARATOR ) {
281  return registerAddress(m_root, fullPath, pAddress);
282  }
283  IRegistry* pRegistry = 0;
284  return registerAddress(pRegistry, fullPath, pAddress);
285  }
286  return INVALID_OBJ_PATH;
287 }
288 
291  const std::string& objectPath,
292  IOpaqueAddress* pAddress) {
293  IRegistry* pRegistry = (0 == parentObj) ? 0 : parentObj->registry();
294  return registerAddress(pRegistry, objectPath, pAddress);
295 }
296 
299  const std::string& objPath,
300  IOpaqueAddress* pAddress) {
301  if ( checkRoot() ) {
302  if ( objPath.length() > 0 ) {
303  if ( 0 == parentObj ) {
304  if ( objPath[0] != SEPARATOR ) {
305  return registerAddress(m_root, objPath, pAddress);
306  }
307  std::string::size_type sep = objPath.find(SEPARATOR,1);
308  if ( sep != std::string::npos ) {
309  std::string p_path (objPath, 0, sep);
310  if ( p_path == m_rootName ) {
311  std::string o_path (objPath, sep, objPath.length());
312  return registerAddress(m_root, o_path, pAddress);
313  }
314  }
315  return INVALID_PARENT;
316  }
317  if ( objPath[0] != SEPARATOR ) {
319  path = SEPARATOR;
320  path += objPath;
321  return registerAddress(parentObj, path, pAddress);
322  }
323  RegEntry* par_entry = CAST_REGENTRY(RegEntry*,parentObj);
324  if ( 0 != par_entry ) {
325  std::string::size_type sep = objPath.rfind(SEPARATOR);
326  if ( sep > 0 && sep != std::string::npos ) {
327  std::string p_path (objPath, 0, sep);
328  std::string o_path (objPath, sep, objPath.length());
329  RegEntry* p_entry = par_entry->findLeaf(p_path);
330  // Create default object leafs if the
331  // intermediate nodes are not present
332  if ( 0 == p_entry && m_forceLeaves ) {
333  DataObject *pLeaf = createDefaultObject();
334  StatusCode sc = registerObject(par_entry->identifier(),
335  p_path,
336  pLeaf);
337  if ( ! sc.isSuccess() ) {
338  delete pLeaf;
339  }
340  p_entry = par_entry->findLeaf(p_path);
341  }
342  if ( 0 != p_entry ) {
343  return registerAddress(p_entry, o_path, pAddress);
344  }
345  return INVALID_PARENT;
346  }
347  StatusCode status = par_entry->add(objPath, pAddress);
348  if ( status.isSuccess() ) {
349  return status;
350  }
351  return DOUBL_OBJ_PATH;
352  }
353  return INVALID_PARENT;
354  }
355  return INVALID_OBJ_PATH;
356  }
357  return INVALID_ROOT;
358 }
359 
362  if ( fullPath.length() > 0 ) {
363  IRegistry* pRegistry = 0;
364  if ( fullPath[0] != SEPARATOR ) {
365  return unregisterAddress(m_root, fullPath);
366  }
367  return unregisterAddress(pRegistry, fullPath);
368  }
369  return INVALID_OBJ_PATH;
370 }
371 
374  const std::string& objPath) {
375  IRegistry* pRegistry = (0 == pParent) ? 0 : pParent->registry();
376  return unregisterAddress(pRegistry, objPath);
377 }
378 
381  const std::string& objPath) {
382  if ( checkRoot() ) {
383  if ( objPath.length() > 0 ) {
384  if ( 0 == pParent ) {
385  if ( objPath[0] != SEPARATOR ) {
386  return unregisterAddress(m_root, objPath);
387  }
388  std::string::size_type sep = objPath.find(SEPARATOR,1);
389  if ( sep != std::string::npos ) {
390  std::string p_path (objPath, 0, sep);
391  if ( p_path == m_rootName ) {
392  std::string o_path (objPath, sep, objPath.length());
393  return unregisterAddress(m_root, o_path);
394  }
395  }
396  return INVALID_PARENT;
397  }
398  if ( objPath[0] != SEPARATOR ) {
400  path = SEPARATOR;
401  path += objPath;
402  return unregisterAddress(pParent, path);
403  }
404  RegEntry* node_entry = CAST_REGENTRY(RegEntry*,pParent);
405  if ( 0 != node_entry ) {
406  RegEntry* leaf_entry = node_entry->findLeaf(objPath);
407  if ( 0 != leaf_entry ) {
408  std::string::size_type sep = objPath.rfind(SEPARATOR);
409  if ( sep > 0 && sep != std::string::npos ) {
410  std::string path = objPath.substr(sep);
411  return unregisterAddress(leaf_entry->parent(), path);
412  }
413  StatusCode status = node_entry->remove(objPath);
414  if ( status.isSuccess() ) {
415  return status;
416  }
417  }
418  }
419  return INVALID_PARENT;
420  }
421  return INVALID_OBJ_PATH;
422  }
423  return INVALID_ROOT;
424 }
425 
428  DataObject* pObject) {
429  return registerObject(0, fullPath, pObject);
430 }
431 
432 
435  const std::string& objPath,
436  DataObject* pObject) {
437  DataObject* pO = 0;
438  StatusCode status = retrieveObject(parentPath, pO);
439  if ( !status.isSuccess() && m_forceLeaves ) {
440  pO = createDefaultObject();
441  status = registerObject(parentPath, pO);
442  if ( !status.isSuccess() ) {
443  pO->release();
444  }
445  }
446  if ( status.isSuccess() ) {
447  status = registerObject(pO, objPath, pObject);
448  }
449  return status;
450 }
451 
454  int item,
455  DataObject* pObject) {
456  return registerObject(parentPath, itemToPath(item), pObject);
457 }
458 
461  int item,
462  DataObject* pObject) {
463  return registerObject(parentObj, itemToPath(item), pObject);
464 }
465 
468  const std::string& objPath,
469  DataObject* pObject) {
470  if ( checkRoot() ) {
471  if ( 0 == parentObj ) {
472  if ( objPath.length() > 0 ) {
473  if ( objPath[0] == SEPARATOR ) {
474  std::string::size_type sep = objPath.find(SEPARATOR,1);
475  if ( sep != std::string::npos ) {
476  std::string p_path (objPath, 0, sep);
477  std::string o_path (objPath, sep, objPath.length());
478  return registerObject(p_path, o_path, pObject);
479  }
480  }
481  else {
482  return registerObject(m_rootName, objPath, pObject);
483  }
484  }
485  return INVALID_OBJ_PATH;
486  }
487  RegEntry* node_entry = CAST_REGENTRY(RegEntry*,parentObj->registry());
488  if ( 0 != node_entry ) {
489  StatusCode status = INVALID_PARENT;
490  std::string::size_type sep = objPath.find(SEPARATOR,1);
491  if ( sep != std::string::npos ) {
492  std::string p_path (objPath, 0, sep);
493  std::string o_path (objPath, sep, objPath.length());
494  RegEntry* par_entry = node_entry->findLeaf(p_path);
495  // Create default object leafs if the
496  // intermediate nodes are not present
497  if ( 0 == par_entry && m_forceLeaves ) {
498  DataObject *pLeaf = createDefaultObject();
499  StatusCode sc = registerObject(parentObj, p_path, pLeaf);
500  if ( ! sc.isSuccess() ) {
501  delete pLeaf;
502  }
503  par_entry = node_entry->findLeaf(p_path);
504  }
505  else if ( 0 != par_entry && par_entry->object() == 0 ) {
506  status = retrieveEntry( node_entry, p_path, par_entry);
507  if ( !status.isSuccess() && !par_entry->address() && m_forceLeaves ) {
508  DataObject *pLeaf = createDefaultObject();
509  StatusCode sc = registerObject(parentObj, p_path, pLeaf);
510  if ( ! sc.isSuccess() ) {
511  delete pLeaf;
512  }
513  par_entry = node_entry->findLeaf(p_path);
514  }
515  }
516  node_entry = par_entry;
517  if ( 0 != node_entry ) {
518  DataObject* obj = node_entry->object();
519  if ( 0 != obj ) {
520  status = registerObject( obj, o_path, pObject );
521  }
522  }
523  }
524  else {
525  RegEntry* leaf = node_entry->findLeaf(objPath);
526  if ( 0 == leaf ) {
527  status = node_entry->add( objPath, pObject );
528  }
529  else {
530  DataObject* obj = leaf->object();
531  if ( 0 == obj ) {
532  if (0 == pObject) {
533  error() << "registerObject: trying to register null DataObject" << endmsg;
534  return StatusCode::FAILURE;
535  }
536  else {
537  pObject->setRegistry(leaf);
538  }
539  leaf->setAddress(0);
540  leaf->setObject(pObject);
541  status = StatusCode::SUCCESS;
542  }
543  else {
544  status = DOUBL_OBJ_PATH;
545  }
546  }
547  }
548  return status;
549  }
550  return INVALID_PARENT;
551  }
552  return INVALID_ROOT;
553 }
554 
557  DataObject* pObject = 0;
558  StatusCode status = findObject(fullPath, pObject);
559  if ( status.isSuccess() ) {
560  RegEntry* pEntry = CAST_REGENTRY(RegEntry*,pObject->registry());
561  if ( 0 != pEntry ) {
562  if ( pEntry->isEmpty() ) {
563  RegEntry* pParent = pEntry->parentEntry();
564  if ( 0 != pParent ) {
565  if ( 0 != pObject ) {
566  pObject->addRef();
567  }
568  pParent->remove(pEntry);
569  return StatusCode::SUCCESS;
570  }
571  return INVALID_PARENT;
572  }
573  return DIR_NOT_EMPTY;
574  }
575  return INVALID_ROOT;
576  }
577  return status;
578 }
579 
582  const std::string& objPath) {
583  DataObject* pO = 0;
584  StatusCode status = findObject(parentPath, pO);
585  if ( status.isSuccess() ) {
586  status = unregisterObject(pO, objPath);
587  }
588  return status;
589 }
590 
592 StatusCode TsDataSvc::unregisterObject(const std::string& parentPath, int item) {
593  return unregisterObject(parentPath, itemToPath(item));
594 }
595 
598  if ( checkRoot() ) {
599  RegEntry* entry = m_root->findLeaf(pObject);
600  if ( 0 != entry ) {
601  RegEntry* parent = entry->parentEntry();
602  if ( 0 != parent ) {
603  if ( entry->isEmpty() ) {
604  if ( 0 != entry->object() ) {
605  entry->object()->addRef();
606  }
607  if ( 0 != parent ) {
608  parent->remove(entry);
609  }
610  return SUCCESS;
611  }
612  return INVALID_PARENT;
613  }
614  return DIR_NOT_EMPTY;
615  }
616  return INVALID_OBJECT;
617  }
618  return INVALID_ROOT;
619 }
620 
623  const std::string& objectPath) {
624  if ( checkRoot() ) {
625  try {
626  RegEntry* parent = CAST_REGENTRY(RegEntry*,pParentObj->registry());
627  if ( 0 != parent ) {
628  RegEntry* entry = parent->findLeaf(objectPath);
629  if ( 0 != entry ) {
630  if ( entry->isEmpty() ) {
631  if ( 0 != entry->object() ) {
632  entry->object()->addRef();
633  }
634  parent->remove(entry);
635  return SUCCESS;
636  }
637  return DIR_NOT_EMPTY;
638  }
639  return INVALID_OBJECT;
640  }
641  }
642  catch(...) {
643  }
644  return INVALID_PARENT;
645  }
646  return INVALID_ROOT;
647 }
648 
651  return unregisterObject(pParentObj, itemToPath(item));
652 }
653 
657 {
658  if ( m_enableFaultHdlr ) {
659  IRegistry* pLeaf = 0;
660  if ( pReg && path.length() == 0 ) {
661  DataIncident incident(name(), m_faultName, pReg->identifier());
662  m_incidentSvc->fireIncident(incident);
663  return pReg->object();
664  }
665  else if ( pReg ) {
666  std::string p = pReg->identifier();
667  if (path[0] != SEPARATOR ) p += SEPARATOR;
668  p += path;
669  DataIncident incident(name(), m_faultName, p);
670  m_incidentSvc->fireIncident(incident);
671  pLeaf = m_root->findLeaf(p);
672  }
673  else {
675  if (path[0] != SEPARATOR ) p += SEPARATOR;
676  p += path;
677  DataIncident incident(name(), m_faultName, p);
678  m_incidentSvc->fireIncident(incident);
679  pLeaf = m_root->findLeaf(p);
680  }
681  if ( pLeaf ) {
682  return pLeaf->object();
683  }
684  }
685  return 0;
686 }
687 
692  IConversionSvc* pLoader = getDataLoader(pRegistry);
693  return loadObject(pLoader, pRegistry);
694 }
695 
701  StatusCode status = INVALID_OBJ_ADDR;
702  DataObject* pObject = 0;
703  if ( 0 == pLoader ) { // Precondition: Data loader must be present
704  if (handleDataFault(pRegistry) != 0) return SUCCESS;
705  else return NO_DATA_LOADER;
706  }
707  if ( 0 == pRegistry ) { // Precondition: Directory must be valid
708  if (handleDataFault(pRegistry) != 0) return SUCCESS;
709  else return INVALID_OBJ_ADDR;
710  }
711 
712  VERMSG << "Requested object " << pRegistry->identifier() << endmsg;
713 
714  if ( m_enableAccessHdlr ) {
715  // Fire data access incident
716  DataIncident incident(name(), m_accessName, pRegistry->identifier());
717  m_incidentSvc->fireIncident(incident);
718  }
719  if ( m_inhibitPathes.size() > 0 ) {
720  const std::string& ident = pRegistry->identifier();
722  std::find(m_inhibitPathes.begin(), m_inhibitPathes.end(), ident);
723  if ( inhibit != m_inhibitPathes.end() ) {
724  return NO_ACCESS;
725  }
726  }
727  IOpaqueAddress* pAddress = pRegistry->address();
728  if ( 0 == pAddress ) { // Precondition:
729  return INVALID_OBJ_ADDR; // Address must be valid
730  }
731  try {
732  status = pLoader->createObj(pAddress, pObject); // Call data loader
733  if ( status.isSuccess() ) {
734 
735  VERMSG << "Object " << pRegistry->identifier() << " created" << endmsg;
736 
737  RegEntry *pEntry = CAST_REGENTRY(RegEntry*,pRegistry);
738  pEntry->setObject(pObject);
739 
740  VERMSG << "Filling object " << pRegistry->identifier() << endmsg;
741  status = pLoader->fillObjRefs(pAddress, pObject);
742  }
743  }
744  catch( const GaudiException& exc ) {
745  if ( handleDataFault(pRegistry) != 0 ) {
746  return SUCCESS;
747  }
748  throw GaudiException("GaudiException in loadObject() " + pRegistry->identifier(),
749  name(), StatusCode::FAILURE, exc);
750  }
751  catch( const std::exception& x) {
752  if ( handleDataFault(pRegistry) != 0 ) {
753  return SUCCESS;
754  }
755  throw GaudiException("std::exception in loadObject() " + pRegistry->identifier() +
756  ": " + System::typeinfoName(typeid(x)) + ", " + x.what(),
758  }
759  catch(...) {
760  if ( handleDataFault(pRegistry) != 0 ) {
761  return SUCCESS;
762  }
763  throw GaudiException("UNKN exception in loadObject() " + pRegistry->identifier(),
765  }
766  if ( !status.isSuccess() ) {
767  if ( handleDataFault(pRegistry) != 0 ) {
768  return StatusCode::SUCCESS;
769  }
770  }
771  ON_VERBOSE if ( status.isSuccess() ) {
772  verbose() << "Object " << pRegistry->identifier() << " successfully loaded" << endmsg;
773  }
774  return status;
775 }
776 
779  const std::string& path,
780  RegEntry*& pEntry) {
782  std::string::size_type sep = path.find(SEPARATOR,1);
783  StatusCode status = StatusCode(INVALID_ROOT,true);
784  pEntry = 0;
785  // A.Valassi 16.08.2001 avoid core dump if store is empty
786  if ( checkRoot() ) {
787  if ( 0 == parentObj ) {
788  if ( path.length() == 0 || path == m_rootName ) {
789  return retrieveEntry(m_root, "", pEntry);
790  }
791  else if ( path[0] != SEPARATOR ) {
792  return retrieveEntry(m_root, path, pEntry);
793  }
794  else if ( sep != std::string::npos ) {
795  if ( m_root->object() == 0 ) {
796  RegEntry* r = 0;
797  status = retrieveEntry(m_root, "", r);
798  if ( !status.isSuccess() ) {
799  return status;
800  }
801  }
802  std::string o_path (path, sep, path.length());
803  return retrieveEntry(m_root, o_path, pEntry);
804  }
805  return INVALID_OBJ_PATH;
806  }
807  if ( sep != std::string::npos ) { // the string contains a separator (after pos 0)
808  std::string p_path (path,0,sep);
809  std::string o_path (path,sep,path.length());
810  if (!parentObj->object()) { // if the parent object has not been loaded yet, load it now
811  status = loadObject(parentObj);
812  if ( !status.isSuccess() ) {
813  return status;
814  }
815  }
816  RegEntry* root_entry = parentObj->findLeaf(p_path);
817  if ( !root_entry && m_enableFaultHdlr ) {
818  // If not even the parent is there, an incident
819  // to load the parent must be fired...
820  handleDataFault(parentObj, p_path);
821  root_entry = parentObj->findLeaf(p_path);
822  }
823  if ( root_entry ) {
824  DataObject* pO = root_entry->object();
825  if ( 0 == pO ) {
826  // Object is not loaded: load the object if at all possible
827  status = loadObject(root_entry);
828  if ( !status.isSuccess() ) {
829  return status;
830  }
831  }
832  if ( root_entry->isSoft() ) {
833  root_entry = CAST_REGENTRY(RegEntry*,pO->registry());
834  }
835  return retrieveEntry (root_entry, o_path, pEntry);
836  }
837  return status;
838  }
839  else if ( path.length() == 0 ) {
840  pEntry = parentObj;
841  }
842  else {
843  if (!parentObj->object()) { // if the parent object has not been loaded yet, load it now
844  status = loadObject(parentObj);
845  if ( !status.isSuccess() ) {
846  return status;
847  }
848  }
849  // last leave in search: find leaf and load
850  pEntry = parentObj->findLeaf(path);
851  // If no registry entry was found, trigger incident for action-on-demand
852  if ( !pEntry && m_enableFaultHdlr ) {
853  handleDataFault(parentObj, path);
854  pEntry = (0==path.length()) ? parentObj : parentObj->findLeaf(path);
855  }
856  }
857  // Check results and return
858  if ( 0 == pEntry ) {
859  status = INVALID_OBJ_PATH;
860  }
861  else if ( 0 == pEntry->object() ) {
862  status = loadObject(pEntry);
863  }
864  else if ( m_enableAccessHdlr ) {
865  // Fire data access incident
866  // I do not know if this is a good idea....
867  // This fires too often!
868  //
869  //DataIncident incident(name(), m_accessName, pEntry->identifier());
870  //m_incidentSvc->fireIncident(incident);
871  status = SUCCESS;
872  }
873  else {
874  status = SUCCESS;
875  }
876  }
877  return status;
878 }
879 
882  const std::string& path,
883  DataObject*& pObject) {
885  pObject = 0;
886  RegEntry *result = 0, *parent = CAST_REGENTRY(RegEntry*,pRegistry);
887  StatusCode status = retrieveEntry(parent, path, result);
888  if ( status.isSuccess() ) {
889  pObject = result->object();
890  }
891  return status;
892 }
893 
896  DataObject*& pObject) {
897  IRegistry* nullDir = 0;
898  return retrieveObject(nullDir, fullPath, pObject);
899 }
900 
903  const std::string& objectPath,
904  DataObject*& pObject) {
905  DataObject* parent = 0;
906  StatusCode status = retrieveObject(parentPath, parent);
907  if ( status.isSuccess() ) {
908  status = retrieveObject (parent, objectPath, pObject);
909  }
910  return status;
911 }
912 
915  int item,
916  DataObject*& pObject) {
917  return retrieveObject(parentPath, itemToPath(item), pObject);
918 }
919 
922  const std::string& path,
923  DataObject*& pObject) {
924  IRegistry* pRegistry = (0==parentObj) ? 0 : parentObj->registry();
925  return retrieveObject(pRegistry, path, pObject);
926 }
927 
930  int item,
931  DataObject*& pObject) {
932  return retrieveObject(parentObj, itemToPath(item), pObject);
933 }
934 
937  const std::string& path,
938  DataObject*& pObject) {
940  pObject = 0;
941  IRegistry* pReg = (0==pRegistry) ? m_root : pRegistry;
942  RegEntry* root_entry = CAST_REGENTRY(RegEntry*, pReg);
943  if ( 0 != root_entry ) {
944  if ( path.length() > 0 ) {
945  pReg = root_entry->find(path);
946  }
947  if ( 0 == pReg ) {
948  return INVALID_OBJ_PATH;
949  }
950  pObject = pReg->object();
951  }
952  return (0 == pObject) ? OBJ_NOT_LOADED : IDataProviderSvc_NO_ERROR;
953 }
954 
957  DataObject*& pObject) {
959  pObject = 0;
960  if ( checkRoot() ) {
961  if ( path.length() == 0 || path == m_rootName ) {
962  pObject = m_root->object();
963  return (0 == pObject) ? OBJ_NOT_LOADED : IDataProviderSvc_NO_ERROR;
964  }
965  else if ( path[0] != SEPARATOR ) {
966  return findObject(m_rootName, path, pObject);
967  }
968  return findObject((IRegistry*)0, path, pObject);
969  }
970  return INVALID_ROOT;
971 }
972 
975  const std::string& objectPath,
976  DataObject*& pObject) {
977  DataObject* parent = 0;
978  StatusCode status = findObject(parentPath, parent);
979  if ( status.isSuccess() ) {
980  status = findObject (parent, objectPath, pObject);
981  }
982  return status;
983 }
984 
987  int item, DataObject*& pObject) {
988  return findObject(parentPath, itemToPath(item), pObject);
989 }
990 
993  int item,
994  DataObject*& pObject) {
995  return findObject(parentObj, itemToPath(item), pObject);
996 }
997 
1000  const std::string& path,
1001  DataObject*& pObject) {
1002  IRegistry* pDir = (0==parentObj) ? 0 : parentObj->registry();
1003  return findObject(pDir, path, pObject);
1004 }
1005 
1008  DataObject* pO = 0;
1009  StatusCode status = findObject(updatePath, pO);
1010  if ( status.isSuccess() ) {
1011  return updateObject(pO);
1012  }
1013  return retrieveObject(updatePath, pO);
1014 }
1015 
1018  if ( 0 == pRegistry ) { // Precondition:
1019  return INVALID_OBJ_ADDR; // Addres must be valid
1020  }
1021  DataObject* toUpdate = pRegistry->object();
1022  if ( 0 == toUpdate ) { // Try first to load
1023  return loadObject(pRegistry);
1024  }
1025  return updateObject(toUpdate);
1026 }
1027 
1031  StatusCode status = INVALID_OBJ_ADDR;
1032  if ( 0 == toUpdate ) { // Precondition:
1033  return INVALID_OBJECT; // Address must be valid
1034  }
1035  IRegistry* pRegistry = toUpdate->registry(); // Precondition:
1036  if ( 0 == pRegistry ) { // Need valid registry
1037  return INVALID_OBJECT;
1038  }
1039  IOpaqueAddress* pAddress = pRegistry->address(); // Precondition:
1040  if ( 0 == pAddress ) { // Need valid address
1041  return INVALID_OBJ_ADDR;
1042  }
1043  IConversionSvc* pLoader = getDataLoader(pRegistry);
1044  if ( 0 == pLoader ) { // Precondition:
1045  return NO_DATA_LOADER; // Data loader must be present
1046  }
1047  if ( m_inhibitPathes.size() > 0 ) {
1048  const std::string& ident = pRegistry->identifier();
1050  std::find(m_inhibitPathes.begin(), m_inhibitPathes.end(), ident);
1051  if ( inhibit != m_inhibitPathes.end() ) {
1052  return NO_ACCESS;
1053  }
1054  }
1055  try {
1056  status = pLoader->updateObj(pAddress, toUpdate); // Call data loader
1057  if ( status.isSuccess() ) {
1058  status = pLoader->updateObjRefs(pAddress, toUpdate);
1059  }
1060  }
1061  catch( const GaudiException& exc ) {
1062  throw GaudiException("GaudiException in updateObject() " +
1063  pRegistry->name(),
1064  name(),
1065  StatusCode::FAILURE, exc);
1066  }
1067  catch( const std::exception& x) {
1068  throw GaudiException("std::exception in updateObject() " +
1069  pRegistry->name() + ": " +
1070  System::typeinfoName(typeid(x)) + ", " +
1071  x.what(),
1073  }
1074  catch(...) {
1075  throw GaudiException("UNKN exception in updateObject() " +
1076  pRegistry->name(),
1078  }
1079  return status;
1080 }
1081 
1084  const std::string& updatePath) {
1085  DataObject* pParent = 0;
1086  StatusCode status = findObject(parentPath, pParent);
1087  if ( status.isSuccess() ) {
1088  status = updateObject( pParent, updatePath);
1089  }
1090  return status;
1091 }
1092 
1095  const std::string& updatePath) {
1096  DataObject* pObject = 0;
1097  StatusCode status = findObject(parent, updatePath, pObject);
1098  if ( status.isSuccess() ) {
1099  status = updateObject(pObject);
1100  }
1101  return status;
1102 }
1103 
1104 // Link object
1106  const std::string& objPath, DataObject* to) {
1108  if ( checkRoot() ) {
1109  try {
1110  RegEntry* from_entry = CAST_REGENTRY(RegEntry*,from);
1111  if ( 0 != from_entry ) {
1112  // First check if both objects are already registered to the store
1113  RegEntry* to_entry = m_root->findLeaf(to);
1114  if ( 0 == to_entry ) {
1115  return INVALID_OBJECT;
1116  }
1117  else {
1118  std::string::size_type sep = objPath.rfind(SEPARATOR);
1119  if ( sep > 0 && sep != std::string::npos ) { // in case the objPath is a sub-directory itself
1120  DataObject* pO = 0;
1121  std::string fromPath(objPath, 0, sep);
1122  StatusCode sc = retrieveObject(from, fromPath, pO);
1123  if ( sc.isSuccess() ) {
1124  std::string toPath(objPath, sep, objPath.length());
1125  sc = linkObject(pO->registry(), toPath, to);
1126  }
1127  return sc;
1128  }
1129  // Now register the soft link
1130  StatusCode status = from_entry->add( objPath, to, true);
1131  return status.isSuccess() ?
1132  IDataProviderSvc_NO_ERROR : DOUBL_OBJ_PATH;
1133  }
1134  }
1135  }
1136  catch (...) {
1137  }
1138  return INVALID_PARENT;
1139  }
1140  return INVALID_ROOT;
1141 }
1142 
1145  DataObject* to) {
1147  if ( fullPath.length() > 0 ) {
1148  if ( fullPath[0] != SEPARATOR ) {
1149  return linkObject(m_rootName, fullPath, to);
1150  }
1151  std::string::size_type sep = fullPath.rfind(SEPARATOR);
1152  std::string objPath(fullPath, sep, fullPath.length());
1153  std::string fromPath(fullPath, 0, sep);
1154  return linkObject( fromPath, objPath, to);
1155  }
1156  return INVALID_OBJ_PATH;
1157 }
1158 
1161  const std::string& objPath,
1162  DataObject* to) {
1164  DataObject* pO = 0;
1165  StatusCode status = retrieveObject(from, pO);
1166  if ( status.isSuccess() ) {
1167  return linkObject(pO->registry(), objPath, to);
1168  }
1169  return status;
1170 }
1171 
1174  const std::string& objPath,
1175  DataObject* to) {
1177  if ( 0 != from ) {
1178  IRegistry* from_entry = from->registry();
1179  if ( 0 != from_entry ) {
1180  return linkObject( from_entry, objPath, to);
1181  }
1182  }
1183  return INVALID_PARENT;
1184 }
1185 
1188  const std::string& objPath) {
1190  if ( checkRoot() ) {
1191  try {
1192  RegEntry* from_entry = CAST_REGENTRY(RegEntry*,from);
1193  if ( 0 != from_entry ) {
1194  std::string::size_type sep = objPath.rfind(SEPARATOR);
1195  if ( sep > 0 && sep != std::string::npos ) { // in case the objPath is a sub-directory itself
1196  DataObject* pO = 0;
1197  std::string fromPath(objPath, 0, sep);
1198  StatusCode sc = findObject(from, fromPath, pO);
1199  if ( sc.isSuccess() ) {
1200  std::string toPath(objPath, sep, objPath.length());
1201  sc = unlinkObject(pO->registry(), toPath);
1202  }
1203  return sc;
1204  }
1205  StatusCode status = from_entry->remove( objPath );
1206  if ( status.isSuccess() ) {
1207  return status;
1208  }
1209  return INVALID_OBJ_PATH;
1210  }
1211  }
1212  catch (...) {
1213  }
1214  return INVALID_PARENT;
1215  }
1216  return INVALID_ROOT;
1217 }
1218 
1221  if ( fullPath.length() > 0 ) {
1222  if ( fullPath[0] != SEPARATOR ) {
1223  return unlinkObject(m_rootName, fullPath);
1224  }
1225  std::string::size_type sep = fullPath.rfind(SEPARATOR);
1226  std::string objPath(fullPath, sep, fullPath.length());
1227  std::string fromPath(fullPath, 0, sep);
1228  return unlinkObject(fromPath, objPath);
1229  }
1230  return INVALID_OBJ_PATH;
1231 }
1232 
1235  const std::string& objPath) {
1236  DataObject* pObject = 0;
1237  StatusCode status = findObject(from, pObject);
1238  if ( status.isSuccess() ) {
1239  status = unlinkObject(pObject->registry(), objPath);
1240  }
1241  return status;
1242 }
1243 
1246  const std::string& objPath) {
1247  if ( checkRoot() ) {
1248  IRegistry* from_entry = m_root->findLeaf(from);
1249  return unlinkObject(from_entry, objPath);
1250  }
1251  return INVALID_ROOT;
1252 }
1253 
1256  LoadItems::iterator i = std::find(m_preLoads.begin(), m_preLoads.end(), item);
1257  if ( i == m_preLoads.end() ) {
1258  m_preLoads.push_back(item);
1259  }
1260  return StatusCode::SUCCESS;
1261 }
1262 
1265  return addPreLoadItem( DataStoreItem(itemPath,1) );
1266 }
1267 
1270  LoadItems::iterator i =
1272  if ( i != m_preLoads.end() ) {
1274  }
1275  return StatusCode::SUCCESS;
1276 }
1277 
1280  return removePreLoadItem( DataStoreItem(itemPath,1) );
1281 }
1282 
1286  return StatusCode::SUCCESS;
1287 }
1288 
1290 StatusCode TsDataSvc::preLoad(int depth, int load_depth, DataObject* pObject) {
1291  //unused: StatusCode sc = StatusCode::FAILURE;
1292  if ( 0 != pObject && depth++ < load_depth ) {
1293  RegEntry* dir = CAST_REGENTRY(RegEntry*,pObject->registry());
1294  if ( 0 != dir ) {
1295  for (RegEntry::Iterator i = dir->begin(); i != dir->end(); i++ ) {
1296  DataObject *pObj = 0;
1297  StatusCode status = retrieveObject(pObject, (*i)->name(), pObj);
1298  if ( status.isSuccess() && depth < load_depth ) {
1299  preLoad(depth, load_depth, pObj).ignore();
1300  }
1301  }
1302  }
1303  }
1304  return StatusCode::SUCCESS;
1305 }
1306 
1309  DataObject* pObj = 0;
1310  for (LoadItems::iterator i = m_preLoads.begin(); i != m_preLoads.end(); i++) {
1311  StatusCode sc = retrieveObject( (*i).path(), pObj);
1312  int load_depth = (*i).depth();
1313  if ( sc.isSuccess() && load_depth > 1 ) {
1314  preLoad(1, load_depth, pObj).ignore();
1315  }
1316  }
1317  return StatusCode::SUCCESS;
1318 }
1319 
1322  // Nothing to do: just call base class initialisation
1324  if ( !sc.isSuccess() ) {
1325  return sc;
1326  }
1327  sc = service("IncidentSvc", m_incidentSvc, true);
1328  if ( UNLIKELY(!sc.isSuccess()) ) {
1329  error() << "Failed to access incident service." << endmsg;
1330  }
1331  return sc;
1332 }
1333 
1336  StatusCode sc;
1337  // the finalize part is copied here
1338  setDataLoader(0).ignore();
1339  resetPreLoad().ignore();
1340  clearStore().ignore();
1341  if ( m_incidentSvc ) {
1343  m_incidentSvc = 0;
1344  }
1345  // re-initialize the base class
1346  sc = Service::reinitialize();
1347  if ( UNLIKELY(!sc.isSuccess()) ) {
1348  error() << "Unable to reinitialize base class" << endmsg;
1349  return sc;
1350  }
1351  // the initialize part is copied here
1352  sc = service("IncidentSvc", m_incidentSvc, true);
1353  if ( UNLIKELY(!sc.isSuccess()) ) {
1354  error() << "Failed to access incident service." << endmsg;
1355  return sc;
1356  }
1357  // return
1358  return StatusCode::SUCCESS;
1359 }
1360 
1363  // Nothing to do: just call base class initialisation
1364  setDataLoader(0).ignore();
1365  resetPreLoad().ignore();
1366  clearStore().ignore();
1367  if ( m_incidentSvc ) {
1369  m_incidentSvc = 0;
1370  }
1371  return Service::finalize();
1372 }
1373 
1376  return( (CLID)m_rootCLID );
1377 }
1378 
1381  return( m_rootName );
1382 }
1383 
1386  return new DataObject();
1387 }
1388 
1393  return m_dataLoader;
1394 }
1395 
1398  setDataLoader(0).ignore();
1399  resetPreLoad().ignore();
1400  clearStore().ignore();
1401 }
StatusCode unregisterAddress(const std::string &fullPath) override
IDataManagerSvc: Unregister object address from the data store.
Definition: TsDataSvc.cpp:361
StatusCode retrieveObject(IRegistry *pDirectory, const std::string &path, DataObject *&pObject) override
Retrieve object from data store.
Definition: TsDataSvc.cpp:881
StatusCode initialize() override
Definition: Service.cpp:64
RegistryEntry * findLeaf(boost::string_ref path) const
Find identified leaf in this registry node.
Definition: RegistryEntry.h:95
T copy(T...args)
Define general base for Gaudi exception.
StatusCode unlinkObject(IRegistry *from, const std::string &objPath) override
Remove a link to another object.
Definition: TsDataSvc.cpp:1187
DataObject * object() const override
Retrive object behind the link.
const std::string & name() const override
Retrieve name of the service.
Definition: Service.cpp:289
virtual StatusCode createObj(IOpaqueAddress *pAddress, DataObject *&refpObject)=0
Create the transient representation of an object.
constexpr char SEPARATOR
StatusCode setRoot(std::string root_name, DataObject *pRootObj) override
Initialize data store for new event by giving new event path and root object.
Definition: TsDataSvc.cpp:165
StatusCode finalize() override
Definition: Service.cpp:174
StatusCode addPreLoadItem(const DataStoreItem &item) override
Add an item to the preload list.
Definition: TsDataSvc.cpp:1255
GAUDI_API const std::string typeinfoName(const std::type_info &)
Get platform independent information about the class type.
Definition: System.cpp:299
StatusCode traverseTree(IDataStoreAgent *pAgent) override
IDataManagerSvc: Analyze by traversing all data objects in the data store.
Definition: TsDataSvc.cpp:153
bool isSuccess() const
Test for a status code of SUCCESS.
Definition: StatusCode.h:74
StatusCode updateObject(IRegistry *pDirectory) override
Update object identified by its directory entry.
Definition: TsDataSvc.cpp:1017
Gaudi::Property< std::string > m_accessName
Definition: TsDataSvc.h:81
virtual long add(const std::string &name, DataObject *pObject, bool is_soft=false)
Add entry to data store.
T rfind(T...args)
Gaudi::Property< CLID > m_rootCLID
Definition: TsDataSvc.h:70
virtual long traverseTree(IDataStoreAgent *pAgent, int level=0)
traverse data tree
MsgStream & verbose() const
shortcut for the method msgStream(MSG::VERBOSE)
virtual StatusCode setDataProvider(IDataProviderSvc *pService)=0
Set Data provider service.
#define UNLIKELY(x)
Definition: Kernel.h:126
~TsDataSvc() override
Standard Destructor.
Definition: TsDataSvc.cpp:1397
void setRegistry(IRegistry *pRegistry)
Set pointer to Registry.
Definition: DataObject.h:70
unsigned long release() override
IInterface implementation: Reference the object.
virtual const name_type & name() const =0
Name of the directory (or key)
StatusCode initialize() override
Service initialization.
Definition: TsDataSvc.cpp:1321
StatusCode removePreLoadItem(const DataStoreItem &item) override
Remove an item from the preload list.
Definition: TsDataSvc.cpp:1269
T end(T...args)
virtual IConversionSvc * getDataLoader(IRegistry *pReg)
Retrieve customizable data loader according to registry entry to be retrieved.
Definition: TsDataSvc.cpp:1392
virtual long remove(const std::string &name)
Remove an entry from the store.
const Store & leaves() const
Access the leaves of the object.
IConversionSvc * m_dataLoader
Pointer to data loader service.
Definition: TsDataSvc.h:66
StatusCode setDataLoader(IConversionSvc *svc, IDataProviderSvc *dpsvc=nullptr) override
IDataManagerSvc: IDataManagerSvc: Pass a default data loader to the service and optionally a data pro...
Definition: TsDataSvc.cpp:214
Data provider interface definition.
T remove(T...args)
void setAddress(IOpaqueAddress *pAddress) override
Set/Update Opaque address.
Description of the DataStoreItem class.
Definition: DataStoreItem.h:17
IRegistry * registry() const
Get pointer to Registry.
Definition: DataObject.h:74
virtual StatusCode updateObj(IOpaqueAddress *pAddress, DataObject *refpObject)=0
Update the transient object from the other representation.
StatusCode resetPreLoad() override
Clear the preload list.
Definition: TsDataSvc.cpp:1284
virtual RegistryEntry * parentEntry()
Pointer to parent registry entry.
Definition: RegistryEntry.h:91
STL class.
#define VERMSG
Definition: TsDataSvc.cpp:72
virtual bool isSoft() const
Is the link soft or hard.
StatusCode linkObject(IRegistry *from, const std::string &objPath, DataObject *to) override
Add a link to another object.
Definition: TsDataSvc.cpp:1105
T push_back(T...args)
MsgStream & error() const
shortcut for the method msgStream(MSG::ERROR)
virtual unsigned long addRef()
Add reference to object.
Definition: DataObject.cpp:63
virtual void fireIncident(const Incident &incident)=0
Fire an Incident.
void setObject(DataObject *obj)
Set/Update object address.
StatusCode preLoad() override
load all preload items of the list
Definition: TsDataSvc.cpp:1308
StatusCode traverseSubTree(const std::string &sub_tree_path, IDataStoreAgent *pAgent) override
IDataManagerSvc: Analyze by traversing all data objects below the sub tree identified by its full pat...
Definition: TsDataSvc.cpp:127
IIncidentSvc * m_incidentSvc
Pointer to incident service.
Definition: TsDataSvc.h:68
virtual const id_type & identifier() const =0
Full identifier (or key)
#define ON_VERBOSE
Definition: TsDataSvc.cpp:69
T what(T...args)
virtual Iterator begin() const
Return starting point for container iteration.
DataSvcHelpers::RegistryEntry * m_root
Pointer to root entry.
Definition: TsDataSvc.h:86
This class is used for returning status codes from appropriate routines.
Definition: StatusCode.h:26
LoadItems m_preLoads
Items to be pre-loaded.
Definition: TsDataSvc.h:84
virtual StatusCode updateObjRefs(IOpaqueAddress *pAddress, DataObject *pObject)=0
Update the references of an updated transient object.
DataSvcHelpers::RegistryEntry RegEntry
Definition: TsDataSvc.cpp:66
T erase(T...args)
void setDataSvc(IDataProviderSvc *s)
Set the transient data store.
Definition: RegistryEntry.h:87
const std::string & rootName() const override
IDataManagerSvc: Accessor for root event name.
Definition: TsDataSvc.cpp:1380
Gaudi::Property< bool > m_enableAccessHdlr
Definition: TsDataSvc.h:79
StatusCode reinitialize() override
Service initialization.
Definition: TsDataSvc.cpp:1335
StatusCode objectLeaves(const DataObject *pObject, std::vector< IRegistry * > &refLeaves) override
IDataManagerSvc: Explore the object store: retrieve all leaves attached to the object.
Definition: TsDataSvc.cpp:249
The IRegistry represents the entry door to the environment any data object residing in a transient da...
Definition: IRegistry.h:22
virtual bool isEmpty() const
Simple check if the Container is empty.
StatusCode reinitialize() override
Definition: Service.cpp:250
unsigned int CLID
Class ID definition.
Definition: ClassID.h:8
Store::const_iterator Iterator
Iterator definition.
Definition: RegistryEntry.h:45
DataObject * handleDataFault(IRegistry *pReg, const std::string &path="")
Invoke data fault handling if enabled.
Definition: TsDataSvc.cpp:656
STL class.
T move(T...args)
virtual DataObject * object() const =0
Retrieve object behind the link.
Definition of an entry in the transient data store.
Definition: RegistryEntry.h:36
virtual unsigned long release()
release reference to object
Definition: DataObject.cpp:56
T find(T...args)
T length(T...args)
virtual DataObject * createDefaultObject() const
Create default objects in case forced creation of leaves is requested.
Definition: TsDataSvc.cpp:1385
virtual StatusCode fillObjRefs(IOpaqueAddress *pAddress, DataObject *pObject)=0
Resolve the references of the created transient object.
StatusCode registerObject(const std::string &fullPath, DataObject *pObject) override
Register object with the data store.
Definition: TsDataSvc.cpp:427
StatusCode clearSubTree(const std::string &sub_tree_path) override
IDataManagerSvc: Remove all data objects below the sub tree identified by its full path name...
Definition: TsDataSvc.cpp:77
virtual unsigned long release()=0
Release Interface instance.
StatusCode finalize() override
Service initialization.
Definition: TsDataSvc.cpp:1362
virtual IRegistry * parent() const
Pointer to parent directory entry.
Generic data agent interface.
StatusCode registerAddress(const std::string &fullPath, IOpaqueAddress *pAddress) override
IDataManagerSvc: Register object address with the data store.
Definition: TsDataSvc.cpp:277
T begin(T...args)
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: TsDataSvc.cpp:176
const std::string & name() const
Retreive DataObject name. It is the name when registered in the store.
Definition: DataObject.cpp:78
bool checkRoot()
Check if root path is valid.
Definition: TsDataSvc.h:335
virtual unsigned long addRef()=0
Increment the reference count of Interface instance.
T substr(T...args)
Gaudi::Property< bool > m_forceLeaves
Definition: TsDataSvc.h:72
StatusCode service(const std::string &name, const T *&psvc, bool createIf=true) const
Access a service by name, creating it if it doesn&#39;t already exist.
Definition: Service.h:85
const std::string & identifier() const override
Full identifier (or key)
StatusCode clearStore() override
IDataManagerSvc: Remove all data objects in the data store.
Definition: TsDataSvc.cpp:115
Data service incident class.
StatusCode unregisterObject(const std::string &fullPath) override
Unregister object from the data store.
Definition: TsDataSvc.cpp:556
Opaque address interface definition.
void ignore() const
Definition: StatusCode.h:106
CLID rootCLID() const override
IDataManagerSvc: Accessor for root event CLID.
Definition: TsDataSvc.cpp:1375
virtual IOpaqueAddress * address() const =0
Retrieve opaque storage address.
Gaudi::Property< std::vector< std::string > > m_inhibitPathes
Definition: TsDataSvc.h:73
A DataObject is the base class of any identifiable object on any data store.
Definition: DataObject.h:30
#define STD_LOCK_GUARD_MACRO
Definition: TsDataSvc.cpp:46
#define CAST_REGENTRY(x, y)
Definition: TsDataSvc.cpp:64
virtual StatusCode loadObject(IRegistry *pNode)
Invoke Persistency service to create transient object from its persistent representation.
Definition: TsDataSvc.cpp:691
StatusCode findObject(const std::string &fullPath, DataObject *&pObject) override
Find object identified by its full path in the data store.
Definition: TsDataSvc.cpp:956
StatusCode objectParent(const DataObject *pObject, IRegistry *&refpParent) override
IDataManagerSvc: Explore the object store: retrieve the object&#39;s parent.
Definition: TsDataSvc.cpp:225
virtual IRegistry * find(const IRegistry *obj) const
Try to find an object identified by its pointer.
MsgStream & endmsg(MsgStream &s)
MsgStream Modifier: endmsg. Calls the output method of the MsgStream.
Definition: MsgStream.h:244
virtual Iterator end() const
Return end elemtn if the container.
StatusCode retrieveEntry(DataSvcHelpers::RegistryEntry *pNode, const std::string &path, DataSvcHelpers::RegistryEntry *&pEntry)
Retrieve registry entry from store.
Definition: TsDataSvc.cpp:778
Gaudi::Property< bool > m_enableFaultHdlr
Definition: TsDataSvc.h:75
Gaudi::Property< std::string > m_faultName
Definition: TsDataSvc.h:77
Gaudi::Property< std::string > m_rootName
Definition: TsDataSvc.h:71
void makeHard(DataObject *pObject)
Initialize link as hard link.