Loading [MathJax]/extensions/tex2jax.js
The Gaudi Framework  v31r0 (aeb156f0)
All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Modules Pages
RecordDataSvc.cpp
Go to the documentation of this file.
1 //====================================================================
2 // RecordDataSvc.cpp
3 //--------------------------------------------------------------------
4 //
5 // Package : System ( The LHCb Offline System)
6 //
7 // Description: implementation of the Transient event data service.
8 //
9 // Author : M.Frank
10 // History :
11 // +---------+----------------------------------------------+---------
12 // | Date | Comment | Who
13 // +---------+----------------------------------------------+---------
14 // | 10/12/08| Initial version | MF
15 // +---------+----------------------------------------------+---------
16 //
17 //====================================================================
18 #define DATASVC_RECORDDATASVC_CPP
19 
21 #include "GaudiKernel/DataObject.h"
25 #include "GaudiKernel/IProperty.h"
28 #include "GaudiKernel/SmartIF.h"
29 
30 #include "RecordDataSvc.h"
31 using namespace std;
32 
33 // Instantiation of a static factory class used by clients to create
34 // instances of this service
36 
37 StatusCode RecordDataSvc::initialize() {
39  // Nothing to do: just call base class initialisation
41 
42  if ( !sc.isSuccess() ) { // Base class failure
43  return sc;
44  }
45  // Attach data loader facility
46  m_cnvSvc = service( m_persSvcName, true );
47  if ( !m_cnvSvc ) {
48  error() << "Failed to access RecordPersistencySvc." << endmsg;
49  return StatusCode::FAILURE;
50  }
51  auto prp = m_cnvSvc.as<IProperty>();
52  if ( prp ) {
53  // prp->setProperty();
54  }
55  sc = setDataLoader( m_cnvSvc.get() );
56  if ( !sc.isSuccess() ) {
57  error() << "Failed to attach dataloader RecordPersistencySvc." << endmsg;
58  return sc;
59  }
60 
61  sc = setRoot( m_rootName, new DataObject() );
62  if ( !sc.isSuccess() ) {
63  warning() << "Error declaring Record root DataObject" << endmsg;
64  return sc;
65  }
66 
67  if ( !m_incidentSvc ) {
68  fatal() << "IncidentSvc is invalid--base class failed." << endmsg;
69  return sc;
70  }
71 
76  m_incidentSvc->addListener( this, "FILE_OPEN_READ" );
77  m_incidentSvc->addListener( this, m_saveIncidentName );
78  return sc;
79 }
80 
83  if ( m_incidentSvc ) m_incidentSvc->removeListener( this );
84  m_cnvSvc.reset();
86  return StatusCode::SUCCESS;
87 }
88 
90 void RecordDataSvc::handle( const Incident& incident ) {
91  if ( incident.type() == "FILE_OPEN_READ" ) {
93  auto inc = dynamic_cast<const Ctxt*>( &incident );
94  if ( !inc ) {
95  always() << "Received invalid incident of type:" << incident.type() << endmsg;
96  } else {
97  registerRecord( inc->source(), inc->tag() );
98  if ( !m_incidentName.empty() ) {
99  auto incidents = m_incidents;
100  m_incidents.clear();
101  for ( const auto& i : incidents ) m_incidentSvc->fireIncident( Incident{i, m_incidentName} );
102  }
103  }
104  } else if ( incident.type() == m_saveIncidentName ) {
105  always() << "Saving records not implemented." << endmsg;
106  }
107 }
108 
111  if ( !pObj ) {
112  error() << "Failed to load records object" << endmsg;
113  } else {
114  vector<IRegistry*> leaves;
115  DataObject* p = nullptr;
116  const string& id0 = pObj->identifier();
117  StatusCode sc = retrieveObject( id0, p );
118  if ( sc.isSuccess() ) {
119  debug() << "Loaded records object: " << id0 << endmsg;
120  sc = objectLeaves( pObj, leaves );
121  if ( sc.isSuccess() ) {
122  for ( const auto& i : leaves ) loadRecords( i );
123  }
124  }
125  }
126 }
127 
129 void RecordDataSvc::registerRecord( const string& data, IOpaqueAddress* pAddr ) {
130  if ( !data.empty() && pAddr ) {
131  string fid = data;
132  debug() << "Request to load record for file " << fid << endmsg;
133  StatusCode sc = registerAddress( m_root.get(), fid, pAddr );
134  if ( !sc.isSuccess() ) {
135  warning() << "Failed to register record for:" << fid << endmsg;
136  pAddr->release();
137  return;
138  }
139  if ( m_autoLoad ) { loadRecords( pAddr->registry() ); }
140  m_incidents.push_back( pAddr->registry()->identifier() );
141  } else if ( !data.empty() && !pAddr ) {
142  info() << "Failed to register record for:" << data << " [Invalid Address]" << endmsg;
143  }
144 }
145 
147 RecordDataSvc::RecordDataSvc( const string& name, ISvcLocator* svc ) : base_class( name, svc ) {
148  m_rootName = "/Records";
149 }
StatusCode finalize() override
Service finalization.
T empty(T...args)
The ISvcLocator is the interface implemented by the Service Factory in the Application Manager to loc...
Definition: ISvcLocator.h:25
const std::string & type() const
Access to the incident type.
Definition: Incident.h:38
bool isSuccess() const
Definition: StatusCode.h:267
Gaudi::Property< std::string > m_rootName
Definition: DataSvc.h:52
virtual IRegistry * registry() const =0
Update branch name.
constexpr static const auto SUCCESS
Definition: StatusCode.h:85
STL namespace.
virtual unsigned long release()=0
release reference to object
A RecordDataSvc is the base class for event services.
Definition: RecordDataSvc.h:24
#define DECLARE_COMPONENT(type)
virtual const id_type & identifier() const =0
Full identifier (or key)
This class is used for returning status codes from appropriate routines.
Definition: StatusCode.h:50
void clear(STATE_TYPE _i=std::ios_base::failbit)
Definition: MsgStream.h:171
The IRegistry represents the entry door to the environment any data object residing in a transient da...
Definition: IRegistry.h:22
StatusCode finalize() override
Service initialization.
Definition: DataSvc.cpp:847
StatusCode initialize() override
Service initialization.
Definition: DataSvc.cpp:814
const StatusCode & ignore() const
Ignore/check StatusCode.
Definition: StatusCode.h:153
Base class for all Incidents (computing events).
Definition: Incident.h:17
constexpr static const auto FAILURE
Definition: StatusCode.h:86
RecordDataSvc(const std::string &name, ISvcLocator *svc)
Standard Constructor.
void handle(const Incident &incident) override
IIncidentListener override: Inform that a new incident has occured.
void registerRecord(const std::string &data, IOpaqueAddress *pAddr)
Load new record into the data store if necessary.
Opaque address interface definition.
The IProperty is the basic interface for all components which have properties that can be set or get...
Definition: IProperty.h:20
A DataObject is the base class of any identifiable object on any data store.
Definition: DataObject.h:30
MsgStream & endmsg(MsgStream &s)
MsgStream Modifier: endmsg. Calls the output method of the MsgStream.
Definition: MsgStream.h:192
void loadRecords(IRegistry *pReg)
Load dependent records into memory.