The Gaudi Framework  v33r0 (d5ea422b)
PersistencySvc.cpp
Go to the documentation of this file.
1 /***********************************************************************************\
2 * (c) Copyright 1998-2019 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 //====================================================================
12 // PersistencySvc.cpp
13 //--------------------------------------------------------------------
14 //
15 // Package : System ( The LHCb Offline System)
16 //
17 // Description: implementation of the PersistencySvc
18 //
19 // Author : M.Frank
20 // History :
21 // +---------+----------------------------------------------+---------
22 // | Date | Comment | Who
23 // +---------+----------------------------------------------+---------
24 // | 29/10/98| Initial version | MF
25 // +---------+----------------------------------------------+---------
26 //
27 //====================================================================
28 #define PERSISTENCYSVC_PERSISTENCYSVC_CPP
29 
30 // Interface definitions
31 #include "GaudiKernel/DataObject.h"
32 #include "GaudiKernel/IConverter.h"
37 #include "GaudiKernel/MsgStream.h"
38 #include "GaudiKernel/SmartIF.h"
40 #include "GaudiKernel/strcasecmp.h"
41 
42 // Implementation specific definitions
43 #include "PersistencySvc.h"
44 
45 // Instantiation of a static factory class used by clients to create
46 // instances of this service
48 
58 };
59 
60 StatusCode PersistencySvc::makeCall( int typ, IOpaqueAddress*& pAddress, DataObject*& pObject ) {
61  if ( m_enable ) {
62  IConversionSvc* svc = nullptr;
63  switch ( typ ) {
64  case CREATE_REP:
65  case FILL_REP_REFS:
66  case UPDATE_REP:
67  case UPDATE_REP_REFS:
68  svc = m_cnvDefault;
69  break;
70  default:
71  if ( !pAddress ) return Status::INVALID_ADDRESS;
72  svc = service( pAddress->svcType() );
73  if ( !svc ) return Status::BAD_STORAGE_TYPE;
74  break;
75  }
76 
77  StatusCode status( StatusCode::FAILURE, true );
78  switch ( typ ) {
79  case CREATE_OBJ:
80  pObject = nullptr;
81  status = svc->createObj( pAddress, pObject );
82  break;
83  case FILL_OBJ_REFS:
84  status = svc->fillObjRefs( pAddress, pObject );
85  break;
86  case UPDATE_OBJ:
87  status = svc->updateObj( pAddress, pObject );
88  break;
89  case UPDATE_OBJ_REFS:
90  status = svc->updateObjRefs( pAddress, pObject );
91  break;
92  case CREATE_REP:
93  status = svc->createRep( pObject, pAddress );
94  break;
95  case FILL_REP_REFS:
96  status = svc->fillRepRefs( pAddress, pObject );
97  break;
98  case UPDATE_REP:
99  status = svc->updateRep( pAddress, pObject );
100  break;
101  case UPDATE_REP_REFS:
102  status = svc->updateRepRefs( pAddress, pObject );
103  break;
104  default:
105  status = StatusCode::FAILURE;
106  break;
107  }
108  status.ignore();
109  return status;
110  }
111  return StatusCode::SUCCESS;
112 }
113 
116  return makeCall( CREATE_OBJ, pAddr, refpObj );
117 }
118 
121  return makeCall( FILL_OBJ_REFS, pAddr, pObj );
122 }
123 
126  return makeCall( UPDATE_OBJ, pAddr, pObj );
127 }
128 
131  return makeCall( UPDATE_OBJ_REFS, pAddr, pObj );
132 }
133 
136  return makeCall( CREATE_REP, refpAddr, pObj );
137 }
138 
141  return makeCall( FILL_REP_REFS, pAddr, pObj );
142 }
143 
146  return makeCall( UPDATE_REP, pAddr, pObj );
147 }
148 
151  return makeCall( UPDATE_REP_REFS, pAddr, pObj );
152 }
153 
156  long typ = type;
157  auto it = m_cnvServices.find( typ );
158  if ( it == m_cnvServices.end() ) {
160  if ( s ) {
161  it = m_cnvServices.find( typ );
162  if ( it != m_cnvServices.end() ) return it->second.addrCreator();
163  }
164  static SmartIF<IAddressCreator> no_creator;
165  return no_creator;
166  }
167  return it->second.addrCreator();
168 }
169 
172  m_dataSvc = pDataSvc;
173  for ( auto& i : m_cnvServices ) { i.second.conversionSvc()->setDataProvider( m_dataSvc ).ignore(); }
174  return StatusCode( StatusCode::SUCCESS, true );
175 }
176 
179 
182  m_cnvDefault = svc;
183  return StatusCode( StatusCode::SUCCESS, true );
184 }
185 
188 
191 
194  if ( !pConverter ) return Status::NO_CONVERTER;
195  IConversionSvc* svc = service( pConverter->repSvcType() );
196  return svc ? svc->addConverter( pConverter ) : Status::BAD_STORAGE_TYPE;
197 }
198 
201  // Remove converter type from all services
202  StatusCode status = Status::NO_CONVERTER, iret = StatusCode::SUCCESS;
203  for ( auto& i : m_cnvServices ) {
204  iret = i.second.conversionSvc()->removeConverter( clid );
205  if ( iret.isSuccess() ) status = iret;
206  }
207  return status;
208 }
209 
211 IConverter* PersistencySvc::converter( const CLID& /*clid*/ ) { return nullptr; }
212 
217  [&]( Services::const_reference i ) { return i.second.service()->name() == tn.name(); } );
218  if ( it != m_cnvServices.end() ) return it->second.conversionSvc();
219 
220  auto svc = Service::service<IConversionSvc>( nam, true );
221  if ( svc && addCnvService( svc.get() ).isSuccess() ) {
222  return service( nam ); // now it is in the list
223  }
224 
225  info() << "Cannot access Conversion service:" << nam << endmsg;
226  static SmartIF<IConversionSvc> no_svc;
227  return no_svc;
228 }
229 
232  // Check wether this is already an active service
233  auto it = m_cnvServices.find( type );
234  if ( it != m_cnvServices.end() ) return it->second.conversionSvc();
235  // if not, check if the service is in the list and may be requested
236  for ( const auto& i : m_svcNames.value() ) {
237  auto& svc = service( i );
238  if ( svc && svc->repSvcType() == type ) return svc;
239  }
240  static SmartIF<IConversionSvc> no_svc;
241  return no_svc;
242 }
243 
246  if ( !servc ) return Status::BAD_STORAGE_TYPE;
247  long type = servc->repSvcType();
248  long def_typ = ( m_cnvDefault ? m_cnvDefault->repSvcType() : 0 );
249  auto it = m_cnvServices.find( type );
250  auto cnv_svc = ( it != m_cnvServices.end() ? it->second.conversionSvc() : nullptr );
251  if ( type == def_typ ) m_cnvDefault = servc;
252  if ( cnv_svc == servc ) return StatusCode::SUCCESS;
253 
254  auto iservc = make_SmartIF( servc );
255  auto icr = iservc.as<IAddressCreator>();
256  if ( icr ) {
257  auto isvc = iservc.as<IService>();
258  if ( isvc ) {
259  if ( cnv_svc ) removeCnvService( type ).ignore();
260  auto p = m_cnvServices.emplace( type, ServiceEntry( type, isvc, iservc, icr ) );
261  if ( !p.second ) {
262  info() << "Cannot add Conversion service of type " << isvc->name() << endmsg;
263  return StatusCode::FAILURE;
264  }
265  info() << "Added successfully Conversion service:" << isvc->name() << endmsg;
266  iservc->setAddressCreator( this ).ignore();
267  iservc->setDataProvider( m_dataSvc ).ignore();
268  return StatusCode::SUCCESS;
269  }
270  }
271  info() << "Cannot add Conversion service of type " << type << endmsg;
272  return StatusCode::FAILURE;
273 }
274 
277  auto it = m_cnvServices.find( svctype );
278  if ( it == m_cnvServices.end() ) return Status::BAD_STORAGE_TYPE;
279  it->second.service()->release();
280  it->second.addrCreator()->release();
281  m_cnvServices.erase( it );
282  return StatusCode::SUCCESS;
283 }
284 
287 
291  return StatusCode::SUCCESS;
292 }
293 
295 StatusCode PersistencySvc::connectOutput( const std::string& outputFile, const std::string& /* openMode */ ) {
296  return connectOutput( outputFile );
297 }
298 
301 
304 
306 StatusCode PersistencySvc::createAddress( long svc_type, const CLID& clid, const std::string* pars,
307  const unsigned long* ipars, IOpaqueAddress*& refpAddress ) {
308  refpAddress = nullptr;
309  IAddressCreator* svc = addressCreator( svc_type );
310  return svc ? svc->createAddress( svc_type, clid, pars, ipars, refpAddress ) : Status::BAD_STORAGE_TYPE;
311 }
312 
315  // Assumuption is that the Persistency service prepends a header
316  // and requests the conversion service refered to by the service
317  // type to encode the rest
318  long svc_type = 0;
319  CLID clid = 0;
320  if ( pAddress ) {
321  svc_type = pAddress->svcType();
322  clid = pAddress->clID();
323  }
324  IAddressCreator* svc = addressCreator( svc_type );
325  StatusCode status = Status::BAD_STORAGE_TYPE; // Preset error
326  refAddress.clear();
327 
328  if ( svc ) {
329  // Found service, set header
330  encodeAddrHdr( svc_type, clid, refAddress );
331  std::string address;
332  // Get rest of address from conversion service
333  status = svc->convertAddress( pAddress, address );
334  refAddress += address;
335  }
336  return status;
337 }
338 
340 StatusCode PersistencySvc::createAddress( long /* svc_type */, const CLID& /* clid */, const std::string& refAddress,
341  IOpaqueAddress*& refpAddress ) {
342  // Assumption is that the Persistency service decodes that header
343  // and requests the conversion service referred to by the service
344  // type to decode the rest
345  long new_svc_type = 0;
346  CLID new_clid = 0;
347  std::string address_trailer;
348  decodeAddrHdr( refAddress, new_svc_type, new_clid, address_trailer );
349  IAddressCreator* svc = addressCreator( new_svc_type );
350  return svc ? svc->createAddress( new_svc_type, new_clid, address_trailer, refpAddress ) : Status::BAD_STORAGE_TYPE;
351 }
352 
354 void PersistencySvc::encodeAddrHdr( long service_type, const CLID& clid, std::string& address ) const {
355  // For address header, use xml-style format of
356  // <addrhdr service_type="xxx" clid="yyy" />
357  std::stringstream stream;
358  int svctyp = service_type; // must put int into stream, not char
359  stream << "<address_header service_type=\"" << svctyp << "\" clid=\"" << clid << "\" /> ";
360  address = stream.str();
361 }
362 
364 void PersistencySvc::decodeAddrHdr( const std::string& address, long& service_type, CLID& clid,
365  std::string& address_trailer ) const {
366  // For address header, use xml-style format of
367  // <address_header service_type="xxx" clid="yyy" />
368  service_type = 0;
369  clid = 0;
370  address_trailer.clear();
371 
372  // Check for address_header tag
373  size_t pos = address.find( "<address_header" );
374  if ( std::string::npos != pos ) {
375  // Get service_type
376  pos = address.find( "service_type=\"" );
377  if ( std::string::npos != pos ) {
378  pos += 14;
379  size_t end = address.find( '"', pos );
380  if ( std::string::npos != end ) {
381  service_type = std::stol( address.substr( pos, end - pos ) );
382  // Get clid
383  pos = address.find( "clid=\"" );
384  if ( std::string::npos != pos ) {
385  pos += 6;
386  end = address.find( '\"', pos );
387  if ( std::string::npos != end ) {
388  std::istringstream str;
389  str.str( address.substr( pos, end - pos ) );
390  str >> clid;
391  // Get trailer_address
392  pos = address.find( '>' );
393  if ( pos < ( address.size() - 2 ) ) { // this means that '>' was found (pos != npos)
394  // it is before the last char
395  address_trailer = address.substr( pos + 1 );
396  }
397  }
398  }
399  }
400  }
401  }
402 }
403 
406  // The persistency service is a address creation dispatcher istelf.
407  // The persistency service can NEVER create addresses itself.
408  // The entry point must only be provided in order to fulfill the needs of the
409  // implementing interfaces.
410  return StatusCode::FAILURE;
411 }
412 
415 
417 StatusCode PersistencySvc::getService( long service_type, IConversionSvc*& refpSvc ) {
418  refpSvc = service( service_type );
419  return refpSvc ? StatusCode::SUCCESS : StatusCode::FAILURE;
420 }
421 
424  const char* imp = service_type.c_str();
425  long len = service_type.length();
426  if ( ::strncasecmp( imp, "SICB", len ) == 0 )
427  return getService( SICB_StorageType, refpSvc );
428  else if ( ::strncasecmp( imp, "ZEBRA", len ) == 0 )
429  return getService( SICB_StorageType, refpSvc );
430  else if ( ::strncasecmp( imp, "MS Access", len ) == 0 )
431  return getService( ACCESS_StorageType, refpSvc );
432  else if ( ::strncasecmp( imp, "Microsoft Access", strlen( "Microsoft Access" ) ) == 0 )
433  return getService( ACCESS_StorageType, refpSvc );
434  else if ( ::strncasecmp( imp, "SQL Server", len ) == 0 )
435  return getService( SQLSERVER_StorageType, refpSvc );
436  else if ( ::strncasecmp( imp, "Microsoft ODBC for Oracle", len ) == 0 )
437  return getService( ORACLE_StorageType, refpSvc );
438  else if ( ::strncasecmp( imp, "Oracle ODBC", strlen( "Oracle ODBC" ) ) == 0 )
439  return getService( ORACLE_StorageType, refpSvc );
440  else if ( ::strncasecmp( imp, "Oracle OCI", strlen( "Oracle OCI" ) ) == 0 )
441  return getService( ORACLE_StorageType, refpSvc );
442  else if ( ::strncasecmp( imp, "MySQL", len ) == 0 )
443  return getService( MYSQL_StorageType, refpSvc );
444  else if ( ::strncasecmp( imp, "ROOT", len ) == 0 )
445  return getService( ROOT_StorageType, refpSvc );
446  else if ( ::strncasecmp( imp, "OBJY", len ) == 0 )
447  return getService( OBJY_StorageType, refpSvc );
448  else if ( ::strncasecmp( imp, "OBJYECTI", 7 ) == 0 )
449  return getService( OBJY_StorageType, refpSvc );
450  else if ( ::strncasecmp( imp, "POOL_ROOTKEY", 12 ) == 0 )
451  return getService( POOL_ROOTKEY_StorageType, refpSvc );
452  else if ( ::strncasecmp( imp, "POOL_ROOTTREE", 12 ) == 0 )
453  return getService( POOL_ROOTTREE_StorageType, refpSvc );
454  else if ( ::strncasecmp( imp, "POOL_ROOT", 9 ) == 0 )
455  return getService( POOL_ROOT_StorageType, refpSvc );
456  else if ( ::strncasecmp( imp, "POOL_MySQL", 8 ) == 0 )
457  return getService( POOL_MYSQL_StorageType, refpSvc );
458  else if ( ::strncasecmp( imp, "POOL_ORACLE", 8 ) == 0 )
459  return getService( POOL_ORACLE_StorageType, refpSvc );
460  else if ( ::strncasecmp( imp, "POOL_ACCESS", 8 ) == 0 )
461  return getService( POOL_ACCESS_StorageType, refpSvc );
462  else if ( ::strncasecmp( imp, "POOL", 4 ) == 0 )
463  return getService( POOL_StorageType, refpSvc );
464 
465  for ( const auto& i : m_cnvServices ) {
466  SmartIF<IService> svc( i.second.conversionSvc() );
467  if ( svc ) {
468  // Check wether this is already an active service: first check by service name
469  if ( svc->name() == service_type ) {
470  refpSvc = i.second.conversionSvc();
471  return StatusCode::SUCCESS;
472  }
473  // Check wether this is already an active service: now check by service type
474  auto instance = svc.get();
475  if ( System::typeinfoName( typeid( *instance ) ) == service_type ) {
476  refpSvc = i.second.conversionSvc();
477  return StatusCode::SUCCESS;
478  }
479  }
480  }
481  // if not, check if the service is in the list and may be requested
482  for ( const auto& i : m_svcNames.value() ) {
484  if ( itm.name() == service_type || itm.type() == service_type ) {
485  IConversionSvc* svc = service( i );
486  if ( svc ) {
487  refpSvc = svc;
488  return StatusCode::SUCCESS;
489  }
490  }
491  }
492  return StatusCode::FAILURE;
493 }
494 
496 const CLID& PersistencySvc::objType() const { return CLID_NULL; }
497 
500  m_addrCreator = this; // initialize internal pointer to IAddressCreator interface
501  // Initialize basic service
502  StatusCode status = Service::initialize();
503  if ( UNLIKELY( !status.isSuccess() ) ) { error() << "Error initializing Service base class." << endmsg; }
504  return status;
505 }
506 
509  // Release all workers
511  // Release references to this to avoid loops
512  m_addrCreator = nullptr;
513  return StatusCode::SUCCESS;
514 }
515 
517 bool PersistencySvc::enable( bool value ) {
518  std::swap( value, m_enable );
519  return value;
520 }
SmartIF< IAddressCreator > m_addrCreator
Pointer to the IAddressCreator interface of this, for addressCreator().
SmartIF< IAddressCreator > & addressCreator() const override
Retrieve address creator facility.
#define UNLIKELY(x)
Definition: Kernel.h:106
SmartIF< IConversionSvc > & service(const std::string &nam)
Retrieve conversion service by name.
StatusCode initialize() override
Definition: Service.cpp:70
The data converters are responsible to translate data from one representation into another.
Definition: IConverter.h:68
virtual StatusCode createObj(IOpaqueAddress *pAddress, DataObject *&refpObject)=0
Create the transient representation of an object.
StatusCode initialize() override
Initialize the service.
SmartIF< IAddressCreator > & addrCreator() const
StatusCode connectOutput(const std::string &outputFile, const std::string &openMode) override
Connect the output file to the service with open mode.
GAUDI_API const std::string typeinfoName(const std::type_info &)
Get platform independent information about the class type.
Definition: System.cpp:308
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.
T swap(T... args)
Gaudi::Property< std::vector< std::string > > m_svcNames
const long ACCESS_StorageType
Definition: ClassID.h:70
IAddressCreator interface definition.
bool m_enable
Flag to indicate that the service is enabled.
constexpr static const auto SUCCESS
Definition: StatusCode.h:96
StatusCode setConversionSvc(IConversionSvc *svc) override
Set conversion service the converter is connected to.
virtual StatusCode addConverter(IConverter *pConverter)=0
Add converter object to conversion service.
virtual SmartIF< IConversionSvc > & conversionSvc() const =0
Get conversion service the converter is connected to.
StatusCode makeCall(int typ, IOpaqueAddress *&pAddress, DataObject *&pObject)
Implementation helper.
const std::string & type() const
T end(T... args)
virtual StatusCode createRep(DataObject *pObject, IOpaqueAddress *&refpAddress)=0
Convert the transient object to the requested representation.
const long MYSQL_StorageType
Definition: ClassID.h:74
MsgStream & info() const
shortcut for the method msgStream(MSG::INFO)
Data provider interface definition.
StatusCode removeConverter(const CLID &clid) override
Remove converter object from conversion service (if present).
virtual long svcType() const =0
Retrieve service type.
virtual StatusCode updateRepRefs(IOpaqueAddress *pAddress, DataObject *pObject)=0
Update the references of an already converted object.
const long POOL_MYSQL_StorageType
Definition: ClassID.h:82
StatusCode updateRep(IOpaqueAddress *pAddress, DataObject *pObject) override
Implementation of IConverter: Update the converted representation of a transient object.
StatusCode updateObjRefs(IOpaqueAddress *pAddress, DataObject *pObject) override
Implementation of IConverter: Update the references of an updated transient object.
StatusCode addConverter(IConverter *pConverter) override
Add converter object to conversion service.
virtual StatusCode updateObj(IOpaqueAddress *pAddress, DataObject *refpObject)=0
Update the transient object from the other representation.
StatusCode convertAddress(const IOpaqueAddress *pAddress, std::string &refAddress) override
Convert an address to string form.
STL class.
const long POOL_ROOTKEY_StorageType
Definition: ClassID.h:79
long repSvcType() const override
Return default service type.
#define DECLARE_COMPONENT(type)
StatusCode fillObjRefs(IOpaqueAddress *pAddress, DataObject *pObject) override
Implementation of IConverter: Resolve the references of the created transient object.
bool enable(bool value)
Set enabled flag.
MsgStream & error() const
shortcut for the method msgStream(MSG::ERROR)
StatusCode setDataProvider(IDataProviderSvc *pStore) override
Define transient datastore.
const long POOL_ACCESS_StorageType
Definition: ClassID.h:81
Helper class to parse a string of format "type/name".
virtual const CLID & clID() const =0
Retrieve class information from link.
const CLID & objType() const override
Retrieve the class type of objects the converter produces. (DUMMY)
virtual long repSvcType() const =0
Retrieve the class type of the data store the converter uses.
General service interface definition.
Definition: IService.h:28
const std::string & name() const
This class is used for returning status codes from appropriate routines.
Definition: StatusCode.h:61
StatusCode createRep(DataObject *pObject, IOpaqueAddress *&refpAddress) override
Implementation of IConverter: Convert the transient object to the requested representation.
StatusCode finalize() override
stop the service.
virtual StatusCode updateObjRefs(IOpaqueAddress *pAddress, DataObject *pObject)=0
Update the references of an updated transient object.
StatusCode getService(long service_type, IConversionSvc *&refpSvc) override
Retrieve conversion service identified by technology.
T erase(T... args)
void encodeAddrHdr(long service_type, const CLID &clid, std::string &address) const
Retrieve string from storage type and clid.
CnvSvcAction
const long POOL_ORACLE_StorageType
Definition: ClassID.h:83
SmartIF< IConversionSvc > m_cnvDefault
Default output service.
StatusCode commitOutput(const std::string &output, bool do_commit) override
Commit pending output.
T str(T... args)
PersistencySvc class implementation definition.
const long ROOT_StorageType
Definition: ClassID.h:62
StatusCode fillRepRefs(IOpaqueAddress *pAddress, DataObject *pObject) override
Implementation of IConverter: Resolve the references of the converted object.
def end
Definition: IOTest.py:123
virtual StatusCode updateRep(IOpaqueAddress *pAddress, DataObject *pObject)=0
Update the converted representation of a transient object.
unsigned int CLID
Class ID definition.
Definition: ClassID.h:18
T clear(T... args)
bool isSuccess() const
Definition: StatusCode.h:361
const long ORACLE_StorageType
Definition: ClassID.h:75
const long POOL_ROOT_StorageType
Definition: ClassID.h:78
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.
StatusCode addCnvService(IConversionSvc *service) override
Add a new Service.
StatusCode removeCnvService(long type) override
Remove a Service.
StatusCode updateObj(IOpaqueAddress *pAddress, DataObject *refpObject) override
Implementation of IConverter: Update the transient object from the other representation.
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.
const long POOL_StorageType
Definition: ClassID.h:77
T find(T... args)
T size(T... args)
SmartIF< IConversionSvc > & conversionSvc() const override
Get conversion service the converter is connected to.
const StatusCode & ignore() const
Ignore/check StatusCode.
Definition: StatusCode.h:164
virtual StatusCode fillObjRefs(IOpaqueAddress *pAddress, DataObject *pObject)=0
Resolve the references of the created transient object.
const long POOL_ROOTTREE_StorageType
Definition: ClassID.h:80
virtual StatusCode convertAddress(const IOpaqueAddress *pAddress, std::string &refAddress)=0
Convert an address to string form.
SmartIF< IDataProviderSvc > & dataProvider() const override
Access reference to transient datastore.
SmartIF< IConversionSvc > & conversionSvc() const
T begin(T... args)
StatusCode createObj(IOpaqueAddress *pAddress, DataObject *&refpObject) override
Implementation of IConverter: Create the transient representation of an object.
T c_str(T... args)
Services m_cnvServices
List of convermsion workers.
T emplace(T... args)
string s
Definition: gaudirun.py:328
constexpr static const auto FAILURE
Definition: StatusCode.h:97
StatusCode setAddressCreator(IAddressCreator *creator) override
Set address creator facility.
T substr(T... args)
SmartIF< IFace > make_SmartIF(IFace *iface)
Definition: SmartIF.h:150
const long SQLSERVER_StorageType
Definition: ClassID.h:73
Opaque address interface definition.
const long OBJY_StorageType
Definition: ClassID.h:63
StatusCode setDefaultCnvService(long type) override
Set default service type.
const long SICB_StorageType
Definition: ClassID.h:61
A DataObject is the base class of any identifiable object on any data store.
Definition: DataObject.h:40
virtual StatusCode fillRepRefs(IOpaqueAddress *pAddress, DataObject *pObject)=0
Resolve the references of the converted object.
StatusCode updateRepRefs(IOpaqueAddress *pAddress, DataObject *pObject) override
Implementation of IConverter: Update the references of an already converted object.
T stol(T... args)
MsgStream & endmsg(MsgStream &s)
MsgStream Modifier: endmsg. Calls the output method of the MsgStream.
Definition: MsgStream.h:202
SmartIF< IService > & service() const
SmartIF< IDataProviderSvc > m_dataSvc
Pointer to datma provider service.
IConverter * converter(const CLID &clid) override
Retrieve converter from list.