4 * Created on: Oct 31, 2010
15 #include <sys/types.h>
21 #include "DeviceConfig.hh"
22 #include "W1Configure.hh"
23 #include "StoreDay.hh"
30 StoreDay::StoreDay(string device_id_param,
31 Date *date_time_param): Store(device_id_param, date_time_param) {
32 store_fname = get_file_name(device_id_param, date_time_param);
35 StoreDay::StoreDay(string fname_param): Store("", NULL) {
38 store_fname = fname_param;
41 StoreDay::~StoreDay() {
42 if (store_data != NULL) {
48 string StoreDay::get_dir_name(string device_id, Date *date_time_param) {
53 snprintf(buffer, 30, "%d/%02d", date_time_param->year, date_time_param->month);
54 bd_name = DeviceConfig::get_base_dir_name();
55 bd_name = W1Util::concat_paths(bd_name, device_id);
56 ret_val = bd_name + "/" + buffer;
60 string StoreDay::get_file_name(string device_id, Date *date_time_param) {
65 snprintf(buffer, 30, "%d-%02d-%02d", date_time_param->year, date_time_param->month, date_time_param->day);
67 fname = fname + DATAFILE_SUFFIX;
68 ret_val = get_dir_name(device_id, date_time_param);
69 ret_val = W1Util::concat_paths(ret_val, fname);
73 void StoreDay::save(string device_id,
74 std::list<Data *> *data_list,
82 list<Data *>::iterator iter;
86 log_info("[%s] writing %d data values to save.\n", device_id.c_str(), data_list->size());
87 // TODO: add mutex to protect string_list while it's read and emptied
88 for(iter = data_list->begin(); iter != data_list->end(); iter++) {
90 date = data->get_date();
91 n_path = get_file_name(device_id, &date);
92 if (n_path.compare(f_path) != 0) {
93 if (ostream != NULL) {
98 log_info("[%s] Opening file for save: %s\n", device_id.c_str(), f_path.c_str());
99 ostream = W1Util::open_for_writing(f_path.c_str());
101 if ((ostream != NULL) &&
102 (ostream->is_open() == true)) {
103 line = data->to_string(dec_precision);
104 if (line.length() > 0) {
105 log_debug("storing line: %s\n", line.c_str());
106 *ostream << line << endl;
110 log_error("[%s] File open for data save failed: %s\n", device_id.c_str(), f_path.c_str());
113 if (ostream != NULL) {
119 bool StoreDay::load() {
120 return Store::load(store_fname);
123 bool StoreDay::exist(string fname_param) {
125 ret_val = (access(fname_param.c_str(), F_OK) == 0);
129 bool StoreDay::exist() {
130 return exist(store_fname);
133 static int get_summary_period_as_freq_seconds(EnumSummaryPeriod period_type_param) {
137 switch(period_type_param) {
138 case PERIOD_SECONDLY:
141 case PERIOD_MINUTELY:
151 // -1 as freq means that show all data from the current store
158 plp::DataRange *StoreDay::get_sum(EnumSummaryPeriod period_type_param) {
170 ret_val = new DataRange();
173 frq_sec = get_summary_period_as_freq_seconds(period_type_param);
174 if (store_data == NULL) {
177 if (store_data != NULL) {
178 row_count = store_data->get_count();
180 col_count = store_data->get_data_item_value_count();
182 for (ii = 0; ii < row_count; ii++) {
183 data = store_data->get(ii);
186 calc = data->clone();
187 limit_d = data->get_date().clone();
190 limit_d->inc_seconds(frq_sec);
193 date = data->get_date();
194 if ((ii <= (row_count -1)) &&
195 ((frq_sec == -1) || (date.before(limit_d)))) {
196 for (jj = 0; jj < col_count; jj++) {
197 calc->value_arr[jj] = calc->value_arr[jj] + data->value_arr[jj];
200 if ((ii >= (row_count -1)) ||
201 ((frq_sec != -1) && (date.before(limit_d) == false))) {
204 calc = data->clone();
205 if (limit_d != NULL) {
208 limit_d = data->get_date().clone();
211 limit_d->inc_seconds(frq_sec);
221 if (limit_d != NULL) {
230 plp::DataRange *StoreDay::get_mean(EnumSummaryPeriod period_type_param) {
243 ret_val = new DataRange();
247 frq_sec = get_summary_period_as_freq_seconds(period_type_param);
248 if (store_data == NULL) {
251 if (store_data != NULL) {
252 row_count = store_data->get_count();
254 col_count = store_data->get_data_item_value_count();
256 for (ii = 0; ii < row_count; ii++) {
257 data = store_data->get(ii);
261 calc = data->clone();
262 limit_d = data->get_date().clone();
265 limit_d->inc_seconds(frq_sec);
268 date = data->get_date();
269 if ((ii <= (row_count -1)) &&
270 ((frq_sec == -1) || (date.before(limit_d)))) {
271 for (jj = 0; jj < col_count; jj++) {
272 calc->value_arr[jj] = calc->value_arr[jj] + data->value_arr[jj];
276 if ((ii >= (row_count -1)) ||
277 ((frq_sec != -1) && (date.before(limit_d) == false))) {
278 for (jj = 0; jj < col_count; jj++) {
279 calc->value_arr[jj] = calc->value_arr[jj] / d_count;
284 calc = data->clone();
285 if (limit_d != NULL) {
288 limit_d = data->get_date().clone();
291 limit_d->inc_seconds(frq_sec);
301 if (limit_d != NULL) {
310 plp::DataRange *StoreDay::get_delta(EnumSummaryPeriod period_type_param) {
323 ret_val = new DataRange();
327 frq_sec = get_summary_period_as_freq_seconds(period_type_param);
328 if (store_data == NULL) {
331 if (store_data != NULL) {
332 row_count = store_data->get_count();
334 col_count = store_data->get_data_item_value_count();
336 for (ii = 0; ii < row_count; ii++) {
337 data = store_data->get(ii);
340 calc1 = data->clone();
341 limit_d = data->get_date().clone();
344 limit_d->inc_seconds(frq_sec);
351 date = data->get_date();
352 if ((ii <= (row_count -1)) &&
353 ((frq_sec == -1) || (date.before(limit_d)))) {
357 calc2 = data->clone();
359 if ((ii >= (row_count -1)) ||
360 ((frq_sec != -1) && (date.before(limit_d) == false))) {
362 calc2 = calc1->clone();
364 for (jj = 0; jj < col_count; jj++) {
365 calc2->value_arr[jj] = calc2->value_arr[jj] - calc1->value_arr[jj];
369 calc1 = data->clone();
372 if (limit_d != NULL) {
375 limit_d = data->get_date().clone();
378 limit_d->inc_seconds(frq_sec);
392 if (limit_d != NULL) {
401 plp::DataRange *StoreDay::get_max_or_min(EnumSummaryPeriod period_type_param, bool max) {
413 ret_val = new DataRange();
416 frq_sec = get_summary_period_as_freq_seconds(period_type_param);
417 if (store_data == NULL) {
420 if (store_data != NULL) {
421 row_count = store_data->get_count();
423 col_count = store_data->get_data_item_value_count();
425 for (ii = 0; ii < row_count; ii++) {
426 data = store_data->get(ii);
429 calc = data->clone();
430 limit_d = data->get_date().clone();
433 limit_d->inc_seconds(frq_sec);
436 date = data->get_date();
437 if ((ii <= (row_count -1)) &&
438 ((frq_sec == -1) || (date.before(limit_d)))) {
441 for (jj = 0; jj < col_count; jj++) {
442 if (calc->value_arr[jj] < data->value_arr[jj]) {
443 calc->value_arr[jj] = data->value_arr[jj];
449 for (jj = 0; jj < col_count; jj++) {
450 if (data->value_arr[jj] < calc->value_arr[jj]) {
451 calc->value_arr[jj] = data->value_arr[jj];
459 new_date = data->get_date();
460 calc->set_date(&new_date);
463 if ((ii >= (row_count -1)) ||
464 ((frq_sec != -1) && (date.before(limit_d) == false))) {
467 calc = data->clone();
468 if (limit_d != NULL) {
471 limit_d = data->get_date().clone();
474 limit_d->inc_seconds(frq_sec);
484 if (limit_d != NULL) {
493 plp::DataRange *StoreDay::get_max(EnumSummaryPeriod period_type_param) {
496 ret_val = get_max_or_min(period_type_param, true);
500 plp::DataRange *StoreDay::get_min(EnumSummaryPeriod period_type_param) {
503 ret_val = get_max_or_min(period_type_param, false);
507 DataRange *StoreDay::get_oldest_and_newest_data(string fname_param) {
520 if (store_data != NULL) {
521 row_count = store_data->get_count();
523 o_data = store_data->get(0);
524 n_data = store_data->get(row_count - 1);
528 if (range_data != NULL) {
529 row_count = range_data->get_count();
531 o_data = range_data->get(0);
532 n_data = range_data->get(row_count - 1);
536 in.open(fname_param.c_str());
537 if (in.is_open() == true) {
538 while (in.eof() == false) {
540 if (line.empty() == false) {
541 if (o_data == NULL) {
542 o_data = Data::parse_string(line);
547 if (prev_line.empty() == false) {
548 n_data = Data::parse_string(prev_line);
553 if ((o_data != NULL) &&
555 ret_val = new DataRange(o_data);
556 ret_val->add(n_data);
557 if (range_data != NULL) {
558 range_data = new DataRange(o_data);
559 range_data->add(n_data);
562 if (o_data != NULL) {
565 if (n_data != NULL) {
571 DataRange *StoreDay::get_oldest_and_newest_data() {
572 return get_oldest_and_newest_data(store_fname);
575 Data *StoreDay::get_oldest_data() {
581 dr = get_oldest_and_newest_data();
583 row_count = dr->get_count();
584 if (row_count >= 1) {
585 ret_val = dr->get(0);
592 Data *StoreDay::get_newest_data() {
598 dr = get_oldest_and_newest_data();
600 row_count = dr->get_count();
601 if (row_count == 2) {
602 ret_val = dr->get(1);