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