File indexing completed on 2024-04-06 12:23:11
0001 #include <stdexcept>
0002 #include <string>
0003 #include <cstdlib>
0004
0005 #include "OnlineDB/Oracle/interface/Oracle.h"
0006
0007 #include "OnlineDB/EcalCondDB/interface/ODTTCFConfig.h"
0008
0009 using namespace std;
0010 using namespace oracle::occi;
0011
0012 ODTTCFConfig::ODTTCFConfig() {
0013 m_env = nullptr;
0014 m_conn = nullptr;
0015 m_writeStmt = nullptr;
0016 m_readStmt = nullptr;
0017 m_config_tag = "";
0018 m_ID = 0;
0019 clear();
0020 m_size = 0;
0021 }
0022
0023 void ODTTCFConfig::clear() {}
0024
0025 ODTTCFConfig::~ODTTCFConfig() {}
0026
0027 int ODTTCFConfig::fetchNextId() noexcept(false) {
0028 int result = 0;
0029 try {
0030 this->checkConnection();
0031 std::cout << "going to fetch new id for TTCF 1" << endl;
0032 m_readStmt = m_conn->createStatement();
0033 m_readStmt->setSQL("select ecal_ttcf_config_sq.NextVal from dual");
0034 ResultSet* rset = m_readStmt->executeQuery();
0035 while (rset->next()) {
0036 result = rset->getInt(1);
0037 }
0038 std::cout << "id is : " << result << endl;
0039
0040 m_conn->terminateStatement(m_readStmt);
0041 return result;
0042
0043 } catch (SQLException& e) {
0044 throw(std::runtime_error(std::string("ODTTCFConfig::fetchNextId(): ") + e.getMessage()));
0045 }
0046 }
0047
0048 void ODTTCFConfig::prepareWrite() noexcept(false) {
0049 this->checkConnection();
0050 int next_id = fetchNextId();
0051
0052 try {
0053 m_writeStmt = m_conn->createStatement();
0054 m_writeStmt->setSQL(
0055 "INSERT INTO ECAL_TTCF_CONFIGURATION (ttcf_configuration_id, ttcf_tag, "
0056 " rxbc0_delay, reg_30 , ttcf_configuration_file , ttcf_configuration ) "
0057 "VALUES (:1, :2, :3 , :4, :5, :6)");
0058 m_writeStmt->setInt(1, next_id);
0059 m_writeStmt->setString(2, getConfigTag());
0060
0061 m_writeStmt->setInt(3, getRxBC0Delay());
0062 m_writeStmt->setInt(4, getReg30());
0063
0064 m_writeStmt->setString(5, getTTCFConfigurationFile());
0065
0066 oracle::occi::Clob clob(m_conn);
0067 clob.setEmpty();
0068 m_writeStmt->setClob(6, clob);
0069 m_writeStmt->executeUpdate();
0070 m_ID = next_id;
0071
0072 m_conn->terminateStatement(m_writeStmt);
0073 std::cout << "inserted into CONFIGURATION with id=" << next_id << std::endl;
0074
0075
0076 m_writeStmt = m_conn->createStatement();
0077 m_writeStmt->setSQL(
0078 "SELECT ttcf_configuration FROM ECAL_TTCF_CONFIGURATION WHERE"
0079 " ttcf_configuration_id=:1 FOR UPDATE");
0080
0081 std::cout << "updating the clob 0" << std::endl;
0082
0083 } catch (SQLException& e) {
0084 throw(std::runtime_error(std::string("ODTTCFConfig::prepareWrite(): ") + e.getMessage()));
0085 }
0086
0087 std::cout << "updating the clob 1 " << std::endl;
0088 }
0089
0090 void ODTTCFConfig::writeDB() noexcept(false) {
0091 std::cout << "updating the clob 2" << std::endl;
0092
0093 try {
0094 m_writeStmt->setInt(1, m_ID);
0095 ResultSet* rset = m_writeStmt->executeQuery();
0096
0097 rset->next();
0098
0099 oracle::occi::Clob clob = rset->getClob(1);
0100 cout << "Opening the clob in read write mode" << endl;
0101 populateClob(clob, getTTCFConfigurationFile(), m_size);
0102 int clobLength = clob.length();
0103 cout << "Length of the clob is: " << clobLength << endl;
0104
0105 m_writeStmt->executeUpdate();
0106 m_writeStmt->closeResultSet(rset);
0107
0108 } catch (SQLException& e) {
0109 throw(std::runtime_error(std::string("ODTTCFConfig::writeDB(): ") + e.getMessage()));
0110 }
0111
0112 if (!this->fetchID()) {
0113 throw(std::runtime_error("ODTTCFConfig::writeDB: Failed to write"));
0114 }
0115 }
0116
0117 void ODTTCFConfig::fetchData(ODTTCFConfig* result) noexcept(false) {
0118 this->checkConnection();
0119 result->clear();
0120
0121 if (result->getId() == 0 && (result->getConfigTag().empty())) {
0122 throw(std::runtime_error("ODTTCFConfig::fetchData(): no Id defined for this ODTTCFConfig "));
0123 }
0124
0125 try {
0126 m_readStmt->setSQL(
0127 "SELECT * "
0128 "FROM ECAL_TTCF_CONFIGURATION "
0129 " where (ttcf_configuration_id = :1 or ttcf_tag= :2) ");
0130 m_readStmt->setInt(1, result->getId());
0131 m_readStmt->setString(2, result->getConfigTag());
0132 ResultSet* rset = m_readStmt->executeQuery();
0133
0134 rset->next();
0135
0136 result->setId(rset->getInt(1));
0137 result->setConfigTag(rset->getString(2));
0138 result->setTTCFConfigurationFile(rset->getString(3));
0139 Clob clob = rset->getClob(4);
0140 cout << "Opening the clob in Read only mode" << endl;
0141 clob.open(OCCI_LOB_READONLY);
0142 int clobLength = clob.length();
0143 cout << "Length of the clob is: " << clobLength << endl;
0144 m_size = clobLength;
0145 unsigned char* buffer = readClob(clob, m_size);
0146 clob.close();
0147 result->setTTCFClob((unsigned char*)buffer);
0148
0149 } catch (SQLException& e) {
0150 throw(std::runtime_error(std::string("ODTTCFConfig::fetchData(): ") + e.getMessage()));
0151 }
0152 }
0153
0154 int ODTTCFConfig::fetchID() noexcept(false) {
0155 if (m_ID != 0) {
0156 return m_ID;
0157 }
0158
0159 this->checkConnection();
0160
0161 try {
0162 Statement* stmt = m_conn->createStatement();
0163 stmt->setSQL(
0164 "SELECT ttcf_configuration_id FROM ecal_ttcf_configuration "
0165 "WHERE ttcf_tag=:ttcf_tag ");
0166
0167 stmt->setString(1, getConfigTag());
0168
0169 ResultSet* rset = stmt->executeQuery();
0170
0171 if (rset->next()) {
0172 m_ID = rset->getInt(1);
0173 } else {
0174 m_ID = 0;
0175 }
0176 m_conn->terminateStatement(stmt);
0177 } catch (SQLException& e) {
0178 throw(std::runtime_error(std::string("ODTTCFConfig::fetchID: ") + e.getMessage()));
0179 }
0180
0181 return m_ID;
0182 }
0183
0184 void ODTTCFConfig::setParameters(const std::map<string, string>& my_keys_map) {
0185
0186
0187
0188 for (std::map<std::string, std::string>::const_iterator ci = my_keys_map.begin(); ci != my_keys_map.end(); ci++) {
0189 if (ci->first == "TTCF_CONFIGURATION_ID")
0190 setConfigTag(ci->second);
0191 if (ci->first == "Configuration") {
0192 std::string fname = ci->second;
0193 string str3;
0194 size_t pos, pose;
0195
0196 pos = fname.find('=');
0197 pose = fname.size();
0198 str3 = fname.substr(pos + 1, pose - pos - 2);
0199
0200 cout << "fname=" << fname << " and reduced is: " << str3 << endl;
0201 setTTCFConfigurationFile(str3);
0202
0203
0204 std::cout << "Going to read file: " << str3 << endl;
0205
0206 ifstream inpFile;
0207 inpFile.open(str3.c_str());
0208
0209
0210 int bufsize = 0;
0211 inpFile.seekg(0, ios::end);
0212 bufsize = inpFile.tellg();
0213 std::cout << " bufsize =" << bufsize << std::endl;
0214
0215 inpFile.seekg(0, ios::beg);
0216
0217 inpFile.close();
0218 m_size = bufsize;
0219
0220 } else if (ci->first == "RXBC0_DELAY") {
0221 setRxBC0Delay(atoi(ci->second.c_str()));
0222 } else if (ci->first == "REG_30") {
0223 setReg30(atoi(ci->second.c_str()));
0224 }
0225 }
0226 }