PoolDbStatCnv.cpp
Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011 #include "GaudiPoolDb/PoolDbStatCnv.h"
00012 #include "GaudiPoolDb/IPoolDbMgr.h"
00013 #include "GaudiPoolDb/PoolDbNTupleDescriptor.h"
00014
00015 #include "GaudiKernel/NTuple.h"
00016 #include "GaudiKernel/IRegistry.h"
00017 #include "GaudiKernel/IDataProviderSvc.h"
00018 #include "GaudiKernel/CnvFactory.h"
00019 #include "StorageSvc/DbReflex.h"
00020 #include "StorageSvc/DbTypeInfo.h"
00021 #include "StorageSvc/DbObjectCallBack.h"
00022
00023 #include <memory>
00024
00025
00026 PoolDbStatCnv::PoolDbStatCnv (long typ,
00027 const CLID& clid,
00028 ISvcLocator* svc)
00029 : PoolDbBaseCnv(typ, clid, svc)
00030 {
00031 }
00032
00033
00034 const std::string PoolDbStatCnv::containerName(IRegistry* pReg) const {
00035 const std::string& path = pReg->identifier();
00036 long loc = path.find('/',1);
00037 std::string local = "<local>";
00038 if ( loc > 0 ) {
00039 loc = path.find('/',++loc);
00040 if ( loc > 0 ) {
00041 local += path.substr(loc,path.length()-loc);
00042 }
00043 }
00044 return local;
00045 }
00046
00047 const std::string PoolDbStatCnv::fileName(IRegistry* pReg) const {
00048 std::string path = topLevel(pReg);
00049 DataObject* pObj = 0;
00050 dataProvider()->retrieveObject(path, pObj);
00051 if ( pObj ) {
00052 NTuple::File* fptr = dynamic_cast<NTuple::File*>(pObj);
00053 if ( fptr ) {
00054 return fptr->name();
00055 }
00056 }
00057 return "";
00058 }
00059
00061 const std::string PoolDbStatCnv::topLevel(IRegistry* pReg) const
00062 {
00063 if ( pReg ) {
00064 std::string path = pReg->identifier();
00065 size_t idx = path.find('/', 1);
00066 if ( idx != std::string::npos ) {
00067 idx = path.find('/', idx+1);
00068 if ( idx != std::string::npos ) {
00069 path = path.substr(0, idx);
00070 }
00071 return path;
00072 }
00073 }
00074 return "";
00075 }
00076
00077 StatusCode PoolDbStatCnv::saveDescription(const std::string& path,
00078 const std::string& ident,
00079 const std::string& desc,
00080 const std::string& opt,
00081 const pool::Guid& guid,
00082 const CLID& clid,
00083 const std::string& openMode)
00084 {
00085 ROOT::Reflex::Type cl = pool::DbReflex::forTypeInfo(typeid(PoolDbNTupleDescriptor));
00086 const pool::DbTypeInfo* info = pool::DbTypeInfo::create(cl.Name(ROOT::Reflex::SCOPED));
00087 if ( info ) {
00088 StatusCode status = m_dbMgr->connectOutput(path, openMode);
00089 if ( status.isSuccess() ) {
00090 std::auto_ptr<PoolDbNTupleDescriptor> dsc(new PoolDbNTupleDescriptor());
00091 dsc->description = desc;
00092 dsc->optional = opt;
00093 dsc->container = ident;
00094 dsc->guid = guid.toString();
00095 dsc->clid = clid;
00096 pool::DataCallBack* call=new pool::DbObjectCallBack(cl);
00097 call->setShape(info);
00098 call->setObject(dsc.release());
00099 status = m_dbMgr->markWrite(call,"GaudiStatisticsDescription");
00100 if ( status.isSuccess() ) {
00101 status = m_dbMgr->commitOutput(path, true);
00102 }
00103 }
00104 return status;
00105 }
00106 return StatusCode::FAILURE;
00107 }