Gaudi Framework, version v22r2

Home   Generated: Tue May 10 2011
Public Types | Public Member Functions | Protected Member Functions | Protected Attributes | Private Member Functions | Friends

DataSvc Class Reference

Data service base class. More...

#include <GaudiKernel/DataSvc.h>

Inheritance diagram for DataSvc:
Inheritance graph
[legend]
Collaboration diagram for DataSvc:
Collaboration graph
[legend]

List of all members.

Public Types

typedef std::vector
< DataStoreItem
LoadItems
 Define set of load items.

Public Member Functions

virtual CLID rootCLID () const
 IDataManagerSvc: Accessor for root event CLID.
virtual std::string rootName () const
 IDataManagerSvc: Accessor for root event name.
virtual StatusCode registerAddress (const std::string &fullPath, IOpaqueAddress *pAddress)
 IDataManagerSvc: Register object address with the data store.
virtual StatusCode registerAddress (DataObject *parentObj, const std::string &objectPath, IOpaqueAddress *pAddress)
 IDataManagerSvc: Register object address with the data store.
virtual StatusCode registerAddress (IRegistry *parentObj, const std::string &objectPath, IOpaqueAddress *pAddress)
 IDataManagerSvc: Register object address with the data store.
virtual StatusCode unregisterAddress (const std::string &fullPath)
 IDataManagerSvc: Unregister object address from the data store.
virtual StatusCode unregisterAddress (DataObject *pParent, const std::string &objPath)
 IDataManagerSvc: Unregister object address from the data store.
virtual StatusCode unregisterAddress (IRegistry *pParent, const std::string &objPath)
 IDataManagerSvc: Unregister object address from the data store.
virtual StatusCode objectLeaves (const DataObject *pObject, std::vector< IRegistry * > &refLeaves)
 IDataManagerSvc: Explore the object store: retrieve all leaves attached to the object.
virtual StatusCode objectLeaves (const IRegistry *pRegistry, std::vector< IRegistry * > &refLeaves)
 IDataManagerSvc: Explore the object store: retrieve all leaves attached to the object.
virtual StatusCode objectParent (const DataObject *pObject, IRegistry *&refpParent)
 IDataManagerSvc: Explore the object store: retrieve the object's parent.
virtual StatusCode objectParent (const IRegistry *pRegistry, IRegistry *&refpParent)
 IDataManagerSvc: Explore the object store: retrieve the object's parent.
virtual StatusCode clearSubTree (const std::string &sub_tree_path)
 IDataManagerSvc: Remove all data objects below the sub tree identified by its full path name.
virtual StatusCode clearSubTree (DataObject *pObject)
 IDataManagerSvc: Remove all data objects below the sub tree identified by the object.
virtual StatusCode clearStore ()
 IDataManagerSvc: Remove all data objects in the data store.
virtual StatusCode traverseSubTree (const std::string &sub_tree_path, IDataStoreAgent *pAgent)
 IDataManagerSvc: Analyze by traversing all data objects below the sub tree identified by its full path name.
virtual StatusCode traverseSubTree (DataObject *pObject, IDataStoreAgent *pAgent)
 IDataManagerSvc: Analyze by traversing all data objects below the sub tree.
virtual StatusCode traverseTree (IDataStoreAgent *pAgent)
 IDataManagerSvc: Analyze by traversing all data objects in the data store.
virtual StatusCode setRoot (const std::string &root_name, DataObject *pRootObj)
 Initialize data store for new event by giving new event path and root object.
virtual StatusCode i_setRoot (const std::string &root_name, DataObject *pRootObj)
 Initialize data store for new event by giving new event path and root object.
virtual StatusCode setRoot (const std::string &root_path, IOpaqueAddress *pRootAddr)
 Initialize data store for new event by giving new event path and address of root object.
virtual StatusCode i_setRoot (const std::string &root_path, IOpaqueAddress *pRootAddr)
 Initialize data store for new event by giving new event path and address of root object.
virtual StatusCode setDataLoader (IConversionSvc *svc)
 IDataManagerSvc: IDataManagerSvc: Pass a default data loader to the service.
virtual StatusCode addPreLoadItem (const DataStoreItem &item)
 Add an item to the preload list.
virtual StatusCode addPreLoadItem (const std::string &itemPath)
 Add an item to the preload list.
virtual StatusCode removePreLoadItem (const DataStoreItem &item)
 Remove an item from the preload list.
virtual StatusCode removePreLoadItem (const std::string &itemPath)
 Add an item to the preload list.
virtual StatusCode resetPreLoad ()
 Clear the preload list.
virtual StatusCode preLoad (int depth, int load_depth, DataObject *pObject)
 Execute one level of preloading and recursively load until the final level is reached.
virtual StatusCode preLoad ()
 load all preload items of the list
virtual StatusCode registerObject (const std::string &fullPath, DataObject *pObject)
 Register object with the data store.
virtual StatusCode registerObject (const std::string &parentPath, const std::string &objPath, DataObject *pObject)
 Register object with the data store.
virtual StatusCode registerObject (const std::string &parentPath, int item, DataObject *pObject)
 Register object with the data store.
virtual StatusCode registerObject (DataObject *parentObj, const std::string &objPath, DataObject *pObject)
 Register object with the data store.
virtual StatusCode registerObject (DataObject *parentObj, int item, DataObject *pObject)
 Register object with the data store.
virtual StatusCode unregisterObject (const std::string &fullPath)
 Unregister object from the data store.
virtual StatusCode unregisterObject (const std::string &parentPath, const std::string &objectPath)
 Unregister object from the data store.
virtual StatusCode unregisterObject (const std::string &parentPath, int item)
 Unregister object from the data store.
virtual StatusCode unregisterObject (DataObject *pObject)
 Unregister object from the data store.
virtual StatusCode unregisterObject (DataObject *pObject, const std::string &objectPath)
 Unregister object from the data store.
virtual StatusCode unregisterObject (DataObject *pObject, int item)
 Unregister object from the data store.
virtual StatusCode retrieveObject (IRegistry *pDirectory, const std::string &path, DataObject *&pObject)
 Retrieve object from data store.
virtual StatusCode retrieveObject (const std::string &fullPath, DataObject *&pObject)
 Retrieve object identified by its full path from the data store.
virtual StatusCode retrieveObject (const std::string &parentPath, const std::string &objPath, DataObject *&pObject)
 Retrieve object from data store.
virtual StatusCode retrieveObject (const std::string &parentPath, int item, DataObject *&pObject)
 Retrieve object from data store.
virtual StatusCode retrieveObject (DataObject *parentObj, const std::string &objPath, DataObject *&pObject)
 Retrieve object from data store.
virtual StatusCode retrieveObject (DataObject *parentObj, int item, DataObject *&pObject)
 Retrieve object from data store.
virtual StatusCode findObject (const std::string &fullPath, DataObject *&pObject)
 Find object identified by its full path in the data store.
virtual StatusCode findObject (IRegistry *pDirectory, const std::string &path, DataObject *&pObject)
 Find object identified by its full path in the data store.
virtual StatusCode findObject (const std::string &parentPath, const std::string &objPath, DataObject *&pObject)
 Find object in the data store.
virtual StatusCode findObject (const std::string &parentPath, int item, DataObject *&pObject)
 Find object in the data store.
virtual StatusCode findObject (DataObject *parentObj, const std::string &objPath, DataObject *&pObject)
 Find object in the data store.
virtual StatusCode findObject (DataObject *parentObj, int item, DataObject *&pObject)
 Find object in the data store.
virtual StatusCode linkObject (IRegistry *from, const std::string &objPath, DataObject *to)
 Add a link to another object.
virtual StatusCode linkObject (const std::string &fromPath, const std::string &objPath, DataObject *to)
 Add a link to another object.
virtual StatusCode linkObject (DataObject *from, const std::string &objPath, DataObject *to)
 Add a link to another object.
virtual StatusCode linkObject (const std::string &fullPath, DataObject *to)
 Add a link to another object.
virtual StatusCode unlinkObject (IRegistry *from, const std::string &objPath)
 Remove a link to another object.
virtual StatusCode unlinkObject (const std::string &fromPath, const std::string &objPath)
 Remove a link to another object.
virtual StatusCode unlinkObject (DataObject *fromObj, const std::string &objPath)
 Remove a link to another object.
virtual StatusCode unlinkObject (const std::string &fullPath)
 Remove a link to another object.
virtual StatusCode updateObject (IRegistry *pDirectory)
 Update object identified by its directory entry.
virtual StatusCode updateObject (const std::string &updatePath)
 Update object.
virtual StatusCode updateObject (DataObject *toUpdate)
 Update object.
virtual StatusCode updateObject (const std::string &parentPath, const std::string &updatePath)
 Update object.
virtual StatusCode updateObject (DataObject *pParent, const std::string &updatePath)
 Update object.
virtual StatusCode initialize ()
 Service initialization.
virtual StatusCode reinitialize ()
 Service initialization.
virtual StatusCode finalize ()
 Service initialization.
 DataSvc (const std::string &name, ISvcLocator *svc)
 Standard Constructor.
virtual ~DataSvc ()
 Standard Destructor.

Protected Member Functions

bool checkRoot ()
 Check if root path is valid.
virtual IConversionSvcgetDataLoader (IRegistry *pReg)
 Retrieve customizable data loader according to registry entry to be retrieved.
virtual DataObjectcreateDefaultObject () const
 Create default objects in case forced creation of leaves is requested.
virtual StatusCode loadObject (IRegistry *pNode)
 Invoke Persistency service to create transient object from its persistent representation.
virtual StatusCode loadObject (IConversionSvc *pLoader, IRegistry *pNode)
 Invoke Persistency service to create transient object from its persistent representation.
StatusCode retrieveEntry (DataSvcHelpers::RegistryEntry *pNode, const std::string &path, DataSvcHelpers::RegistryEntry *&pEntry)
 Retrieve registry entry from store.
DataObjecthandleDataFault (IRegistry *pReg, const std::string &path="")
 Invoke data fault handling if enabled.

Protected Attributes

CLID m_rootCLID
 Integer Property corresponding to CLID of root entry.
std::string m_rootName
 Name of root event.
IConversionSvcm_dataLoader
 Pointer to data loader service.
IIncidentSvcm_incidentSvc
 Pointer to incident service.
LoadItems m_preLoads
 Items to be pre-loaded.
bool m_forceLeaves
 Allow forced creation of default leaves on registerObject.
bool m_enableAccessHdlr
 Flag to enable interrupts on data access requests.
bool m_enableFaultHdlr
 Flag to enable interrupts on data creation requests.
DataSvcHelpers::RegistryEntrym_root
 Pointer to root entry.
DataSvcHelpers::InhibitMap * m_inhibitMap
 Map with object paths to be inhibited from loading.
std::vector< std::stringm_inhibitPathes
 Property for the inhibited leaves.
std::string m_accessName
 Name of the data access incident.
std::string m_faultName
 Name of the data fault incident.

Private Member Functions

 DataSvc (const DataSvc &)
 Fake copy constructor (never implemented).
DataSvcoperator= (const DataSvc &)
 Fake assignment operator (never implemented).

Friends

class SvcFactory< DataSvc >
 The class creator is of course a friend!

Detailed Description

Data service base class.

A data service manages the transient data stores and implements the IDataProviderSvc and IDataManagerSvc interfaces.

Author:
Markus Frank
Sebastien Ponce
Version:
1.0

Definition at line 42 of file DataSvc.h.


Member Typedef Documentation

Define set of load items.

Definition at line 49 of file DataSvc.h.


Constructor & Destructor Documentation

DataSvc::DataSvc ( const std::string name,
ISvcLocator svc 
)

Standard Constructor.

Definition at line 1373 of file DataSvc.cpp.

: base_class(name,svc), m_rootCLID( /*CLID_Event*/ 110),
  m_rootName( "/Event"), m_root(0)
{
  m_dataLoader = 0;
  m_inhibitMap = 0;
  m_incidentSvc = 0;
  m_forceLeaves = false;
  m_enableFaultHdlr = false;
  m_enableAccessHdlr = false;
  m_faultName  = "DataFault";
  m_accessName = "DataAccess";
  declareProperty("RootCLID",            m_rootCLID);
  declareProperty("RootName",            m_rootName);
  declareProperty("ForceLeaves",         m_forceLeaves);
  declareProperty("InhibitPathes",       m_inhibitPathes);
  declareProperty("DataFaultName",       m_faultName);
  declareProperty("DataAccessName",      m_accessName);
  declareProperty("EnableFaultHandler",  m_enableFaultHdlr);
  declareProperty("EnableAccessHandler", m_enableAccessHdlr);
}
DataSvc::~DataSvc (  ) [virtual]

Standard Destructor.

Definition at line 1396 of file DataSvc.cpp.

DataSvc::DataSvc ( const DataSvc  ) [private]

Fake copy constructor (never implemented).


Member Function Documentation

StatusCode DataSvc::addPreLoadItem ( const DataStoreItem item ) [virtual]

Add an item to the preload list.

Definition at line 1228 of file DataSvc.cpp.

StatusCode DataSvc::addPreLoadItem ( const std::string itemPath ) [virtual]

Add an item to the preload list.

Definition at line 1237 of file DataSvc.cpp.

                                                               {
  return addPreLoadItem( DataStoreItem(itemPath,1) );
}
bool DataSvc::checkRoot (  ) [inline, protected]

Check if root path is valid.

Definition at line 390 of file DataSvc.h.

                      {
    return 0 != m_root;
  }
StatusCode DataSvc::clearStore (  ) [virtual]

IDataManagerSvc: Remove all data objects in the data store.

Reimplemented in DetDataSvc.

Definition at line 104 of file DataSvc.cpp.

                                 {
  if ( checkRoot() )    {
    m_root->release();
    m_root = 0;
    return SUCCESS;
  }
  return INVALID_ROOT;
}
StatusCode DataSvc::clearSubTree ( const std::string sub_tree_path ) [virtual]

IDataManagerSvc: Remove all data objects below the sub tree identified by its full path name.

Definition at line 66 of file DataSvc.cpp.

                                                                  {
  DataObject* pObject = 0;
  StatusCode status = findObject(sub_tree_path, pObject);
  if ( status.isSuccess() )   {
    RegEntry* node_entry = CAST_REGENTRY(RegEntry*,pObject->registry());
    if ( 0 != node_entry )   {
      RegEntry* parent = node_entry->parentEntry();
      if ( 0 != parent )  {
        parent->remove(node_entry);
        return StatusCode::SUCCESS;
      }
      return INVALID_PARENT;
    }
    return INVALID_OBJECT;
  }
  return status;
}
StatusCode DataSvc::clearSubTree ( DataObject pObject ) [virtual]

IDataManagerSvc: Remove all data objects below the sub tree identified by the object.

Definition at line 87 of file DataSvc.cpp.

                                                       {
  if ( checkRoot() )  {
    RegEntry* entry = CAST_REGENTRY(RegEntry*,pObject->registry());
    if ( 0 != entry )   {
      RegEntry* parent = entry->parentEntry();
      if ( 0 != parent )  {
        parent->remove(entry);
        return SUCCESS;
      }
      return INVALID_PARENT;
    }
    return INVALID_OBJECT;
  }
  return INVALID_ROOT;
}
DataObject * DataSvc::createDefaultObject (  ) const [protected, virtual]

Create default objects in case forced creation of leaves is requested.

Definition at line 1361 of file DataSvc.cpp.

                                                    {
  return new DataObject();
}
StatusCode DataSvc::finalize ( void   ) [virtual]

Service initialization.

Service initialisation.

Reimplemented from Service.

Reimplemented in AIDATupleSvc, EvtDataSvc, RecordDataSvc, DetDataSvc, FastContainersSvc, HistogramSvc, NTupleSvc, and TagCollectionSvc.

Definition at line 1338 of file DataSvc.cpp.

                                {
  // Nothing to do: just call base class initialisation
  setDataLoader(0).ignore();
  resetPreLoad().ignore();
  clearStore().ignore();
  if ( m_incidentSvc )  {
    m_incidentSvc->release();
    m_incidentSvc = 0;
  }
  return Service::finalize();
}
StatusCode DataSvc::findObject ( const std::string fullPath,
DataObject *&  pObject 
) [virtual]

Find object identified by its full path in the data store.

Definition at line 936 of file DataSvc.cpp.

                                                       {
  pObject = 0;
  if ( checkRoot() )  {
    if ( path.length() == 0 || path == m_rootName )   {
      pObject = m_root->object();
      return (0 == pObject) ? OBJ_NOT_LOADED : IDataProviderSvc_NO_ERROR;
    }
    else if ( path[0] != SEPARATOR )    {
      return findObject(m_rootName, path, pObject);
    }
    return findObject((IRegistry*)0, path, pObject);
  }
  return INVALID_ROOT;
}
StatusCode DataSvc::findObject ( IRegistry pDirectory,
const std::string path,
DataObject *&  pObject 
) [virtual]

Find object identified by its full path in the data store.

Retrieve object identified by its directory from the data store.

Definition at line 917 of file DataSvc.cpp.

                                                       {
  pObject = 0;
  IRegistry* pReg = (0==pRegistry) ? m_root : pRegistry;
  RegEntry* root_entry = CAST_REGENTRY(RegEntry*, pReg);
  if ( 0 != root_entry )    {
    if ( path.length() > 0 )  {
      pReg = root_entry->find(path);
    }
    if ( 0 == pReg )    {
      return INVALID_OBJ_PATH;
    }
    pObject = pReg->object();
  }
  return (0 == pObject) ? OBJ_NOT_LOADED : IDataProviderSvc_NO_ERROR;
}
StatusCode DataSvc::findObject ( const std::string parentPath,
const std::string objPath,
DataObject *&  pObject 
) [virtual]

Find object in the data store.

Retrieve object identified by its full path from the data store.

Definition at line 953 of file DataSvc.cpp.

                                                       {
  DataObject* parent = 0;
  StatusCode status = findObject(parentPath, parent);
  if ( status.isSuccess() )   {
    status = findObject (parent, objectPath, pObject);
  }
  return status;
}
StatusCode DataSvc::findObject ( const std::string parentPath,
int  item,
DataObject *&  pObject 
) [virtual]

Find object in the data store.

Retrieve object identified by its full path from the data store.

Definition at line 965 of file DataSvc.cpp.

                                                                 {
  return findObject(parentPath, itemToPath(item), pObject);
}
StatusCode DataSvc::findObject ( DataObject parentObj,
const std::string objPath,
DataObject *&  pObject 
) [virtual]

Find object in the data store.

Find object identified by its full path in the data store.

Definition at line 978 of file DataSvc.cpp.

                                                        {
  IRegistry* pDir = (0==parentObj) ? 0 : parentObj->registry();
  return findObject(pDir, path, pObject);
}
StatusCode DataSvc::findObject ( DataObject parentObj,
int  item,
DataObject *&  pObject 
) [virtual]

Find object in the data store.

Find object identified by its full path in the data store.

Definition at line 971 of file DataSvc.cpp.

                                                        {
  return findObject(parentObj, itemToPath(item), pObject);
}
IConversionSvc * DataSvc::getDataLoader ( IRegistry pReg ) [protected, virtual]

Retrieve customizable data loader according to registry entry to be retrieved.

Reimplemented in NTupleSvc.

Definition at line 1368 of file DataSvc.cpp.

                                                              {
  return m_dataLoader;
}
DataObject * DataSvc::handleDataFault ( IRegistry pReg,
const std::string path = "" 
) [protected]

Invoke data fault handling if enabled.

Parameters:
pReg[IN] Pointer to missing registry entry
path[IN] Sub-path of requested object from pReg
Returns:
Object corresponding to the specified leaf

Definition at line 639 of file DataSvc.cpp.

{
  if ( m_enableFaultHdlr )  {
    IRegistry* pLeaf = 0;
    if ( pReg && path.length() == 0 )   {
      DataIncident incident(name(), m_faultName, pReg->identifier());
      m_incidentSvc->fireIncident(incident);
      return pReg->object();
    }
    else if ( pReg )  {
      std::string p = pReg->identifier();
      if (path[0] != SEPARATOR ) p += SEPARATOR;
      p += path;
      DataIncident incident(name(), m_faultName, p);
      m_incidentSvc->fireIncident(incident);
      pLeaf = m_root->findLeaf(p);
    }
    else  {
      std::string p = m_root->identifier();
      if (path[0] != SEPARATOR ) p += SEPARATOR;
      p += path;
      DataIncident incident(name(), m_faultName, p);
      m_incidentSvc->fireIncident(incident);
      pLeaf = m_root->findLeaf(p);
    }
    if ( pLeaf )  {
      return pLeaf->object();
    }
  }
  return 0;
}
StatusCode DataSvc::i_setRoot ( const std::string root_path,
DataObject pRootObj 
) [virtual]

Initialize data store for new event by giving new event path and root object.

Does not clear the store before reinitializing it. This could lead to errors and should be handle with care. Use setRoot if unsure

Definition at line 162 of file DataSvc.cpp.

                                                       {
  if ( 0 != pRootObj )  {
    m_root = new RegEntry(root_path);
    m_root->makeHard(pRootObj);
    m_root->setDataSvc(this);
    preLoad().ignore();
  }
  return SUCCESS;
}
StatusCode DataSvc::i_setRoot ( const std::string root_path,
IOpaqueAddress pRootAddr 
) [virtual]

Initialize data store for new event by giving new event path and address of root object.

Does not clear the store before reinitializing it. This could lead to errors and should be handle with care. Use setRoot if unsure

Definition at line 188 of file DataSvc.cpp.

                                                            {
  if ( 0 != pRootAddr )  {
    m_root = new RegEntry(root_path);
    m_root->makeHard(pRootAddr);
    m_root->setDataSvc(this);
    preLoad().ignore();
  }
  return SUCCESS;
}
StatusCode DataSvc::initialize (  ) [virtual]

Service initialization.

Reimplemented from Service.

Reimplemented in AIDATupleSvc, EvtDataSvc, RecordDataSvc, DetDataSvc, FastContainersSvc, HistogramSvc, NTupleSvc, and TagCollectionSvc.

Definition at line 1294 of file DataSvc.cpp.

                                  {
  // Nothing to do: just call base class initialisation
  StatusCode sc = Service::initialize();
  if ( !sc.isSuccess() )  {
    return sc;
  }
  sc = service("IncidentSvc", m_incidentSvc, true);
  if ( !sc.isSuccess() )  {
    MsgStream log(msgSvc(), name());
    log << MSG::ERROR << "Failed to access incident service." << endmsg;
  }
  return sc;
}
StatusCode DataSvc::linkObject ( IRegistry from,
const std::string objPath,
DataObject to 
) [virtual]

Add a link to another object.

Definition at line 1083 of file DataSvc.cpp.

                                                                         {
  if ( checkRoot() )  {
    try   {
      RegEntry* from_entry = CAST_REGENTRY(RegEntry*,from);
      if ( 0 != from_entry )    {
        // First check if both objects are already registered to the store
        RegEntry* to_entry   = m_root->findLeaf(to);
        if ( 0 == to_entry )   {
          return INVALID_OBJECT;
        }
        else  {
          std::string::size_type sep = objPath.rfind(SEPARATOR);
          if ( sep > 0 && sep != std::string::npos )    {   // in case the objPath is a sub-directory itself
            DataObject* pO = 0;
            std::string fromPath(objPath, 0, sep);
            StatusCode sc = retrieveObject(from, fromPath, pO);
            if ( sc.isSuccess() )    {
              std::string toPath(objPath, sep, objPath.length());
              sc = linkObject(pO->registry(), toPath, to);
            }
            return sc;
          }
          // Now register the soft link
          StatusCode status = from_entry->add( objPath, to, true);
          return status.isSuccess() ?
            IDataProviderSvc_NO_ERROR : DOUBL_OBJ_PATH;
        }
      }
    }
    catch (...) {
    }
    return INVALID_PARENT;
  }
  return INVALID_ROOT;
}
StatusCode DataSvc::linkObject ( const std::string fromPath,
const std::string objPath,
DataObject to 
) [virtual]

Add a link to another object.

Definition at line 1136 of file DataSvc.cpp.

                                                  {
  DataObject* pO = 0;
  StatusCode status = retrieveObject(from, pO);
  if ( status.isSuccess() )   {
    return linkObject(pO->registry(), objPath, to);
  }
  return status;
}
StatusCode DataSvc::linkObject ( DataObject from,
const std::string objPath,
DataObject to 
) [virtual]

Add a link to another object.

Definition at line 1148 of file DataSvc.cpp.

                                                  {
  if ( 0 != from )    {
    IRegistry* from_entry = from->registry();
    if ( 0 != from_entry )   {
      return linkObject( from_entry, objPath, to);
    }
  }
  return INVALID_PARENT;
}
StatusCode DataSvc::linkObject ( const std::string fullPath,
DataObject to 
) [virtual]

Add a link to another object.

Definition at line 1121 of file DataSvc.cpp.

                                                  {
  if ( fullPath.length() > 0 )    {
    if ( fullPath[0] != SEPARATOR )   {
      return linkObject(m_rootName, fullPath, to);
    }
    std::string::size_type sep = fullPath.rfind(SEPARATOR);
    std::string objPath(fullPath, sep, fullPath.length());
    std::string fromPath(fullPath, 0, sep);
    return linkObject( fromPath, objPath, to);
  }
  return INVALID_OBJ_PATH;
}
StatusCode DataSvc::loadObject ( IRegistry pNode ) [protected, virtual]

Invoke Persistency service to create transient object from its persistent representation.

Definition at line 674 of file DataSvc.cpp.

                                                     {
  IConversionSvc* pLoader = getDataLoader(pRegistry);
  return loadObject(pLoader, pRegistry);
}
StatusCode DataSvc::loadObject ( IConversionSvc pLoader,
IRegistry pNode 
) [protected, virtual]

Invoke Persistency service to create transient object from its persistent representation.

Definition at line 682 of file DataSvc.cpp.

                                                                            {
  StatusCode status = INVALID_OBJ_ADDR;
  DataObject* pObject = 0;
  if ( 0 == pLoader )   {         // Precondition: Data loader must be present
    if (handleDataFault(pRegistry) != 0) return  SUCCESS;
    else                                 return  NO_DATA_LOADER;
  }
  if ( 0 == pRegistry )    {      // Precondition: Directory must be valid
    if (handleDataFault(pRegistry) != 0) return  SUCCESS;
    else                                 return  INVALID_OBJ_ADDR;
  }

  MsgStream log( msgSvc(), name() );
  log << MSG::VERBOSE << "Requested object " << pRegistry->identifier() << endmsg;

  if ( m_enableAccessHdlr )  {
    // Fire data access incident
    DataIncident incident(name(), m_accessName, pRegistry->identifier());
    m_incidentSvc->fireIncident(incident);
  }
  if ( m_inhibitPathes.size() > 0 )   {
    const std::string& ident = pRegistry->identifier();
    std::vector<std::string>::iterator inhibit =
      std::find(m_inhibitPathes.begin(), m_inhibitPathes.end(), ident);
    if ( inhibit != m_inhibitPathes.end() )   {
      return NO_ACCESS;
    }
  }
  IOpaqueAddress* pAddress = pRegistry->address();
  if ( 0 == pAddress )  {         // Precondition:
    return INVALID_OBJ_ADDR;      // Address must be valid
  }
  try   {
    status = pLoader->createObj(pAddress, pObject);  // Call data loader
    if ( status.isSuccess() )    {

      log << MSG::VERBOSE << "Object " << pRegistry->identifier() << " created" << endmsg;

      RegEntry *pEntry = CAST_REGENTRY(RegEntry*,pRegistry);
      pEntry->setObject(pObject);

      log << MSG::VERBOSE << "Filling object " << pRegistry->identifier() << endmsg;
      status = pLoader->fillObjRefs(pAddress, pObject);
    }
  }
  catch( const GaudiException& exc ) {
    if ( handleDataFault(pRegistry) != 0 )  {
      return SUCCESS;
    }
    throw GaudiException("GaudiException in loadObject() " + pRegistry->identifier(),
        name(), StatusCode::FAILURE, exc);
  }
  catch( const std::exception& x) {
    if ( handleDataFault(pRegistry) != 0 )  {
      return SUCCESS;
    }
    throw GaudiException("std::exception in loadObject() " + pRegistry->identifier() +
        ": " + System::typeinfoName(typeid(x)) + ", " + x.what(),
      name(), StatusCode::FAILURE);
  }
  catch(...) {
    if ( handleDataFault(pRegistry) != 0 )  {
      return SUCCESS;
    }
    throw GaudiException("UNKN exception in loadObject() " + pRegistry->identifier(),
      name(), StatusCode::FAILURE);
  }
  if ( !status.isSuccess() )  {
    if ( handleDataFault(pRegistry) != 0 )  {
      return StatusCode::SUCCESS;
    }
  }
  if ( status.isSuccess() ) {
    log << MSG::VERBOSE << "Object " << pRegistry->identifier() << " successfully loaded" << endmsg;
  }
  return status;
}
StatusCode DataSvc::objectLeaves ( const IRegistry pRegistry,
std::vector< IRegistry * > &  refLeaves 
) [virtual]

IDataManagerSvc: Explore the object store: retrieve all leaves attached to the object.

IDataManagerSvc: Explore an object identified by the pointer to the registry entry.

Definition at line 244 of file DataSvc.cpp.

                                                                  {
  if ( checkRoot() )    {
    const RegEntry* node_entry = CAST_REGENTRY(const RegEntry*,pRegistry);
    if ( node_entry )   {
      leaves = node_entry->leaves();
      return StatusCode::SUCCESS;
    }
    return INVALID_OBJECT;
  }
  return INVALID_ROOT;
}
StatusCode DataSvc::objectLeaves ( const DataObject pObject,
std::vector< IRegistry * > &  refLeaves 
) [virtual]

IDataManagerSvc: Explore the object store: retrieve all leaves attached to the object.

IDataManagerSvc: Explore an object identified by its pointer.

Definition at line 233 of file DataSvc.cpp.

                                                                  {
  if ( pObject )    {
    return objectLeaves(pObject->registry(), leaves);
  }
  return INVALID_OBJECT;
}
StatusCode DataSvc::objectParent ( const DataObject pObject,
IRegistry *&  refpParent 
) [virtual]

IDataManagerSvc: Explore the object store: retrieve the object's parent.

Definition at line 211 of file DataSvc.cpp.

                                                           {
  if ( pObject )    {
    return objectParent(pObject->registry(), refpParent);
  }
  return INVALID_OBJECT;
}
StatusCode DataSvc::objectParent ( const IRegistry pRegistry,
IRegistry *&  refpParent 
) [virtual]

IDataManagerSvc: Explore the object store: retrieve the object's parent.

Definition at line 219 of file DataSvc.cpp.

                                                          {
  if ( checkRoot() )    {
    const RegEntry* node_entry = CAST_REGENTRY(const RegEntry*,pRegistry);
    if ( node_entry )   {
      refpParent = node_entry->parent();
      return StatusCode::SUCCESS;
    }
    return INVALID_OBJECT;
  }
  return INVALID_ROOT;
}
DataSvc& DataSvc::operator= ( const DataSvc  ) [private]

Fake assignment operator (never implemented).

StatusCode DataSvc::preLoad ( int  depth,
int  load_depth,
DataObject pObject 
) [virtual]

Execute one level of preloading and recursively load until the final level is reached.

Preload one level deep, then recursively call the next level.

Parameters:
depthcurrent level of loading from requested parent
load_depthmaximum level of object loading
pObjectpointer to next level root object
Returns:
Status code indicating success or failure.

Definition at line 1263 of file DataSvc.cpp.

                                                                             {
  //unused:  StatusCode sc = StatusCode::FAILURE;
  if ( 0 != pObject && depth++ < load_depth )    {
    RegEntry* dir = CAST_REGENTRY(RegEntry*,pObject->registry());
    if ( 0 != dir )   {
      for (RegEntry::Iterator i = dir->begin(); i != dir->end(); i++ )    {
        DataObject *pObj = 0;
        StatusCode status = retrieveObject(pObject, (*i)->name(), pObj);
        if ( status.isSuccess() && depth < load_depth )   {
          preLoad(depth, load_depth, pObj).ignore();
        }
      }
    }
  }
  return StatusCode::SUCCESS;
}
StatusCode DataSvc::preLoad (  ) [virtual]

load all preload items of the list

Definition at line 1281 of file DataSvc.cpp.

                              {
  DataObject* pObj = 0;
  for (LoadItems::iterator i = m_preLoads.begin(); i != m_preLoads.end(); i++) {
    StatusCode sc = retrieveObject( (*i).path(), pObj);
    int load_depth = (*i).depth();
    if ( sc.isSuccess() && load_depth > 1 )   {
      preLoad(1, load_depth, pObj).ignore();
    }
  }
  return StatusCode::SUCCESS;
}
StatusCode DataSvc::registerAddress ( DataObject parentObj,
const std::string objectPath,
IOpaqueAddress pAddress 
) [virtual]

IDataManagerSvc: Register object address with the data store.

Definition at line 271 of file DataSvc.cpp.

                                                                {
  IRegistry* pRegistry = (0 == parentObj) ? 0 : parentObj->registry();
  return registerAddress(pRegistry, objectPath, pAddress);
}
StatusCode DataSvc::registerAddress ( IRegistry parentObj,
const std::string objectPath,
IOpaqueAddress pAddress 
) [virtual]

IDataManagerSvc: Register object address with the data store.

Definition at line 279 of file DataSvc.cpp.

                                                                {
  if ( checkRoot() )  {
    if ( objPath.length() > 0 )   {
      if ( 0 == parentObj )   {
        if ( objPath[0] != SEPARATOR )    {
          return registerAddress(m_root, objPath, pAddress);
        }
        std::string::size_type sep = objPath.find(SEPARATOR,1);
        if ( sep != std::string::npos )    {
          std::string p_path (objPath, 0, sep);
          if ( p_path == m_rootName )   {
            std::string o_path (objPath, sep, objPath.length());
            return registerAddress(m_root, o_path, pAddress);
          }
        }
        return INVALID_PARENT;
      }
      if ( objPath[0] != SEPARATOR )    {
        std::string path;
        path  = SEPARATOR;
        path += objPath;
        return registerAddress(parentObj, path, pAddress);
      }
      RegEntry* par_entry = CAST_REGENTRY(RegEntry*,parentObj);
      if ( 0 != par_entry )   {
        std::string::size_type sep = objPath.rfind(SEPARATOR);
        if ( sep > 0 && sep != std::string::npos )    {
          std::string p_path (objPath, 0, sep);
          std::string o_path (objPath, sep, objPath.length());
          RegEntry* p_entry = par_entry->findLeaf(p_path);
          // Create default object leafs if the
          // intermediate nodes are not present
          if ( 0 == p_entry && m_forceLeaves )    {
            DataObject *pLeaf = createDefaultObject();
            StatusCode sc = registerObject(par_entry->identifier(),
                                           p_path,
                                           pLeaf);
            if ( ! sc.isSuccess() )   {
              delete pLeaf;
            }
            p_entry = par_entry->findLeaf(p_path);
          }
          if ( 0 != p_entry )  {
            return registerAddress(p_entry, o_path, pAddress);
          }
          return INVALID_PARENT;
        }
        StatusCode status = par_entry->add(objPath, pAddress);
        if ( status.isSuccess() )   {
          return status;
        }
        return DOUBL_OBJ_PATH;
      }
      return INVALID_PARENT;
    }
    return INVALID_OBJ_PATH;
  }
  return INVALID_ROOT;
}
StatusCode DataSvc::registerAddress ( const std::string fullPath,
IOpaqueAddress pAddress 
) [virtual]

IDataManagerSvc: Register object address with the data store.

Definition at line 258 of file DataSvc.cpp.

                                                                {
  if ( fullPath.length() > 0 )    {
    if ( fullPath[0] != SEPARATOR )   {
      return registerAddress(m_root, fullPath, pAddress);
    }
    IRegistry* pRegistry = 0;
    return registerAddress(pRegistry, fullPath, pAddress);
  }
  return INVALID_OBJ_PATH;
}
StatusCode DataSvc::registerObject ( const std::string parentPath,
const std::string objPath,
DataObject pObject 
) [virtual]

Register object with the data store.

Definition at line 415 of file DataSvc.cpp.

                                                           {
  DataObject* pO = 0;
  StatusCode status = retrieveObject(parentPath, pO);
  if ( !status.isSuccess() && m_forceLeaves )   {
    pO = createDefaultObject();
    status = registerObject(parentPath, pO);
    if ( !status.isSuccess() )   {
      pO->release();
    }
  }
  if ( status.isSuccess() )   {
    status = registerObject(pO, objPath, pObject);
  }
  return status;
}
StatusCode DataSvc::registerObject ( const std::string parentPath,
int  item,
DataObject pObject 
) [virtual]

Register object with the data store.

Definition at line 434 of file DataSvc.cpp.

                                                          {
  return registerObject(parentPath, itemToPath(item), pObject);
}
StatusCode DataSvc::registerObject ( DataObject parentObj,
const std::string objPath,
DataObject pObject 
) [virtual]

Register object with the data store.

Definition at line 448 of file DataSvc.cpp.

                                                          {
  if ( checkRoot() )  {
    if ( 0 == parentObj )   {
      if ( objPath.length() > 0 )   {
        if ( objPath[0] == SEPARATOR )    {
          std::string::size_type sep = objPath.find(SEPARATOR,1);
          if ( sep != std::string::npos )    {
            std::string p_path (objPath, 0, sep);
            std::string o_path (objPath, sep, objPath.length());
            return registerObject(p_path, o_path, pObject);
          }
        }
        else  {
          return registerObject(m_rootName, objPath, pObject);
        }
      }
      return INVALID_OBJ_PATH;
    }
    RegEntry* node_entry = CAST_REGENTRY(RegEntry*,parentObj->registry());
    if ( 0 != node_entry )   {
      StatusCode status = INVALID_PARENT;
      std::string::size_type sep = objPath.find(SEPARATOR,1);
      if ( sep != std::string::npos )    {
        std::string p_path (objPath, 0, sep);
        std::string o_path (objPath, sep, objPath.length());
        RegEntry* par_entry = node_entry->findLeaf(p_path);
        // Create default object leafs if the
        // intermediate nodes are not present
        if ( 0 == par_entry && m_forceLeaves )    {
          DataObject *pLeaf = createDefaultObject();
          StatusCode sc = registerObject(parentObj, p_path, pLeaf);
          if ( ! sc.isSuccess() )   {
            delete pLeaf;
          }
          par_entry = node_entry->findLeaf(p_path);
        }
        else if ( 0 != par_entry && par_entry->object() == 0 )  {
          status = retrieveEntry( node_entry, p_path, par_entry);
          if ( !status.isSuccess() && !par_entry->address() && m_forceLeaves )  {
            DataObject *pLeaf = createDefaultObject();
            StatusCode sc = registerObject(parentObj, p_path, pLeaf);
            if ( ! sc.isSuccess() )   {
              delete pLeaf;
            }
            par_entry = node_entry->findLeaf(p_path);
          }
        }
        node_entry = par_entry;
        if ( 0 != node_entry )    {
          DataObject* obj = node_entry->object();
          if ( 0 != obj )   {
            status = registerObject( obj, o_path, pObject );
          }
        }
      }
      else   {
        RegEntry* leaf = node_entry->findLeaf(objPath);
        if ( 0 == leaf )    {
          status = node_entry->add( objPath, pObject );
        }
        else    {
          DataObject* obj = leaf->object();
          if ( 0 == obj )    {
            if (0 == pObject) {
              MsgStream log(msgSvc(), name());
              log << MSG::ERROR
                  << "registerObject: trying to register null DataObject" << endmsg;
              return StatusCode::FAILURE;
            }
            else  {
              pObject->setRegistry(leaf);
            }
            leaf->setAddress(0);
            leaf->setObject(pObject);
            status = StatusCode::SUCCESS;
          }
          else  {
            status = DOUBL_OBJ_PATH;
          }
        }
      }
      return status;
    }
    return INVALID_PARENT;
  }
  return INVALID_ROOT;
}
StatusCode DataSvc::registerObject ( DataObject parentObj,
int  item,
DataObject pObject 
) [virtual]

Register object with the data store.

Definition at line 441 of file DataSvc.cpp.

                                                          {
  return registerObject(parentObj, itemToPath(item), pObject);
}
StatusCode DataSvc::registerObject ( const std::string fullPath,
DataObject pObject 
) [virtual]

Register object with the data store.

Definition at line 408 of file DataSvc.cpp.

                                                           {
  return registerObject(0, fullPath, pObject);
}
StatusCode DataSvc::reinitialize (  ) [virtual]

Service initialization.

Service reinitialization.

Reimplemented from Service.

Reimplemented in AIDATupleSvc, EvtDataSvc, RecordDataSvc, DetDataSvc, FastContainersSvc, HistogramSvc, and NTupleSvc.

Definition at line 1309 of file DataSvc.cpp.

                                    {
  StatusCode sc;
  // the finalize part is copied here
  setDataLoader(0).ignore();
  resetPreLoad().ignore();
  clearStore().ignore();
  if ( m_incidentSvc )  {
    m_incidentSvc->release();
    m_incidentSvc = 0;
  }
  // re-initialize the base class
  sc = Service::reinitialize();
  if (!sc.isSuccess()) {
    MsgStream log(msgSvc(), name());
    log << MSG::ERROR << "Unable to reinitialize base class" << endmsg;
    return sc;
  }
  // the initialize part is copied here
  sc = service("IncidentSvc", m_incidentSvc, true);
  if ( !sc.isSuccess() )  {
    MsgStream log(msgSvc(), name());
    log << MSG::ERROR << "Failed to access incident service." << endmsg;
    return sc;
  }
  // return
  return StatusCode::SUCCESS;
}
StatusCode DataSvc::removePreLoadItem ( const DataStoreItem item ) [virtual]

Remove an item from the preload list.

Definition at line 1242 of file DataSvc.cpp.

StatusCode DataSvc::removePreLoadItem ( const std::string itemPath ) [virtual]

Add an item to the preload list.

Definition at line 1252 of file DataSvc.cpp.

                                                                  {
  return removePreLoadItem( DataStoreItem(itemPath,1) );
}
StatusCode DataSvc::resetPreLoad (  ) [virtual]

Clear the preload list.

Definition at line 1257 of file DataSvc.cpp.

StatusCode DataSvc::retrieveEntry ( DataSvcHelpers::RegistryEntry pNode,
const std::string path,
DataSvcHelpers::RegistryEntry *&  pEntry 
) [protected]

Retrieve registry entry from store.

Definition at line 761 of file DataSvc.cpp.

                                                      {
  std::string::size_type        sep    = path.find(SEPARATOR,1);
  StatusCode status = StatusCode(INVALID_ROOT,true);
  pEntry = 0;
  // A.Valassi 16.08.2001 avoid core dump if store is empty
  if ( checkRoot() )  {
    if ( 0 == parentObj )    {
      if ( path.length() == 0 || path == m_rootName )   {
        return retrieveEntry(m_root, "", pEntry);
      }
      else if ( path[0] != SEPARATOR )  {
        return retrieveEntry(m_root, path, pEntry);
      }
      else if ( sep != std::string::npos )    {
        if ( m_root->object() == 0 )  {
          RegEntry* r = 0;
          status = retrieveEntry(m_root, "", r);
          if ( !status.isSuccess() )  {
            return status;
          }
        }
        std::string o_path (path, sep, path.length());
        return retrieveEntry(m_root, o_path, pEntry);
      }
      return INVALID_OBJ_PATH;
    }
    if ( sep != std::string::npos )  { // the string contains a separator (after pos 0)
      std::string p_path (path,0,sep);
      std::string o_path (path,sep,path.length());
      if (!parentObj->object()) { // if the parent object has not been loaded yet, load it now
        status = loadObject(parentObj);
        if ( !status.isSuccess() )  {
          return status;
        }
      }
      RegEntry* root_entry = parentObj->findLeaf(p_path);
      if ( !root_entry && m_enableFaultHdlr )    {
        // If not even the parent is there, an incident
        // to load the parent must be fired...
        handleDataFault(parentObj, p_path);
        root_entry = parentObj->findLeaf(p_path);
      }
      if ( root_entry )    {
        DataObject* pO = root_entry->object();
        if ( 0 == pO )  {
          // Object is not loaded: load the object if at all possible
          status = loadObject(root_entry);
          if ( !status.isSuccess() )  {
            return status;
          }
        }
        if ( root_entry->isSoft() )    {
          root_entry = CAST_REGENTRY(RegEntry*,pO->registry());
        }
        return retrieveEntry (root_entry, o_path, pEntry);
      }
      return status;
    }
    else if ( path.length() == 0 )    {
      pEntry = parentObj;
    }
    else {
      if (!parentObj->object()) { // if the parent object has not been loaded yet, load it now
        status = loadObject(parentObj);
        if ( !status.isSuccess() )  {
          return status;
        }
      }
      // last leave in search: find leaf and load
      pEntry = parentObj->findLeaf(path);
      // If no registry entry was found, trigger incident for action-on-demand
      if ( !pEntry && m_enableFaultHdlr )  {
        handleDataFault(parentObj, path);
        pEntry = (0==path.length()) ? parentObj : parentObj->findLeaf(path);
      }
    }
    // Check results and return
    if ( 0 == pEntry )  {
      status = INVALID_OBJ_PATH;
    }
    else if ( 0 == pEntry->object() )  {
      status = loadObject(pEntry);
    }
    else if ( m_enableAccessHdlr )  {
      // Fire data access incident
      // I do not know if this is a good idea....
      // This fires too often!
      //
      //DataIncident incident(name(), m_accessName, pEntry->identifier());
      //m_incidentSvc->fireIncident(incident);
      status = SUCCESS;
    }
    else  {
      status = SUCCESS;
    }
  }
  return status;
}
StatusCode DataSvc::retrieveObject ( IRegistry pDirectory,
const std::string path,
DataObject *&  pObject 
) [virtual]

Retrieve object from data store.

Retrieve object identified by its directory from the data store.

Definition at line 863 of file DataSvc.cpp.

                                                           {
  pObject = 0;
  RegEntry *result = 0, *parent = CAST_REGENTRY(RegEntry*,pRegistry);
  StatusCode status = retrieveEntry(parent, path, result);
  if ( status.isSuccess() )   {
    pObject = result->object();
  }
  return status;
}
StatusCode DataSvc::retrieveObject ( const std::string fullPath,
DataObject *&  pObject 
) [virtual]

Retrieve object identified by its full path from the data store.

Definition at line 876 of file DataSvc.cpp.

                                                           {
  IRegistry* nullDir = 0;
  return retrieveObject(nullDir, fullPath, pObject);
}
StatusCode DataSvc::retrieveObject ( const std::string parentPath,
const std::string objPath,
DataObject *&  pObject 
) [virtual]

Retrieve object from data store.

Retrieve object identified by its full path from the data store.

Definition at line 883 of file DataSvc.cpp.

                                                           {
  DataObject* parent = 0;
  StatusCode status = retrieveObject(parentPath, parent);
  if ( status.isSuccess() )   {
    status = retrieveObject (parent, objectPath, pObject);
  }
  return status;
}
StatusCode DataSvc::retrieveObject ( const std::string parentPath,
int  item,
DataObject *&  pObject 
) [virtual]

Retrieve object from data store.

Retrieve object identified by its full path from the data store.

Definition at line 895 of file DataSvc.cpp.

                                                           {
  return retrieveObject(parentPath, itemToPath(item), pObject);
}
StatusCode DataSvc::retrieveObject ( DataObject parentObj,
const std::string objPath,
DataObject *&  pObject 
) [virtual]

Retrieve object from data store.

Definition at line 902 of file DataSvc.cpp.

                                                          {
  IRegistry* pRegistry = (0==parentObj) ? 0 : parentObj->registry();
  return retrieveObject(pRegistry, path, pObject);
}
StatusCode DataSvc::retrieveObject ( DataObject parentObj,
int  item,
DataObject *&  pObject 
) [virtual]

Retrieve object from data store.

Retrieve registry entry from store.

Definition at line 910 of file DataSvc.cpp.

                                                          {
  return retrieveObject(parentObj, itemToPath(item), pObject);
}
CLID DataSvc::rootCLID (  ) const [virtual]

IDataManagerSvc: Accessor for root event CLID.

CLID for root Event.

Definition at line 1351 of file DataSvc.cpp.

                             {
  return( (CLID)m_rootCLID );
}
std::string DataSvc::rootName (  ) const [virtual]

IDataManagerSvc: Accessor for root event name.

Name for root Event.

Definition at line 1356 of file DataSvc.cpp.

                                  {
  return( m_rootName );
}
StatusCode DataSvc::setDataLoader ( IConversionSvc svc ) [virtual]

IDataManagerSvc: IDataManagerSvc: Pass a default data loader to the service.

IDataManagerSvc: Pass a default data loader to the service.

Definition at line 200 of file DataSvc.cpp.

                                                                {
  if ( 0 != pDataLoader  ) pDataLoader->addRef();
  if ( 0 != m_dataLoader ) m_dataLoader->release();
  if ( 0 != pDataLoader  )    {
    pDataLoader->setDataProvider(this).ignore();
  }
  m_dataLoader = pDataLoader;
  return SUCCESS;
}
StatusCode DataSvc::setRoot ( const std::string root_path,
IOpaqueAddress pRootAddr 
) [virtual]

Initialize data store for new event by giving new event path and address of root object.

Takes care to clear the store before reinitializing it

Definition at line 177 of file DataSvc.cpp.

                                                          {
  clearStore().ignore();
  return i_setRoot (root_path, pRootAddr);
}
StatusCode DataSvc::setRoot ( const std::string root_path,
DataObject pRootObj 
) [virtual]

Initialize data store for new event by giving new event path and root object.

Takes care to clear the store before reinitializing it

Definition at line 151 of file DataSvc.cpp.

                                                     {
  clearStore().ignore();
  return i_setRoot (root_path, pRootObj);
}
StatusCode DataSvc::traverseSubTree ( DataObject pObject,
IDataStoreAgent pAgent 
) [virtual]

IDataManagerSvc: Analyze by traversing all data objects below the sub tree.

IDataManagerSvc: Analyse by traversing all data objects below the sub tree.

Definition at line 127 of file DataSvc.cpp.

                                                                 {
  if ( checkRoot() )    {
    RegEntry* entry = CAST_REGENTRY(RegEntry*,pObject->registry());
    if ( 0 != entry )   {
      return entry->traverseTree(pAgent);
    }
    return INVALID_OBJECT;
  }
  return INVALID_ROOT;
}
StatusCode DataSvc::traverseSubTree ( const std::string sub_tree_path,
IDataStoreAgent pAgent 
) [virtual]

IDataManagerSvc: Analyze by traversing all data objects below the sub tree identified by its full path name.

IDataManagerSvc: Analyse by traversing all data objects below the sub tree identified by its full path name.

Definition at line 116 of file DataSvc.cpp.

                                                               {
  DataObject* pO = 0;
  StatusCode status = findObject(sub_tree_path, pO);
  if ( status.isSuccess() )   {
    status = traverseSubTree(pO, pAgent);
  }
  return status;
}
StatusCode DataSvc::traverseTree ( IDataStoreAgent pAgent ) [virtual]

IDataManagerSvc: Analyze by traversing all data objects in the data store.

IDataManagerSvc: Analyse by traversing all data objects in the data store.

Definition at line 140 of file DataSvc.cpp.

                                                          {
  if ( checkRoot() )    {
    return m_root->traverseTree(pAgent);
  }
  return INVALID_ROOT;
}
StatusCode DataSvc::unlinkObject ( DataObject fromObj,
const std::string objPath 
) [virtual]

Remove a link to another object.

Definition at line 1218 of file DataSvc.cpp.

                                                              {
  if ( checkRoot() )  {
    IRegistry* from_entry = m_root->findLeaf(from);
    return unlinkObject(from_entry, objPath);
  }
  return INVALID_ROOT;
}
StatusCode DataSvc::unlinkObject ( const std::string fullPath ) [virtual]

Remove a link to another object.

Definition at line 1193 of file DataSvc.cpp.

                                                             {
  if ( fullPath.length() > 0 )    {
    if ( fullPath[0] != SEPARATOR )   {
      return unlinkObject(m_rootName, fullPath);
    }
    std::string::size_type sep = fullPath.rfind(SEPARATOR);
    std::string objPath(fullPath, sep, fullPath.length());
    std::string fromPath(fullPath, 0, sep);
    return unlinkObject(fromPath, objPath);
  }
  return INVALID_OBJ_PATH;
}
StatusCode DataSvc::unlinkObject ( IRegistry from,
const std::string objPath 
) [virtual]

Remove a link to another object.

Definition at line 1161 of file DataSvc.cpp.

                                                              {
  if ( checkRoot() )  {
    try   {
      RegEntry* from_entry = CAST_REGENTRY(RegEntry*,from);
      if ( 0 != from_entry )    {
        std::string::size_type sep = objPath.rfind(SEPARATOR);
        if ( sep > 0 && sep != std::string::npos )    {  // in case the objPath is a sub-directory itself
          DataObject* pO = 0;
          std::string fromPath(objPath, 0, sep);
          StatusCode sc = findObject(from, fromPath, pO);
          if ( sc.isSuccess() )    {
            std::string toPath(objPath, sep, objPath.length());
            sc = unlinkObject(pO->registry(), toPath);
          }
          return sc;
        }
        StatusCode status = from_entry->remove( objPath );
        if ( status.isSuccess() )     {
          return status;
        }
        return INVALID_OBJ_PATH;
      }
    }
    catch (...)   {
    }
    return INVALID_PARENT;
  }
  return INVALID_ROOT;
}
StatusCode DataSvc::unlinkObject ( const std::string fromPath,
const std::string objPath 
) [virtual]

Remove a link to another object.

Definition at line 1207 of file DataSvc.cpp.

                                                              {
  DataObject* pObject = 0;
  StatusCode status = findObject(from, pObject);
  if ( status.isSuccess() )   {
    status = unlinkObject(pObject->registry(), objPath);
  }
  return status;
}
StatusCode DataSvc::unregisterAddress ( const std::string fullPath ) [virtual]

IDataManagerSvc: Unregister object address from the data store.

Definition at line 342 of file DataSvc.cpp.

                                                                  {
  if ( fullPath.length() > 0 )    {
    IRegistry* pRegistry = 0;
    if ( fullPath[0] != SEPARATOR )   {
      return unregisterAddress(m_root, fullPath);
    }
    return unregisterAddress(pRegistry, fullPath);
  }
  return INVALID_OBJ_PATH;
}
StatusCode DataSvc::unregisterAddress ( IRegistry pParent,
const std::string objPath 
) [virtual]

IDataManagerSvc: Unregister object address from the data store.

Definition at line 361 of file DataSvc.cpp.

                                                                  {
  if ( checkRoot() )  {
    if ( objPath.length() > 0 )   {
      if ( 0 == pParent )   {
        if ( objPath[0] != SEPARATOR )    {
          return unregisterAddress(m_root, objPath);
        }
        std::string::size_type sep = objPath.find(SEPARATOR,1);
        if ( sep != std::string::npos )    {
          std::string p_path (objPath, 0, sep);
          if ( p_path == m_rootName )   {
            std::string o_path (objPath, sep, objPath.length());
            return unregisterAddress(m_root, o_path);
          }
        }
        return INVALID_PARENT;
      }
      if ( objPath[0] != SEPARATOR )    {
        std::string path;
        path  = SEPARATOR;
        path += objPath;
        return unregisterAddress(pParent, path);
      }
      RegEntry* node_entry = CAST_REGENTRY(RegEntry*,pParent);
      if ( 0 != node_entry )   {
        RegEntry* leaf_entry = node_entry->findLeaf(objPath);
        if ( 0 != leaf_entry )    {
          std::string::size_type sep = objPath.rfind(SEPARATOR);
          if ( sep > 0 && sep != std::string::npos )    {
            std::string path = objPath.substr(sep);
            return unregisterAddress(leaf_entry->parent(), path);
          }
          StatusCode status = node_entry->remove(objPath);
          if ( status.isSuccess() )   {
            return status;
          }
        }
      }
      return INVALID_PARENT;
    }
    return INVALID_OBJ_PATH;
  }
  return INVALID_ROOT;
}
StatusCode DataSvc::unregisterAddress ( DataObject pParent,
const std::string objPath 
) [virtual]

IDataManagerSvc: Unregister object address from the data store.

Definition at line 354 of file DataSvc.cpp.

                                                                  {
  IRegistry* pRegistry = (0 == pParent) ? 0 : pParent->registry();
  return unregisterAddress(pRegistry, objPath);
}
StatusCode DataSvc::unregisterObject ( const std::string parentPath,
int  item 
) [virtual]

Unregister object from the data store.

Definition at line 575 of file DataSvc.cpp.

                                                                          {
  return unregisterObject(parentPath, itemToPath(item));
}
StatusCode DataSvc::unregisterObject ( const std::string fullPath ) [virtual]

Unregister object from the data store.

Definition at line 539 of file DataSvc.cpp.

                                                                {
  DataObject* pObject = 0;
  StatusCode status = findObject(fullPath, pObject);
  if ( status.isSuccess() )   {
    RegEntry* pEntry = CAST_REGENTRY(RegEntry*,pObject->registry());
    if ( 0 != pEntry )    {
      if ( pEntry->isEmpty() )    {
        RegEntry* pParent = pEntry->parentEntry();
        if ( 0 != pParent )   {
          if ( 0 != pObject )    {
            pObject->addRef();
          }
          pParent->remove(pEntry);
          return StatusCode::SUCCESS;
        }
        return INVALID_PARENT;
      }
      return DIR_NOT_EMPTY;
    }
    return INVALID_ROOT;
  }
  return status;
}
StatusCode DataSvc::unregisterObject ( DataObject pObject,
int  item 
) [virtual]

Unregister object from the data store.

Definition at line 633 of file DataSvc.cpp.

                                                                        {
  return unregisterObject(pParentObj, itemToPath(item));
}
StatusCode DataSvc::unregisterObject ( const std::string parentPath,
const std::string objectPath 
) [virtual]

Unregister object from the data store.

Definition at line 564 of file DataSvc.cpp.

                                                                 {
  DataObject* pO = 0;
  StatusCode status = findObject(parentPath, pO);
  if ( status.isSuccess() )   {
    status = unregisterObject(pO, objPath);
  }
  return status;
}
StatusCode DataSvc::unregisterObject ( DataObject pObject ) [virtual]

Unregister object from the data store.

Definition at line 580 of file DataSvc.cpp.

                                                           {
  if ( checkRoot() )  {
    RegEntry* entry = m_root->findLeaf(pObject);
    if ( 0 != entry )   {
      RegEntry* parent = entry->parentEntry();
      if ( 0 != parent )    {
        if ( entry->isEmpty() )    {
          if ( 0 != entry->object() )    {
            entry->object()->addRef();
          }
          if ( 0 != parent )  {
            parent->remove(entry);
          }
          return SUCCESS;
        }
        return INVALID_PARENT;
      }
      return DIR_NOT_EMPTY;
    }
    return INVALID_OBJECT;
  }
  return INVALID_ROOT;
}
StatusCode DataSvc::unregisterObject ( DataObject pObject,
const std::string objectPath 
) [virtual]

Unregister object from the data store.

Definition at line 605 of file DataSvc.cpp.

                                                                   {
  if ( checkRoot() )  {
    try   {
      RegEntry* parent = CAST_REGENTRY(RegEntry*,pParentObj->registry());
      if ( 0 != parent )   {
        RegEntry* entry = parent->findLeaf(objectPath);
        if ( 0 != entry )   {
          if ( entry->isEmpty() )    {
            if ( 0 != entry->object() )    {
              entry->object()->addRef();
            }
            parent->remove(entry);
            return SUCCESS;
          }
          return DIR_NOT_EMPTY;
        }
        return INVALID_OBJECT;
      }
    }
    catch(...) {
    }
    return INVALID_PARENT;
  }
  return INVALID_ROOT;
}
StatusCode DataSvc::updateObject ( DataObject toUpdate ) [virtual]

Update object.

Reimplemented in DetDataSvc.

Definition at line 1008 of file DataSvc.cpp.

                                                        {
  StatusCode status = INVALID_OBJ_ADDR;
  if ( 0 == toUpdate )  {                          // Precondition:
    return INVALID_OBJECT;                         // Address must be valid
  }
  IRegistry* pRegistry = toUpdate->registry();     // Precondition:
  if ( 0 == pRegistry )    {                       // Need valid registry
    return INVALID_OBJECT;
  }
  IOpaqueAddress* pAddress = pRegistry->address(); // Precondition:
  if ( 0 == pAddress )    {                        // Need valid address
    return INVALID_OBJ_ADDR;
  }
  IConversionSvc* pLoader = getDataLoader(pRegistry);
  if ( 0 == pLoader )   {                      // Precondition:
    return NO_DATA_LOADER;                     // Data loader must be present
  }
  if ( m_inhibitPathes.size() > 0 )   {
    const std::string& ident = pRegistry->identifier();
    std::vector<std::string>::iterator inhibit =
      std::find(m_inhibitPathes.begin(), m_inhibitPathes.end(), ident);
    if ( inhibit != m_inhibitPathes.end() )   {
      return NO_ACCESS;
    }
  }
  try   {
    status = pLoader->updateObj(pAddress, toUpdate);  // Call data loader
    if ( status.isSuccess() )   {
      status = pLoader->updateObjRefs(pAddress, toUpdate);
    }
  }
  catch( const GaudiException& exc ) {
    throw GaudiException("GaudiException in updateObject() " +
                         pRegistry->name(),
                         name(),
                         StatusCode::FAILURE, exc);
  }
  catch( const std::exception& x) {
    throw GaudiException("std::exception in updateObject() " +
                         pRegistry->name() + ": " +
                         System::typeinfoName(typeid(x)) + ", " +
                         x.what(),
                         name(), StatusCode::FAILURE);
  }
  catch(...) {
    throw GaudiException("UNKN exception in updateObject() " +
                         pRegistry->name(),
      name(), StatusCode::FAILURE);
  }
  return status;
}
StatusCode DataSvc::updateObject ( const std::string updatePath ) [virtual]

Update object.

Definition at line 986 of file DataSvc.cpp.

                                                              {
  DataObject* pO = 0;
  StatusCode status = findObject(updatePath, pO);
  if ( status.isSuccess() )   {
    return updateObject(pO);
  }
  return retrieveObject(updatePath, pO);
}
StatusCode DataSvc::updateObject ( const std::string parentPath,
const std::string updatePath 
) [virtual]

Update object.

Definition at line 1061 of file DataSvc.cpp.

                                                                 {
  DataObject* pParent = 0;
  StatusCode status = findObject(parentPath, pParent);
  if ( status.isSuccess() )   {
    status = updateObject( pParent, updatePath);
  }
  return status;
}
StatusCode DataSvc::updateObject ( DataObject pParent,
const std::string updatePath 
) [virtual]

Update object.

Definition at line 1072 of file DataSvc.cpp.

                                                                {
  DataObject* pObject = 0;
  StatusCode status = findObject(parent, updatePath, pObject);
  if ( status.isSuccess() )   {
    status = updateObject(pObject);
  }
  return status;
}
StatusCode DataSvc::updateObject ( IRegistry pDirectory ) [virtual]

Update object identified by its directory entry.

Update object.

Definition at line 996 of file DataSvc.cpp.

                                                        {
  if ( 0 == pRegistry )  {                     // Precondition:
    return INVALID_OBJ_ADDR;                   // Addres must be valid
  }
  DataObject* toUpdate = pRegistry->object();
  if ( 0 == toUpdate )  {                      // Try first to load
    return loadObject(pRegistry);
  }
  return updateObject(toUpdate);
}

Friends And Related Function Documentation

friend class SvcFactory< DataSvc > [friend]

The class creator is of course a friend!

Definition at line 45 of file DataSvc.h.


Member Data Documentation

Name of the data access incident.

Definition at line 75 of file DataSvc.h.

Pointer to data loader service.

Definition at line 57 of file DataSvc.h.

bool DataSvc::m_enableAccessHdlr [protected]

Flag to enable interrupts on data access requests.

Definition at line 65 of file DataSvc.h.

bool DataSvc::m_enableFaultHdlr [protected]

Flag to enable interrupts on data creation requests.

Definition at line 67 of file DataSvc.h.

Name of the data fault incident.

Definition at line 77 of file DataSvc.h.

bool DataSvc::m_forceLeaves [protected]

Allow forced creation of default leaves on registerObject.

Definition at line 63 of file DataSvc.h.

Pointer to incident service.

Definition at line 59 of file DataSvc.h.

DataSvcHelpers::InhibitMap* DataSvc::m_inhibitMap [protected]

Map with object paths to be inhibited from loading.

Definition at line 71 of file DataSvc.h.

Property for the inhibited leaves.

Definition at line 73 of file DataSvc.h.

Items to be pre-loaded.

Definition at line 61 of file DataSvc.h.

Pointer to root entry.

Definition at line 69 of file DataSvc.h.

Integer Property corresponding to CLID of root entry.

Definition at line 53 of file DataSvc.h.

Name of root event.

Definition at line 55 of file DataSvc.h.


The documentation for this class was generated from the following files:
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Defines

Generated at Tue May 10 2011 18:54:38 for Gaudi Framework, version v22r2 by Doxygen version 1.7.2 written by Dimitri van Heesch, © 1997-2004