18 #define PERSISTENCYSVC_PERSISTENCYSVC_CPP
35 #define ON_DEBUG if (msgLevel(MSG::DEBUG))
36 #define ON_VERBOSE if (msgLvel(MSG::VERBOSE))
38 #define DEBMSG ON_DEBUG debug()
39 #define VERMSG ON_VERBOSE verbose()
69 if ( !pAddress )
return INVALID_ADDRESS;
71 if ( !svc )
return BAD_STORAGE_TYPE;
79 status = svc->
createObj(pAddress, pObject);
85 status = svc->
updateObj(pAddress, pObject);
91 status = svc->
createRep(pObject, pAddress);
97 status = svc->
updateRep(pAddress, pObject);
165 return it->second.addrCreator();
172 i.second.conversionSvc()->setDataProvider(
m_dataSvc).ignore();
200 if ( !pConverter )
return NO_CONVERTER;
202 return svc ? svc->
addConverter(pConverter) : BAD_STORAGE_TYPE;
210 iret =
i.second.conversionSvc()->removeConverter(clid);
211 if ( iret.isSuccess() ) status = iret;
225 [&](Services::const_reference
i) {
226 return i.second.service()->name() == tn.
name();
230 auto svc = Service::service<IConversionSvc>(nam,
true);
235 info() <<
"Cannot access Conversion service:" << nam <<
endmsg;
248 if ( svc && svc->repSvcType() ==
type )
return svc;
256 if ( !servc )
return BAD_STORAGE_TYPE;
272 info() <<
"Cannot add Conversion service of type " << isvc->name() <<
endmsg;
275 info() <<
"Added successfully Conversion service:" << isvc->name() <<
endmsg;
276 iservc->setAddressCreator(
this).ignore();
277 iservc->setDataProvider(
m_dataSvc).ignore();
281 info() <<
"Cannot add Conversion service of type " << type <<
endmsg;
289 it->second.
service()->release();
290 it->second.addrCreator()->release();
326 const unsigned long* ipars,
328 refpAddress =
nullptr;
330 return svc ? svc->
createAddress(svc_type, clid, pars, ipars, refpAddress)
344 svc_type = pAddress->
svcType();
345 clid = pAddress->
clID();
357 refAddress += address;
371 long new_svc_type = 0;
374 decodeAddrHdr(refAddress, new_svc_type, new_clid, address_trailer);
376 return svc ? svc->
createAddress( new_svc_type, new_clid, address_trailer, refpAddress)
388 int svctyp = service_type;
389 stream <<
"<address_header service_type=\"" << svctyp <<
"\" clid=\"" << clid <<
"\" /> ";
390 address = stream.
str();
403 address_trailer.
clear();
406 size_t pos = address.
find(
"<address_header");
407 if (std::string::npos != pos) {
409 pos = address.
find(
"service_type=\"");
410 if (std::string::npos != pos) {
412 size_t end = address.
find(
'"', pos);
413 if (std::string::npos != end) {
416 pos = address.
find(
"clid=\"");
417 if (std::string::npos != pos) {
419 end = address.
find(
'\"', pos);
420 if (std::string::npos != end) {
425 pos = address.
find(
'>');
426 if (pos < (address.
size()-2)) {
428 address_trailer = address.
substr(pos+1);
453 refpSvc =
service(service_type);
459 const char* imp = service_type.
c_str();
460 long len = service_type.
length();
461 if ( ::strncasecmp(imp,
"SICB", len) == 0 )
463 else if ( ::strncasecmp(imp,
"ZEBRA", len) == 0 )
465 else if ( ::strncasecmp(imp,
"MS Access", len) == 0 )
467 else if ( ::strncasecmp(imp,
"Microsoft Access", strlen(
"Microsoft Access")) == 0 )
469 else if ( ::strncasecmp(imp,
"SQL Server", len) == 0 )
471 else if ( ::strncasecmp(imp,
"Microsoft ODBC for Oracle", len) == 0 )
473 else if ( ::strncasecmp(imp,
"Oracle ODBC", strlen(
"Oracle ODBC")) == 0 )
475 else if ( ::strncasecmp(imp,
"Oracle OCI", strlen(
"Oracle OCI")) == 0 )
477 else if ( ::strncasecmp(imp,
"MySQL", len) == 0 )
479 else if ( ::strncasecmp(imp,
"ROOT", len) == 0 )
481 else if ( ::strncasecmp(imp,
"OBJY", len) == 0 )
483 else if ( ::strncasecmp(imp,
"OBJYECTI", 7) == 0 )
485 else if ( ::strncasecmp(imp,
"POOL_ROOTKEY", 12) == 0 )
487 else if ( ::strncasecmp(imp,
"POOL_ROOTTREE", 12) == 0 )
489 else if ( ::strncasecmp(imp,
"POOL_ROOT", 9) == 0 )
491 else if ( ::strncasecmp(imp,
"POOL_MySQL", 8) == 0 )
493 else if ( ::strncasecmp(imp,
"POOL_ORACLE", 8) == 0 )
495 else if ( ::strncasecmp(imp,
"POOL_ACCESS", 8) == 0 )
497 else if ( ::strncasecmp(imp,
"POOL", 4) == 0 )
504 if ( svc->name() == service_type ) {
505 refpSvc =
i.second.conversionSvc();
509 auto instance = svc.get();
511 refpSvc =
i.second.conversionSvc();
519 if ( itm.
name() == service_type || itm.
type() == service_type ) {
541 error() <<
"Error initializing Service base class." <<
endmsg;
SmartIF< IAddressCreator > m_addrCreator
Pointer to the IAddressCreator interface of this, for addressCreator().
SmartIF< IAddressCreator > & addressCreator() const override
Retrieve address creator facility.
SmartIF< IConversionSvc > & service(const std::string &nam)
Retrieve conversion service by name.
SmartIF< IConversionSvc > & conversionSvc() const
StatusCode initialize() override
SmartIF< IAddressCreator > & addrCreator() const
The ISvcLocator is the interface implemented by the Service Factory in the Application Manager to loc...
The data converters are responsible to translate data from one representation into another...
virtual StatusCode createObj(IOpaqueAddress *pAddress, DataObject *&refpObject)=0
Create the transient representation of an object.
StatusCode initialize() override
Initialize the service.
MsgStream & info() const
shortcut for the method msgStream(MSG::INFO)
StatusCode connectOutput(const std::string &outputFile, const std::string &openMode) override
Connect the output file to the service with open mode.
virtual Property & declareUpdateHandler(std::function< void(Property &)> fun)
set new callback for update
GAUDI_API const std::string typeinfoName(const std::type_info &)
Get platform independent information about the class type.
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.
bool isSuccess() const
Test for a status code of SUCCESS.
const long ACCESS_StorageType
SmartIF< IService > & service() const
IAddressCreator interface definition.
bool m_enable
Flag to indicate that the service is enabled.
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.
StatusCode makeCall(int typ, IOpaqueAddress *&pAddress, DataObject *&pObject)
Implementation helper.
StringArrayProperty m_svcNames
Names of services to be requested from the service locator and added by default.
virtual StatusCode createRep(DataObject *pObject, IOpaqueAddress *&refpAddress)=0
Convert the transient object to the requested representation.
const long MYSQL_StorageType
Data provider interface definition.
StatusCode removeConverter(const CLID &clid) override
Remove converter object from conversion service (if present).
PersistencySvc(const std::string &name, ISvcLocator *svc)
Standard Constructor.
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
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.
#define DECLARE_COMPONENT(type)
const long POOL_ROOTKEY_StorageType
long repSvcType() const override
Return default service 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
Helper class to parse a string of format "type/name".
virtual const CLID & clID() const =0
Retrieve class information from link.
void encodeAddrHdr(long service_type, const CLID &clid, std::string &address) const
Retrieve string from storage type and clid.
void svcNamesHandler(Property &theProp)
Handlers for Service Names Property.
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.
This class is used for returning status codes from appropriate routines.
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.
const long POOL_ORACLE_StorageType
SmartIF< IConversionSvc > m_cnvDefault
Default output service.
StatusCode commitOutput(const std::string &output, bool do_commit) override
Commit pending output.
auto end(reverse_wrapper< T > &w)
PersistencySvc class implementation definition.
const long ROOT_StorageType
StatusCode fillRepRefs(IOpaqueAddress *pAddress, DataObject *pObject) override
Implementation of IConverter: Resolve the references of the converted object.
virtual StatusCode updateRep(IOpaqueAddress *pAddress, DataObject *pObject)=0
Update the converted representation of a transient object.
unsigned int CLID
Class ID definition.
const long ORACLE_StorageType
const long POOL_ROOT_StorageType
const TYPE & value() const
explicit conversion
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
SmartIF< IConversionSvc > & conversionSvc() const override
Get conversion service the converter is connected to.
Property base class allowing Property* collections to be "homogeneous".
virtual StatusCode fillObjRefs(IOpaqueAddress *pAddress, DataObject *pObject)=0
Resolve the references of the created transient object.
const long POOL_ROOTTREE_StorageType
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.
StatusCode createObj(IOpaqueAddress *pAddress, DataObject *&refpObject) override
Implementation of IConverter: Create the transient representation of an object.
const std::string & type() const
Services m_cnvServices
List of convermsion workers.
StatusCode setAddressCreator(IAddressCreator *creator) override
Set address creator facility.
SmartIF< IFace > make_SmartIF(IFace *iface)
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.
const long SQLSERVER_StorageType
const std::string & name() const
Opaque address interface definition.
Property * declareProperty(const std::string &name, T &property, const std::string &doc="none") const
Declare the named property.
const long OBJY_StorageType
StatusCode setDefaultCnvService(long type) override
Set default service type.
const long SICB_StorageType
A DataObject is the base class of any identifiable object on any data store.
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.
MsgStream & endmsg(MsgStream &s)
MsgStream Modifier: endmsg. Calls the output method of the MsgStream.
SmartIF< IDataProviderSvc > m_dataSvc
Pointer to datma provider service.
IConverter * converter(const CLID &clid) override
Retrieve converter from list.