]> pilppa.org Git - libplp.git/blobdiff - src/StoreDay.cc
Data read optimizations
[libplp.git] / src / StoreDay.cc
index 5d71b37cb39ca9e0fc75a4f1d2b28c345f0bf067..39a23005f7c3314cc237fdb5f409db3130e47e33 100644 (file)
@@ -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;
+}