11#define DATASVC_DATASVC_CPP 
   26  std::string 
operator+( 
char c, std::string_view sr ) {
 
   28    s.append( sr.data(), sr.size() );
 
   32  std::string_view::size_type find( std::string_view s, 
char c, 
size_t o ) {
 
   33    if ( !s.empty() ) s.remove_prefix( o );
 
   35    return r == std::string_view::npos ? r : ( r + o );
 
   38  std::string to_string( std::string_view sr ) { 
return { sr.data(), sr.size() }; }
 
   46#define CAST_REGENTRY( x, y ) dynamic_cast<x>( y ) 
   50#define ON_DEBUG if ( msgLevel( MSG::DEBUG ) ) 
   51#define ON_VERBOSE if ( msgLevel( MSG::VERBOSE ) ) 
   53#define DEBMSG ON_DEBUG debug() 
   54#define VERMSG ON_VERBOSE verbose() 
   64  if ( !node_entry ) 
return Status::INVALID_OBJECT;
 
   66  if ( !parent ) 
return Status::INVALID_PARENT;
 
   67  parent->
remove( node_entry );
 
 
   75  if ( !
checkRoot() ) 
return Status::INVALID_ROOT;
 
   77  if ( !entry ) 
return Status::INVALID_OBJECT;
 
   79  if ( !parent ) 
return Status::INVALID_PARENT;
 
 
  102  return entry ? entry->
traverseTree( pAgent ) : Status::INVALID_OBJECT;
 
 
  107  if ( !
checkRoot() ) 
return Status::INVALID_ROOT;
 
  108  return m_root->traverseTree( pAgent );
 
 
  117  return i_setRoot( std::move( root_path ), pRootObj );
 
 
  127    m_root = std::make_unique<RegEntry>( std::move( root_path ) );
 
  128    m_root->makeHard( pRootObj );
 
  129    m_root->setDataSvc( 
this );
 
 
  141  return i_setRoot( std::move( root_path ), pRootAddr );
 
 
  151    m_root = std::make_unique<RegEntry>( std::move( root_path ) );
 
  152    m_root->makeHard( pRootAddr );
 
  153    m_root->setDataSvc( 
this );
 
 
  168  if ( !pObject ) 
return Status::INVALID_OBJECT;
 
 
  173  if ( !
checkRoot() ) 
return Status::INVALID_ROOT;
 
  175  if ( !node_entry ) 
return Status::INVALID_OBJECT;
 
  176  refpParent = node_entry->
parent();
 
 
  182  if ( !pObject ) 
return Status::INVALID_OBJECT;
 
 
  190  if ( !
checkRoot() ) 
return Status::INVALID_ROOT;
 
  192  if ( !node_entry ) 
return Status::INVALID_OBJECT;
 
  193  leaves = node_entry->
leaves();
 
 
  199  if ( fullPath.empty() ) 
return Status::INVALID_OBJ_PATH;
 
  200  return registerAddress( fullPath.front() != SEPARATOR ? 
m_root.get() : 
nullptr, fullPath, pAddress );
 
 
  205  if ( !
checkRoot() ) 
return Status::INVALID_ROOT;
 
  206  if ( objPath.empty() ) 
return Status::INVALID_OBJ_PATH;
 
  210    auto sep = find( objPath, SEPARATOR, 1 );
 
  211    if ( sep == std::string_view::npos || objPath.substr( 0, sep ) != 
m_rootName.value() ) {
 
  212      return Status::INVALID_PARENT;
 
  216  if ( objPath.front() != SEPARATOR ) { 
return registerAddress( parentObj, 
char( SEPARATOR ) + objPath, pAddress ); }
 
  218  if ( !par_entry ) 
return Status::INVALID_PARENT;
 
  220  auto sep = objPath.rfind( SEPARATOR );
 
  221  if ( sep > 0 && sep != std::string_view::npos ) {
 
  222    auto      p_path  = objPath.substr( 0, sep );
 
  223    auto      o_path  = objPath.substr( sep );
 
  231      p_entry = par_entry->
findLeaf( p_path );
 
  233    if ( !p_entry ) 
return Status::INVALID_PARENT;
 
  236  StatusCode status = par_entry->
add( to_string( objPath ), pAddress );
 
  237  return status.
isSuccess() ? status : Status::DOUBL_OBJ_PATH;
 
 
  242  if ( fullPath.empty() ) 
return Status::INVALID_OBJ_PATH;
 
 
  248  if ( !
checkRoot() ) 
return Status::INVALID_ROOT;
 
  249  if ( objPath.empty() ) 
return Status::INVALID_OBJ_PATH;
 
  253    auto sep = find( objPath, SEPARATOR, 1 );
 
  254    if ( sep != std::string_view::npos && objPath.substr( 0, sep ) == 
m_rootName.value() ) {
 
  257    return Status::INVALID_PARENT;
 
  259  if ( objPath.front() != SEPARATOR ) { 
return unregisterAddress( pParent, 
char( SEPARATOR ) + objPath ); }
 
  264      auto sep = objPath.rfind( SEPARATOR );
 
  265      if ( sep > 0 && sep != std::string_view::npos ) {
 
  272  return Status::INVALID_PARENT;
 
 
  289  if ( !
checkRoot() ) 
return Status::INVALID_ROOT;
 
  292    if ( !objPath.empty() ) {
 
  294      auto sep = find( objPath, SEPARATOR, 1 );
 
  295      if ( sep != std::string_view::npos ) {
 
  296        return registerObject( objPath.substr( 0, sep ), objPath.substr( sep ), pObject );
 
  299    return Status::INVALID_OBJ_PATH;
 
  304    auto       sep    = find( objPath, SEPARATOR, 1 );
 
  305    if ( sep != std::string_view::npos ) {
 
  306      auto      p_path    = objPath.substr( 0, sep );
 
  307      auto      o_path    = objPath.substr( sep );
 
  315        par_entry = node_entry->
findLeaf( p_path );
 
  316      } 
else if ( par_entry && !par_entry->
object() ) {
 
  322          par_entry = node_entry->
findLeaf( p_path );
 
  325      node_entry = par_entry;
 
  333        status = node_entry->
add( to_string( objPath ), pObject );
 
  338            error() << 
"registerObject: trying to register null DataObject" << 
endmsg;
 
  346          status = Status::DOUBL_OBJ_PATH;
 
  352  return Status::INVALID_PARENT;
 
 
 
  361  if ( !pEntry ) 
return Status::INVALID_ROOT;
 
  362  if ( !pEntry->
isEmpty() ) 
return Status::DIR_NOT_EMPTY;
 
  364  if ( !pParent ) 
return Status::INVALID_PARENT;
 
  366  pParent->
remove( pEntry );
 
 
  372  if ( !
checkRoot() ) 
return Status::INVALID_ROOT;
 
  374  if ( !entry ) 
return Status::INVALID_OBJECT;
 
  376  if ( !parent ) 
return Status::INVALID_PARENT;
 
  377  if ( !entry->
isEmpty() ) 
return Status::DIR_NOT_EMPTY;
 
  379  if ( parent ) parent->
remove( entry );
 
 
  396          return Status::DIR_NOT_EMPTY;
 
  398        return Status::INVALID_OBJECT;
 
  401    return Status::INVALID_PARENT;
 
  403  return Status::INVALID_ROOT;
 
 
  415    if ( pReg && path.empty() ) {
 
  422      if ( path.front() != SEPARATOR ) p += SEPARATOR;
 
  423      p.append( path.data(), path.size() );
 
  426      pLeaf = 
m_root->findLeaf( p );
 
  428      std::string p = 
m_root->identifier();
 
  429      if ( path.front() != SEPARATOR ) p += SEPARATOR;
 
  430      p.append( path.data(), path.size() );
 
  433      pLeaf = 
m_root->findLeaf( p );
 
  435    if ( pLeaf ) { 
return pLeaf->
object(); }
 
 
  474    return Status::INVALID_OBJ_ADDR; 
 
  477    status = pLoader->
createObj( pAddress, pObject ); 
 
  486      status = pLoader->
fillObjRefs( pAddress, pObject );
 
  492  } 
catch ( 
const std::exception& x ) {
 
 
  517  if ( !
checkRoot() ) 
return Status::INVALID_ROOT;
 
  519  static constexpr auto empty = std::string_view{};
 
  520  auto                  sep   = find( path, SEPARATOR, 1 );
 
  524    if ( path.empty() || path == 
m_rootName.value() ) {
 
  527    } 
else if ( path.front() != SEPARATOR ) {
 
  529    } 
else if ( sep != std::string_view::npos ) {
 
  530      if ( !
m_root->object() ) {
 
  533        if ( !status.isSuccess() ) 
return status;
 
  536      path      = path.substr( sep );
 
  538      return Status::INVALID_OBJ_PATH;
 
  540    sep = find( path, SEPARATOR, 1 );
 
  544  if ( sep != std::string_view::npos ) { 
 
  545    if ( !parentObj->
object() ) {        
 
  547      if ( !status.isSuccess() ) 
return status;
 
  549    auto      p_path     = path.substr( 0, sep );
 
  555      root_entry = parentObj->
findLeaf( p_path );
 
  562        if ( !status.isSuccess() ) 
return status;
 
  567    return Status::INVALID_OBJ_PATH;
 
  568  } 
else if ( path.empty() ) {
 
  571    if ( !parentObj->
object() ) { 
 
  573      if ( !status.isSuccess() ) 
return status;
 
  576    pEntry = parentObj->
findLeaf( path );
 
  580      pEntry = ( path.empty() ? parentObj : parentObj->
findLeaf( path ) );
 
  585  if ( !pEntry ) 
return Status::INVALID_OBJ_PATH;
 
 
  615    if ( !path.empty() ) pReg = root_entry->
find( path );
 
  616    if ( !pReg ) 
return Status::INVALID_OBJ_PATH;
 
  619  return ( !pObject ) ? Status::OBJ_NOT_LOADED : Status::IDataProviderSvc_NO_ERROR;
 
 
  625  if ( !
checkRoot() ) 
return Status::INVALID_ROOT;
 
  626  if ( path.empty() || path == 
m_rootName.value() ) {
 
  627    pObject = 
m_root->object();
 
  628    return !pObject ? Status::OBJ_NOT_LOADED : Status::IDataProviderSvc_NO_ERROR;
 
  630  return findObject( path.front() != SEPARATOR ? 
m_root.get() : 
nullptr, path, pObject );
 
 
  636    return Status::INVALID_OBJ_ADDR; 
 
 
  649    return Status::INVALID_OBJECT; 
 
  653    return Status::INVALID_OBJECT;
 
  657    return Status::INVALID_OBJ_ADDR;
 
  661    return Status::NO_DATA_LOADER; 
 
  668    status = pLoader->
updateObj( pAddress, toUpdate ); 
 
  672  } 
catch ( 
const std::exception& x ) {
 
  673    throw GaudiException( 
"std::exception in updateObject() " + pRegistry->
name() + 
": " +
 
 
  684  if ( !
checkRoot() ) 
return Status::INVALID_ROOT;
 
  690      if ( !to_entry ) 
return Status::INVALID_OBJECT;
 
  691      auto sep = objPath.rfind( SEPARATOR );
 
  692      if ( sep > 0 && sep != std::string_view::npos ) { 
 
  698      StatusCode status = from_entry->
add( to_string( objPath ), to, 
true );
 
  699      return status.
isSuccess() ? Status::IDataProviderSvc_NO_ERROR : Status::DOUBL_OBJ_PATH;
 
  702  return Status::INVALID_PARENT;
 
 
  707  if ( fullPath.empty() ) 
return Status::INVALID_OBJ_PATH;
 
  709  auto sep = fullPath.rfind( SEPARATOR );
 
  710  return linkObject( fullPath.substr( 0, sep ), fullPath.substr( sep ), to );
 
 
  715  if ( !
checkRoot() ) 
return Status::INVALID_ROOT;
 
  719      auto sep = objPath.rfind( SEPARATOR );
 
  720      if ( sep > 0 && sep != std::string_view::npos ) { 
 
  727      return Status::INVALID_OBJ_PATH;
 
  730  return Status::INVALID_PARENT;
 
 
  735  if ( fullPath.empty() ) 
return Status::INVALID_OBJ_PATH;
 
  737  auto sep = fullPath.rfind( SEPARATOR );
 
  738  return unlinkObject( fullPath.substr( 0, sep ), fullPath.substr( sep ) );
 
 
  743  if ( !
checkRoot() ) 
return Status::INVALID_ROOT;
 
 
  770  if ( pObject && depth++ < load_depth ) {
 
  773      for ( 
const auto& i : *dir ) {
 
 
  788    int        load_depth = i.depth();
 
 
  814    error() << 
"Unable to reinitialize base class" << 
endmsg;
 
  820    error() << 
"Failed to access incident service." << 
endmsg;
 
 
unsigned int CLID
Class ID definition.
DataSvcHelpers::RegistryEntry RegEntry
#define CAST_REGENTRY(x, y)
MsgStream & endmsg(MsgStream &s)
MsgStream Modifier: endmsg. Calls the output method of the MsgStream.
GAUDI_API Stat operator+(const Stat &stat, const double value)
external operator for addition of Stat and a number
MsgStream & error() const
shortcut for the method msgStream(MSG::ERROR)
MsgStream & verbose() const
shortcut for the method msgStream(MSG::VERBOSE)
Data service incident class.
A DataObject is the base class of any identifiable object on any data store.
virtual unsigned long addRef()
Add reference to object.
void setRegistry(IRegistry *pRegistry)
Set pointer to Registry.
const std::string & name() const
Retreive DataObject name. It is the name when registered in the store.
IRegistry * registry() const
Get pointer to Registry.
virtual unsigned long release()
release reference to object
Description of the DataStoreItem class.
Definition of an entry in the transient data store.
void setObject(DataObject *obj)
Set/Update object address.
StatusCode traverseTree(IDataStoreAgent *pAgent, int level=0)
traverse data tree
void setAddress(IOpaqueAddress *pAddress) override
Set/Update Opaque address.
IRegistry * parent() const
Pointer to parent directory entry.
const Store & leaves() const
Access the leaves of the object.
bool isSoft() const
Is the link soft or hard.
const std::string & identifier() const override
Full identifier (or key)
RegistryEntry * findLeaf(std::string_view path) const
Find identified leaf in this registry node.
IRegistry * find(const IRegistry *obj) const
Try to find an object identified by its pointer.
RegistryEntry * parentEntry()
Pointer to parent registry entry.
DataObject * object() const override
Retrive object behind the link.
bool isEmpty() const
Simple check if the Container is empty.
IOpaqueAddress * address() const override
Retrieve opaque storage address.
StatusCode remove(std::string_view name)
Remove an entry from the store.
StatusCode add(std::string name, DataObject *pObject, bool is_soft=false)
Add entry to data store.
StatusCode reinitialize() override
Service initialization.
StatusCode retrieveEntry(DataSvcHelpers::RegistryEntry *pNode, std::string_view path, DataSvcHelpers::RegistryEntry *&pEntry)
Retrieve registry entry from store.
StatusCode traverseSubTree(std::string_view sub_tree_path, IDataStoreAgent *pAgent) override
IDataManagerSvc: Analyze by traversing all data objects below the sub tree identified by its full pat...
StatusCode setRoot(std::string root_name, DataObject *pRootObj) override
Initialize data store for new event by giving new event path and root object.
virtual DataObject * createDefaultObject() const
Create default objects in case forced creation of leaves is requested.
StatusCode finalize() override
Service initialization.
Gaudi::Property< std::string > m_rootName
StatusCode findObject(std::string_view fullPath, DataObject *&pObject) override
Find object identified by its full path in the data store.
StatusCode resetPreLoad() override
Clear the preload list.
StatusCode clearSubTree(std::string_view sub_tree_path) override
IDataManagerSvc: Remove all data objects below the sub tree identified by its full path name.
virtual StatusCode i_setRoot(std::string root_name, DataObject *pRootObj)
Initialize data store for new event by giving new event path and root object.
virtual IConversionSvc * getDataLoader(IRegistry *pReg)
Retrieve customizable data loader according to registry entry to be retrieved.
SmartIF< IConversionSvc > m_dataLoader
Pointer to data loader service.
StatusCode setDataLoader(IConversionSvc *svc, IDataProviderSvc *dpsvc=nullptr) override
IDataManagerSvc: IDataManagerSvc: Pass a default data loader to the service and optionally a data pro...
StatusCode objectLeaves(const DataObject *pObject, std::vector< IRegistry * > &refLeaves) override
IDataManagerSvc: Explore the object store: retrieve all leaves attached to the object.
StatusCode initialize() override
Service initialization.
StatusCode unregisterAddress(std::string_view fullPath) override
IDataManagerSvc: Unregister object address from the data store.
SmartIF< IIncidentSvc > m_incidentSvc
Pointer to incident service.
StatusCode unregisterObject(std::string_view fullPath) override
Unregister object from the data store.
StatusCode registerObject(std::string_view parentPath, std::string_view objPath, DataObject *pObject) override
Register object with the data store.
StatusCode addPreLoadItem(const DataStoreItem &item) override
Add an item to the preload list.
DataObject * handleDataFault(IRegistry *pReg, std::string_view path="")
Invoke data fault handling if enabled.
DataObject * i_handleDataFault(IRegistry *pReg, std::string_view path=std::string_view{})
Gaudi::Property< std::vector< std::string > > m_inhibitPathes
Gaudi::Property< bool > m_enableAccessHdlr
Gaudi::Property< CLID > m_rootCLID
Gaudi::Property< std::string > m_accessName
StatusCode preLoad() override
load all preload items of the list
StatusCode retrieveObject(IRegistry *pDirectory, std::string_view path, DataObject *&pObject) override
Retrieve object from data store.
const std::string & rootName() const override
IDataManagerSvc: Accessor for root event name.
StatusCode registerAddress(std::string_view fullPath, IOpaqueAddress *pAddress) override
IDataManagerSvc: Register object address with the data store.
StatusCode traverseTree(IDataStoreAgent *pAgent) override
IDataManagerSvc: Analyze by traversing all data objects in the data store.
bool checkRoot()
Check if root path is valid.
CLID rootCLID() const override
IDataManagerSvc: Accessor for root event CLID.
StatusCode objectParent(const DataObject *pObject, IRegistry *&refpParent) override
IDataManagerSvc: Explore the object store: retrieve the object's parent.
StatusCode updateObject(IRegistry *pDirectory) override
Update object identified by its directory entry.
StatusCode removePreLoadItem(const DataStoreItem &item) override
Remove an item from the preload list.
Gaudi::Property< bool > m_forceLeaves
Gaudi::Property< bool > m_enableFaultHdlr
StatusCode clearStore() override
IDataManagerSvc: Remove all data objects in the data store.
StatusCode i_retrieveEntry(DataSvcHelpers::RegistryEntry *parentObj, std::string_view path, DataSvcHelpers::RegistryEntry *&pEntry)
Gaudi::Property< std::string > m_faultName
virtual StatusCode loadObject(IRegistry *pNode)
Invoke Persistency service to create transient object from its persistent representation.
std::vector< DataStoreItem > m_preLoads
Items to be pre-loaded.
StatusCode unlinkObject(IRegistry *from, std::string_view objPath) override
Remove a link to another object.
StatusCode linkObject(IRegistry *from, std::string_view objPath, DataObject *to) override
Add a link to another object.
std::unique_ptr< DataSvcHelpers::RegistryEntry > m_root
Pointer to root entry.
Define general base for Gaudi exception.
virtual StatusCode fillObjRefs(IOpaqueAddress *pAddress, DataObject *pObject)=0
Resolve the references of the created transient object.
virtual StatusCode updateObj(IOpaqueAddress *pAddress, DataObject *refpObject)=0
Update the transient object from the other representation.
virtual StatusCode createObj(IOpaqueAddress *pAddress, DataObject *&refpObject)=0
Create the transient representation of an object.
virtual StatusCode updateObjRefs(IOpaqueAddress *pAddress, DataObject *pObject)=0
Update the references of an updated transient object.
Data provider interface definition.
Generic data agent interface.
Opaque address interface definition.
The IRegistry represents the entry door to the environment any data object residing in a transient da...
virtual const name_type & name() const =0
Name of the directory (or key)
virtual const id_type & identifier() const =0
Full identifier (or key)
virtual DataObject * object() const =0
Retrieve object behind the link.
virtual IOpaqueAddress * address() const =0
Retrieve opaque storage address.
StatusCode finalize() override
const std::string & name() const override
Retrieve name of the service.
StatusCode reinitialize() override
SmartIF< IFace > service(const std::string &name, bool createIf=true) const
StatusCode initialize() override
This class is used for returning status codes from appropriate routines.
const StatusCode & ignore() const
Allow discarding a StatusCode without warning.
constexpr static const auto SUCCESS
constexpr static const auto FAILURE
GAUDI_API const std::string typeinfoName(const std::type_info &)
Get platform independent information about the class type.