X-Git-Url: http://pilppa.org/gitweb/?p=libplp.git;a=blobdiff_plain;f=src%2FStoreDay.cc;h=39a23005f7c3314cc237fdb5f409db3130e47e33;hp=5d71b37cb39ca9e0fc75a4f1d2b28c345f0bf067;hb=fb1be129d4304d68e42f3e30710968a0899e5482;hpb=88183ebdd35a2bd340d949382f593466dfc887de diff --git a/src/StoreDay.cc b/src/StoreDay.cc index 5d71b37..39a2300 100644 --- a/src/StoreDay.cc +++ b/src/StoreDay.cc @@ -42,7 +42,21 @@ StoreDay::~StoreDay() { } } -string StoreDay::get_dir_name(string device_id, Date *date_time_param) { +string StoreDay::get_year_dir_name(string device_id, + Date *date_time_param) { + string ret_val; + char buffer[10]; + string bd_name; + + snprintf(buffer, 10, "%d", date_time_param->year); + bd_name = DeviceConfig::get_base_dir_name(); + bd_name = FileUtil::concat_paths(bd_name, device_id); + ret_val = bd_name + "/" + buffer; + return ret_val; +} + +string StoreDay::get_dir_name(string device_id, + Date *date_time_param) { string ret_val; char buffer[30]; string bd_name; @@ -54,12 +68,18 @@ string StoreDay::get_dir_name(string device_id, Date *date_time_param) { return ret_val; } -string StoreDay::get_file_name(string device_id, Date *date_time_param) { +string StoreDay::get_file_name(string device_id, + Date *date_time_param) { string ret_val; string fname; char buffer[30]; - snprintf(buffer, 30, "%d-%02d-%02d", date_time_param->year, date_time_param->month, date_time_param->day); + snprintf(buffer, + 30, + "%d-%02d-%02d", + date_time_param->year, + date_time_param->month, + date_time_param->day); fname = buffer; fname = fname + DATAFILE_SUFFIX; ret_val = get_dir_name(device_id, date_time_param); @@ -121,14 +141,47 @@ bool StoreDay::load() { return Store::load(store_fname); } -bool StoreDay::exist(string fname_param) { +bool StoreDay::exist(string fname_param, bool writable) { + bool ret_val; + ret_val = FileUtil::file_exist(fname_param.c_str(), writable); + return ret_val; +} + +bool StoreDay::exist(string dev_id_param, + Date *date, + bool writable) { + bool ret_val; + string f_name; + + f_name = get_file_name(dev_id_param, date); + ret_val = FileUtil::file_exist(f_name.c_str(), writable); + return ret_val; +} + +bool StoreDay::exist_in_month(string dev_id_param, + Date *date, + bool writable) { + string dirname; + bool ret_val; + + dirname = StoreDay::get_dir_name(dev_id_param, date); + ret_val = FileUtil::dir_exist(dirname.c_str(), writable); + return ret_val; +} + +bool StoreDay::exist_in_year(string dev_id_param, + Date *date, + bool writable) { + string dirname; bool ret_val; - ret_val = (access(fname_param.c_str(), F_OK) == 0); + + dirname = StoreDay::get_year_dir_name(dev_id_param, date); + ret_val = FileUtil::dir_exist(dirname.c_str(), writable); return ret_val; } -bool StoreDay::exist() { - return exist(store_fname); +bool StoreDay::exist(bool writable) { + return exist(store_fname, writable); } static int get_summary_period_as_freq_seconds(EnumSummaryPeriod period_type_param) { @@ -167,19 +220,22 @@ plp::DataRange *StoreDay::get_sum(EnumSummaryPeriod period_type_param) { Date date; DataRange *ret_val; int frq_sec; + bool succ; - ret_val = new DataRange(); + ret_val = NULL; calc = NULL; limit_d = NULL; frq_sec = get_summary_period_as_freq_seconds(period_type_param); if (store_data == NULL) { - load(); + succ = load(); } - if (store_data != NULL) { + if ((succ == true) && + (store_data != NULL)) { row_count = store_data->get_count(); if (row_count > 0) { col_count = store_data->get_data_item_value_count(); if (col_count > 0) { + ret_val = new DataRange(); for (ii = 0; ii < row_count; ii++) { data = store_data->get(ii); if (data != NULL) { @@ -190,27 +246,25 @@ plp::DataRange *StoreDay::get_sum(EnumSummaryPeriod period_type_param) { limit_d->sec = 0; limit_d->inc_seconds(frq_sec); } - else { - date = data->get_date(); - if ((ii <= (row_count -1)) && - ((frq_sec == -1) || (date.before(limit_d)))) { - for (jj = 0; jj < col_count; jj++) { - calc->value_arr[jj] = calc->value_arr[jj] + data->value_arr[jj]; - } + date = data->get_date(); + if ((ii <= (row_count -1)) && + ((frq_sec == -1) || (date.before(limit_d)))) { + for (jj = 0; jj < col_count; jj++) { + calc->value_arr[jj] = calc->value_arr[jj] + data->value_arr[jj]; } - if ((ii >= (row_count -1)) || - ((frq_sec != -1) && (date.before(limit_d) == false))) { - ret_val->add(calc); - delete(calc); - calc = data->clone(); - if (limit_d != NULL) { - delete(limit_d); - } - limit_d = data->get_date().clone(); - limit_d->min = 0; - limit_d->sec = 0; - limit_d->inc_seconds(frq_sec); + } + if ((ii >= (row_count -1)) || + ((frq_sec != -1) && (date.before(limit_d) == false))) { + ret_val->add(calc); + delete(calc); + calc = data->clone(); + if (limit_d != NULL) { + delete(limit_d); } + limit_d = data->get_date().clone(); + limit_d->min = 0; + limit_d->sec = 0; + limit_d->inc_seconds(frq_sec); } delete(data); } @@ -240,20 +294,23 @@ plp::DataRange *StoreDay::get_mean(EnumSummaryPeriod period_type_param) { Date date; DataRange *ret_val; int frq_sec; + bool succ; - ret_val = new DataRange(); + ret_val = NULL; calc = NULL; limit_d = NULL; d_count = 1; frq_sec = get_summary_period_as_freq_seconds(period_type_param); if (store_data == NULL) { - load(); + succ = load(); } - if (store_data != NULL) { + if ((succ == true) && + (store_data != NULL)) { row_count = store_data->get_count(); if (row_count > 0) { col_count = store_data->get_data_item_value_count(); if (col_count > 0) { + ret_val = new DataRange(); for (ii = 0; ii < row_count; ii++) { data = store_data->get(ii); if (data != NULL) { @@ -265,32 +322,30 @@ plp::DataRange *StoreDay::get_mean(EnumSummaryPeriod period_type_param) { limit_d->sec = 0; limit_d->inc_seconds(frq_sec); } - else { - date = data->get_date(); - if ((ii <= (row_count -1)) && - ((frq_sec == -1) || (date.before(limit_d)))) { - for (jj = 0; jj < col_count; jj++) { - calc->value_arr[jj] = calc->value_arr[jj] + data->value_arr[jj]; - } - d_count++; + date = data->get_date(); + if ((ii <= (row_count -1)) && + ((frq_sec == -1) || (date.before(limit_d)))) { + for (jj = 0; jj < col_count; jj++) { + calc->value_arr[jj] = calc->value_arr[jj] + data->value_arr[jj]; } - if ((ii >= (row_count -1)) || - ((frq_sec != -1) && (date.before(limit_d) == false))) { - for (jj = 0; jj < col_count; jj++) { - calc->value_arr[jj] = calc->value_arr[jj] / d_count; - } - ret_val->add(calc); - delete(calc); - d_count = 1; - calc = data->clone(); - if (limit_d != NULL) { - delete(limit_d); - } - limit_d = data->get_date().clone(); - limit_d->min = 0; - limit_d->sec = 0; - limit_d->inc_seconds(frq_sec); + d_count++; + } + if ((ii >= (row_count -1)) || + ((frq_sec != -1) && (date.before(limit_d) == false))) { + for (jj = 0; jj < col_count; jj++) { + calc->value_arr[jj] = calc->value_arr[jj] / d_count; } + ret_val->add(calc); + delete(calc); + d_count = 1; + calc = data->clone(); + if (limit_d != NULL) { + delete(limit_d); + } + limit_d = data->get_date().clone(); + limit_d->min = 0; + limit_d->sec = 0; + limit_d->inc_seconds(frq_sec); } delete(data); } @@ -320,20 +375,23 @@ plp::DataRange *StoreDay::get_delta(EnumSummaryPeriod period_type_param) { Date date; DataRange *ret_val; int frq_sec; + bool succ; - ret_val = new DataRange(); + ret_val = NULL; calc1 = NULL; calc2 = NULL; limit_d = NULL; frq_sec = get_summary_period_as_freq_seconds(period_type_param); if (store_data == NULL) { - load(); + succ = load(); } - if (store_data != NULL) { + if ((succ == true) && + (store_data != NULL)) { row_count = store_data->get_count(); if (row_count > 0) { col_count = store_data->get_data_item_value_count(); if (col_count > 0) { + ret_val = new DataRange(); for (ii = 0; ii < row_count; ii++) { data = store_data->get(ii); if (data != NULL) { @@ -348,36 +406,34 @@ plp::DataRange *StoreDay::get_delta(EnumSummaryPeriod period_type_param) { } calc2 = NULL; } - else { - date = data->get_date(); - if ((ii <= (row_count -1)) && - ((frq_sec == -1) || (date.before(limit_d)))) { - if (calc2 != NULL) { - delete(calc2); - } - calc2 = data->clone(); - } - if ((ii >= (row_count -1)) || - ((frq_sec != -1) && (date.before(limit_d) == false))) { - if (calc2 == NULL) { - calc2 = calc1->clone(); - } - for (jj = 0; jj < col_count; jj++) { - calc2->value_arr[jj] = calc2->value_arr[jj] - calc1->value_arr[jj]; - } - ret_val->add(calc2); - delete(calc1); - calc1 = data->clone(); + date = data->get_date(); + if ((ii <= (row_count -1)) && + ((frq_sec == -1) || (date.before(limit_d)))) { + if (calc2 != NULL) { delete(calc2); - calc2 = NULL; - if (limit_d != NULL) { - delete(limit_d); - } - limit_d = data->get_date().clone(); - limit_d->min = 0; - limit_d->sec = 0; - limit_d->inc_seconds(frq_sec); } + calc2 = data->clone(); + } + if ((ii >= (row_count -1)) || + ((frq_sec != -1) && (date.before(limit_d) == false))) { + if (calc2 == NULL) { + calc2 = calc1->clone(); + } + for (jj = 0; jj < col_count; jj++) { + calc2->value_arr[jj] = calc2->value_arr[jj] - calc1->value_arr[jj]; + } + ret_val->add(calc2); + delete(calc1); + calc1 = data->clone(); + delete(calc2); + calc2 = NULL; + if (limit_d != NULL) { + delete(limit_d); + } + limit_d = data->get_date().clone(); + limit_d->min = 0; + limit_d->sec = 0; + limit_d->inc_seconds(frq_sec); } delete(data); } @@ -410,19 +466,22 @@ plp::DataRange *StoreDay::get_max_or_min(EnumSummaryPeriod period_type_param, bo Date date; DataRange *ret_val; int frq_sec; + bool succ; - ret_val = new DataRange(); + ret_val = NULL; calc = NULL; limit_d = NULL; frq_sec = get_summary_period_as_freq_seconds(period_type_param); if (store_data == NULL) { - load(); + succ = load(); } - if (store_data != NULL) { + if ((succ == true) && + (store_data != NULL)) { row_count = store_data->get_count(); if (row_count > 0) { col_count = store_data->get_data_item_value_count(); if (col_count > 0) { + ret_val = new DataRange(); for (ii = 0; ii < row_count; ii++) { data = store_data->get(ii); if (data != NULL) { @@ -433,47 +492,45 @@ plp::DataRange *StoreDay::get_max_or_min(EnumSummaryPeriod period_type_param, bo limit_d->sec = 0; limit_d->inc_seconds(frq_sec); } - else { - date = data->get_date(); - if ((ii <= (row_count -1)) && - ((frq_sec == -1) || (date.before(limit_d)))) { - int changed = 0; - if (max == true) { - for (jj = 0; jj < col_count; jj++) { - if (calc->value_arr[jj] < data->value_arr[jj]) { - calc->value_arr[jj] = data->value_arr[jj]; - changed = 1; - } + date = data->get_date(); + if ((ii <= (row_count -1)) && + ((frq_sec == -1) || (date.before(limit_d)))) { + int changed = 0; + if (max == true) { + for (jj = 0; jj < col_count; jj++) { + if (calc->value_arr[jj] < data->value_arr[jj]) { + calc->value_arr[jj] = data->value_arr[jj]; + changed = 1; } } - else { - for (jj = 0; jj < col_count; jj++) { - if (data->value_arr[jj] < calc->value_arr[jj]) { - calc->value_arr[jj] = data->value_arr[jj]; - changed = 1; - } + } + else { + for (jj = 0; jj < col_count; jj++) { + if (data->value_arr[jj] < calc->value_arr[jj]) { + calc->value_arr[jj] = data->value_arr[jj]; + changed = 1; } } - if (changed == 1) { - Date new_date; + } + if (changed == 1) { + Date new_date; - new_date = data->get_date(); - calc->set_date(&new_date); - } + new_date = data->get_date(); + calc->set_date(&new_date); } - if ((ii >= (row_count -1)) || - ((frq_sec != -1) && (date.before(limit_d) == false))) { - ret_val->add(calc); - delete(calc); - calc = data->clone(); - if (limit_d != NULL) { - delete(limit_d); - } - limit_d = data->get_date().clone(); - limit_d->min = 0; - limit_d->sec = 0; - limit_d->inc_seconds(frq_sec); + } + if ((ii >= (row_count -1)) || + ((frq_sec != -1) && (date.before(limit_d) == false))) { + ret_val->add(calc); + delete(calc); + calc = data->clone(); + if (limit_d != NULL) { + delete(limit_d); } + limit_d = data->get_date().clone(); + limit_d->min = 0; + limit_d->sec = 0; + limit_d->inc_seconds(frq_sec); } delete(data); } @@ -606,3 +663,103 @@ Data *StoreDay::get_latest_data() { } return ret_val; } + +bool StoreDay::data_day_scan_days_in_month(string dev_id_param, + Date *new_date, + Date *max_date) { + bool ret_val; + string fname; + + ret_val = false; + while((ret_val == false) && + (new_date->before(max_date))) { + new_date->next_day(); + fname = get_file_name(dev_id_param, new_date); + if (exist(fname, false) == true) { + ret_val = true; + break; + } + if (new_date->is_last_day_of_month() == true) { + break; + } + } + return ret_val; +} + +bool StoreDay::data_day_scan_month_in_year(string dev_id_param, + Date *new_date, + Date *max_date) { + bool ret_val; + + ret_val = false; + // next scan months dir existence under the first year + while((ret_val == false) && + (new_date->before(max_date))) { + new_date->next_month(); + if (exist_in_month(dev_id_param, + new_date, + false)) { + ret_val = data_day_scan_days_in_month(dev_id_param, + new_date, + max_date); + if (ret_val == true) + break; + } + if (new_date->month == 12) + break; + } + return ret_val; +} + +bool StoreDay::data_day_scan_years(string dev_id_param, + Date *new_date, + Date *max_date) { + bool ret_val; + + ret_val = false; + while((ret_val == false) && + (new_date->before(max_date))) { + new_date->next_year(); + if (exist_in_year(dev_id_param, + new_date, + false)) { + ret_val = data_day_scan_month_in_year(dev_id_param, + new_date, + max_date); + if (ret_val == true) + break; + } + } + return ret_val; +} + +bool StoreDay::get_next_date_with_data(std::string dev_id_param, + plp::Date *next_date, + plp::Date *max_date) { + bool ret_val; + Date *new_date; + string fname; + string dirname; + + new_date = next_date->clone(); + // scan first dates in current month + ret_val = data_day_scan_days_in_month(dev_id_param, + new_date, + max_date); + if (ret_val == false) { + ret_val = data_day_scan_month_in_year(dev_id_param, + new_date, + max_date); + if (ret_val == false) { + ret_val = data_day_scan_years(dev_id_param, + new_date, + max_date); + } + } + if (ret_val == true) + new_date->copy(next_date); + else + max_date->copy(next_date); + delete(new_date); + return ret_val; +}