query.cpp 5.8 KB
Newer Older
Axel Auweter's avatar
Axel Auweter committed
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
//================================================================================
// Name        : query.cpp
// Author      : Axel Auweter
// Copyright   : Leibniz Supercomputing Centre
// Description : Implementation of query class of dcdbquery
//================================================================================

//================================================================================
// This file is part of DCDB (DataCenter DataBase)
// Copyright (C) 2011-2016 Leibniz Supercomputing Centre
//
// This program is free software; you can redistribute it and/or
// modify it under the terms of the GNU General Public License
// as published by the Free Software Foundation; either version 2
// of the License, or (at your option) any later version.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with this program; if not, write to the Free Software
// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
//================================================================================
Axel Auweter's avatar
Axel Auweter committed
26
27
28
29
30
31
32

#include <iostream>
#include <list>
#include <string>
#include <algorithm>

#include <cstdlib>
33
#include <cinttypes>
Axel Auweter's avatar
Axel Auweter committed
34

35
#include <boost/algorithm/string.hpp>
36
#include <boost/regex.hpp>
37
38

#include "dcdbendian.h"
Axel Auweter's avatar
Axel Auweter committed
39
40
#include "query.h"

Axel Auweter's avatar
Axel Auweter committed
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
void DCDBQuery::setLocalTimeEnabled(bool enable) {
  useLocalTime = enable;
}

bool DCDBQuery::getLocalTimeEnabled() {
  return useLocalTime;
}

void DCDBQuery::setRawOutputEnabled(bool enable) {
  useRawOutput = enable;
}

bool DCDBQuery::getRawOutputEnabled() {
  return useRawOutput;
}

Axel Auweter's avatar
Axel Auweter committed
57
58
59
60
61
62
63
64
void DCDBQuery::setFloatOutputEnabled(bool enable) {
  useFloatOutput = enable;
}

bool DCDBQuery::getFloatOutputEnabled() {
  return useFloatOutput;
}

65
void DCDBQuery::genOutput(std::list<DCDB::SensorDataStoreReading> &results)
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
	int64_t prev = 0;
	for (std::list<DCDB::SensorDataStoreReading>::iterator reading =
			results.begin(); reading != results.end(); reading++) {
		double fvalue;
		int64_t ivalue;

		/* Assign the reading to local variable */
		if (useFloatOutput) {
			fvalue = (*reading).value;
		} else {
			ivalue = (*reading).value;
		}

		/* Convert the unit if requested */
		if (unitConvert) {
			if (useFloatOutput) {
				if (!DCDB::UnitConv::convert(fvalue, baseUnit, targetUnit)) {
					std::cerr << "Warning, cannot convert units ("
							<< DCDB::UnitConv::toString(baseUnit) << " -> "
							<< DCDB::UnitConv::toString(targetUnit) << ")"
							<< std::endl;
					unitConvert = false;
				}
			} else {
				if (!DCDB::UnitConv::convert(ivalue, baseUnit, targetUnit)) {
					std::cerr << "Warning, cannot convert units ("
							<< DCDB::UnitConv::toString(baseUnit) << " -> "
							<< DCDB::UnitConv::toString(targetUnit) << ")"
							<< std::endl;
					unitConvert = false;
				}
			}
		}

		/* Print the sensor's public name */
		std::cout << sensorName << ",";

		/* Print the time stamp */
		if (useLocalTime) {
			(*reading).timeStamp.convertToLocal();
		}
		if (useRawOutput) {
			std::cout << (*reading).timeStamp.getRaw() << ",";
		} else {
			std::cout << (*reading).timeStamp.getString() << ",";
		}

		/* Print the sensor value */
		if (useFloatOutput) {
			std::cout << fvalue << ",";
		} else {
			std::cout << ivalue << ",";
		}

		/* Print delta */
		if (reading != results.begin()) {
			std::cout << (*reading).value - prev;
		}
		prev = (*reading).value;
		std::cout << std::endl;
	}
128
129
}

130
void DCDBQuery::doQuery(const char* hostname, std::list<std::string> sensors, DCDB::TimeStamp start, DCDB::TimeStamp end)
Axel Auweter's avatar
Axel Auweter committed
131
132
{
  /* Create a new connection to the database */
133
  connection = new DCDB::Connection();
Axel Auweter's avatar
Axel Auweter committed
134
135
136
  connection->setHostname(hostname);
  if (!connection->connect()) {
      std::cout << "Cannot connect to database." << std::endl;
137
      exit(EXIT_FAILURE);
Axel Auweter's avatar
Axel Auweter committed
138
139
140
  }

  /* Initialize the SensorConfig interface */
141
  DCDB::SensorConfig sensorConfig(connection);
Axel Auweter's avatar
Axel Auweter committed
142
143

  /* Print the CSV header */
144
  std::cout << "Sensor,Time,Value,Delta" << std::endl;
Axel Auweter's avatar
Axel Auweter committed
145
146
147

  /* Iterate over list of sensors requested by the user */
  for (std::list<std::string>::iterator it = sensors.begin(); it != sensors.end(); it++) {
148
149
150
      unitConvert = false;
      scale = false;
      scalingFactor = 1;
root's avatar
root committed
151
      std::string modifierStr;
152
153
      baseUnit = DCDB::Unit_None;
      targetUnit = DCDB::Unit_None;
Axel Auweter's avatar
Axel Auweter committed
154

155
      /* Check if the sensor was requested in a different unit or with scaling factor */
Axel Auweter's avatar
Axel Auweter committed
156
      if (it->find('/') != std::string::npos) {
157
          modifierStr = it->substr(it->find('/')+1, it->length());
Axel Auweter's avatar
Axel Auweter committed
158

159
160
          /* Remove the modifier from the string */
          *it = it->substr(0, it->find('/'));
Axel Auweter's avatar
Axel Auweter committed
161

162
163
164
165
166
167
168
169
          /* Check what type of modificatino is requested */
          boost::regex e("\\.?[0-9]*", boost::regex::extended);
          if (boost::regex_match(modifierStr, e)) {
              scale = true;
              sscanf(modifierStr.c_str(), "%lf", &scalingFactor);
          }
          else {
              unitConvert = true;
170
              targetUnit = DCDB::UnitConv::fromString(modifierStr);
Axel Auweter's avatar
Axel Auweter committed
171

172
              DCDB::PublicSensor sen;
173
              sensorConfig.getPublicSensorByName(sen, it->c_str());
174
              baseUnit = DCDB::UnitConv::fromString(sen.unit);
175
          }
Axel Auweter's avatar
Axel Auweter committed
176
177
      }

178
179
180
      std::list<DCDB::SensorDataStoreReading> results;
      sensorName = *it;
      DCDB::Sensor sensor(connection, sensorName);
181
182
183
      if (scale) {
        sensor.setScalingFactor(scalingFactor);
      }
184
      sensor.query(results, start, end);
185
      genOutput(results);
Axel Auweter's avatar
Axel Auweter committed
186
187
188
189
190
191
192
193
194
195
  }

  /*
   * Clean up
   */
  connection->disconnect();
  delete connection;

}

Axel Auweter's avatar
Axel Auweter committed
196
DCDBQuery::DCDBQuery()
Axel Auweter's avatar
Axel Auweter committed
197
{
Axel Auweter's avatar
Axel Auweter committed
198
199
200
  connection = nullptr;
  useLocalTime = false;
  useRawOutput = false;
Axel Auweter's avatar
Axel Auweter committed
201
  useFloatOutput = false;
Axel Auweter's avatar
Axel Auweter committed
202
}