Gaudi Framework, version v20r3

Generated: 24 Nov 2008

PoolDbCacheSvc.cpp

Go to the documentation of this file.
00001 // $Id: PoolDbCacheSvc.cpp,v 1.21 2008/10/27 16:41:33 marcocle Exp $
00002 //====================================================================
00003 //      PoolDbCacheSvc implementation
00004 //--------------------------------------------------------------------
00005 //      Author     : M.Frank
00006 //
00007 //====================================================================
00008 
00009 // FIXME: missing in CORAL
00010 #include <algorithm>
00011 
00012 #include "GaudiPoolDb/PoolDbCacheSvc.h"
00013 #include "GaudiKernel/ClassID.h"
00014 #include "GaudiKernel/MsgStream.h"
00015 #include "GaudiKernel/strcasecmp.h"
00016 #include "GaudiKernel/SvcFactory.h"
00017 #include "StorageSvc/DbPrint.h"
00018 #include "StorageSvc/DbOption.h"
00019 #include "StorageSvc/IDbOptionProxy.h"
00020 #include "StorageSvc/DbInstanceCount.h"
00021 #include "GaudiUtils/IFileCatalog.h"
00022 #include "GaudiUtils/IIODataManager.h"
00023 
00024 #include "Reflex/Reflex.h"
00025 
00026 namespace GaudiPoolDb  {  bool patchStreamers(MsgStream& log);     }
00027 
00028 static pool::DbInstanceCount::Counter* s_count = 
00029   pool::DbInstanceCount::getCounter(typeid(PoolDbCacheSvc));
00030 
00031 DECLARE_SERVICE_FACTORY(PoolDbCacheSvc);
00032 
00041 class PoolDbMsgReporter : public coral::MsgReporter  {
00042 protected:
00044   IMessageSvc* m_svc;
00045   int m_lvl;
00046 public:
00048   PoolDbMsgReporter(IMessageSvc* s, int l) : coral::MsgReporter(), m_svc(s), m_lvl(l)  {}
00050   virtual ~PoolDbMsgReporter()               { }
00052   virtual void report(int lvl, const std::string& src, const std::string& msg) {
00053     if ( lvl >= m_lvl ) m_svc->reportMessage(src,lvl,msg);
00054   }
00055 };
00056 
00058 PoolDbCacheSvc::PoolDbCacheSvc(const std::string& nam, ISvcLocator* svc)
00059   : Service(nam, svc), m_callbackHandler(0)
00060 {
00061   s_count->increment();
00062   m_callbackHandler = this;
00063   declareProperty("Dlls",               m_dlls);
00064   declareProperty("DomainOpts",         m_domainOpts);
00065   declareProperty("DatabaseOpts",       m_databaseOpts);
00066   declareProperty("DatabaseOnOpenOpts", m_databaseOpenOpts);
00067   declareProperty("ContainerOpts",      m_containerOpts);
00068   declareProperty("ContainerOnOpenOpts",m_containerOpenOpts);
00069 }
00070 
00072 PoolDbCacheSvc::~PoolDbCacheSvc()
00073 {
00074   s_count->decrement();
00075 }
00076 
00078 StatusCode PoolDbCacheSvc::queryInterface(const InterfaceID& riid, void** ppvInterface)
00079 {
00080   if ( IPoolCacheSvc::interfaceID().versionMatch(riid) )  {
00081     *ppvInterface = (IPoolCacheSvc*)this;
00082     addRef();
00083     return StatusCode::SUCCESS;
00084   }
00085   // Interface is not directly availible: try out a base class
00086   return Service::queryInterface(riid, ppvInterface);
00087 }
00088 
00090 StatusCode PoolDbCacheSvc::initialize()  {
00091   StatusCode status = Service::initialize();
00092   MsgStream log(messageService(), name());
00093   if ( !status.isSuccess() ) {
00094     log << MSG::ERROR << "Failed to initialize Service base class."
00095         << endmsg;
00096     return status;
00097   }
00098   coral::MessageStream::installMsgReporter(new PoolDbMsgReporter(messageService(),m_outputLevel.value()));
00099   coral::MessageStream::setMsgVerbosity(static_cast<coral::MsgLevel>(m_outputLevel.value()));
00100 
00101   log << MSG::INFO << "POOL output threshold:" << m_outputLevel
00102       << endmsg;
00103   status = loadLibraries();
00104   if ( !status.isSuccess() ) {
00105     log << MSG::ERROR << "Failed to load POOL libraries."
00106         << endmsg;
00107     return status;
00108   }
00109   session().open(0);
00110   // All dictionaries should be loaded. Let's patch the streamers
00111   // for ContainedObject, DataObject and SmartRefbase
00112   if ( !GaudiPoolDb::patchStreamers(log) )  {
00113     log << MSG::ERROR << "Failed to install customized IO!" << endmsg;
00114     return StatusCode::FAILURE;
00115   }
00116   return status;
00117 }
00118 
00120 StatusCode PoolDbCacheSvc::finalize()   {
00121   MsgStream log(messageService(), name());
00122   session().close();
00124   std::vector<System::ImageHandle>::iterator i;
00125   for(i=m_sharedHdls.begin(); i != m_sharedHdls.end(); ++i)  {
00126     if ( *i ) {
00127       // System::unloadDynamicLib(*i);
00128     }
00129   }
00130   m_sharedHdls.clear();
00131   coral::MessageStream::installMsgReporter(0);
00132   return Service::finalize();
00133 }
00134 
00136 pool::DbStatus 
00137 PoolDbCacheSvc::setCallbackOptions( pool::IDbOptionProxy* pObj,
00138                                     const std::vector<std::string>& v,
00139                                     const std::string& obj)
00140 {
00141   std::string opt_nam, opt_val, opt_typ;
00142   typedef std::vector<std::string> StringV;
00143   for (StringV::const_iterator i=v.begin(); i!=v.end(); ++i)  {
00144     const std::string& id = *i;
00145     if ( id.length() > obj.length() )   {
00146       if ( obj == id.substr(0, obj.length()) )  {
00147         std::string n = id.substr(obj.length()+1);
00148         size_t idx = n.find("=");
00149         size_t idx2 = n.find("TYP=");
00150         if ( idx != std::string::npos && idx2 != std::string::npos )  {
00151           opt_nam = n.substr(0, idx);
00152           opt_val = n.substr(idx+1, idx2-2-idx);
00153           opt_typ = n.substr(idx2+4,1);
00154           std::stringstream s(opt_val);
00155           pool::DbOption opt(opt_nam);
00156           float fval;
00157           int   ival;
00158           long long int lval;
00159           switch(::toupper(opt_typ[0])) {
00160             case 'I':
00161               s >> ival;
00162               opt._setValue(ival);
00163               pObj->setOption(opt);
00164               break;
00165             case 'L':
00166               s >> lval;
00167               opt._setValue(lval);
00168               pObj->setOption(opt);
00169               break;
00170             case 'F':
00171               s >> fval;
00172               opt._setValue(fval);
00173               pObj->setOption(opt);
00174               break;
00175             case 'S':
00176               opt._setValue(opt_val.c_str());
00177               pObj->setOption(opt);
00178               break;
00179             default:
00180               break;
00181           }
00182         }
00183       }
00184     }
00185   }
00186   return pool::Success;
00187 }
00188 
00190 pool::DbStatus 
00191 PoolDbCacheSvc::setMyOptions( pool::IDbOptionProxy* pObj, 
00192                               pool::DbOptionCallback::OptionType typ, 
00193                               const std::string& name)
00194 {
00195   switch (typ)  {
00196     case pool::DbOptionCallback::_DOMAIN_OPT:
00197       return setCallbackOptions(pObj, m_domainOpts, name);
00198     case pool::DbOptionCallback::_DATABASE_OPT:
00199       return setCallbackOptions(pObj, m_databaseOpts, name);
00200     case pool::DbOptionCallback::_DATABASE_ONOPEN:
00201       return setCallbackOptions(pObj, m_databaseOpenOpts, name);
00202     case pool::DbOptionCallback::_CONTAINER_OPT:
00203       return setCallbackOptions(pObj, m_containerOpts, name);
00204     case pool::DbOptionCallback::_CONTAINER_ONOPEN:
00205       return setCallbackOptions(pObj, m_containerOpenOpts, name);
00206     default:
00207       break;
00208   }
00209   return pool::Error;
00210 }
00211 
00212 // Load all required libraries
00213 StatusCode PoolDbCacheSvc::loadLibraries()  {
00214   StatusCode status = StatusCode::SUCCESS;
00215   if ( !m_dlls.empty() )  {
00216     std::vector<std::string>::const_iterator i;
00217     for(i=m_dlls.begin(); i != m_dlls.end(); ++i)  {
00218       StatusCode iret = loadDictionary(*i);
00219       if ( !iret.isSuccess() )  {
00220         status = iret;
00221       }
00222     }
00223   }
00224   return status;
00225 }
00226 
00228 StatusCode PoolDbCacheSvc::loadDictionary(const std::string& nam) {
00229   System::ImageHandle hdl = 0;
00230   StatusCode status = System::loadDynamicLib(nam, &hdl);
00231   if ( !status.isSuccess() )  {
00232     MsgStream log(messageService(), name());
00233     log << MSG::ERROR << System::getLastErrorString() << endmsg
00234         << "Failed to load POOL implementation library:"
00235         << nam << endmsg;
00236     return status;
00237   }
00238   m_sharedHdls.push_back(hdl);
00239   return status;
00240 }

Generated at Mon Nov 24 14:38:47 2008 for Gaudi Framework, version v20r3 by Doxygen version 1.5.6 written by Dimitri van Heesch, © 1997-2004