The Gaudi Framework  master (37c0b60a)
PersistencySvc.cpp
Go to the documentation of this file.
1 /***********************************************************************************\
2 * (c) Copyright 1998-2024 CERN for the benefit of the LHCb and ATLAS collaborations *
3 * *
4 * This software is distributed under the terms of the Apache version 2 licence, *
5 * copied verbatim in the file "LICENSE". *
6 * *
7 * In applying this licence, CERN does not waive the privileges and immunities *
8 * granted to it by virtue of its status as an Intergovernmental Organization *
9 * or submit itself to any jurisdiction. *
10 \***********************************************************************************/
11 #include "PersistencySvc.h"
12 #include <GaudiKernel/DataObject.h>
13 #include <GaudiKernel/IConverter.h>
18 #include <GaudiKernel/MsgStream.h>
19 #include <GaudiKernel/SmartIF.h>
21 #include <GaudiKernel/strcasecmp.h>
22 
24 
34 };
35 
36 StatusCode PersistencySvc::makeCall( int typ, IOpaqueAddress*& pAddress, DataObject*& pObject ) {
37  if ( m_enable ) {
38  IConversionSvc* svc = nullptr;
39  switch ( typ ) {
40  case CREATE_REP:
41  case FILL_REP_REFS:
42  case UPDATE_REP:
43  case UPDATE_REP_REFS:
44  svc = m_cnvDefault;
45  break;
46  default:
47  if ( !pAddress ) return Status::INVALID_ADDRESS;
48  svc = service( pAddress->svcType() );
49  if ( !svc ) return Status::BAD_STORAGE_TYPE;
50  break;
51  }
52 
54  switch ( typ ) {
55  case CREATE_OBJ:
56  pObject = nullptr;
57  status = svc->createObj( pAddress, pObject );
58  break;
59  case FILL_OBJ_REFS:
60  status = svc->fillObjRefs( pAddress, pObject );
61  break;
62  case UPDATE_OBJ:
63  status = svc->updateObj( pAddress, pObject );
64  break;
65  case UPDATE_OBJ_REFS:
66  status = svc->updateObjRefs( pAddress, pObject );
67  break;
68  case CREATE_REP:
69  status = svc->createRep( pObject, pAddress );
70  break;
71  case FILL_REP_REFS:
72  status = svc->fillRepRefs( pAddress, pObject );
73  break;
74  case UPDATE_REP:
75  status = svc->updateRep( pAddress, pObject );
76  break;
77  case UPDATE_REP_REFS:
78  status = svc->updateRepRefs( pAddress, pObject );
79  break;
80  default:
81  status = StatusCode::FAILURE;
82  break;
83  }
84  status.ignore();
85  return status;
86  }
87  return StatusCode::SUCCESS;
88 }
89 
92  return makeCall( CREATE_OBJ, pAddr, refpObj );
93 }
94 
97  return makeCall( FILL_OBJ_REFS, pAddr, pObj );
98 }
99 
102  return makeCall( UPDATE_OBJ, pAddr, pObj );
103 }
104 
107  return makeCall( UPDATE_OBJ_REFS, pAddr, pObj );
108 }
109 
112  return makeCall( CREATE_REP, refpAddr, pObj );
113 }
114 
117  return makeCall( FILL_REP_REFS, pAddr, pObj );
118 }
119 
122  return makeCall( UPDATE_REP, pAddr, pObj );
123 }
124 
127  return makeCall( UPDATE_REP_REFS, pAddr, pObj );
128 }
129 
132  std::scoped_lock _{ m_servicesMutex };
133 
134  long typ = type;
135  auto it = m_cnvServices.find( typ );
136  if ( it == m_cnvServices.end() ) {
138  if ( s ) {
139  it = m_cnvServices.find( typ );
140  if ( it != m_cnvServices.end() ) return it->second.addrCreator();
141  }
142  static SmartIF<IAddressCreator> no_creator;
143  return no_creator;
144  }
145  return it->second.addrCreator();
146 }
147 
150  std::scoped_lock _{ m_servicesMutex };
151  m_dataSvc = pDataSvc;
152  for ( auto& i : m_cnvServices ) { i.second.conversionSvc()->setDataProvider( m_dataSvc ).ignore(); }
153  return StatusCode::SUCCESS;
154 }
155 
158 
161  m_cnvDefault = svc;
162  return StatusCode::SUCCESS;
163 }
164 
167 
170 
173  if ( !pConverter ) return Status::NO_CONVERTER;
174  IConversionSvc* svc = service( pConverter->repSvcType() );
175  return svc ? svc->addConverter( pConverter ) : Status::BAD_STORAGE_TYPE;
176 }
177 
180  std::scoped_lock _{ m_servicesMutex };
181  // Remove converter type from all services
182  StatusCode status = Status::NO_CONVERTER, iret = StatusCode::SUCCESS;
183  for ( auto& i : m_cnvServices ) {
184  iret = i.second.conversionSvc()->removeConverter( clid );
185  if ( iret.isSuccess() ) status = iret;
186  }
187  return status;
188 }
189 
191 IConverter* PersistencySvc::converter( const CLID& /*clid*/ ) { return nullptr; }
192 
196 
197  std::scoped_lock _{ m_servicesMutex };
198 
200  [&]( Services::const_reference i ) { return i.second.service()->name() == tn.name(); } );
201  if ( it != m_cnvServices.end() ) return it->second.conversionSvc();
202 
203  auto svc = Service::service<IConversionSvc>( nam, true );
204  if ( svc && addCnvService( svc.get() ).isSuccess() ) {
205  return service( nam ); // now it is in the list
206  }
207 
208  error() << "Cannot access Conversion service " << nam << endmsg;
209  static SmartIF<IConversionSvc> no_svc;
210  return no_svc;
211 }
212 
215  std::scoped_lock _{ m_servicesMutex };
216  // Check wether this is already an active service
217  auto it = m_cnvServices.find( type );
218  if ( it != m_cnvServices.end() ) return it->second.conversionSvc();
219  // if not, check if the service is in the list and may be requested
220  for ( const auto& i : m_svcNames.value() ) {
221  auto& svc = service( i );
222  if ( svc && svc->repSvcType() == type ) return svc;
223  }
224  static SmartIF<IConversionSvc> no_svc;
225  return no_svc;
226 }
227 
230  std::scoped_lock _{ m_servicesMutex };
231  if ( !servc ) return Status::BAD_STORAGE_TYPE;
232  long type = servc->repSvcType();
233  long def_typ = ( m_cnvDefault ? m_cnvDefault->repSvcType() : 0 );
234  auto it = m_cnvServices.find( type );
235  auto cnv_svc = ( it != m_cnvServices.end() ? it->second.conversionSvc() : nullptr );
236  if ( type == def_typ ) m_cnvDefault = servc;
237  if ( cnv_svc == servc ) return StatusCode::SUCCESS;
238 
239  auto iservc = make_SmartIF( servc );
240  auto icr = iservc.as<IAddressCreator>();
241  if ( icr ) {
242  auto isvc = iservc.as<IService>();
243  if ( isvc ) {
244  if ( cnv_svc ) removeCnvService( type ).ignore();
245  auto p = m_cnvServices.emplace( type, ServiceEntry( type, isvc, iservc, icr ) );
246  if ( !p.second ) {
247  error() << "Cannot add Conversion service " << isvc->name() << endmsg;
248  return StatusCode::FAILURE;
249  }
250  info() << "Added successfully Conversion service " << isvc->name() << endmsg;
251  iservc->setAddressCreator( this ).ignore();
252  iservc->setDataProvider( m_dataSvc ).ignore();
253  return StatusCode::SUCCESS;
254  }
255  }
256  error() << "Cannot add Conversion service for type " << type << endmsg;
257  return StatusCode::FAILURE;
258 }
259 
262  std::scoped_lock _{ m_servicesMutex };
263 
264  auto it = m_cnvServices.find( svctype );
265  if ( it == m_cnvServices.end() ) return Status::BAD_STORAGE_TYPE;
266  it->second.service()->release();
267  it->second.addrCreator()->release();
268  m_cnvServices.erase( it );
269  return StatusCode::SUCCESS;
270 }
271 
273 long PersistencySvc::repSvcType() const { return m_cnvDefault ? m_cnvDefault->repSvcType() : 0; }
274 
278  return StatusCode::SUCCESS;
279 }
280 
282 StatusCode PersistencySvc::connectOutput( const std::string& outputFile, const std::string& /* openMode */ ) {
283  return connectOutput( outputFile );
284 }
285 
288 
291 
293 StatusCode PersistencySvc::createAddress( long svc_type, const CLID& clid, const std::string* pars,
294  const unsigned long* ipars, IOpaqueAddress*& refpAddress ) {
295  refpAddress = nullptr;
296  IAddressCreator* svc = addressCreator( svc_type );
297  return svc ? svc->createAddress( svc_type, clid, pars, ipars, refpAddress ) : Status::BAD_STORAGE_TYPE;
298 }
299 
302  // Assumption is that the Persistency service prepends a header
303  // and requests the conversion service referred to by the service
304  // type to encode the rest
305  long svc_type = 0;
306  CLID clid = 0;
307  if ( pAddress ) {
308  svc_type = pAddress->svcType();
309  clid = pAddress->clID();
310  }
311  IAddressCreator* svc = addressCreator( svc_type );
312  StatusCode status = Status::BAD_STORAGE_TYPE; // Preset error
313  refAddress.clear();
314 
315  if ( svc ) {
316  // Found service, set header
317  encodeAddrHdr( svc_type, clid, refAddress );
318  std::string address;
319  // Get rest of address from conversion service
320  status = svc->convertAddress( pAddress, address );
321  refAddress += address;
322  }
323  return status;
324 }
325 
327 StatusCode PersistencySvc::createAddress( long /* svc_type */, const CLID& /* clid */, const std::string& refAddress,
328  IOpaqueAddress*& refpAddress ) {
329  // Assumption is that the Persistency service decodes that header
330  // and requests the conversion service referred to by the service
331  // type to decode the rest
332  long new_svc_type = 0;
333  CLID new_clid = 0;
334  std::string address_trailer;
335  decodeAddrHdr( refAddress, new_svc_type, new_clid, address_trailer );
336  IAddressCreator* svc = addressCreator( new_svc_type );
337  return svc ? svc->createAddress( new_svc_type, new_clid, address_trailer, refpAddress ) : Status::BAD_STORAGE_TYPE;
338 }
339 
341 void PersistencySvc::encodeAddrHdr( long service_type, const CLID& clid, std::string& address ) const {
342  // For address header, use xml-style format of
343  // <addrhdr service_type="xxx" clid="yyy" />
345  int svctyp = service_type; // must put int into stream, not char
346  stream << "<address_header service_type=\"" << svctyp << "\" clid=\"" << clid << "\" /> ";
347  address = stream.str();
348 }
349 
351 void PersistencySvc::decodeAddrHdr( const std::string& address, long& service_type, CLID& clid,
352  std::string& address_trailer ) const {
353  // For address header, use xml-style format of
354  // <address_header service_type="xxx" clid="yyy" />
355  service_type = 0;
356  clid = 0;
357  address_trailer.clear();
358 
359  // Check for address_header tag
360  size_t pos = address.find( "<address_header" );
361  if ( std::string::npos != pos ) {
362  // Get service_type
363  pos = address.find( "service_type=\"" );
364  if ( std::string::npos != pos ) {
365  pos += 14;
366  size_t end = address.find( '"', pos );
367  if ( std::string::npos != end ) {
368  service_type = std::stol( address.substr( pos, end - pos ) );
369  // Get clid
370  pos = address.find( "clid=\"" );
371  if ( std::string::npos != pos ) {
372  pos += 6;
373  end = address.find( '\"', pos );
374  if ( std::string::npos != end ) {
375  std::istringstream str;
376  str.str( address.substr( pos, end - pos ) );
377  str >> clid;
378  // Get trailer_address
379  pos = address.find( '>' );
380  if ( pos < ( address.size() - 2 ) ) { // this means that '>' was found (pos != npos)
381  // it is before the last char
382  address_trailer = address.substr( pos + 1 );
383  }
384  }
385  }
386  }
387  }
388  }
389 }
390 
393  // The persistency service is an address creation dispatcher itself.
394  // The persistency service can NEVER create addresses itself.
395  // The entry point must only be provided in order to fulfill the needs of the
396  // implementing interfaces.
397  return StatusCode::FAILURE;
398 }
399 
402 
404 StatusCode PersistencySvc::getService( long service_type, IConversionSvc*& refpSvc ) {
405  refpSvc = service( service_type );
406  return refpSvc ? StatusCode::SUCCESS : StatusCode::FAILURE;
407 }
408 
411  const char* imp = service_type.c_str();
412  long len = service_type.length();
413  if ( ::strncasecmp( imp, "SICB", len ) == 0 )
414  return getService( SICB_StorageType, refpSvc );
415  else if ( ::strncasecmp( imp, "ZEBRA", len ) == 0 )
416  return getService( SICB_StorageType, refpSvc );
417  else if ( ::strncasecmp( imp, "MS Access", len ) == 0 )
418  return getService( ACCESS_StorageType, refpSvc );
419  else if ( ::strncasecmp( imp, "Microsoft Access", strlen( "Microsoft Access" ) ) == 0 )
420  return getService( ACCESS_StorageType, refpSvc );
421  else if ( ::strncasecmp( imp, "SQL Server", len ) == 0 )
422  return getService( SQLSERVER_StorageType, refpSvc );
423  else if ( ::strncasecmp( imp, "Microsoft ODBC for Oracle", len ) == 0 )
424  return getService( ORACLE_StorageType, refpSvc );
425  else if ( ::strncasecmp( imp, "Oracle ODBC", strlen( "Oracle ODBC" ) ) == 0 )
426  return getService( ORACLE_StorageType, refpSvc );
427  else if ( ::strncasecmp( imp, "Oracle OCI", strlen( "Oracle OCI" ) ) == 0 )
428  return getService( ORACLE_StorageType, refpSvc );
429  else if ( ::strncasecmp( imp, "MySQL", len ) == 0 )
430  return getService( MYSQL_StorageType, refpSvc );
431  else if ( ::strncasecmp( imp, "ROOT", len ) == 0 )
432  return getService( ROOT_StorageType, refpSvc );
433  else if ( ::strncasecmp( imp, "OBJY", len ) == 0 )
434  return getService( OBJY_StorageType, refpSvc );
435  else if ( ::strncasecmp( imp, "OBJYECTI", 7 ) == 0 )
436  return getService( OBJY_StorageType, refpSvc );
437  else if ( ::strncasecmp( imp, "POOL_ROOTKEY", 12 ) == 0 )
438  return getService( POOL_ROOTKEY_StorageType, refpSvc );
439  else if ( ::strncasecmp( imp, "POOL_ROOTTREE", 12 ) == 0 )
440  return getService( POOL_ROOTTREE_StorageType, refpSvc );
441  else if ( ::strncasecmp( imp, "POOL_ROOT", 9 ) == 0 )
442  return getService( POOL_ROOT_StorageType, refpSvc );
443  else if ( ::strncasecmp( imp, "POOL_MySQL", 8 ) == 0 )
444  return getService( POOL_MYSQL_StorageType, refpSvc );
445  else if ( ::strncasecmp( imp, "POOL_ORACLE", 8 ) == 0 )
446  return getService( POOL_ORACLE_StorageType, refpSvc );
447  else if ( ::strncasecmp( imp, "POOL_ACCESS", 8 ) == 0 )
448  return getService( POOL_ACCESS_StorageType, refpSvc );
449  else if ( ::strncasecmp( imp, "POOL", 4 ) == 0 )
450  return getService( POOL_StorageType, refpSvc );
451 
452  std::scoped_lock _{ m_servicesMutex };
453  for ( const auto& i : m_cnvServices ) {
454  SmartIF<IService> svc( i.second.conversionSvc() );
455  if ( svc ) {
456  // Check wether this is already an active service: first check by service name
457  if ( svc->name() == service_type ) {
458  refpSvc = i.second.conversionSvc();
459  return StatusCode::SUCCESS;
460  }
461  // Check wether this is already an active service: now check by service type
462  auto instance = svc.get();
463  if ( System::typeinfoName( typeid( *instance ) ) == service_type ) {
464  refpSvc = i.second.conversionSvc();
465  return StatusCode::SUCCESS;
466  }
467  }
468  }
469  // if not, check if the service is in the list and may be requested
470  for ( const auto& i : m_svcNames.value() ) {
472  if ( itm.name() == service_type || itm.type() == service_type ) {
473  IConversionSvc* svc = service( i );
474  if ( svc ) {
475  refpSvc = svc;
476  return StatusCode::SUCCESS;
477  }
478  }
479  }
480  return StatusCode::FAILURE;
481 }
482 
484 const CLID& PersistencySvc::objType() const { return CLID_NULL; }
485 
488  m_addrCreator = this; // initialize internal pointer to IAddressCreator interface
489  // Initialize basic service
490  StatusCode status = Service::initialize();
491  if ( !status.isSuccess() ) { error() << "Error initializing Service base class." << endmsg; }
492  return status;
493 }
494 
497  std::scoped_lock _{ m_servicesMutex };
498  // Release all workers
500  // Release references to this to avoid loops
501  m_addrCreator = nullptr;
502  return StatusCode::SUCCESS;
503 }
504 
506 bool PersistencySvc::enable( bool value ) {
507  std::swap( value, m_enable );
508  return value;
509 }
PersistencySvc::encodeAddrHdr
void encodeAddrHdr(long service_type, const CLID &clid, std::string &address) const
Retrieve string from storage type and clid.
Definition: PersistencySvc.cpp:341
IService
Definition: IService.h:28
PersistencySvc::commitOutput
StatusCode commitOutput(const std::string &output, bool do_commit) override
Commit pending output.
Definition: PersistencySvc.cpp:290
UPDATE_REP_REFS
@ UPDATE_REP_REFS
Definition: PersistencySvc.cpp:33
PersistencySvc
PersistencySvc class implementation definition.
Definition: PersistencySvc.h:57
PersistencySvc::createRep
StatusCode createRep(DataObject *pObject, IOpaqueAddress *&refpAddress) override
Implementation of IConverter: Convert the transient object to the requested representation.
Definition: PersistencySvc.cpp:111
PersistencySvc::finalize
StatusCode finalize() override
stop the service.
Definition: PersistencySvc.cpp:496
Write.stream
stream
Definition: Write.py:32
Service::initialize
StatusCode initialize() override
Definition: Service.cpp:118
IAddressCreator
Definition: IAddressCreator.h:38
PersistencySvc::ServiceEntry::conversionSvc
SmartIF< IConversionSvc > & conversionSvc() const
Definition: PersistencySvc.h:80
std::string
STL class.
Gaudi::Utils::TypeNameString::name
const std::string & name() const
Definition: TypeNameString.h:49
PersistencySvc::fillRepRefs
StatusCode fillRepRefs(IOpaqueAddress *pAddress, DataObject *pObject) override
Implementation of IConverter: Resolve the references of the converted object.
Definition: PersistencySvc.cpp:116
PersistencySvc::m_cnvDefault
SmartIF< IConversionSvc > m_cnvDefault
Default output service.
Definition: PersistencySvc.h:234
IConverter::fillRepRefs
virtual StatusCode fillRepRefs(IOpaqueAddress *pAddress, DataObject *pObject)=0
Resolve the references of the converted object.
PersistencySvc::updateObj
StatusCode updateObj(IOpaqueAddress *pAddress, DataObject *refpObject) override
Implementation of IConverter: Update the transient object from the other representation.
Definition: PersistencySvc.cpp:101
PersistencySvc::conversionSvc
SmartIF< IConversionSvc > & conversionSvc() const override
Get conversion service the converter is connected to.
Definition: PersistencySvc.cpp:166
StatusCode::isSuccess
bool isSuccess() const
Definition: StatusCode.h:314
IConverter::updateRepRefs
virtual StatusCode updateRepRefs(IOpaqueAddress *pAddress, DataObject *pObject)=0
Update the references of an already converted object.
CnvSvcAction
CnvSvcAction
Definition: PersistencySvc.cpp:25
CREATE_OBJ
@ CREATE_OBJ
Definition: PersistencySvc.cpp:26
gaudirun.s
string s
Definition: gaudirun.py:346
IOpaqueAddress
Definition: IOpaqueAddress.h:33
PersistencySvc::dataProvider
SmartIF< IDataProviderSvc > & dataProvider() const override
Access reference to transient datastore.
Definition: PersistencySvc.cpp:157
ACCESS_StorageType
const long ACCESS_StorageType
Definition: ClassID.h:70
std::map::find
T find(T... args)
strcasecmp.h
std::string::size
T size(T... args)
IOpaqueAddress::svcType
virtual long svcType() const =0
Retrieve service type.
MYSQL_StorageType
const long MYSQL_StorageType
Definition: ClassID.h:74
PersistencySvc::addCnvService
StatusCode addCnvService(IConversionSvc *service) override
Add a new Service.
Definition: PersistencySvc.cpp:229
PersistencySvc::decodeAddrHdr
void decodeAddrHdr(const std::string &address, long &service_type, CLID &clid, std::string &address_trailer) const
Retrieve storage type and clid from address header of string.
Definition: PersistencySvc.cpp:351
IAddressCreator::convertAddress
virtual StatusCode convertAddress(const IOpaqueAddress *pAddress, std::string &refAddress)=0
Convert an address to string form.
IConverter
Definition: IConverter.h:68
PersistencySvc::createAddress
StatusCode createAddress(long svc_type, const CLID &clid, const std::string *pars, const unsigned long *ipars, IOpaqueAddress *&refpAddress) override
Create a Generic address using explicit arguments to identify a single object.
Definition: PersistencySvc.cpp:293
PersistencySvc::removeCnvService
StatusCode removeCnvService(long type) override
Remove a Service.
Definition: PersistencySvc.cpp:261
PersistencySvc::createObj
StatusCode createObj(IOpaqueAddress *pAddress, DataObject *&refpObject) override
Implementation of IConverter: Create the transient representation of an object.
Definition: PersistencySvc.cpp:91
std::map::emplace
T emplace(T... args)
POOL_MYSQL_StorageType
const long POOL_MYSQL_StorageType
Definition: ClassID.h:82
std::stringstream
STL class.
std::istringstream
STL class.
IConverter::createObj
virtual StatusCode createObj(IOpaqueAddress *pAddress, DataObject *&refpObject)=0
Create the transient representation of an object.
System::typeinfoName
GAUDI_API const std::string typeinfoName(const std::type_info &)
Get platform independent information about the class type.
Definition: System.cpp:315
PersistencySvc::ServiceEntry::service
SmartIF< IService > & service() const
Definition: PersistencySvc.h:79
PersistencySvc::m_cnvServices
Services m_cnvServices
List of conversion workers.
Definition: PersistencySvc.h:229
IDataProviderSvc.h
std::string::clear
T clear(T... args)
FILL_OBJ_REFS
@ FILL_OBJ_REFS
Definition: PersistencySvc.cpp:27
PersistencySvc::setAddressCreator
StatusCode setAddressCreator(IAddressCreator *creator) override
Set address creator facility.
Definition: PersistencySvc.cpp:392
PersistencySvc::updateRepRefs
StatusCode updateRepRefs(IOpaqueAddress *pAddress, DataObject *pObject) override
Implementation of IConverter: Update the references of an already converted object.
Definition: PersistencySvc.cpp:126
SmartIF.h
std::stol
T stol(T... args)
Gaudi::Utils::TypeNameString
Helper class to parse a string of format "type/name".
Definition: TypeNameString.h:20
StatusCode
Definition: StatusCode.h:65
IConverter::createRep
virtual StatusCode createRep(DataObject *pObject, IOpaqueAddress *&refpAddress)=0
Convert the transient object to the requested representation.
PersistencySvc::m_dataSvc
SmartIF< IDataProviderSvc > m_dataSvc
Pointer to data provider service.
Definition: PersistencySvc.h:227
PersistencySvc::setDefaultCnvService
StatusCode setDefaultCnvService(long type) override
Set default service type.
Definition: PersistencySvc.cpp:276
IConverter::conversionSvc
virtual SmartIF< IConversionSvc > & conversionSvc() const =0
Get conversion service the converter is connected to.
PersistencySvc::service
SmartIF< IConversionSvc > & service(const std::string &nam)
Retrieve conversion service by name.
Definition: PersistencySvc.cpp:194
PersistencySvc::m_addrCreator
SmartIF< IAddressCreator > m_addrCreator
Pointer to the IAddressCreator interface of this, for addressCreator().
Definition: PersistencySvc.h:250
IDataSelector.h
PersistencySvc::ServiceEntry::addrCreator
SmartIF< IAddressCreator > & addrCreator() const
Definition: PersistencySvc.h:81
IOpaqueAddress.h
POOL_ROOT_StorageType
const long POOL_ROOT_StorageType
Definition: ClassID.h:78
std::string::c_str
T c_str(T... args)
CREATE_REP
@ CREATE_REP
Definition: PersistencySvc.cpp:30
POOL_ROOTKEY_StorageType
const long POOL_ROOTKEY_StorageType
Definition: ClassID.h:79
IConverter::updateObj
virtual StatusCode updateObj(IOpaqueAddress *pAddress, DataObject *refpObject)=0
Update the transient object from the other representation.
IOpaqueAddress::clID
virtual const CLID & clID() const =0
Retrieve class information from link.
Gaudi::Property::value
const ValueType & value() const
Definition: Property.h:237
PersistencySvc::converter
IConverter * converter(const CLID &clid) override
Retrieve converter from list.
Definition: PersistencySvc.cpp:191
POOL_ORACLE_StorageType
const long POOL_ORACLE_StorageType
Definition: ClassID.h:83
GaudiPython.Bindings.nullptr
nullptr
Definition: Bindings.py:87
PersistencySvc::addressCreator
SmartIF< IAddressCreator > & addressCreator() const override
Retrieve address creator facility.
Definition: PersistencySvc.cpp:401
std::map::erase
T erase(T... args)
POOL_StorageType
const long POOL_StorageType
Definition: ClassID.h:77
POOL_ACCESS_StorageType
const long POOL_ACCESS_StorageType
Definition: ClassID.h:81
SmartIF< IAddressCreator >
CLID
unsigned int CLID
Class ID definition.
Definition: ClassID.h:18
IConversionSvc::addConverter
virtual StatusCode addConverter(IConverter *pConverter)=0
Add converter object to conversion service.
PersistencySvc::connectOutput
StatusCode connectOutput(const std::string &outputFile, const std::string &openMode) override
Connect the output file to the service with open mode.
Definition: PersistencySvc.cpp:282
PersistencySvc::ServiceEntry
Definition: PersistencySvc.h:59
ORACLE_StorageType
const long ORACLE_StorageType
Definition: ClassID.h:75
endmsg
MsgStream & endmsg(MsgStream &s)
MsgStream Modifier: endmsg. Calls the output method of the MsgStream.
Definition: MsgStream.h:202
ROOT_StorageType
const long ROOT_StorageType
Definition: ClassID.h:62
PersistencySvc::m_svcNames
Gaudi::Property< std::vector< std::string > > m_svcNames
Definition: PersistencySvc.h:236
TypeNameString.h
Gaudi::Utils::TypeNameString::type
const std::string & type() const
Definition: TypeNameString.h:48
IConverter::repSvcType
virtual long repSvcType() const =0
Retrieve the class type of the data store the converter uses.
UPDATE_REP
@ UPDATE_REP
Definition: PersistencySvc.cpp:32
IConverter.h
StatusCode::ignore
const StatusCode & ignore() const
Allow discarding a StatusCode without warning.
Definition: StatusCode.h:139
std::swap
T swap(T... args)
std::string::substr
T substr(T... args)
PersistencySvc::initialize
StatusCode initialize() override
Initialize the service.
Definition: PersistencySvc.cpp:487
gaudirun.type
type
Definition: gaudirun.py:160
make_SmartIF
SmartIF< IFace > make_SmartIF(IFace *iface)
Definition: SmartIF.h:150
UPDATE_OBJ_REFS
@ UPDATE_OBJ_REFS
Definition: PersistencySvc.cpp:29
PersistencySvc::setConversionSvc
StatusCode setConversionSvc(IConversionSvc *svc) override
Set conversion service the converter is connected to.
Definition: PersistencySvc.cpp:160
StatusCode::SUCCESS
constexpr static const auto SUCCESS
Definition: StatusCode.h:100
SQLSERVER_StorageType
const long SQLSERVER_StorageType
Definition: ClassID.h:73
DataObject.h
SmartIF::get
TYPE * get() const
Get interface pointer.
Definition: SmartIF.h:86
IAddressCreator::createAddress
virtual StatusCode createAddress(long svc_type, const CLID &clid, const std::string *par, const unsigned long *ipar, IOpaqueAddress *&refpAddress)=0
Create a Generic address using explicit arguments to identify a single object.
IConverter::updateObjRefs
virtual StatusCode updateObjRefs(IOpaqueAddress *pAddress, DataObject *pObject)=0
Update the references of an updated transient object.
POOL_ROOTTREE_StorageType
const long POOL_ROOTTREE_StorageType
Definition: ClassID.h:80
PersistencySvc::makeCall
StatusCode makeCall(int typ, IOpaqueAddress *&pAddress, DataObject *&pObject)
Implementation helper.
Definition: PersistencySvc.cpp:36
std::map::begin
T begin(T... args)
IConverter::updateRep
virtual StatusCode updateRep(IOpaqueAddress *pAddress, DataObject *pObject)=0
Update the converted representation of a transient object.
PersistencySvc::removeConverter
StatusCode removeConverter(const CLID &clid) override
Remove converter object from conversion service (if present).
Definition: PersistencySvc.cpp:179
PersistencySvc::m_servicesMutex
std::recursive_mutex m_servicesMutex
Mutex to protect accesses to m_cnvServices.
Definition: PersistencySvc.h:231
DECLARE_COMPONENT
#define DECLARE_COMPONENT(type)
Definition: PluginServiceV1.h:46
PersistencySvc::addConverter
StatusCode addConverter(IConverter *pConverter) override
Add converter object to conversion service.
Definition: PersistencySvc.cpp:172
DataObject
Definition: DataObject.h:36
PersistencySvc::m_enable
bool m_enable
Flag to indicate that the service is enabled.
Definition: PersistencySvc.h:247
UPDATE_OBJ
@ UPDATE_OBJ
Definition: PersistencySvc.cpp:28
PersistencySvc::updateObjRefs
StatusCode updateObjRefs(IOpaqueAddress *pAddress, DataObject *pObject) override
Implementation of IConverter: Update the references of an updated transient object.
Definition: PersistencySvc.cpp:106
PersistencySvc::updateRep
StatusCode updateRep(IOpaqueAddress *pAddress, DataObject *pObject) override
Implementation of IConverter: Update the converted representation of a transient object.
Definition: PersistencySvc.cpp:121
std::istringstream::str
T str(T... args)
PersistencySvc::repSvcType
long repSvcType() const override
Return default service type.
Definition: PersistencySvc.cpp:273
PersistencySvc::fillObjRefs
StatusCode fillObjRefs(IOpaqueAddress *pAddress, DataObject *pObject) override
Implementation of IConverter: Resolve the references of the created transient object.
Definition: PersistencySvc.cpp:96
IConverter::fillObjRefs
virtual StatusCode fillObjRefs(IOpaqueAddress *pAddress, DataObject *pObject)=0
Resolve the references of the created transient object.
std::map::end
T end(T... args)
IDataProviderSvc
Definition: IDataProviderSvc.h:53
IOTest.end
end
Definition: IOTest.py:125
StatusCode::FAILURE
constexpr static const auto FAILURE
Definition: StatusCode.h:101
PersistencySvc::enable
bool enable(bool value)
Set enabled flag.
Definition: PersistencySvc.cpp:506
ISvcLocator.h
OBJY_StorageType
const long OBJY_StorageType
Definition: ClassID.h:63
PersistencySvc::convertAddress
StatusCode convertAddress(const IOpaqueAddress *pAddress, std::string &refAddress) override
Convert an address to string form.
Definition: PersistencySvc.cpp:301
SICB_StorageType
const long SICB_StorageType
Definition: ClassID.h:61
PersistencySvc::objType
const CLID & objType() const override
Retrieve the class type of objects the converter produces. (DUMMY)
Definition: PersistencySvc.cpp:484
FILL_REP_REFS
@ FILL_REP_REFS
Definition: PersistencySvc.cpp:31
MsgStream.h
PersistencySvc::setDataProvider
StatusCode setDataProvider(IDataProviderSvc *pStore) override
Define transient datastore.
Definition: PersistencySvc.cpp:149
PersistencySvc::getService
StatusCode getService(long service_type, IConversionSvc *&refpSvc) override
Retrieve conversion service identified by technology.
Definition: PersistencySvc.cpp:404
PersistencySvc.h
IConversionSvc
Definition: IConversionSvc.h:47