Gaudi Framework, version v20r4

Generated: 8 Jan 2009

PersistencySvc.cpp

Go to the documentation of this file.
00001 //====================================================================
00002 //  PersistencySvc.cpp
00003 //--------------------------------------------------------------------
00004 //
00005 //  Package    : System ( The LHCb Offline System)
00006 //
00007 //  Description: implementation of the PersistencySvc
00008 //
00009 //  Author     : M.Frank
00010 //  History    :
00011 // +---------+----------------------------------------------+---------
00012 // |    Date |                 Comment                      | Who     
00013 // +---------+----------------------------------------------+---------
00014 // | 29/10/98| Initial version                              | MF
00015 // +---------+----------------------------------------------+---------
00016 //
00017 //====================================================================
00018 #define  PERSISTENCYSVC_PERSISTENCYSVC_CPP
00019 
00020 // Interface defintions
00021 #include "GaudiKernel/SmartIF.h"
00022 #include "GaudiKernel/SvcFactory.h"
00023 #include "GaudiKernel/CnvFactory.h"
00024 #include "GaudiKernel/DataObject.h"
00025 #include "GaudiKernel/IConverter.h"
00026 #include "GaudiKernel/ISvcLocator.h"
00027 #include "GaudiKernel/IDataSelector.h"
00028 #include "GaudiKernel/IOpaqueAddress.h"
00029 #include "GaudiKernel/MsgStream.h"
00030 #include "GaudiKernel/strcasecmp.h"
00031 #include "GaudiKernel/ListItem.h"
00032 
00033 // Implementation specific definitions
00034 #include "PersistencySvc.h"
00035 
00036 // Instantiation of a static factory class used by clients to create
00037 // instances of this service
00038 DECLARE_SERVICE_FACTORY(PersistencySvc)
00039 
00040 enum CnvSvcAction   {
00041   CREATE_OBJ,
00042   FILL_OBJ_REFS,
00043   UPDATE_OBJ,
00044   UPDATE_OBJ_REFS,
00045   CREATE_REP,
00046   FILL_REP_REFS,
00047   UPDATE_REP,
00048   UPDATE_REP_REFS
00049 };
00050 
00051 StatusCode PersistencySvc::makeCall(int typ,
00052                                     IOpaqueAddress*& pAddress, 
00053                                     DataObject*& pObject)      {
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 }
00113 
00115 StatusCode PersistencySvc::createObj(IOpaqueAddress* pAddr, DataObject*& refpObj)   {
00116   return makeCall(CREATE_OBJ, pAddr, refpObj);
00117 }
00118 
00120 StatusCode PersistencySvc::fillObjRefs(IOpaqueAddress* pAddr, DataObject* pObj)    {
00121   return makeCall(FILL_OBJ_REFS, pAddr, pObj);
00122 }
00123 
00125 StatusCode PersistencySvc::updateObj(IOpaqueAddress* pAddr, DataObject* pObj)   {
00126   return makeCall(UPDATE_OBJ, pAddr, pObj);
00127 }
00128 
00130 StatusCode PersistencySvc::updateObjRefs(IOpaqueAddress* pAddr, DataObject* pObj)  {
00131   return makeCall(UPDATE_OBJ_REFS, pAddr, pObj);
00132 }
00133 
00135 StatusCode PersistencySvc::createRep(DataObject* pObj, IOpaqueAddress*& refpAddr)  {
00136   return makeCall(CREATE_REP, refpAddr, pObj);
00137 }
00138 
00140 StatusCode PersistencySvc::fillRepRefs(IOpaqueAddress* pAddr, DataObject* pObj)  {
00141   return makeCall(FILL_REP_REFS, pAddr, pObj);
00142 }
00143 
00145 StatusCode PersistencySvc::updateRep(IOpaqueAddress* pAddr, DataObject* pObj)  {
00146   return makeCall(UPDATE_REP, pAddr, pObj);
00147 }
00148 
00150 StatusCode PersistencySvc::updateRepRefs(IOpaqueAddress* pAddr, DataObject* pObj)    {
00151   return makeCall(UPDATE_REP_REFS, pAddr, pObj);
00152 }
00153 
00155 IAddressCreator* PersistencySvc::addressCreator(long type)     {
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 }
00170 
00172 StatusCode PersistencySvc::setDataProvider(IDataProviderSvc* pDataSvc)    {
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 }
00179 
00181 IDataProviderSvc* PersistencySvc::dataProvider()  const  {
00182   return m_dataSvc;
00183 }
00184 
00186 StatusCode PersistencySvc::setConversionSvc(IConversionSvc* svc)   {
00187   m_cnvDefault = svc;
00188   return StatusCode(StatusCode::SUCCESS,true);
00189 }
00190 
00192 IConversionSvc* PersistencySvc::conversionSvc()    const   {
00193   return m_cnvDefault;
00194 }
00195 
00197 StatusCode PersistencySvc::addConverter(const CLID& /* clid */)  {
00198   return StatusCode::FAILURE;
00199 }
00200 
00202 StatusCode PersistencySvc::addConverter(IConverter* pConverter)    {
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 }
00213 
00215 StatusCode PersistencySvc::removeConverter(const CLID& clid)  {
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 }
00226 
00228 IConverter* PersistencySvc::converter(const CLID& /*clid*/) {
00229   return 0;
00230 }
00231 
00233 IConversionSvc* PersistencySvc::service(const std::string& nam)     {
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 }
00251 
00253 IConversionSvc* PersistencySvc::service(long type)     {
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 }
00273 
00275 StatusCode PersistencySvc::addCnvService(IConversionSvc* servc)    {
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 }
00323 
00325 StatusCode PersistencySvc::removeCnvService(long svctype)    {
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 }
00335 
00337 long PersistencySvc::repSvcType() const {
00338   long typ = (m_cnvDefault) ? m_cnvDefault->repSvcType() : 0;
00339   return typ;
00340 }
00341 
00343 StatusCode PersistencySvc::setDefaultCnvService(long type)     {
00344   m_cnvDefault = service(type);
00345   return StatusCode::SUCCESS;
00346 }
00347 
00349 StatusCode PersistencySvc::connectOutput(const std::string&    outputFile,
00350                                          const std::string& /* openMode */) {
00351   return connectOutput(outputFile);
00352 }
00353 
00355 StatusCode PersistencySvc::connectOutput(const std::string&) {
00356   return StatusCode::SUCCESS;
00357 }
00358 
00360 StatusCode PersistencySvc::commitOutput(const std::string& , bool ) {
00361   return StatusCode::SUCCESS;
00362 }
00363 
00365 StatusCode PersistencySvc::createAddress(long svc_type,
00366                                          const CLID& clid,
00367                                          const std::string* pars, 
00368                                          const unsigned long* ipars,
00369                                          IOpaqueAddress*& refpAddress)    {
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 }
00378 
00380 StatusCode PersistencySvc::convertAddress( const IOpaqueAddress* pAddress,
00381                                            std::string& refAddress)
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 }
00406 
00408 StatusCode PersistencySvc::createAddress( long /* svc_type */, 
00409                                          const CLID& /* clid */, 
00410                                          const std::string& refAddress,
00411                                          IOpaqueAddress*& refpAddress) 
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 }
00427 
00429 void PersistencySvc::encodeAddrHdr( long service_type, 
00430                                     const CLID& clid, 
00431                                     std::string& address) const 
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 }
00440 
00442 void PersistencySvc::decodeAddrHdr( const std::string& address, 
00443                                     long& service_type, 
00444                                     CLID& clid, 
00445                                     std::string& address_trailer) const
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 }
00489 
00491 StatusCode PersistencySvc::setAddressCreator(IAddressCreator*)    {
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 }
00498 
00500 IAddressCreator* PersistencySvc::addressCreator()   const   {
00501   return (IAddressCreator*)this;
00502 }
00503 
00505 StatusCode PersistencySvc::getService(long service_type, IConversionSvc*& refpSvc)     {
00506   refpSvc = service(service_type);
00507   return (0==refpSvc) ? StatusCode::FAILURE : StatusCode::SUCCESS;
00508 }
00509 
00511 StatusCode PersistencySvc::getService(const std::string& service_type, IConversionSvc*& refpSvc)     {
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 }
00582 
00584 const CLID& PersistencySvc::objType() const    {
00585   return CLID_NULL;
00586 }
00587 
00589 StatusCode PersistencySvc::initialize()     {
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 }
00598 
00600 StatusCode PersistencySvc::finalize()      {
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 }
00610 
00612 StatusCode PersistencySvc::queryInterface(const InterfaceID& riid, void** ppvInterface)  {
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 }
00632 
00633 void PersistencySvc::svcNamesHandler( Property& p )     {
00634   MsgStream log( msgSvc(), name() );
00635   log << MSG::INFO << p << endreq ;
00636 }
00637 
00639 bool PersistencySvc::enable(bool value)
00640 {
00641   bool old = m_enable;
00642   m_enable = value;
00643   return old;
00644 }
00645 
00647 PersistencySvc::PersistencySvc(const std::string& name, ISvcLocator* svc)
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 }
00657 
00659 PersistencySvc::~PersistencySvc()   {
00660 }

Generated at Thu Jan 8 17:44:24 2009 for Gaudi Framework, version v20r4 by Doxygen version 1.5.6 written by Dimitri van Heesch, © 1997-2004