1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
|
#include "CondTools/DQM/interface/DQMSummaryReader.h"
#include "FWCore/Utilities/interface/Exception.h"
#include "RelationalAccess/ISession.h"
//#include "RelationalAccess/ISessionProxy.h"
//#include "RelationalAccess/ITypeConverter.h"
#include "RelationalAccess/ITransaction.h"
#include "RelationalAccess/ISchema.h"
#include "RelationalAccess/ITable.h"
#include "RelationalAccess/ITableDataEditor.h"
#include "RelationalAccess/TableDescription.h"
#include "RelationalAccess/IQuery.h"
#include "RelationalAccess/ICursor.h"
#include "CoralBase/AttributeList.h"
#include "CoralBase/Attribute.h"
#include "CoralBase/AttributeSpecification.h"
#include <iostream>
#include <stdexcept>
#include <vector>
#include <cmath>
DQMSummaryReader::DQMSummaryReader(const std::string& connectionString,
const std::string& user,
const std::string& pass)
: TestBase(), m_connectionString(connectionString), m_user(user), m_pass(pass) {
m_tableToRead = "";
}
DQMSummaryReader::~DQMSummaryReader() {}
void DQMSummaryReader::run() {}
DQMSummary DQMSummaryReader::readData(const std::string& table,
/*const std::string & column,*/ const long long r_number) {
m_tableToRead = table; // to be CMS_DQM_SUMMARY.summarycontent
//m_columnToRead = column; // to be run, lumisec
DQMSummary dqmSummary;
dqmSummary.m_run = r_number;
std::cout << "Entering readData" << std::endl;
coral::ISession* session = this->connect(m_connectionString, m_user, m_pass);
//coral::ISessionProxy* session = this->connect(m_connectionString,
// m_user, m_pass);
try {
//session->typeConverter().setCppTypeForSqlType(coral::AttributeSpecification::typeNameForId(typeid(std::string)), "VARCHAR2(20)");
//session->typeConverter().setCppTypeForSqlType(coral::AttributeSpecification::typeNameForId(typeid(std::string)), "VARCHAR2(40)");
session->transaction().start();
std::cout << "Starting session on the connection " << m_connectionString << std::endl;
coral::ISchema& schema = session->nominalSchema();
std::cout << "--- accessing schema for user " << m_user << std::endl;
std::cout << "------ trying to handle table " << m_tableToRead << std::endl;
//defining count query
coral::IQuery* query = schema.tableHandle(m_tableToRead).newQuery();
query->addToOutputList("count(*)", "count");
//condition for the WHERE clause in the count query
std::string condition = "run=:n_run";
coral::AttributeList conditionData;
conditionData.extend<long long>("n_run");
//conditionData[0].setValue<long long>(r_number);
conditionData[0].data<long long>() = r_number;
query->setCondition(condition, conditionData);
//performing count query
coral::ICursor& cursor = query->execute();
DQMSummary::DQMSummary::RunItem runItem;
DQMSummary::DQMSummary::RunItem::LumiItem lumiItem;
double nRows = 0;
if (cursor.next()) {
//cursor.currentRow().toOutputStream(std::cout) << std::endl;
const coral::AttributeList& row = cursor.currentRow();
nRows = row["count"].data<double>();
/*const coral::Attribute& count = cursor.currentRow()["count"];
if(count.specification().type() == typeid(double))
nRows = count.data<double>();
else
nRows = count.data<float>();*/
std::cout << "Rows for count query " << nRows << std::endl;
if (nRows != 0) {
std::cout << "Starting to build DQMSummary" << std::endl;
//defining first query
coral::IQuery* queryI = schema.tableHandle(m_tableToRead).newQuery();
queryI->setDistinct();
queryI->addToOutputList("lumisec");
//condition for the WHERE clause in the first query
std::string conditionI = "run=:n_run";
coral::AttributeList conditionDataI;
conditionDataI.extend<long long>("n_run");
//conditionDataI[0].setValue<long long>(r_number);
conditionDataI[0].data<long long>() = r_number;
queryI->setCondition(conditionI, conditionDataI);
//performing query
coral::ICursor& cursorI = queryI->execute();
//a little printout, then filling DQMSummary
int nRowsI = 0;
while (cursorI.next()) {
//cursorI.currentRow().toOutputStream(std::cout) << std::endl;
++nRowsI;
const coral::AttributeList& rowI = cursorI.currentRow();
runItem.m_lumisec = rowI["lumisec"].data<long long>();
//defining second query
coral::IQuery* queryII = schema.tableHandle(m_tableToRead).newQuery();
queryII->addToOutputList("subsystem");
queryII->addToOutputList("reportcontent");
//queryII->addToOutputList("type"); // when implemented in OMDS
queryII->addToOutputList("status");
std::string conditionII = "run= :n_run AND lumisec= :n_lumisec";
coral::AttributeList conditionDataII;
conditionDataII.extend<long long>("n_run");
//conditionDataII[0].setValue<long long>(r_number);
conditionDataII[0].data<long long>() = r_number;
conditionDataII.extend<long long>("n_lumisec");
//conditionDataII[1].setValue<long long>(rowI["lumisec"].data<long long>());
conditionDataII[1].data<long long>() = rowI["lumisec"].data<long long>();
queryII->setCondition(conditionII, conditionDataII);
//performing query
coral::ICursor& cursorII = queryII->execute();
//a little printout, then filling DQMSummary
int nRowsII = 0;
while (cursorII.next()) {
//cursorII.currentRow().toOutputStream(std::cout) << std::endl;
++nRowsII;
const coral::AttributeList& rowII = cursorII.currentRow();
lumiItem.m_subsystem = rowII["subsystem"].data<std::string>();
lumiItem.m_reportcontent = rowII["reportcontent"].data<std::string>();
//lumiItem.m_type = rowII["type"].data<std::string>(); // when implemented in OMDS
lumiItem.m_type = "reportSummary";
lumiItem.m_status = rowII["status"].data<double>();
runItem.m_lumisummary.push_back(lumiItem);
std::cout << "DQMSummary::DQMSummary::RunItem::LumiItem filled" << std::endl;
}
std::cout << "Returned rows for lumisection query " << nRowsII << std::endl;
dqmSummary.m_summary.push_back(runItem);
std::cout << "DQMSummary::DQMSummary::RunItem filled" << std::endl;
delete queryII;
}
std::cout << "Returned rows for run number query " << nRowsI << std::endl;
delete queryI;
} else {
runItem.m_lumisec = 0;
lumiItem.m_subsystem = " ";
lumiItem.m_reportcontent = " ";
lumiItem.m_type = " ";
lumiItem.m_status = -2;
std::cout << "[lumisec (long long) : " << runItem.m_lumisec
<< "], [subsystem (string) : " << lumiItem.m_subsystem
<< "], [reportcontent (string) : " << lumiItem.m_reportcontent
<< "], [type (string) : " << lumiItem.m_type << "], [status (double) : " << lumiItem.m_status << "]"
<< std::endl;
runItem.m_lumisummary.push_back(lumiItem);
dqmSummary.m_summary.push_back(runItem);
std::cout << "No information in DQMSummary for run " << r_number << std::endl;
}
} else
throw cms::Exception("UnconsistentData") << "What is wrong with you?" << std::endl;
std::cout << "DQMSummary built" << std::endl;
delete query;
session->transaction().commit();
} catch (const std::exception& e) {
std::cout << "Exception: " << e.what() << std::endl;
}
delete session;
return dqmSummary;
}
|