20 #define TSDATASVC_DATASVC_CPP 45 #define STD_LOCK_GUARD_MACRO std::lock_guard<tsDataSvcMutex> lock( m_accessMutex ); 56 s.append( sr.data(), sr.size() );
60 boost::string_ref::size_type find( boost::string_ref
s,
char c,
size_t o )
62 if ( !s.empty() ) s.remove_prefix( o );
64 return r == boost::string_ref::npos ? r : ( r + o );
67 std::string to_string( boost::string_ref sr ) {
return {sr.data(), sr.size()}; }
75 #define CAST_REGENTRY( x, y ) dynamic_cast<x>( y ) 79 #define ON_DEBUG if ( msgLevel( MSG::DEBUG ) ) 80 #define ON_VERBOSE if ( msgLevel( MSG::VERBOSE ) ) 82 #define DEBMSG ON_DEBUG debug() 83 #define VERMSG ON_VERBOSE verbose() 94 if ( !node_entry )
return Status::INVALID_OBJECT;
96 if ( !parent )
return Status::INVALID_PARENT;
97 parent->
remove( node_entry );
106 if ( !
checkRoot() )
return Status::INVALID_ROOT;
108 if ( !entry )
return Status::INVALID_OBJECT;
110 if ( !parent )
return Status::INVALID_PARENT;
118 if ( !
checkRoot() )
return Status::INVALID_ROOT;
139 if ( !
checkRoot() )
return Status::INVALID_ROOT;
141 if ( !entry )
return Status::INVALID_OBJECT;
149 if ( !
checkRoot() )
return Status::INVALID_ROOT;
208 if ( pDataLoader ) pDataLoader->
addRef();
221 if ( !pObject )
return Status::INVALID_OBJECT;
228 if ( !
checkRoot() )
return Status::INVALID_ROOT;
230 if ( !node_entry )
return Status::INVALID_OBJECT;
231 refpParent = node_entry->
parent();
239 if ( !pObject )
return Status::INVALID_OBJECT;
249 if ( !
checkRoot() )
return Status::INVALID_ROOT;
251 if ( !node_entry )
return Status::INVALID_OBJECT;
260 if ( fullPath.empty() )
return Status::INVALID_OBJ_PATH;
278 if ( !
checkRoot() )
return Status::INVALID_ROOT;
279 if ( objPath.empty() )
return Status::INVALID_OBJ_PATH;
284 auto sep = find( objPath,
SEPARATOR, 1 );
285 if ( sep == boost::string_ref::npos || objPath.substr( 0, sep ) !=
m_rootName.value() ) {
286 return Status::INVALID_PARENT;
294 if ( !par_entry )
return Status::INVALID_PARENT;
296 if ( sep > 0 && sep != boost::string_ref::npos ) {
297 auto p_path = objPath.substr( 0, sep );
298 auto o_path = objPath.substr( sep );
306 p_entry = par_entry->
findLeaf( p_path );
308 if ( !p_entry )
return Status::INVALID_PARENT;
311 StatusCode status = par_entry->
add( to_string( objPath ), pAddress );
312 return status.
isSuccess() ? status : Status::DOUBL_OBJ_PATH;
318 if ( fullPath.empty() )
return Status::INVALID_OBJ_PATH;
336 if ( !
checkRoot() )
return Status::INVALID_ROOT;
338 if ( objPath.empty() )
return Status::INVALID_OBJ_PATH;
343 auto sep = find( objPath,
SEPARATOR, 1 );
344 if ( sep == boost::string_ref::npos || objPath.substr( 0, sep ) !=
m_rootName.value() ) {
345 return Status::INVALID_PARENT;
357 if ( sep > 0 && sep != boost::string_ref::npos ) {
361 if ( status.isSuccess() )
return status;
364 return Status::INVALID_PARENT;
401 if ( !
checkRoot() )
return Status::INVALID_ROOT;
403 if ( !objPath.empty() ) {
407 auto sep = find( objPath,
SEPARATOR, 1 );
408 if ( sep != boost::string_ref::npos ) {
409 return registerObject( objPath.substr( 0, sep ), objPath.substr( sep ), pObject );
412 return Status::INVALID_OBJ_PATH;
417 auto sep = find( objPath,
SEPARATOR, 1 );
418 if ( sep != boost::string_ref::npos ) {
419 auto p_path = objPath.substr( 0, sep );
420 auto o_path = objPath.substr( sep );
428 par_entry = node_entry->
findLeaf( p_path );
429 }
else if ( par_entry && !par_entry->
object() ) {
435 par_entry = node_entry->
findLeaf( p_path );
438 node_entry = par_entry;
446 status = node_entry->
add( to_string( objPath ), pObject );
451 error() <<
"registerObject: trying to register null DataObject" <<
endmsg;
460 status = Status::DOUBL_OBJ_PATH;
466 return Status::INVALID_PARENT;
476 if ( !pEntry )
return Status::INVALID_ROOT;
477 if ( !pEntry->
isEmpty() )
return Status::DIR_NOT_EMPTY;
479 if ( !pParent )
return Status::INVALID_PARENT;
480 if ( pObject ) pObject->
addRef();
481 pParent->
remove( pEntry );
502 if ( !
checkRoot() )
return Status::INVALID_ROOT;
504 if ( !entry )
return Status::INVALID_OBJECT;
506 if ( !parent )
return Status::INVALID_PARENT;
507 if ( !entry->
isEmpty() )
return Status::DIR_NOT_EMPTY;
509 if ( parent ) parent->
remove( entry );
516 if ( !
checkRoot() )
return Status::INVALID_ROOT;
521 if ( !entry )
return Status::INVALID_OBJECT;
522 if ( !entry->
isEmpty() )
return Status::DIR_NOT_EMPTY;
529 return Status::INVALID_PARENT;
544 if ( pReg && path.empty() ) {
551 p.
append( path.data(), path.size() );
558 p.
append( path.data(), path.size() );
563 if ( pLeaf )
return pLeaf->
object();
589 return Status::NO_DATA_LOADER;
595 return Status::INVALID_OBJ_ADDR;
612 return Status::INVALID_OBJ_ADDR;
615 status = pLoader->
createObj( pAddress, pObject );
616 if ( status.isSuccess() ) {
624 status = pLoader->
fillObjRefs( pAddress, pObject );
639 if ( !status.isSuccess() ) {
661 if ( sep == boost::string_ref::npos )
return Status::INVALID_OBJ_PATH;
665 if ( !status.
isSuccess() )
return status;
669 if ( sep != boost::string_ref::npos ) {
670 auto p_path = path.substr( 0, sep );
671 auto o_path = path.substr( sep );
672 if ( !parentObj->
object() ) {
674 if ( !status.
isSuccess() )
return status;
681 root_entry = parentObj->
findLeaf( p_path );
688 if ( !status.
isSuccess() )
return status;
690 if ( root_entry->
isSoft() ) {
696 }
else if ( path.empty() ) {
699 if ( !parentObj->
object() ) {
701 if ( !status.
isSuccess() )
return status;
704 pEntry = parentObj->
findLeaf( path );
708 pEntry = ( path.empty() ? parentObj : parentObj->
findLeaf( path ) );
713 status = Status::INVALID_OBJ_PATH;
714 }
else if ( !pEntry->
object() ) {
784 if ( !path.empty() ) pReg = root_entry->
find( path );
785 if ( !pReg )
return Status::INVALID_OBJ_PATH;
788 return pObject ? Status::IDataProviderSvc_NO_ERROR : Status::OBJ_NOT_LOADED;
796 if ( !
checkRoot() )
return Status::INVALID_ROOT;
799 return !pObject ? Status::OBJ_NOT_LOADED : Status::IDataProviderSvc_NO_ERROR;
804 return findObject( static_cast<IRegistry*>(
nullptr ), path, pObject );
818 return findObject( parentPath, itemToPath( item ), pObject );
824 return findObject( parentObj, itemToPath( item ), pObject );
845 return Status::INVALID_OBJ_ADDR;
860 return Status::INVALID_OBJECT;
864 return Status::INVALID_OBJECT;
868 return Status::INVALID_OBJ_ADDR;
872 return Status::NO_DATA_LOADER;
880 status = pLoader->
updateObj( pAddress, toUpdate );
881 if ( status.isSuccess() ) {
887 throw GaudiException(
"std::exception in updateObject() " + pRegistry->
name() +
": " +
916 if ( !
checkRoot() )
return Status::INVALID_ROOT;
922 if ( !to_entry )
return Status::INVALID_OBJECT;
924 if ( sep > 0 && sep != boost::string_ref::npos ) {
930 StatusCode status = from_entry->
add( to_string( objPath ), to,
true );
931 return status.
isSuccess() ? Status::IDataProviderSvc_NO_ERROR : Status::DOUBL_OBJ_PATH;
935 return Status::INVALID_PARENT;
942 if ( fullPath.empty() )
return Status::INVALID_OBJ_PATH;
945 return linkObject( fullPath.substr( 0, sep ), fullPath.substr( sep ), to );
963 if ( from_entry )
return linkObject( from_entry, objPath, to );
965 return Status::INVALID_PARENT;
972 if ( !
checkRoot() )
return Status::INVALID_ROOT;
977 if ( sep > 0 && sep != boost::string_ref::npos ) {
983 return status.
isSuccess() ? status : Status::INVALID_OBJ_PATH;
987 return Status::INVALID_PARENT;
993 if ( fullPath.empty() )
return Status::INVALID_OBJ_PATH;
998 return unlinkObject( fullPath.substr( 0, sep ), fullPath.substr( sep ) );
1012 if ( !
checkRoot() )
return Status::INVALID_ROOT;
1055 if ( pObject && depth++ < load_depth ) {
1058 for (
const auto& i : *dir ) {
1061 if ( status.
isSuccess() && depth < load_depth ) {
1076 int load_depth = i.depth();
1077 if ( sc.
isSuccess() && load_depth > 1 ) {
1092 error() <<
"Failed to access incident service." <<
endmsg;
1112 error() <<
"Unable to reinitialize base class" <<
endmsg;
1118 error() <<
"Failed to access incident service." <<
endmsg;
constexpr static const auto FAILURE
StatusCode initialize() override
RegistryEntry * findLeaf(boost::string_ref path) const
Find identified leaf in this registry node.
Define general base for Gaudi exception.
DataObject * object() const override
Retrive object behind the link.
const std::string & name() const override
Retrieve name of the service.
virtual StatusCode createObj(IOpaqueAddress *pAddress, DataObject *&refpObject)=0
Create the transient representation of an object.
StatusCode setRoot(std::string root_name, DataObject *pRootObj) override
Initialize data store for new event by giving new event path and root object.
StatusCode finalize() override
StatusCode addPreLoadItem(const DataStoreItem &item) override
Add an item to the preload list.
StatusCode linkObject(IRegistry *from, boost::string_ref objPath, DataObject *to) override
Add a link to another object.
StatusCode unregisterObject(boost::string_ref fullPath) override
Unregister object from the data store.
GAUDI_API const std::string typeinfoName(const std::type_info &)
Get platform independent information about the class type.
StatusCode traverseTree(IDataStoreAgent *pAgent, int level=0)
traverse data tree
StatusCode traverseTree(IDataStoreAgent *pAgent) override
IDataManagerSvc: Analyze by traversing all data objects in the data store.
StatusCode updateObject(IRegistry *pDirectory) override
Update object identified by its directory entry.
StatusCode unregisterAddress(boost::string_ref fullPath) override
IDataManagerSvc: Unregister object address from the data store.
Gaudi::Property< std::string > m_accessName
Gaudi::Property< CLID > m_rootCLID
StatusCode retrieveObject(IRegistry *pDirectory, boost::string_ref path, DataObject *&pObject) override
Retrieve object from data store.
MsgStream & verbose() const
shortcut for the method msgStream(MSG::VERBOSE)
virtual StatusCode setDataProvider(IDataProviderSvc *pService)=0
Set Data provider service.
~TsDataSvc() override
Standard Destructor.
void setRegistry(IRegistry *pRegistry)
Set pointer to Registry.
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.
StatusCode removePreLoadItem(const DataStoreItem &item) override
Remove an item from the preload list.
virtual IConversionSvc * getDataLoader(IRegistry *pReg)
Retrieve customizable data loader according to registry entry to be retrieved.
const Store & leaves() const
Access the leaves of the object.
bool isSoft() const
Is the link soft or hard.
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...
Data provider interface definition.
void setAddress(IOpaqueAddress *pAddress) override
Set/Update Opaque address.
Description of the DataStoreItem class.
IRegistry * registry() const
Get pointer to Registry.
virtual StatusCode updateObj(IOpaqueAddress *pAddress, DataObject *refpObject)=0
Update the transient object from the other representation.
StatusCode resetPreLoad() override
Clear the preload list.
MsgStream & error() const
shortcut for the method msgStream(MSG::ERROR)
StatusCode registerAddress(boost::string_ref fullPath, IOpaqueAddress *pAddress) override
IDataManagerSvc: Register object address with the data store.
virtual unsigned long addRef()
Add reference to object.
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
StatusCode findObject(boost::string_ref fullPath, DataObject *&pObject) override
Find object identified by its full path in the data store.
IIncidentSvc * m_incidentSvc
Pointer to incident service.
virtual const id_type & identifier() const =0
Full identifier (or key)
DataSvcHelpers::RegistryEntry * m_root
Pointer to root entry.
This class is used for returning status codes from appropriate routines.
LoadItems m_preLoads
Items to be pre-loaded.
IRegistry * parent() const
Pointer to parent directory entry.
virtual StatusCode updateObjRefs(IOpaqueAddress *pAddress, DataObject *pObject)=0
Update the references of an updated transient object.
DataSvcHelpers::RegistryEntry RegEntry
void setDataSvc(IDataProviderSvc *s)
Set the transient data store.
const std::string & rootName() const override
IDataManagerSvc: Accessor for root event name.
Gaudi::Property< bool > m_enableAccessHdlr
StatusCode reinitialize() override
Service initialization.
StatusCode objectLeaves(const DataObject *pObject, std::vector< IRegistry * > &refLeaves) override
IDataManagerSvc: Explore the object store: retrieve all leaves attached to the object.
The IRegistry represents the entry door to the environment any data object residing in a transient da...
StatusCode unlinkObject(IRegistry *from, boost::string_ref objPath) override
Remove a link to another object.
StatusCode reinitialize() override
unsigned int CLID
Class ID definition.
IOpaqueAddress * address() const override
Retrieve opaque storage address.
StatusCode retrieveEntry(DataSvcHelpers::RegistryEntry *pNode, boost::string_ref path, DataSvcHelpers::RegistryEntry *&pEntry)
Retrieve registry entry from store.
constexpr static const auto SUCCESS
virtual DataObject * object() const =0
Retrieve object behind the link.
Definition of an entry in the transient data store.
virtual unsigned long release()
release reference to object
StatusCode add(std::string name, DataObject *pObject, bool is_soft=false)
Add entry to data store.
virtual DataObject * createDefaultObject() const
Create default objects in case forced creation of leaves is requested.
virtual StatusCode fillObjRefs(IOpaqueAddress *pAddress, DataObject *pObject)=0
Resolve the references of the created transient object.
virtual unsigned long release()=0
Release Interface instance.
StatusCode finalize() override
Service initialization.
Generic data agent interface.
StatusCode clearSubTree(boost::string_ref sub_tree_path) override
IDataManagerSvc: Remove all data objects below the sub tree identified by its full path name...
RegistryEntry * parentEntry()
Pointer to parent registry entry.
virtual StatusCode i_setRoot(std::string root_name, DataObject *pRootObj)
Initialize data store for new event by giving new event path and root object.
const StatusCode & ignore() const
Ignore/check StatusCode.
decltype(auto) operator+(const T &v, const Property< TP, V, H > &p)
implemantation of (value + property)
IRegistry * find(const IRegistry *obj) const
Try to find an object identified by its pointer.
const std::string & name() const
Retreive DataObject name. It is the name when registered in the store.
bool checkRoot()
Check if root path is valid.
virtual unsigned long addRef()=0
Increment the reference count of Interface instance.
StatusCode traverseSubTree(boost::string_ref sub_tree_path, IDataStoreAgent *pAgent) override
IDataManagerSvc: Analyze by traversing all data objects below the sub tree identified by its full pat...
Gaudi::Property< bool > m_forceLeaves
StatusCode service(const std::string &name, const T *&psvc, bool createIf=true) const
Access a service by name, creating it if it doesn't already exist.
const std::string & identifier() const override
Full identifier (or key)
StatusCode remove(boost::string_ref name)
Remove an entry from the store.
StatusCode clearStore() override
IDataManagerSvc: Remove all data objects in the data store.
bool isEmpty() const
Simple check if the Container is empty.
Data service incident class.
Opaque address interface definition.
CLID rootCLID() const override
IDataManagerSvc: Accessor for root event CLID.
virtual IOpaqueAddress * address() const =0
Retrieve opaque storage address.
Gaudi::Property< std::vector< std::string > > m_inhibitPathes
DataObject * handleDataFault(IRegistry *pReg, boost::string_ref path={})
Invoke data fault handling if enabled.
A DataObject is the base class of any identifiable object on any data store.
#define STD_LOCK_GUARD_MACRO
#define CAST_REGENTRY(x, y)
virtual StatusCode loadObject(IRegistry *pNode)
Invoke Persistency service to create transient object from its persistent representation.
StatusCode registerObject(boost::string_ref fullPath, DataObject *pObject) override
Register object with the data store.
StatusCode objectParent(const DataObject *pObject, IRegistry *&refpParent) override
IDataManagerSvc: Explore the object store: retrieve the object's parent.
MsgStream & endmsg(MsgStream &s)
MsgStream Modifier: endmsg. Calls the output method of the MsgStream.
Gaudi::Property< bool > m_enableFaultHdlr
Gaudi::Property< std::string > m_faultName
Gaudi::Property< std::string > m_rootName
void makeHard(DataObject *pObject)
Initialize link as hard link.