PoolDbDirectoryCnv.cpp
Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011 #include <algorithm>
00012
00013 #include <memory>
00014
00015
00016 #include "GaudiPoolDb/IPoolDbMgr.h"
00017 #include "GaudiPoolDb/PoolDbDirectoryCnv.h"
00018 #include "GaudiPoolDb/PoolDbNTupleDescriptor.h"
00019 #include "GaudiKernel/IOpaqueAddress.h"
00020 #include "GaudiKernel/IDataManagerSvc.h"
00021 #include "GaudiKernel/MsgStream.h"
00022 #include "GaudiKernel/IRegistry.h"
00023 #include "GaudiKernel/NTuple.h"
00024 #include "GaudiKernel/CnvFactory.h"
00025
00026 #include "StorageSvc/DbReflex.h"
00027 #include "StorageSvc/DbSelect.h"
00028 #include "StorageSvc/DbObjectCallBack.h"
00029
00030
00031
00032 PLUGINSVC_FACTORY_WITH_ID( PoolDbDirectoryCnv,
00033 ConverterID(POOL_StorageType,CLID_StatisticsDirectory),
00034 IConverter*(long, CLID, ISvcLocator*) );
00035
00036
00037
00038 PoolDbDirectoryCnv::PoolDbDirectoryCnv (long typ,
00039 const CLID& clid,
00040 ISvcLocator* svc)
00041 : PoolDbStatCnv(typ, clid, svc)
00042 {
00043 }
00044
00046 StatusCode
00047 PoolDbDirectoryCnv::createObj(IOpaqueAddress* ,
00048 DataObject*& refpObject )
00049 {
00050 refpObject = new NTuple::Directory();
00051 return StatusCode::SUCCESS;
00052 }
00053
00054 StatusCode
00055 PoolDbDirectoryCnv::createRep(DataObject* pObject,
00056 IOpaqueAddress*& )
00057 {
00058 std::string dsc;
00059 pool::Guid guid(pool::Guid::null());
00060 guid.Data1 = objType();
00061
00062 if ( objType() == CLID_StatisticsDirectory ) {
00063 dsc = "Directory containing statistics results.";
00064 }
00065 else if ( objType() == CLID_StatisticsFile ) {
00066 dsc = "File containing statistics results.";
00067 }
00068 else {
00069 return StatusCode::FAILURE;
00070 }
00071 std::string ident = containerName(pObject->registry());
00072 std::string path = fileName(pObject->registry());
00073 return saveDescription(path, ident, dsc, "", guid, objType(), "UPDATE");
00074 }
00075
00076
00077 StatusCode
00078 PoolDbDirectoryCnv::fillObjRefs(IOpaqueAddress* pAddr, DataObject* pObj)
00079 {
00080 return updateObjRefs(pAddr, pObj);
00081 }
00082
00083 StatusCode
00084 PoolDbDirectoryCnv::updateObjRefs(IOpaqueAddress* pAddr,
00085 DataObject* pObject)
00086 {
00087 typedef std::vector<PoolDbNTupleDescriptor*> REFS;
00088 REFS refs;
00089 StatusCode status = StatusCode(StatusCode::FAILURE,true);
00090 MsgStream log(msgSvc(), "PoolDbDatabaseCnv");
00091 if ( pAddr ) {
00092 IRegistry* pReg = pAddr->registry();
00093 if ( pReg ) {
00094 std::string ident = pReg->identifier();
00095 std::string fname = fileName(pReg);
00096 std::string cntName = containerName(pReg);
00097 std::auto_ptr<pool::DbSelect> iter(m_dbMgr->createSelect("*", fname, "GaudiStatisticsDescription"));
00098 if ( iter.get() ) {
00099 pool::DbObjectCallBack cb(pool::DbReflex::forTypeName("PoolDbNTupleDescriptor"));
00100 typedef std::vector<IRegistry*> Leaves;
00101 pool::Token* token = 0;
00102 Leaves leaves;
00103 while( iter->next(token).isSuccess() ) {
00104 m_dbMgr->read(&cb, *token).ignore();
00105 PoolDbNTupleDescriptor* ref = (PoolDbNTupleDescriptor*)cb.object();
00106 std::string s = ref->container.substr(0,cntName.length());
00107 if ( s == cntName ) {
00108 if ( ref->container.length() > cntName.length()+1 ) {
00109 if ( ref->container.find('/',cntName.length()+1) == std::string::npos ) {
00110 refs.push_back(ref);
00111 token->release();
00112 continue;
00113 }
00114 }
00115 }
00116 delete ref;
00117 token->release();
00118 }
00119 status = m_dataMgr->objectLeaves(pObject, leaves);
00120 if ( status.isSuccess() ) {
00121 for(REFS::iterator i = refs.begin(); i != refs.end(); ++i) {
00122 REFS::value_type& ref = *i;
00123 if ( ref ) {
00124 bool need_to_add = true;
00125 for(Leaves::iterator j=leaves.begin(); j != leaves.end(); ++j ) {
00126 std::string curr_leaf = containerName(*j);
00127 if ( curr_leaf == ref->container ) {
00128 need_to_add = false;
00129 break;
00130 }
00131 }
00132 if ( need_to_add ) {
00133 IOpaqueAddress* pA= 0;
00134 if ( ref->clid == CLID_StatisticsDirectory ||
00135 ref->clid == CLID_StatisticsFile ||
00136 ref->clid == CLID_RowWiseTuple ||
00137 ref->clid == CLID_ColumnWiseTuple )
00138 {
00139 std::string spar[] = { fname, ref->container};
00140 unsigned long ipar[] = { pool::INVALID, pool::INVALID};
00141 status = m_dbMgr->createAddress(repSvcType(),
00142 ref->clid,
00143 spar,
00144 ipar,
00145 pA);
00146 }
00147 if ( status.isSuccess() ) {
00148 std::string top = topLevel(pReg);
00149 std::string leaf_name = top + ref->container.substr(7);
00150 status = m_dataMgr->registerAddress(leaf_name, pA);
00151 if ( status.isSuccess() ) {
00152 continue;
00153 }
00154 makeError("Failed to register leaves to directory:"+ident,false).ignore();
00155 break;
00156 }
00157 makeError("Failed to create leave address to directory:"+ident,false).ignore();
00158 break;
00159 }
00160 }
00161 makeError("Failed to add leaves to directory:"+ident,false).ignore();
00162 break;
00163 }
00164 }
00165 }
00166 else {
00167 return makeError("Failed to access required tuple data description.",false);
00168 }
00169 }
00170 }
00171 for(REFS::iterator k = refs.begin(); k != refs.end(); ++k) {
00172 if ( *k ) delete (*k);
00173 }
00174 return status;
00175 }
00176
00178 StatusCode
00179 PoolDbDirectoryCnv::updateObj(IOpaqueAddress* ,
00180 DataObject* )
00181 {
00182 return StatusCode::SUCCESS;
00183 }
00184
00186 StatusCode
00187 PoolDbDirectoryCnv::updateRep(IOpaqueAddress* ,
00188 DataObject* )
00189 {
00190 return StatusCode::SUCCESS;
00191 }
00192
00194 StatusCode
00195 PoolDbDirectoryCnv::updateRepRefs(IOpaqueAddress* ,
00196 DataObject* )
00197 {
00198 return StatusCode::SUCCESS;
00199 }
00200