4 * Created on: Oct 31, 2010
15 #include <sys/types.h>
20 #include "DeviceConfig.hh"
21 #include "StoreDay.hh"
22 #include "FileUtil.hh"
27 StoreDay::StoreDay(string device_id_param,
28 Date *date_time_param): Store(device_id_param, date_time_param) {
29 store_fname = get_file_name(device_id_param, date_time_param);
32 StoreDay::StoreDay(string fname_param): Store("", NULL) {
35 store_fname = fname_param;
38 StoreDay::~StoreDay() {
39 if (store_data != NULL) {
45 string StoreDay::get_dir_name(string device_id, Date *date_time_param) {
50 snprintf(buffer, 30, "%d/%02d", date_time_param->year, date_time_param->month);
51 bd_name = DeviceConfig::get_base_dir_name();
52 bd_name = FileUtil::concat_paths(bd_name, device_id);
53 ret_val = bd_name + "/" + buffer;
57 string StoreDay::get_file_name(string device_id, Date *date_time_param) {
62 snprintf(buffer, 30, "%d-%02d-%02d", date_time_param->year, date_time_param->month, date_time_param->day);
64 fname = fname + DATAFILE_SUFFIX;
65 ret_val = get_dir_name(device_id, date_time_param);
66 ret_val = FileUtil::concat_paths(ret_val, fname);
70 void StoreDay::save(string device_id,
71 std::list<Data *> *data_list,
79 list<Data *>::iterator iter;
83 log_info("[%s] writing %lu data values to save.\n", device_id.c_str(), data_list->size());
84 // TODO: add mutex to protect string_list while it's read and emptied
85 for(iter = data_list->begin(); iter != data_list->end(); iter++) {
87 date = data->get_date();
88 n_path = get_file_name(device_id, &date);
89 if (n_path.compare(f_path) != 0) {
90 if (ostream != NULL) {
95 log_info("[%s] Opening file for save: %s\n", device_id.c_str(), f_path.c_str());
96 ostream = FileUtil::open_for_writing(f_path.c_str());
98 if ((ostream != NULL) &&
99 (ostream->is_open() == true)) {
100 line = data->to_string(dec_precision);
101 if (line.length() > 0) {
102 log_debug("storing line: %s\n", line.c_str());
103 *ostream << line << endl;
107 log_error("[%s] File open for data save failed: %s\n", device_id.c_str(), f_path.c_str());
110 if (ostream != NULL) {
116 bool StoreDay::load() {
117 return Store::load(store_fname);
120 bool StoreDay::exist(string fname_param) {
122 ret_val = (access(fname_param.c_str(), F_OK) == 0);
126 bool StoreDay::exist() {
127 return exist(store_fname);
130 static int get_summary_period_as_freq_seconds(EnumSummaryPeriod period_type_param) {
134 switch(period_type_param) {
135 case PERIOD_SECONDLY:
138 case PERIOD_MINUTELY:
148 // -1 as freq means that show all data from the current store
155 plp::DataRange *StoreDay::get_sum(EnumSummaryPeriod period_type_param) {
167 ret_val = new DataRange();
170 frq_sec = get_summary_period_as_freq_seconds(period_type_param);
171 if (store_data == NULL) {
174 if (store_data != NULL) {
175 row_count = store_data->get_count();
177 col_count = store_data->get_data_item_value_count();
179 for (ii = 0; ii < row_count; ii++) {
180 data = store_data->get(ii);
183 calc = data->clone();
184 limit_d = data->get_date().clone();
187 limit_d->inc_seconds(frq_sec);
190 date = data->get_date();
191 if ((ii <= (row_count -1)) &&
192 ((frq_sec == -1) || (date.before(limit_d)))) {
193 for (jj = 0; jj < col_count; jj++) {
194 calc->value_arr[jj] = calc->value_arr[jj] + data->value_arr[jj];
197 if ((ii >= (row_count -1)) ||
198 ((frq_sec != -1) && (date.before(limit_d) == false))) {
201 calc = data->clone();
202 if (limit_d != NULL) {
205 limit_d = data->get_date().clone();
208 limit_d->inc_seconds(frq_sec);
218 if (limit_d != NULL) {
227 plp::DataRange *StoreDay::get_mean(EnumSummaryPeriod period_type_param) {
240 ret_val = new DataRange();
244 frq_sec = get_summary_period_as_freq_seconds(period_type_param);
245 if (store_data == NULL) {
248 if (store_data != NULL) {
249 row_count = store_data->get_count();
251 col_count = store_data->get_data_item_value_count();
253 for (ii = 0; ii < row_count; ii++) {
254 data = store_data->get(ii);
258 calc = data->clone();
259 limit_d = data->get_date().clone();
262 limit_d->inc_seconds(frq_sec);
265 date = data->get_date();
266 if ((ii <= (row_count -1)) &&
267 ((frq_sec == -1) || (date.before(limit_d)))) {
268 for (jj = 0; jj < col_count; jj++) {
269 calc->value_arr[jj] = calc->value_arr[jj] + data->value_arr[jj];
273 if ((ii >= (row_count -1)) ||
274 ((frq_sec != -1) && (date.before(limit_d) == false))) {
275 for (jj = 0; jj < col_count; jj++) {
276 calc->value_arr[jj] = calc->value_arr[jj] / d_count;
281 calc = data->clone();
282 if (limit_d != NULL) {
285 limit_d = data->get_date().clone();
288 limit_d->inc_seconds(frq_sec);
298 if (limit_d != NULL) {
307 plp::DataRange *StoreDay::get_delta(EnumSummaryPeriod period_type_param) {
320 ret_val = new DataRange();
324 frq_sec = get_summary_period_as_freq_seconds(period_type_param);
325 if (store_data == NULL) {
328 if (store_data != NULL) {
329 row_count = store_data->get_count();
331 col_count = store_data->get_data_item_value_count();
333 for (ii = 0; ii < row_count; ii++) {
334 data = store_data->get(ii);
337 calc1 = data->clone();
338 limit_d = data->get_date().clone();
341 limit_d->inc_seconds(frq_sec);
348 date = data->get_date();
349 if ((ii <= (row_count -1)) &&
350 ((frq_sec == -1) || (date.before(limit_d)))) {
354 calc2 = data->clone();
356 if ((ii >= (row_count -1)) ||
357 ((frq_sec != -1) && (date.before(limit_d) == false))) {
359 calc2 = calc1->clone();
361 for (jj = 0; jj < col_count; jj++) {
362 calc2->value_arr[jj] = calc2->value_arr[jj] - calc1->value_arr[jj];
366 calc1 = data->clone();
369 if (limit_d != NULL) {
372 limit_d = data->get_date().clone();
375 limit_d->inc_seconds(frq_sec);
389 if (limit_d != NULL) {
398 plp::DataRange *StoreDay::get_max_or_min(EnumSummaryPeriod period_type_param, bool max) {
410 ret_val = new DataRange();
413 frq_sec = get_summary_period_as_freq_seconds(period_type_param);
414 if (store_data == NULL) {
417 if (store_data != NULL) {
418 row_count = store_data->get_count();
420 col_count = store_data->get_data_item_value_count();
422 for (ii = 0; ii < row_count; ii++) {
423 data = store_data->get(ii);
426 calc = data->clone();
427 limit_d = data->get_date().clone();
430 limit_d->inc_seconds(frq_sec);
433 date = data->get_date();
434 if ((ii <= (row_count -1)) &&
435 ((frq_sec == -1) || (date.before(limit_d)))) {
438 for (jj = 0; jj < col_count; jj++) {
439 if (calc->value_arr[jj] < data->value_arr[jj]) {
440 calc->value_arr[jj] = data->value_arr[jj];
446 for (jj = 0; jj < col_count; jj++) {
447 if (data->value_arr[jj] < calc->value_arr[jj]) {
448 calc->value_arr[jj] = data->value_arr[jj];
456 new_date = data->get_date();
457 calc->set_date(&new_date);
460 if ((ii >= (row_count -1)) ||
461 ((frq_sec != -1) && (date.before(limit_d) == false))) {
464 calc = data->clone();
465 if (limit_d != NULL) {
468 limit_d = data->get_date().clone();
471 limit_d->inc_seconds(frq_sec);
481 if (limit_d != NULL) {
490 plp::DataRange *StoreDay::get_max(EnumSummaryPeriod period_type_param) {
493 ret_val = get_max_or_min(period_type_param, true);
497 plp::DataRange *StoreDay::get_min(EnumSummaryPeriod period_type_param) {
500 ret_val = get_max_or_min(period_type_param, false);
504 DataRange *StoreDay::get_oldest_and_latest_data(string fname_param) {
517 if (store_data != NULL) {
518 row_count = store_data->get_count();
520 o_data = store_data->get(0);
521 n_data = store_data->get(row_count - 1);
525 if (range_data != NULL) {
526 row_count = range_data->get_count();
528 o_data = range_data->get(0);
529 n_data = range_data->get(row_count - 1);
533 in.open(fname_param.c_str());
534 if (in.is_open() == true) {
535 while (in.eof() == false) {
537 if (line.empty() == false) {
538 if (o_data == NULL) {
539 o_data = Data::parse_string(line);
544 if (prev_line.empty() == false) {
545 n_data = Data::parse_string(prev_line);
550 if ((o_data != NULL) &&
552 ret_val = new DataRange(o_data);
553 ret_val->add(n_data);
554 if (range_data != NULL) {
555 range_data = new DataRange(o_data);
556 range_data->add(n_data);
559 if (o_data != NULL) {
562 if (n_data != NULL) {
568 DataRange *StoreDay::get_oldest_and_latest_data() {
569 return get_oldest_and_latest_data(store_fname);
572 Data *StoreDay::get_oldest_data() {
578 dr = get_oldest_and_latest_data();
580 row_count = dr->get_count();
581 if (row_count >= 1) {
582 ret_val = dr->get(0);
589 Data *StoreDay::get_latest_data() {
595 dr = get_oldest_and_latest_data();
597 row_count = dr->get_count();
598 if (row_count == 2) {
599 ret_val = dr->get(1);