Gaudi Framework, version v20r2

Generated: 18 Jul 2008

PersistencySvc Class Reference

#include <PersistencySvc.h>

Inheritance diagram for PersistencySvc:

Inheritance graph
[legend]
Collaboration diagram for PersistencySvc:

Collaboration graph
[legend]
List of all members.

Detailed Description

PersistencySvc class implementation definition.

System: The LHCb Offline System

Package: PersistencySvc

Dependencies:

History:

    +---------+----------------------------------------------+---------+
    |    Date |                 Comment                      | Who     |
    +---------+----------------------------------------------+---------+
    | 3/11/98 | Initial version                              | M.Frank |
    +---------+----------------------------------------------+---------+
    
Author:
Markus Frank
Version:
1.0

Definition at line 53 of file PersistencySvc.h.

: Object implementation

 PersistencySvc (const std::string &name, ISvcLocator *svc)
 Standard Constructor.
virtual ~PersistencySvc ()
 Standard Destructor.
IConversionSvcservice (const std::string &nam)
 Retrieve conversion service by name.
IConversionSvcservice (long service_type)
 Retrieve conversion service from list.
IAddressCreatoraddressCreator (long service_type)
 Retrieve address creator from list.
void encodeAddrHdr (long service_type, const CLID &clid, std::string &address) const
 Retrieve string from storage type and clid.
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 makeCall (int typ, IOpaqueAddress *&pAddress, DataObject *&pObject)
 Implementation helper.
bool enable (bool value)
 Set enabled flag.

Public Member Functions

IPersistencySvc Interface implementation
long repSvcType () const
 Return default service type.
const CLIDobjType () const
 Retrieve the class type of objects the converter produces. (DUMMY).
virtual StatusCode createObj (IOpaqueAddress *pAddress, DataObject *&refpObject)
 Implementation of IConverter: Create the transient representation of an object.
virtual StatusCode fillObjRefs (IOpaqueAddress *pAddress, DataObject *pObject)
 Implementation of IConverter: Resolve the references of the created transient object.
virtual StatusCode updateObj (IOpaqueAddress *pAddress, DataObject *refpObject)
 Implementation of IConverter: Update the transient object from the other representation.
virtual StatusCode updateObjRefs (IOpaqueAddress *pAddress, DataObject *pObject)
 Implementation of IConverter: Update the references of an updated transient object.
virtual StatusCode createRep (DataObject *pObject, IOpaqueAddress *&refpAddress)
 Implementation of IConverter: Convert the transient object to the requested representation.
virtual StatusCode fillRepRefs (IOpaqueAddress *pAddress, DataObject *pObject)
 Implementation of IConverter: Resolve the references of the converted object.
virtual StatusCode updateRep (IOpaqueAddress *pAddress, DataObject *pObject)
 Implementation of IConverter: Update the converted representation of a transient object.
virtual StatusCode updateRepRefs (IOpaqueAddress *pAddress, DataObject *pObject)
 Implementation of IConverter: Update the references of an already converted object.
virtual StatusCode setDataProvider (IDataProviderSvc *pStore)
 Define transient datastore.
virtual IDataProviderSvcdataProvider () const
 Access reference to transient datastore.
virtual StatusCode setConversionSvc (IConversionSvc *svc)
 Set conversion service the converter is connected to.
virtual IConversionSvcconversionSvc () const
 Get conversion service the converter is connected to.
virtual StatusCode setAddressCreator (IAddressCreator *creator)
 Set address creator facility.
virtual IAddressCreatoraddressCreator () const
 Retrieve address creator facility.
virtual StatusCode addConverter (IConverter *pConverter)
 Add converter object to conversion service.
virtual StatusCode addConverter (const CLID &clid)
 Add converter object to conversion service.
virtual IConverterconverter (const CLID &clid)
 Retrieve converter from list.
virtual StatusCode removeConverter (const CLID &clid)
 Remove converter object from conversion service (if present).
virtual StatusCode connectOutput (const std::string &outputFile, const std::string &openMode)
 Connect the output file to the service with open mode.
virtual StatusCode connectOutput (const std::string &outputFile)
 Connect the output file to the service.
virtual StatusCode commitOutput (const std::string &output, bool do_commit)
 Commit pending output.
virtual StatusCode createAddress (long svc_type, const CLID &clid, const std::string *pars, const unsigned long *ipars, IOpaqueAddress *&refpAddress)
 Create a Generic address using explicit arguments to identify a single object.
virtual StatusCode convertAddress (const IOpaqueAddress *pAddress, std::string &refAddress)
 Convert an address to string form.
virtual StatusCode createAddress (long svc_type, const CLID &clid, const std::string &refAddress, IOpaqueAddress *&refpAddress)
 Convert an address in string form to object form.
: IPersistencySvc implementation
virtual StatusCode addCnvService (IConversionSvc *service)
 Add a new Service.
virtual StatusCode removeCnvService (long type)
 Remove a Service.
virtual StatusCode setDefaultCnvService (long type)
 Set default service type.
virtual StatusCode getService (long service_type, IConversionSvc *&refpSvc)
 Retrieve conversion service identified by technology.
virtual StatusCode getService (const std::string &service_type, IConversionSvc *&refpSvc)
 Retrieve conversion service identified by technology.
: IService implementation
virtual StatusCode initialize ()
 Initialize the service.
virtual StatusCode finalize ()
 stop the service.
: IInterface implementation
StatusCode queryInterface (const InterfaceID &riid, void **ppvUnknown)
 Query interface.

Protected Types

typedef std::map< long, ServiceEntryServices

Protected Member Functions

void svcNamesHandler (Property &theProp)
 Handlers for Service Names Property.

Protected Attributes

long m_cnvDefType
 Default service type.
IDataProviderSvcm_dataSvc
 Pointer to datma provider service.
Services m_cnvServices
 List of convermsion workers.
IConversionSvcm_cnvDefault
 Default output service.
StringArrayProperty m_svcNames
 Names of services to be requested from the service locator and added by default.
bool m_enable
 Flag to indicate that the service is enabled.

Friends

class SvcFactory< PersistencySvc >
class Factory< PersistencySvc, IService *(std::string, ISvcLocator *)>

Classes

class  ServiceEntry


Member Typedef Documentation

typedef std::map<long,ServiceEntry> PersistencySvc::Services [protected]

Definition at line 97 of file PersistencySvc.h.


Constructor & Destructor Documentation

PersistencySvc::PersistencySvc ( const std::string name,
ISvcLocator svc 
)

Standard Constructor.

Definition at line 647 of file PersistencySvc.cpp.

References Service::declareProperty(), Property::declareUpdateHandler(), m_svcNames, and svcNamesHandler().

00648 :  Service(name, svc), 
00649    m_cnvDefType(TEST_StorageType), 
00650    m_dataSvc(0),
00651    m_cnvDefault(0),
00652    m_enable(true)
00653 {
00654   declareProperty("CnvServices", m_svcNames);
00655   m_svcNames.declareUpdateHandler( &PersistencySvc::svcNamesHandler, this );
00656 }

PersistencySvc::~PersistencySvc (  )  [virtual]

Standard Destructor.

Definition at line 659 of file PersistencySvc.cpp.

00659                                   {
00660 }


Member Function Documentation

long PersistencySvc::repSvcType (  )  const [virtual]

Return default service type.

Implements IConverter.

Definition at line 337 of file PersistencySvc.cpp.

References m_cnvDefault, and IConverter::repSvcType().

00337                                       {
00338   long typ = (m_cnvDefault) ? m_cnvDefault->repSvcType() : 0;
00339   return typ;
00340 }

const CLID & PersistencySvc::objType (  )  const [virtual]

Retrieve the class type of objects the converter produces. (DUMMY).

Implements IConverter.

Definition at line 584 of file PersistencySvc.cpp.

References CLID_NULL.

00584                                              {
00585   return CLID_NULL;
00586 }

StatusCode PersistencySvc::createObj ( IOpaqueAddress pAddress,
DataObject *&  refpObject 
) [virtual]

Implementation of IConverter: Create the transient representation of an object.

Implements IConverter.

Definition at line 115 of file PersistencySvc.cpp.

References CREATE_OBJ, and makeCall().

00115                                                                                   {
00116   return makeCall(CREATE_OBJ, pAddr, refpObj);
00117 }

StatusCode PersistencySvc::fillObjRefs ( IOpaqueAddress pAddress,
DataObject pObject 
) [virtual]

Implementation of IConverter: Resolve the references of the created transient object.

Implements IConverter.

Definition at line 120 of file PersistencySvc.cpp.

References FILL_OBJ_REFS, and makeCall().

00120                                                                                  {
00121   return makeCall(FILL_OBJ_REFS, pAddr, pObj);
00122 }

StatusCode PersistencySvc::updateObj ( IOpaqueAddress pAddress,
DataObject refpObject 
) [virtual]

Implementation of IConverter: Update the transient object from the other representation.

Implements IConverter.

Definition at line 125 of file PersistencySvc.cpp.

References makeCall(), and UPDATE_OBJ.

00125                                                                               {
00126   return makeCall(UPDATE_OBJ, pAddr, pObj);
00127 }

StatusCode PersistencySvc::updateObjRefs ( IOpaqueAddress pAddress,
DataObject pObject 
) [virtual]

Implementation of IConverter: Update the references of an updated transient object.

Implements IConverter.

Definition at line 130 of file PersistencySvc.cpp.

References makeCall(), and UPDATE_OBJ_REFS.

00130                                                                                  {
00131   return makeCall(UPDATE_OBJ_REFS, pAddr, pObj);
00132 }

StatusCode PersistencySvc::createRep ( DataObject pObject,
IOpaqueAddress *&  refpAddress 
) [virtual]

Implementation of IConverter: Convert the transient object to the requested representation.

Implements IConverter.

Reimplemented in HistogramPersistencySvc.

Definition at line 135 of file PersistencySvc.cpp.

References CREATE_REP, and makeCall().

Referenced by HistogramPersistencySvc::createRep().

00135                                                                                  {
00136   return makeCall(CREATE_REP, refpAddr, pObj);
00137 }

StatusCode PersistencySvc::fillRepRefs ( IOpaqueAddress pAddress,
DataObject pObject 
) [virtual]

Implementation of IConverter: Resolve the references of the converted object.

Implements IConverter.

Definition at line 140 of file PersistencySvc.cpp.

References FILL_REP_REFS, and makeCall().

00140                                                                                {
00141   return makeCall(FILL_REP_REFS, pAddr, pObj);
00142 }

StatusCode PersistencySvc::updateRep ( IOpaqueAddress pAddress,
DataObject pObject 
) [virtual]

Implementation of IConverter: Update the converted representation of a transient object.

Implements IConverter.

Definition at line 145 of file PersistencySvc.cpp.

References makeCall(), and UPDATE_REP.

00145                                                                              {
00146   return makeCall(UPDATE_REP, pAddr, pObj);
00147 }

StatusCode PersistencySvc::updateRepRefs ( IOpaqueAddress pAddress,
DataObject pObject 
) [virtual]

Implementation of IConverter: Update the references of an already converted object.

Implements IConverter.

Definition at line 150 of file PersistencySvc.cpp.

References makeCall(), and UPDATE_REP_REFS.

00150                                                                                    {
00151   return makeCall(UPDATE_REP_REFS, pAddr, pObj);
00152 }

StatusCode PersistencySvc::setDataProvider ( IDataProviderSvc pStore  )  [virtual]

Define transient datastore.

Implements IConverter.

Definition at line 172 of file PersistencySvc.cpp.

References m_cnvServices, m_dataSvc, and StatusCode::SUCCESS.

00172                                                                         {
00173   m_dataSvc = pDataSvc;
00174   for ( Services::iterator i = m_cnvServices.begin(); i != m_cnvServices.end(); i++ )   {
00175     (*i).second.conversionSvc()->setDataProvider(m_dataSvc).ignore();
00176   }
00177   return StatusCode(StatusCode::SUCCESS,true);
00178 }

IDataProviderSvc * PersistencySvc::dataProvider (  )  const [virtual]

Access reference to transient datastore.

Implements IConverter.

Definition at line 181 of file PersistencySvc.cpp.

References m_dataSvc.

00181                                                        {
00182   return m_dataSvc;
00183 }

StatusCode PersistencySvc::setConversionSvc ( IConversionSvc svc  )  [virtual]

Set conversion service the converter is connected to.

Implements IConverter.

Definition at line 186 of file PersistencySvc.cpp.

References m_cnvDefault, and StatusCode::SUCCESS.

Referenced by HistogramPersistencySvc::reinitialize().

00186                                                                  {
00187   m_cnvDefault = svc;
00188   return StatusCode(StatusCode::SUCCESS,true);
00189 }

IConversionSvc * PersistencySvc::conversionSvc (  )  const [virtual]

Get conversion service the converter is connected to.

Implements IConverter.

Definition at line 192 of file PersistencySvc.cpp.

References m_cnvDefault.

Referenced by HistogramPersistencySvc::reinitialize().

00192                                                          {
00193   return m_cnvDefault;
00194 }

StatusCode PersistencySvc::setAddressCreator ( IAddressCreator creator  )  [virtual]

Set address creator facility.

Implements IConverter.

Definition at line 491 of file PersistencySvc.cpp.

References StatusCode::FAILURE.

00491                                                                 {
00492   // The persistency service is a address creation dispatcher istelf.
00493   // The persistency service can NEVER create addresses itself.
00494   // The entry point must only be provided in order to fulfill the needs of the
00495   // implementing interfaces.
00496   return StatusCode::FAILURE;
00497 }

IAddressCreator * PersistencySvc::addressCreator (  )  const [virtual]

Retrieve address creator facility.

Implements IConverter.

Definition at line 500 of file PersistencySvc.cpp.

Referenced by convertAddress(), and createAddress().

00500                                                           {
00501   return (IAddressCreator*)this;
00502 }

StatusCode PersistencySvc::addConverter ( IConverter pConverter  )  [virtual]

Add converter object to conversion service.

Implements IConversionSvc.

Definition at line 202 of file PersistencySvc.cpp.

References IConversionSvc::addConverter(), IConverter::BAD_STORAGE_TYPE, IConversionSvc::NO_CONVERTER, IConverter::repSvcType(), and service().

00202                                                                  {
00203   if ( 0 != pConverter )    {
00204     long typ  = pConverter->repSvcType();
00205     IConversionSvc* svc = service(typ);
00206     if ( 0 != svc )   {
00207       return svc->addConverter(pConverter);
00208     }
00209     return BAD_STORAGE_TYPE;
00210   }
00211   return NO_CONVERTER;
00212 }

StatusCode PersistencySvc::addConverter ( const CLID clid  )  [virtual]

Add converter object to conversion service.

Implements IConversionSvc.

Definition at line 197 of file PersistencySvc.cpp.

References StatusCode::FAILURE.

00197                                                                {
00198   return StatusCode::FAILURE;
00199 }

IConverter * PersistencySvc::converter ( const CLID clid  )  [virtual]

Retrieve converter from list.

Implements IConversionSvc.

Definition at line 228 of file PersistencySvc.cpp.

00228                                                           {
00229   return 0;
00230 }

StatusCode PersistencySvc::removeConverter ( const CLID clid  )  [virtual]

Remove converter object from conversion service (if present).

Implements IConversionSvc.

Definition at line 215 of file PersistencySvc.cpp.

References m_cnvServices, IConversionSvc::NO_CONVERTER, and StatusCode::SUCCESS.

00215                                                             {
00216   // Remove converter type from all services
00217   StatusCode status = NO_CONVERTER, iret = StatusCode::SUCCESS;
00218   for ( Services::iterator i = m_cnvServices.begin(); i != m_cnvServices.end(); i++ )    {
00219     iret = (*i).second.conversionSvc()->removeConverter(clid);
00220     if ( iret.isSuccess() )    {
00221       status = iret;
00222     }
00223   }
00224   return status;
00225 }

StatusCode PersistencySvc::connectOutput ( const std::string outputFile,
const std::string openMode 
) [virtual]

Connect the output file to the service with open mode.

Implements IConversionSvc.

Definition at line 349 of file PersistencySvc.cpp.

00350                                                                           {
00351   return connectOutput(outputFile);
00352 }

StatusCode PersistencySvc::connectOutput ( const std::string outputFile  )  [virtual]

Connect the output file to the service.

Implements IConversionSvc.

Definition at line 355 of file PersistencySvc.cpp.

References StatusCode::SUCCESS.

00355                                                          {
00356   return StatusCode::SUCCESS;
00357 }

StatusCode PersistencySvc::commitOutput ( const std::string output,
bool  do_commit 
) [virtual]

Commit pending output.

Implements IConversionSvc.

Definition at line 360 of file PersistencySvc.cpp.

References StatusCode::SUCCESS.

00360                                                                 {
00361   return StatusCode::SUCCESS;
00362 }

StatusCode PersistencySvc::createAddress ( long  svc_type,
const CLID clid,
const std::string pars,
const unsigned long *  ipars,
IOpaqueAddress *&  refpAddress 
) [virtual]

Create a Generic address using explicit arguments to identify a single object.

Implements IAddressCreator.

Definition at line 365 of file PersistencySvc.cpp.

References addressCreator(), IConverter::BAD_STORAGE_TYPE, and IAddressCreator::createAddress().

00369                                                                           {
00370   IAddressCreator* svc = addressCreator(svc_type);
00371   StatusCode   status  = BAD_STORAGE_TYPE;        // Preset error
00372   refpAddress = 0;
00373   if ( 0 != svc )   {
00374     status = svc->createAddress(svc_type, clid, pars, ipars, refpAddress);
00375   }
00376   return status;
00377 }

StatusCode PersistencySvc::convertAddress ( const IOpaqueAddress pAddress,
std::string refAddress 
) [virtual]

Convert an address to string form.

Implements IAddressCreator.

Definition at line 380 of file PersistencySvc.cpp.

References addressCreator(), IConverter::BAD_STORAGE_TYPE, IOpaqueAddress::clID(), IAddressCreator::convertAddress(), encodeAddrHdr(), and IOpaqueAddress::svcType().

00382 {
00383   // Assumuption is that the Persistency service prepends a header
00384   // and requests the conversion service refered to by the service
00385   // type to encode the rest
00386   long svc_type = 0;
00387   CLID clid = 0;
00388   if ( 0 != pAddress ) {
00389     svc_type = pAddress->svcType();
00390     clid     = pAddress->clID();
00391   }
00392   IAddressCreator* svc = addressCreator(svc_type);
00393   StatusCode   status  = BAD_STORAGE_TYPE;        // Preset error
00394   refAddress = "";
00395   
00396   if ( 0 != svc )   {
00397     // Found service, set header 
00398     encodeAddrHdr(svc_type, clid, refAddress);
00399     std::string address;
00400     // Get rest of address from conversion service
00401     status = svc->convertAddress(pAddress, address);
00402     refAddress += address;
00403   }
00404   return status;
00405 }

StatusCode PersistencySvc::createAddress ( long  svc_type,
const CLID clid,
const std::string refAddress,
IOpaqueAddress *&  refpAddress 
) [virtual]

Convert an address in string form to object form.

Implements IAddressCreator.

Definition at line 408 of file PersistencySvc.cpp.

References addressCreator(), IConverter::BAD_STORAGE_TYPE, IAddressCreator::createAddress(), and decodeAddrHdr().

00412 {
00413   // Assumuption is that the Persistency service decodes that header
00414   // and requests the conversion service refered to by the service
00415   // type to decode the rest
00416   long new_svc_type = 0;
00417   CLID new_clid = 0;
00418   std::string address_trailer;
00419   decodeAddrHdr(refAddress, new_svc_type, new_clid, address_trailer);
00420   IAddressCreator* svc = addressCreator(new_svc_type);
00421   StatusCode   status  = BAD_STORAGE_TYPE;        // Preset error
00422   if ( 0 != svc )   {
00423     status = svc->createAddress( new_svc_type, new_clid, address_trailer, refpAddress);
00424   }
00425   return status;
00426 }

StatusCode PersistencySvc::addCnvService ( IConversionSvc service  )  [virtual]

Add a new Service.

Implements IPersistencySvc.

Definition at line 275 of file PersistencySvc.cpp.

References IInterface::addRef(), IConverter::BAD_STORAGE_TYPE, IConverter::conversionSvc(), endreq(), StatusCode::FAILURE, StatusCode::ignore(), IID_IAddressCreator, IID_IService, MSG::INFO, StatusCode::isSuccess(), m_cnvDefault, m_cnvServices, m_dataSvc, Service::msgSvc(), Service::name(), IInterface::queryInterface(), removeCnvService(), IConverter::repSvcType(), std::pair< _T1, _T2 >::second, IConverter::setAddressCreator(), IConverter::setDataProvider(), StatusCode::SUCCESS, and Service::type().

Referenced by service().

00275                                                                  {
00276   if ( 0 != servc )   {
00277     long type = servc->repSvcType();
00278     long def_typ = (m_cnvDefault) ? m_cnvDefault->repSvcType() : 0;
00279     Services::iterator it = m_cnvServices.find( type );
00280     IConversionSvc* cnv_svc = 0;
00281     if ( it != m_cnvServices.end() )    {
00282       cnv_svc = (*it).second.conversionSvc();
00283     }
00284     if ( type == def_typ )     {
00285       m_cnvDefault = servc;
00286     }
00287     if ( cnv_svc != servc )   {
00288       MsgStream log( msgSvc(), name() );
00289       IAddressCreator* icr = 0;
00290       StatusCode status  = servc->queryInterface(IID_IAddressCreator, pp_cast<void>(&icr));
00291       if ( status.isSuccess() )   {
00292         IService* isvc = 0;
00293         status = servc->queryInterface(IID_IService, pp_cast<void>(&isvc));
00294         if ( status.isSuccess() )    {
00295           if ( 0 != cnv_svc )   {
00296             removeCnvService (type).ignore();
00297           }
00298           std::pair<Services::iterator, bool> p =
00299             m_cnvServices.insert( Services::value_type( type, ServiceEntry(type, isvc, servc, icr)));
00300           if( p.second )    {
00301             log << MSG::INFO << "Added successfully Conversion service:" << isvc->name() << endreq;
00302             servc->addRef();
00303             servc->setAddressCreator(this).ignore();
00304             servc->setDataProvider(m_dataSvc).ignore();
00305             return StatusCode::SUCCESS;
00306           }
00307           log << MSG::INFO << "Cannot add Conversion service of type " << isvc->name() << endreq;
00308           isvc->release();
00309           icr->release();
00310           return StatusCode::FAILURE;
00311         }
00312         icr->release();
00313       }
00314       log << MSG::INFO << "Cannot add Conversion service of type " << type << endreq;
00315       return StatusCode::FAILURE;
00316     }
00317     else    {
00318       return StatusCode::SUCCESS;
00319     }
00320   }
00321   return BAD_STORAGE_TYPE;
00322 }

StatusCode PersistencySvc::removeCnvService ( long  type  )  [virtual]

Remove a Service.

Implements IPersistencySvc.

Definition at line 325 of file PersistencySvc.cpp.

References IConverter::BAD_STORAGE_TYPE, m_cnvServices, and StatusCode::SUCCESS.

Referenced by addCnvService().

00325                                                            {
00326   Services::iterator it = m_cnvServices.find( svctype );
00327   if( it != m_cnvServices.end() ) {
00328     (*it).second.service()->release();
00329     (*it).second.addrCreator()->release();
00330     m_cnvServices.erase(it);
00331     return StatusCode::SUCCESS;
00332   }
00333   return BAD_STORAGE_TYPE;
00334 }

StatusCode PersistencySvc::setDefaultCnvService ( long  type  )  [virtual]

Set default service type.

Implements IPersistencySvc.

Definition at line 343 of file PersistencySvc.cpp.

References m_cnvDefault, service(), and StatusCode::SUCCESS.

00343                                                              {
00344   m_cnvDefault = service(type);
00345   return StatusCode::SUCCESS;
00346 }

StatusCode PersistencySvc::getService ( long  service_type,
IConversionSvc *&  refpSvc 
) [virtual]

Retrieve conversion service identified by technology.

Implements IPersistencySvc.

Definition at line 505 of file PersistencySvc.cpp.

References StatusCode::FAILURE, service(), and StatusCode::SUCCESS.

Referenced by getService().

00505                                                                                      {
00506   refpSvc = service(service_type);
00507   return (0==refpSvc) ? StatusCode::FAILURE : StatusCode::SUCCESS;
00508 }

StatusCode PersistencySvc::getService ( const std::string service_type,
IConversionSvc *&  refpSvc 
) [virtual]

Retrieve conversion service identified by technology.

Implements IPersistencySvc.

Definition at line 511 of file PersistencySvc.cpp.

References ACCESS_StorageType, std::vector< _Tp, _Alloc >::begin(), std::basic_string< _CharT, _Traits, _Alloc >::c_str(), IConverter::conversionSvc(), std::vector< _Tp, _Alloc >::end(), StatusCode::FAILURE, SmartIFBase< TYPE >::get(), getService(), std::basic_string< _CharT, _Traits, _Alloc >::length(), m_cnvServices, m_svcNames, MYSQL_StorageType, OBJY_StorageType, ORACLE_StorageType, POOL_ACCESS_StorageType, POOL_MYSQL_StorageType, POOL_ORACLE_StorageType, POOL_ROOT_StorageType, POOL_ROOTKEY_StorageType, POOL_ROOTTREE_StorageType, POOL_StorageType, ROOT_StorageType, service(), SICB_StorageType, SQLSERVER_StorageType, StatusCode::SUCCESS, and System::typeinfoName().

00511                                                                                                  {
00512   const char* imp = service_type.c_str();
00513   long len = service_type.length();
00514   if ( ::strncasecmp(imp,"SICB", len) == 0 )
00515     return getService(SICB_StorageType, refpSvc);
00516   else if ( ::strncasecmp(imp,"ZEBRA", len) == 0 )
00517     return getService(SICB_StorageType, refpSvc);
00518   else if ( ::strncasecmp(imp,"MS Access", len) == 0 )
00519     return getService(ACCESS_StorageType, refpSvc);
00520   else if ( ::strncasecmp(imp,"Microsoft Access", strlen("Microsoft Access")) == 0 )
00521     return getService(ACCESS_StorageType, refpSvc);
00522   else if ( ::strncasecmp(imp,"SQL Server", len) == 0 )
00523     return getService(SQLSERVER_StorageType, refpSvc);
00524   else if ( ::strncasecmp(imp,"Microsoft ODBC for Oracle", len) == 0 )
00525     return getService(ORACLE_StorageType, refpSvc);
00526   else if ( ::strncasecmp(imp,"Oracle ODBC", strlen("Oracle ODBC")) == 0 )
00527     return getService(ORACLE_StorageType, refpSvc);
00528   else if ( ::strncasecmp(imp,"Oracle OCI", strlen("Oracle OCI")) == 0 )
00529     return getService(ORACLE_StorageType, refpSvc);
00530   else if ( ::strncasecmp(imp,"MySQL", len) == 0 )
00531     return getService(MYSQL_StorageType, refpSvc);
00532   else if ( ::strncasecmp(imp,"ROOT", len) == 0 )
00533     return getService(ROOT_StorageType, refpSvc);
00534   else if ( ::strncasecmp(imp,"OBJY", len) == 0 )
00535     return getService(OBJY_StorageType, refpSvc);
00536   else if ( ::strncasecmp(imp,"OBJYECTI", 7) == 0 )
00537     return getService(OBJY_StorageType, refpSvc);
00538   else if ( ::strncasecmp(imp,"POOL_ROOTKEY", 12) == 0 )
00539     return getService(POOL_ROOTKEY_StorageType, refpSvc);
00540   else if ( ::strncasecmp(imp,"POOL_ROOTTREE", 12) == 0 )
00541     return getService(POOL_ROOTTREE_StorageType, refpSvc);
00542   else if ( ::strncasecmp(imp,"POOL_ROOT", 9) == 0 )
00543     return getService(POOL_ROOT_StorageType, refpSvc);
00544   else if ( ::strncasecmp(imp,"POOL_MySQL", 8) == 0 )
00545     return getService(POOL_MYSQL_StorageType, refpSvc);
00546   else if ( ::strncasecmp(imp,"POOL_ORACLE", 8) == 0 )
00547     return getService(POOL_ORACLE_StorageType, refpSvc);
00548   else if ( ::strncasecmp(imp,"POOL_ACCESS", 8) == 0 )
00549     return getService(POOL_ACCESS_StorageType, refpSvc);
00550   else if ( ::strncasecmp(imp,"POOL", 4) == 0 )
00551     return getService(POOL_StorageType, refpSvc);
00552 
00553   for(Services::const_iterator i=m_cnvServices.begin(); i != m_cnvServices.end();++i)  {
00554     SmartIF<IService> svc((*i).second.conversionSvc());
00555     if ( svc )  {
00556       // Check wether this is already an active service: first check by service name
00557       if ( svc->name() == service_type )  {
00558         refpSvc = (*i).second.conversionSvc();
00559         return StatusCode::SUCCESS;
00560       }
00561       // Check wether this is already an active service: now check by service type
00562       if ( System::typeinfoName(typeid(*(svc.get()))) == service_type )  {
00563         refpSvc = (*i).second.conversionSvc();
00564         return StatusCode::SUCCESS;
00565       }
00566     }
00567   }
00568   const std::vector<std::string>& names = m_svcNames;
00569   // if not, check if the service is in the list and may be requested
00570   for(std::vector<std::string>::const_iterator i=names.begin(); i != names.end(); i++) {
00571     ListItem itm(*i);
00572     if ( itm.name() == service_type || itm.type() == service_type )  {
00573       IConversionSvc* svc = service(*i);
00574       if ( svc )  {
00575         refpSvc = svc;
00576         return StatusCode::SUCCESS;
00577       }
00578     }
00579   }
00580   return StatusCode::FAILURE;
00581 }

StatusCode PersistencySvc::initialize (  )  [virtual]

Initialize the service.

Reimplemented from Service.

Reimplemented in DetPersistencySvc, EvtPersistencySvc, and HistogramPersistencySvc.

Definition at line 589 of file PersistencySvc.cpp.

References endreq(), MSG::ERROR, Service::initialize(), StatusCode::isSuccess(), Service::msgSvc(), and Service::name().

Referenced by HistogramPersistencySvc::initialize(), EvtPersistencySvc::initialize(), and DetPersistencySvc::initialize().

00589                                           {
00590   // Initialize basic service
00591   StatusCode status = Service::initialize();
00592   if ( !status.isSuccess() )   {
00593     MsgStream log( msgSvc(), name() ); // Service MUST be initialized BEFORE!
00594     log << MSG::ERROR << "Error initializing Service base class." << endreq;
00595   }
00596   return status;
00597 }

StatusCode PersistencySvc::finalize (  )  [virtual]

stop the service.

Reimplemented from Service.

Reimplemented in DetPersistencySvc, EvtPersistencySvc, and HistogramPersistencySvc.

Definition at line 600 of file PersistencySvc.cpp.

References m_cnvServices, and StatusCode::SUCCESS.

Referenced by HistogramPersistencySvc::finalize(), EvtPersistencySvc::finalize(), and DetPersistencySvc::finalize().

00600                                          {
00601   // Release all workers
00602   for ( Services::iterator i = m_cnvServices.begin(); i != m_cnvServices.end(); i++ )    {
00603     (*i).second.service()->release();
00604     (*i).second.conversionSvc()->release();
00605     (*i).second.addrCreator()->release();
00606   }
00607   m_cnvServices.erase(m_cnvServices.begin(), m_cnvServices.end());
00608   return StatusCode::SUCCESS;
00609 }

StatusCode PersistencySvc::queryInterface ( const InterfaceID riid,
void **  ppvUnknown 
) [virtual]

Query interface.

Reimplemented from Service.

Definition at line 612 of file PersistencySvc.cpp.

References Service::addRef(), IID_IAddressCreator, IID_IConversionSvc, IID_IConverter, IID_IPersistencySvc, Service::queryInterface(), and StatusCode::SUCCESS.

00612                                                                                        {
00613   if ( IID_IConverter == riid )  {
00614     *ppvInterface = (IConverter*)this;
00615   }
00616   else if ( IID_IConversionSvc == riid )  {
00617     *ppvInterface = (IConversionSvc*)this;
00618   }
00619   else if ( IID_IPersistencySvc == riid )  {
00620     *ppvInterface = (IPersistencySvc*)this;
00621   }
00622   else if ( IID_IAddressCreator == riid )  {
00623     *ppvInterface = (IAddressCreator*)this;
00624   }
00625   else  {
00626     // Interface is not directly availible: try out a base class
00627     return Service::queryInterface(riid, ppvInterface);
00628   }
00629   addRef();
00630   return StatusCode::SUCCESS;
00631 }

IConversionSvc * PersistencySvc::service ( const std::string nam  )  [protected]

Retrieve conversion service by name.

Definition at line 233 of file PersistencySvc.cpp.

References addCnvService(), IConverter::conversionSvc(), endreq(), MSG::INFO, StatusCode::isSuccess(), m_cnvServices, Service::msgSvc(), Service::name(), and Service::service().

Referenced by addConverter(), addressCreator(), getService(), makeCall(), HistogramPersistencySvc::reinitialize(), service(), and setDefaultCnvService().

00233                                                                 {
00234   IConversionSvc* svc = 0;
00235   for ( Services::iterator it = m_cnvServices.begin(); it != m_cnvServices.end(); it++ )    {
00236     if ( (*it).second.service()->name() == nam )   {
00237       return (*it).second.conversionSvc();
00238     }
00239   }
00240   StatusCode status = Service::service(nam, svc, true);
00241   if ( status.isSuccess() )   {
00242     if ( addCnvService(svc).isSuccess() )   {
00243       svc->release();       // Do not double-reference count
00244       return svc;
00245     }
00246   }
00247   MsgStream log( msgSvc(), name() );
00248   log << MSG::INFO << "Cannot access Conversion service:" << nam << endreq;
00249   return 0;
00250 }

IConversionSvc * PersistencySvc::service ( long  service_type  )  [protected]

Retrieve conversion service from list.

Definition at line 253 of file PersistencySvc.cpp.

References m_cnvServices, m_svcNames, IConverter::repSvcType(), service(), and PropertyWithValue< TYPE >::value().

00253                                                      {
00254   typedef std::vector<std::string> SvcNames;
00255   // Check wether this is already an active service
00256   Services::iterator it = m_cnvServices.find( type );
00257   if( it != m_cnvServices.end() ) {
00258     return (*it).second.conversionSvc();
00259   }
00260   // if not, check if the service is in the list and may be requested
00261   const SvcNames& theNames = m_svcNames.value();
00262   for ( SvcNames::const_iterator i = theNames.begin(); i != theNames.end(); i++ )   {
00263     IConversionSvc* svc = service(*i);
00264     if ( svc != 0 )  {
00265       long typ = svc->repSvcType();
00266       if ( typ == type )    {
00267         return svc;
00268       }
00269     }
00270   }
00271   return 0;
00272 }

IAddressCreator * PersistencySvc::addressCreator ( long  service_type  )  [protected]

Retrieve address creator from list.

Definition at line 155 of file PersistencySvc.cpp.

References m_cnvServices, Gaudi::Units::s, and service().

00155                                                              {
00156   long typ = type;
00157   Services::iterator it = m_cnvServices.find( typ );
00158   if( it == m_cnvServices.end() ) {
00159     IConversionSvc* s = service(type);
00160     if ( s )   {
00161       it = m_cnvServices.find( typ );
00162       if ( it != m_cnvServices.end() ) {
00163         return (*it).second.addrCreator();
00164       }
00165     }
00166     return 0;
00167   }
00168   return (*it).second.addrCreator();
00169 }

void PersistencySvc::encodeAddrHdr ( long  service_type,
const CLID clid,
std::string address 
) const [protected]

Retrieve string from storage type and clid.

Definition at line 429 of file PersistencySvc.cpp.

References std::basic_stringstream< _CharT, _Traits, _Alloc >::str().

Referenced by convertAddress().

00432 {
00433   // For address header, use xml-style format of 
00434   // <addrhdr service_type="xxx" clid="yyy" />
00435   std::stringstream stream;
00436   int svctyp = service_type; // must put int into stream, not char
00437   stream << "<address_header service_type=\"" << svctyp << "\" clid=\"" << clid << "\" /> ";
00438   address = stream.str();
00439 }

void PersistencySvc::decodeAddrHdr ( const std::string address,
long &  service_type,
CLID clid,
std::string address_trailer 
) const [protected]

Retrieve storage type and clid from address header of string.

Definition at line 442 of file PersistencySvc.cpp.

References std::basic_string< _CharT, _Traits, _Alloc >::c_str(), std::basic_string< _CharT, _Traits, _Alloc >::find(), std::basic_string< _CharT, _Traits, _Alloc >::insert(), std::basic_string< _CharT, _Traits, _Alloc >::npos, and std::basic_string< _CharT, _Traits, _Alloc >::size().

Referenced by createAddress().

00446 {
00447   // For address header, use xml-style format of 
00448   // <addrhdr service_type="xxx" clid="yyy" />
00449   service_type = 0;
00450   clid = 0;
00451   address_trailer = "";
00452 
00453   // Check for addrhdr tag
00454   size_t pos = address.find("<address_header");
00455   if (std::string::npos != pos) {
00456     // Get service_type
00457     pos = address.find("service_type=\"");
00458     if (std::string::npos != pos) {
00459       pos += 14;
00460       size_t end = address.find('\"', pos);
00461         if (std::string::npos != end) { 
00462           std::string str;
00463           str.insert(0, address, pos, end-pos);
00464           int temp;
00465           sscanf(str.c_str(),"%d",&temp);
00466           service_type = temp;
00467           // Get clid
00468           pos = address.find("clid=\"");
00469         if (std::string::npos != pos) {
00470           pos += 6;
00471           size_t end = address.find('\"', pos);
00472           if (std::string::npos != end) {
00473             std::string str1;
00474             str1.insert(0, address, pos, end-pos);
00475             sscanf(str1.c_str(),"%d",&temp);
00476             clid = temp;
00477             // Get trailer_address
00478             pos = address.find(">");
00479             if (std::string::npos != pos) {
00480               pos += 1;
00481               address_trailer.insert(0, address, pos, address.size() - pos);
00482             }
00483           }
00484         }
00485       }
00486     }
00487   }
00488 }

StatusCode PersistencySvc::makeCall ( int  typ,
IOpaqueAddress *&  pAddress,
DataObject *&  pObject 
) [protected]

Implementation helper.

Definition at line 51 of file PersistencySvc.cpp.

References IConverter::BAD_STORAGE_TYPE, CREATE_OBJ, CREATE_REP, IConverter::createObj(), IConverter::createRep(), StatusCode::FAILURE, FILL_OBJ_REFS, FILL_REP_REFS, IConverter::fillObjRefs(), IConverter::fillRepRefs(), StatusCode::ignore(), IConverter::INVALID_ADDRESS, m_cnvDefault, m_enable, service(), StatusCode::SUCCESS, IOpaqueAddress::svcType(), UPDATE_OBJ, UPDATE_OBJ_REFS, UPDATE_REP, UPDATE_REP_REFS, IConverter::updateObj(), IConverter::updateObjRefs(), IConverter::updateRep(), and IConverter::updateRepRefs().

Referenced by createObj(), createRep(), fillObjRefs(), fillRepRefs(), updateObj(), updateObjRefs(), updateRep(), and updateRepRefs().

00053                                                                {
00054   if ( m_enable )    {
00055     IConversionSvc* svc    = 0;
00056     switch(typ)   {
00057     case CREATE_REP:
00058     case FILL_REP_REFS:
00059     case UPDATE_REP:
00060     case UPDATE_REP_REFS:
00061       svc = m_cnvDefault;
00062       break;
00063     default:
00064       if ( 0 != pAddress )    {
00065         long svc_type = pAddress->svcType();
00066         svc = service(svc_type);
00067         if ( 0 == svc )   {
00068           return BAD_STORAGE_TYPE;
00069         }
00070       }
00071       else  {
00072         return INVALID_ADDRESS;
00073       }
00074       break;
00075     }
00076 
00077     StatusCode status(StatusCode::FAILURE,true);
00078     switch( typ )     {
00079     case CREATE_OBJ:
00080       pObject = 0;
00081       status = svc->createObj(pAddress, pObject);
00082       break;
00083     case FILL_OBJ_REFS:
00084       status = svc->fillObjRefs(pAddress, pObject);
00085       break;
00086     case UPDATE_OBJ:
00087       status = svc->updateObj(pAddress, pObject);
00088       break;
00089     case UPDATE_OBJ_REFS:
00090       status = svc->updateObjRefs(pAddress, pObject);
00091       break;
00092     case CREATE_REP:
00093       status = svc->createRep(pObject, pAddress);
00094       break;
00095     case FILL_REP_REFS:
00096       status = svc->fillRepRefs(pAddress, pObject);
00097       break;
00098     case UPDATE_REP:
00099       status = svc->updateRep(pAddress, pObject);
00100       break;
00101     case UPDATE_REP_REFS:
00102       status = svc->updateRepRefs(pAddress, pObject);
00103       break;
00104     default:
00105       status = StatusCode::FAILURE;
00106       break;
00107     }
00108     status.ignore();
00109     return status;
00110   }
00111   return StatusCode::SUCCESS;
00112 }

bool PersistencySvc::enable ( bool  value  )  [protected]

Set enabled flag.

Definition at line 639 of file PersistencySvc.cpp.

References m_enable.

Referenced by HistogramPersistencySvc::reinitialize().

00640 {
00641   bool old = m_enable;
00642   m_enable = value;
00643   return old;
00644 }

void PersistencySvc::svcNamesHandler ( Property theProp  )  [protected]

Handlers for Service Names Property.

Definition at line 633 of file PersistencySvc.cpp.

References endreq(), MSG::INFO, Service::msgSvc(), and Service::name().

Referenced by PersistencySvc().

00633                                                       {
00634   MsgStream log( msgSvc(), name() );
00635   log << MSG::INFO << p << endreq ;
00636 }


Friends And Related Function Documentation

friend class SvcFactory< PersistencySvc > [friend]

Definition at line 58 of file PersistencySvc.h.

friend class Factory< PersistencySvc, IService *(std::string, ISvcLocator *)> [friend]

Definition at line 59 of file PersistencySvc.h.


Member Data Documentation

long PersistencySvc::m_cnvDefType [protected]

Default service type.

Definition at line 276 of file PersistencySvc.h.

IDataProviderSvc* PersistencySvc::m_dataSvc [protected]

Pointer to datma provider service.

Definition at line 278 of file PersistencySvc.h.

Referenced by addCnvService(), dataProvider(), and setDataProvider().

Services PersistencySvc::m_cnvServices [protected]

List of convermsion workers.

Definition at line 280 of file PersistencySvc.h.

Referenced by addCnvService(), addressCreator(), finalize(), getService(), removeCnvService(), removeConverter(), service(), and setDataProvider().

IConversionSvc* PersistencySvc::m_cnvDefault [protected]

Default output service.

Definition at line 282 of file PersistencySvc.h.

Referenced by addCnvService(), conversionSvc(), makeCall(), repSvcType(), setConversionSvc(), and setDefaultCnvService().

StringArrayProperty PersistencySvc::m_svcNames [protected]

Names of services to be requested from the service locator and added by default.

Definition at line 286 of file PersistencySvc.h.

Referenced by getService(), PersistencySvc(), and service().

bool PersistencySvc::m_enable [protected]

Flag to indicate that the service is enabled.

Definition at line 288 of file PersistencySvc.h.

Referenced by enable(), and makeCall().


The documentation for this class was generated from the following files:
Generated at Fri Jul 18 12:08:49 2008 for Gaudi Framework, version v20r2 by Doxygen version 1.5.1 written by Dimitri van Heesch, © 1997-2004