19 #include "CoralBase/AttributeList.h"
20 #include "CoralBase/Attribute.h"
22 #include "GaudiKernel/IIncidentSvc.h"
23 #include "GaudiKernel/FileIncident.h"
40 if( incSvc.retrieve().isSuccess() ) {
41 incSvc->removeListener(
this, IncidentType::EndInputFile);
49 bool doFilterDHAliases =
true;
50 IConversionSvc* cnvSvc(
nullptr);
51 if( service(
"AthenaPoolCnvSvc", cnvSvc,
true ).isSuccess() ) {
52 IProperty* prop =
dynamic_cast<IProperty*
>( cnvSvc );
55 if( prop->getProperty(&sizeProp).isSuccess() ) {
58 BooleanProperty aliasFilterProp(
"doFilterDHAliases", doFilterDHAliases);
59 if( prop->getProperty(&aliasFilterProp).isSuccess() ) {
60 doFilterDHAliases = aliasFilterProp.value();
65 if( doFilterDHAliases ) {
76 incSvc->addListener(
this, IncidentType::EndInputFile, 0);
77 incSvc->addListener(
this,
"PreFork", 0);
84 if( incident.type() ==
"PreFork" ) {
87 if( incident.type() == IncidentType::EndInputFile ) {
89 const std::string&
guid =
static_cast<const FileIncident&
>(incident).fileGuid();
99 size_t dbpos = iter->first.find(
"[DB=");
100 if( dbpos != std::string::npos && iter->first.compare(dbpos+4, dbpos+36, dbGuid) == 0 ) {
120 ATH_MSG_ERROR(
"updateRep called but the previous DataHeader was not yet processed."
123 return StatusCode::FAILURE;
128 std::size_t tagBeg = pAddress->par()[1].find(
"[KEY=") + 5;
129 std::size_t tagSize = pAddress->par()[1].find(
']', tagBeg) - tagBeg;
131 return StatusCode::SUCCESS;
144 static const pool::Guid dhf_p6_guid(
"7BE56CEF-C866-4BEE-9348-A5F34B5F1DAD");
145 std::string dhid = pAddress->par()[1];
147 this->
setToken( pAddress->par()[0] );
149 ATH_MSG_ERROR(
"updateRepRefs called without DataHeaderForm" );
150 return StatusCode::FAILURE;
159 ATH_MSG_ERROR(
"updateRepRefs: missing DataHeaderForm for DH ID=" << dhid );
160 return StatusCode::FAILURE;
164 return StatusCode::FAILURE;
173 return(StatusCode::SUCCESS);
182 ATH_MSG_ERROR(
"Failed to cast DataHeader to transient type" );
183 return(StatusCode::FAILURE);
188 const std::string connection = dh_placement.
fileName();
193 std::string form_placement_str = dhf_placement.
toString();
195 std::unique_ptr<DataHeaderForm_p6>& dhForm =
m_persFormMap[form_placement_str];
196 if (dhForm ==
nullptr) {
198 dhForm = std::make_unique<DataHeaderForm_p6>();
206 ATH_MSG_FATAL(
"Failed to convert DataHeader to persistent type: " <<
e.what());
207 return(StatusCode::FAILURE);
214 if (dh_token ==
nullptr) {
216 return(StatusCode::FAILURE);
225 static const RootType dhFormType(
typeid(*dhForm));
227 if (dhf_token ==
nullptr) {
229 return(StatusCode::FAILURE);
237 dhf_token->
release(); dhf_token =
nullptr;
247 if (
list !=
nullptr) {
251 obj->getEvtRefTokenStr().c_str(),
253 delete ref_token; ref_token =
nullptr;
254 for (coral::AttributeList::const_iterator iter =
list->begin(), last =
list->end(); iter != last; ++iter) {
255 attr_placement = this->
setPlacementWithType(
"AttributeList", (*iter).specification().name(), *pAddr->par());
257 (*iter).addressOfData(),
258 RootType((*iter).specification().type()) );
259 delete attr_token; attr_token =
nullptr;
263 if (tokAddr !=
nullptr) {
264 tokAddr->
setToken(dh_token); dh_token =
nullptr;
266 delete dh_token; dh_token =
nullptr;
267 return(StatusCode::FAILURE);
269 return(StatusCode::SUCCESS);
275 void* voidPtr1 =
nullptr;
277 if (voidPtr1 ==
nullptr) {
282 void* voidPtr2 =
nullptr;
289 if (voidPtr2 ==
nullptr) {
290 throw std::runtime_error(
"Could not get object for token = " + mapToken.
toString());
304 void* voidPtr1 =
nullptr;
305 std::string error_message;
310 error_message =
err.what();
312 if (voidPtr1 ==
nullptr) {
313 throw std::runtime_error(
"Could not get object for token = " +
m_i_poolToken->
toString() +
", " + error_message);
318 std::string dhFormToken =
header->dhFormToken();
321 size_t dbpos = dhFormToken.find(
"[DB=");
322 if( dbpos != std::string::npos ) {
323 const std::string dbGuid = dhFormToken.substr(dbpos+4, dbpos+36);
331 void* voidPtr2 =
nullptr;
333 if( dhFormToken.empty() ) {
335 mapToken.
setClassID(
Guid(
"7BE56CEF-C866-4BEE-9348-A5F34B5F1DAD") );
345 error_message =
err.what();
347 if (voidPtr2 ==
nullptr) {
353 void* firstPtr1 =
nullptr;
358 error_message =
err.what();
360 if (firstPtr1 ==
nullptr)
throw std::runtime_error(
"Could not get first DataHeader for token = " + firstToken.
toString() +
", " + error_message);
363 std::unique_ptr<DataHeader_p6> firstHeader(
reinterpret_cast<DataHeader_p6*
>(firstPtr1) );
373 error_message =
err.what();
375 if (voidPtr2 ==
nullptr)
throw std::runtime_error(
"Could not get DataHeaderForm for token = " + mapToken.
toString() +
", " + error_message);
378 ATH_MSG_WARNING(
"DataHeaderForm read exception: " << error_message <<
" - reusing the last good DHForm");
381 ATH_MSG_WARNING(
"DataHeaderForm read exception: " << error_message <<
" - reusing the last good DHForm");
386 if (voidPtr2 ==
nullptr) {
387 throw std::runtime_error(
"Could not get object for token = " + mapToken.
toString());
405 auto iter =
dh->m_inputDataHeader.begin();
406 while( iter !=
dh->m_inputDataHeader.end() ) {
407 if( iter->getToken()->dbID() ==
Guid::null() ) {
409 iter =
dh->m_inputDataHeader.erase(iter);
423 std::string bestPfn, fileType;
430 static const pool::Guid p6_guid(
"4DDBD295-EFCE-472A-9EC8-15CD35A9EB8D");
431 static const pool::Guid p5_guid(
"D82968A1-CF91-4320-B2DD-E0F739CBC7E6");
432 static const pool::Guid p4_guid(
"9630EB7B-CCD7-47D9-A39B-CBBF4133CDF2");
433 static const pool::Guid p3_guid(
"EC1318F0-8E28-45F8-9A2D-2597C1CC87A6");
447 std::unique_ptr<DataHeader_p4> obj_p4(this->poolReadObject<DataHeader_p4>());
451 std::unique_ptr<DataHeader_p3> obj_p3(this->poolReadObject<DataHeader_p3>());
457 std::string
error =
e.what();
458 throw std::runtime_error(
error);