20 #include "RelationalAccess/ISessionProxy.h"
21 #include "RelationalAccess/ITransaction.h"
22 #include "RelationalAccess/SchemaException.h"
23 #include "RelationalAccess/ConnectionService.h"
24 #include "RelationalAccess/ICursor.h"
25 #include "RelationalAccess/ITable.h"
26 #include "RelationalAccess/ISchema.h"
27 #include "RelationalAccess/IQuery.h"
33 #include "CoralBase/Exception.h"
47 ATH_MSG_DEBUG(
" Trying to open the connection " << connName <<
" for the first time");
64 coral::ConnectionService conSvcH;
65 coral::ISessionProxy *
proxy =
nullptr;
67 proxy = conSvcH.connect(connName,coral::ReadOnly);
68 proxy->transaction().start(
true);
69 ATH_MSG_DEBUG(
"Proxy for connection " << connName <<
" obtained");
91 if(connection->second>0) {
94 ATH_MSG_DEBUG(
"Connection " << connName <<
" Sessions = " << connection->second);
96 if(connection->second==0) {
99 session->second->transaction().commit();
100 delete session->second;
101 session->second =
nullptr;
112 if(connName==
"*Everything*") {
115 ATH_MSG_INFO(
"Close everything: Connection: " << ii.first <<
" with reference count = " << ii.second <<
" will be closed.");
131 ATH_MSG_ERROR(
"Wrong name for the connection: " << connName);
135 connection->second = 0;
139 && session->second) {
140 session->second->transaction().commit();
141 delete session->second;
142 session->second =
nullptr;
151 ,
const std::string&
tag
152 ,
const std::string& tag2node
153 ,
const std::string& connName)
157 key += (
"::" + tag2node);
165 RecordsetPtrMap::const_iterator
it = recordsets.find(
key);
166 if(
it != recordsets.end()) {
172 ATH_MSG_ERROR(
"Unable to open connection " << connName <<
". Returning empty recordset");
178 coral::ISessionProxy* session =
m_sessions[connName];
182 std::string lookupMapKey =
tag +
"::" + connName;
183 GlobalTagLookupMap::const_iterator lookupmap =
m_globalTagLookup.find(lookupMapKey);
185 TagNameIdByNode::const_iterator childtagdet = lookupmap->second->find(
node);
186 if(childtagdet!=lookupmap->second->end()) {
187 recConcrete->
getData(session,
node,childtagdet->second.first,childtagdet->second.second);
191 ATH_MSG_DEBUG(
"Unable to find tag for the node " <<
node <<
" in the cache of global tag " <<
tag <<
". Returning empty recordset");
200 catch(coral::SchemaException&
se) {
210 recordsets.emplace(
key,rec);
216 ,
const std::string&
tag
217 ,
const std::string& tag2node
218 ,
const std::string& connName)
224 std::unique_ptr<IRDBQuery>
query;
227 ATH_MSG_ERROR(
"Unable to open connection " << connName <<
". Returning nullptr to IRDBQuery");
231 coral::ISessionProxy* session =
m_sessions[connName];
235 std::string childTagId(
"");
236 std::string lookupMapKey =
tag +
"::" + connName;
237 GlobalTagLookupMap::const_iterator lookupmap =
m_globalTagLookup.find(lookupMapKey);
239 TagNameIdByNode::const_iterator childtagdet = lookupmap->second->find(
node);
240 if(childtagdet!=lookupmap->second->end()) {
241 childTagId = childtagdet->second.second;
246 versionAccessor.getChildTagData();
247 childTagId = versionAccessor.getTagID();
250 if(childTagId.empty()) {
251 ATH_MSG_WARNING(
"Could not get the tag for " <<
node <<
" node. Returning 0 pointer to IRDBQuery");
254 query = std::unique_ptr<IRDBQuery>(
new RDBQuery(dblock,
this,
node,childTagId,connName));
257 catch(coral::SchemaException&
se) {
272 ,
const std::string& parentTag
273 ,
const std::string& parentNode
274 ,
const std::string& connName)
284 ,
const std::string& parentTag
285 ,
const std::string& parentNode
286 ,
const std::string& connName
289 ATH_MSG_DEBUG(
"getChildTag for " << childNode <<
" " << parentTag <<
" " << parentNode);
294 std::string lookupMapKey = parentTag +
"::" + connName;
295 GlobalTagLookupMap::const_iterator lookupmap =
m_globalTagLookup.find(lookupMapKey);
297 TagNameIdByNode::const_iterator childtagdet = lookupmap->second->find(childNode);
298 if(childtagdet!=lookupmap->second->end()) {
299 return childtagdet->second.first;
303 return std::string(
"");
309 ATH_MSG_ERROR(
"Unable to open connection " << connName <<
". Returning empty string");
310 return std::string(
"");
313 std::string childTag(
"");
316 coral::ISessionProxy* session =
m_sessions[connName];
322 catch(coral::SchemaException&
se) {
338 ,
const std::string&
tag
339 ,
const std::string& connName)
349 coral::ISessionProxy* session =
m_sessions[connName];
351 coral::ITable& tableTag2Node = session->nominalSchema().tableHandle(
"HVS_TAG2NODE");
352 coral::IQuery *queryTag2Node = tableTag2Node.newQuery();
353 queryTag2Node->addToOutputList(
"LOCKED");
354 queryTag2Node->addToOutputList(
"SUPPORTED");
355 queryTag2Node->setMemoryCacheSize(1);
357 bindsTag2Node.extend<std::string>(
"tagN");
358 queryTag2Node->setCondition(
"TAG_NAME=:tagN", bindsTag2Node);
359 bindsTag2Node[0].data<std::string>() =
tag;
361 coral::ICursor& cursorTag2Node = queryTag2Node->execute();
362 if(cursorTag2Node.next()) {
363 tagDetails = cursorTag2Node.currentRow();
366 delete queryTag2Node;
369 std::string lookupMapKey =
tag +
"::" + connName;
374 coral::ITable& tableRootTag2Child = session->nominalSchema().tableHandle(
"HVS_TAGCACHE");
375 coral::IQuery* queryRootTag2Child = tableRootTag2Child.newQuery();
376 queryRootTag2Child->addToOutputList(
"CHILDNODE");
377 queryRootTag2Child->addToOutputList(
"CHILDTAG");
378 queryRootTag2Child->addToOutputList(
"CHILDTAGID");
379 queryRootTag2Child->setMemoryCacheSize(1);
381 bindsRootTag2Child.extend<std::string>(
"tagN");
382 queryRootTag2Child->setCondition(
"ROOTTAG=:tagN", bindsRootTag2Child);
383 bindsRootTag2Child[0].data<std::string>() =
tag;
384 queryRootTag2Child->addToOrderList(
"CHILDNODE");
386 coral::ICursor& cursorRootTag2Child = queryRootTag2Child->execute();
387 while(cursorRootTag2Child.next()) {
389 (*lookup)[
row[
"CHILDNODE"].data<std::string>()]=std::make_pair(
row[
"CHILDTAG"].data<std::string>(),
std::to_string(
row[
"CHILDTAGID"].data<long long>()));
392 delete queryRootTag2Child;
402 catch(coral::SchemaException&
se) {
416 ,
const std::string& connName)
424 coral::ISessionProxy* session =
m_sessions[connName];
426 coral::ITable& tableNode = session->nominalSchema().tableHandle(
"HVS_NODE");
427 coral::IQuery *queryNode = tableNode.newQuery();
428 queryNode->addToOutputList(
"NODE_NAME");
429 queryNode->setMemoryCacheSize(1);
431 queryNode->setCondition(
"BRANCH_FLAG=0",
empty);
432 queryNode->addToOrderList(
"NODE_NAME");
434 coral::ICursor& cursorNode = queryNode->execute();
435 while(cursorNode.next()) {
436 list.push_back(cursorNode.currentRow()[
"NODE_NAME"].data<std::string>());
441 catch(coral::SchemaException&
se) {
455 ,
const std::string& connName)
457 std::vector<std::string>
taglist;
463 coral::ISessionProxy* session =
m_sessions[connName];
465 coral::ITable& tableTag2Node = session->nominalSchema().tableHandle(
"HVS_TAG2NODE");
466 coral::IQuery* queryTag2Node = tableTag2Node.newQuery();
467 queryTag2Node->addToOutputList(
"TAG_NAME");
468 queryTag2Node->setMemoryCacheSize(1);
470 std::string condString = std::string(
"NODE_ID=0 AND LOCKED=1 AND SUPPORTED>=")+supportedFlag;
471 queryTag2Node->setCondition(condString,
empty);
472 queryTag2Node->addToOrderList(
"TAG_NAME");
474 coral::ICursor& cursorTagName = queryTag2Node->execute();
475 while(cursorTagName.next()) {
477 taglist.push_back(
row[
"TAG_NAME"].data<std::string>());
479 delete queryTag2Node;
482 catch(coral::SchemaException&
se) {
499 return sessionIt ==
m_sessions.end() ? nullptr : sessionIt->second;
504 return StatusCode::SUCCESS;
518 for(
auto& [sessionName,session] :
m_sessions) {
522 return StatusCode::SUCCESS;
527 if (IID_IRDBAccessSvc == riid) {
531 return AthService::queryInterface(riid, ppvInterface);
535 return StatusCode::SUCCESS;