File indexing completed on 2025-08-03 08:20:56
0001 #include "OnlMonDB.h"
0002 #include "OnlMonDBVar.h"
0003 #include "OnlMonDBodbc.h"
0004
0005 #include <onlmon/OnlMonBase.h> // for OnlMonBase
0006 #include <onlmon/OnlMonServer.h>
0007
0008 #include <ctype.h> // for tolower
0009 #include <algorithm>
0010 #include <cstdio>
0011 #include <iostream>
0012 #include <sstream>
0013 #include <utility> // for pair
0014
0015 OnlMonDB::OnlMonDB(const std::string &thisname)
0016 : OnlMonBase(thisname)
0017 {
0018 return;
0019 }
0020
0021 OnlMonDB::~OnlMonDB()
0022 {
0023 delete db;
0024 while (varmap.begin() != varmap.end())
0025 {
0026 delete varmap.begin()->second;
0027 varmap.erase(varmap.begin());
0028 }
0029 }
0030
0031 void OnlMonDB::Print() const
0032 {
0033 std::cout << "OnlMonDB Name: " << ThisName << std::endl;
0034 std::map<const std::string, OnlMonDBVar *>::const_iterator iter;
0035 for (iter = varmap.begin(); iter != varmap.end(); ++iter)
0036 {
0037 iter->second->Print();
0038 }
0039 return;
0040 }
0041
0042 int OnlMonDB::registerVar(const std::string &varname)
0043 {
0044 std::string cpstring = varname;
0045 transform(cpstring.begin(), cpstring.end(), cpstring.begin(), (int (*)(int)) tolower);
0046 std::map<const std::string, OnlMonDBVar *>::const_iterator iter = varmap.find(cpstring);
0047 if (iter != varmap.end())
0048 {
0049 std::cout << "Variable " << varname << " allready registered in DB" << std::endl;
0050 return -1;
0051 }
0052 varmap[cpstring] = new OnlMonDBVar();
0053 return 0;
0054 }
0055
0056 int OnlMonDB::SetVar(const std::string &varname, const float var, const float varerr, const float varqual)
0057 {
0058 float vararray[3];
0059 vararray[0] = var;
0060 vararray[1] = varerr;
0061 vararray[2] = varqual;
0062 return SetVar(varname, vararray);
0063 }
0064
0065 int OnlMonDB::SetVar(const std::string &varname, const float var[3])
0066 {
0067 std::string cpstring = varname;
0068 transform(cpstring.begin(), cpstring.end(), cpstring.begin(), (int (*)(int)) tolower);
0069 std::map<const std::string, OnlMonDBVar *>::iterator iter = varmap.find(cpstring);
0070 if (iter != varmap.end())
0071 {
0072 iter->second->SetVar(var);
0073 return 0;
0074 }
0075 std::cout << __PRETTY_FUNCTION__ << " Could not find Variable " << varname << " in DB list" << std::endl;
0076 return -1;
0077 }
0078
0079 int OnlMonDB::DBInit()
0080 {
0081 if (!db)
0082 {
0083 db = new OnlMonDBodbc(ThisName);
0084 }
0085 db->Verbosity(Verbosity());
0086 db->CheckAndCreateTable(varmap);
0087 return 0;
0088 }
0089
0090 int OnlMonDB::DBcommit()
0091 {
0092 OnlMonServer *se = OnlMonServer::instance();
0093
0094 int iret = 0;
0095 if (!db)
0096 {
0097 std::cout << "Data Base not initialized, fix your code." << std::endl;
0098 std::cout << "You need to call DBInit() after you registered your variables" << std::endl;
0099 return -1;
0100 }
0101 iret = db->AddRow(se->CurrentTicks(), se->RunNumber(), varmap);
0102 if (iret)
0103 {
0104 printf("error in dbcommit, ret code %d\n", iret);
0105 return iret;
0106 }
0107
0108 std::map<const std::string, OnlMonDBVar *>::iterator iter;
0109 for (iter = varmap.begin(); iter != varmap.end(); ++iter)
0110 {
0111 iter->second->resetupdated();
0112 }
0113 return iret;
0114 }
0115
0116 int OnlMonDB::DBcommitTest()
0117 {
0118 static int ifirst = 1;
0119 int iret = 0;
0120 static time_t ticks = 0;
0121 static int runnumber = 90000;
0122 if (!db)
0123 {
0124 std::cout << "Data Base not initialized, fix your code." << std::endl;
0125 std::cout << "You need to call DBInit() after you registered your variables" << std::endl;
0126 return -1;
0127 }
0128 if (ifirst)
0129 {
0130 ticks = time(nullptr);
0131 ticks -= 2 * 30 * 24 * 60 * 60;
0132 ifirst = 0;
0133 }
0134 else
0135 {
0136 ticks += 3 * 60;
0137 runnumber += 1;
0138 }
0139 db->AddRow(ticks, runnumber, varmap);
0140 if (iret)
0141 {
0142 std::cout << "error in dbcommit" << std::endl;
0143 return iret;
0144 }
0145
0146 std::map<const std::string, OnlMonDBVar *>::iterator iter;
0147 for (iter = varmap.begin(); iter != varmap.end(); ++iter)
0148 {
0149 iter->second->resetupdated();
0150 }
0151 return iret;
0152 }
0153
0154 int OnlMonDB::GetVar(const time_t begin, const time_t end, const std::string &varname, std::vector<time_t> ×tp, std::vector<int> &runnumber, std::vector<float> &var, std::vector<float> &varerr)
0155 {
0156 if (!db)
0157 {
0158 db = new OnlMonDBodbc(ThisName);
0159 }
0160 int iret = db->GetVar(begin, end, varname, timestp, runnumber, var, varerr);
0161 return iret;
0162 }
0163
0164 void OnlMonDB::Reset()
0165 {
0166 std::map<const std::string, OnlMonDBVar *>::iterator iter;
0167 for (iter = varmap.begin(); iter != varmap.end(); ++iter)
0168 {
0169 iter->second->resetupdated();
0170 }
0171 return;
0172 }