19 #include "RelationalAccess/ISessionProxy.h"
20 #include "RelationalAccess/ITransaction.h"
21 #include "RelationalAccess/SchemaException.h"
22 #include "RelationalAccess/ConnectionService.h"
23 #include "RelationalAccess/ICursor.h"
24 #include "RelationalAccess/ITable.h"
25 #include "RelationalAccess/ISchema.h"
26 #include "RelationalAccess/IQuery.h"
32 #include "CoralBase/Exception.h"
46 ATH_MSG_DEBUG(
" Trying to open the connection " << connName <<
" for the first time");
63 coral::ConnectionService conSvcH;
64 coral::ISessionProxy *
proxy =
nullptr;
66 proxy = conSvcH.connect(connName,coral::ReadOnly);
67 proxy->transaction().start(
true);
68 ATH_MSG_DEBUG(
"Proxy for connection " << connName <<
" obtained");
90 if(connection->second>0) {
93 ATH_MSG_DEBUG(
"Connection " << connName <<
" Sessions = " << connection->second);
95 if(connection->second==0) {
98 session->second->transaction().commit();
99 delete session->second;
100 session->second =
nullptr;
111 if(connName==
"*Everything*") {
114 ATH_MSG_INFO(
"Close everything: Connection: " << ii.first <<
" with reference count = " << ii.second <<
" will be closed.");
130 ATH_MSG_ERROR(
"Wrong name for the connection: " << connName);
134 connection->second = 0;
138 && session->second) {
139 session->second->transaction().commit();
140 delete session->second;
141 session->second =
nullptr;
150 ,
const std::string&
tag
151 ,
const std::string& tag2node
152 ,
const std::string& connName)
156 key += (
"::" + tag2node);
164 RecordsetPtrMap::const_iterator
it = recordsets.find(
key);
165 if(
it != recordsets.end()) {
171 ATH_MSG_ERROR(
"Unable to open connection " << connName <<
". Returning empty recordset");
177 coral::ISessionProxy* session =
m_sessions[connName];
181 std::string lookupMapKey =
tag +
"::" + connName;
182 GlobalTagLookupMap::const_iterator lookupmap =
m_globalTagLookup.find(lookupMapKey);
184 TagNameIdByNode::const_iterator childtagdet = lookupmap->second->find(
node);
185 if(childtagdet!=lookupmap->second->end()) {
186 recConcrete->
getData(session,
node,childtagdet->second.first,childtagdet->second.second);
190 ATH_MSG_DEBUG(
"Unable to find tag for the node " <<
node <<
" in the cache of global tag " <<
tag <<
". Returning empty recordset");
199 catch(coral::SchemaException&
se) {
209 recordsets.emplace(
key,rec);
215 ,
const std::string&
tag
216 ,
const std::string& tag2node
217 ,
const std::string& connName)
223 std::unique_ptr<IRDBQuery>
query;
226 ATH_MSG_ERROR(
"Unable to open connection " << connName <<
". Returning nullptr to IRDBQuery");
230 coral::ISessionProxy* session =
m_sessions[connName];
234 std::string childTagId(
"");
235 std::string lookupMapKey =
tag +
"::" + connName;
236 GlobalTagLookupMap::const_iterator lookupmap =
m_globalTagLookup.find(lookupMapKey);
238 TagNameIdByNode::const_iterator childtagdet = lookupmap->second->find(
node);
239 if(childtagdet!=lookupmap->second->end()) {
240 childTagId = childtagdet->second.second;
245 versionAccessor.getChildTagData();
246 childTagId = versionAccessor.getTagID();
249 if(childTagId.empty()) {
250 ATH_MSG_WARNING(
"Could not get the tag for " <<
node <<
" node. Returning 0 pointer to IRDBQuery");
253 query = std::unique_ptr<IRDBQuery>(
new RDBQuery(dblock,
this,
node,childTagId,connName));
256 catch(coral::SchemaException&
se) {
271 ,
const std::string& parentTag
272 ,
const std::string& parentNode
273 ,
const std::string& connName)
283 ,
const std::string& parentTag
284 ,
const std::string& parentNode
285 ,
const std::string& connName
288 ATH_MSG_DEBUG(
"getChildTag for " << childNode <<
" " << parentTag <<
" " << parentNode);
293 std::string lookupMapKey = parentTag +
"::" + connName;
294 GlobalTagLookupMap::const_iterator lookupmap =
m_globalTagLookup.find(lookupMapKey);
296 TagNameIdByNode::const_iterator childtagdet = lookupmap->second->find(childNode);
297 if(childtagdet!=lookupmap->second->end()) {
298 return childtagdet->second.first;
302 return std::string(
"");
308 ATH_MSG_ERROR(
"Unable to open connection " << connName <<
". Returning empty string");
309 return std::string(
"");
312 std::string childTag(
"");
315 coral::ISessionProxy* session =
m_sessions[connName];
321 catch(coral::SchemaException&
se) {
337 ,
const std::string&
tag
338 ,
const std::string& connName)
348 coral::ISessionProxy* session =
m_sessions[connName];
350 coral::ITable& tableTag2Node = session->nominalSchema().tableHandle(
"HVS_TAG2NODE");
351 coral::IQuery *queryTag2Node = tableTag2Node.newQuery();
352 queryTag2Node->addToOutputList(
"LOCKED");
353 queryTag2Node->addToOutputList(
"SUPPORTED");
354 queryTag2Node->setMemoryCacheSize(1);
356 bindsTag2Node.extend<std::string>(
"tagN");
357 queryTag2Node->setCondition(
"TAG_NAME=:tagN", bindsTag2Node);
358 bindsTag2Node[0].data<std::string>() =
tag;
360 coral::ICursor& cursorTag2Node = queryTag2Node->execute();
361 if(cursorTag2Node.next()) {
362 tagDetails = cursorTag2Node.currentRow();
365 delete queryTag2Node;
368 std::string lookupMapKey =
tag +
"::" + connName;
373 coral::ITable& tableRootTag2Child = session->nominalSchema().tableHandle(
"HVS_TAGCACHE");
374 coral::IQuery* queryRootTag2Child = tableRootTag2Child.newQuery();
375 queryRootTag2Child->addToOutputList(
"CHILDNODE");
376 queryRootTag2Child->addToOutputList(
"CHILDTAG");
377 queryRootTag2Child->addToOutputList(
"CHILDTAGID");
378 queryRootTag2Child->setMemoryCacheSize(1);
380 bindsRootTag2Child.extend<std::string>(
"tagN");
381 queryRootTag2Child->setCondition(
"ROOTTAG=:tagN", bindsRootTag2Child);
382 bindsRootTag2Child[0].data<std::string>() =
tag;
383 queryRootTag2Child->addToOrderList(
"CHILDNODE");
385 coral::ICursor& cursorRootTag2Child = queryRootTag2Child->execute();
386 while(cursorRootTag2Child.next()) {
388 (*lookup)[
row[
"CHILDNODE"].data<std::string>()]=std::make_pair(
row[
"CHILDTAG"].data<std::string>(),
std::to_string(
row[
"CHILDTAGID"].data<long long>()));
391 delete queryRootTag2Child;
401 catch(coral::SchemaException&
se) {
415 ,
const std::string& connName)
423 coral::ISessionProxy* session =
m_sessions[connName];
425 coral::ITable& tableNode = session->nominalSchema().tableHandle(
"HVS_NODE");
426 coral::IQuery *queryNode = tableNode.newQuery();
427 queryNode->addToOutputList(
"NODE_NAME");
428 queryNode->setMemoryCacheSize(1);
430 queryNode->setCondition(
"BRANCH_FLAG=0", empty);
431 queryNode->addToOrderList(
"NODE_NAME");
433 coral::ICursor& cursorNode = queryNode->execute();
434 while(cursorNode.next()) {
435 list.push_back(cursorNode.currentRow()[
"NODE_NAME"].data<std::string>());
440 catch(coral::SchemaException&
se) {
454 ,
const std::string& connName)
456 std::vector<std::string>
taglist;
462 coral::ISessionProxy* session =
m_sessions[connName];
464 coral::ITable& tableTag2Node = session->nominalSchema().tableHandle(
"HVS_TAG2NODE");
465 coral::IQuery* queryTag2Node = tableTag2Node.newQuery();
466 queryTag2Node->addToOutputList(
"TAG_NAME");
467 queryTag2Node->setMemoryCacheSize(1);
469 std::string condString = std::string(
"NODE_ID=0 AND LOCKED=1 AND SUPPORTED>=")+supportedFlag;
470 queryTag2Node->setCondition(condString,empty);
471 queryTag2Node->addToOrderList(
"TAG_NAME");
473 coral::ICursor& cursorTagName = queryTag2Node->execute();
474 while(cursorTagName.next()) {
476 taglist.push_back(
row[
"TAG_NAME"].data<std::string>());
478 delete queryTag2Node;
481 catch(coral::SchemaException&
se) {
498 return sessionIt ==
m_sessions.end() ? nullptr : sessionIt->second;
503 return StatusCode::SUCCESS;
517 for(
auto& [sessionName,session] :
m_sessions) {
521 return StatusCode::SUCCESS;