]> pilppa.org Git - lib1wire.git/blobdiff - src/DeviceData.cc
Optimization for year and monthly data calculation.
[lib1wire.git] / src / DeviceData.cc
index 790bcaef7140cbbc1abf1e186cc81f87ec7dc3a4..c564377a146d747b9c051092e3ef55bae5664fa1 100644 (file)
@@ -4,6 +4,8 @@
  *  Created on: Nov 7, 2010
  *      Author: lamikr
  */
+#include <sstream>
+
 #include <dirent.h>
 #include <malloc.h>
 #include <errno.h>
@@ -22,6 +24,15 @@ using namespace w1;
 using namespace std;
 using namespace plp;
 
+template <class NumberDataType>
+bool string_to_number(NumberDataType& result,
+                 const std::string& string_param,
+                 std::ios_base& (*format)(std::ios_base&))
+{
+       istringstream iss(string_param);
+       return !(iss >> format >> result).fail();
+}
+
 DeviceData::DeviceData(string device_id_param) {
        string  base_dir;
 
@@ -40,81 +51,21 @@ DeviceData::~DeviceData() {
        }
 }
 
-Data *DeviceData::find_newest_data(string year_name_param) {
-       int             ii;
-       string          mon_dr;
-       vector<string>  mon_vcr;
-       vector<string>  d_vcr;
-       string          f_name;
-       StoreDay        *store;
-       Data            *ret_val;
-       string          year_dr;
-       int             size;
-
-       ret_val = NULL;
-       year_dr = W1Util::concat_paths(device_dir, year_name_param);
-       mon_vcr = W1Util::get_subdirectories(year_dr);
-       for (ii = mon_vcr.size() - 1; ii >= 0; ii--) {
-               mon_dr  = mon_vcr.at(ii);
-               mon_dr  = W1Util::concat_paths(year_dr, mon_dr);
-               // scan data files from month dir
-               d_vcr   = W1Util::get_data_files(mon_dr);
-               size    = d_vcr.size();
-               if (size > 0) {
-                       f_name  = d_vcr.at(size - 1);
-                       f_name  = W1Util::concat_paths(mon_dr, f_name);
-                       store   = new StoreDay(f_name);
-                       ret_val = store->get_newest_data();
-                       delete(store);
-                       break;
-               }
-       }
-       return ret_val;
-}
-
 Data *DeviceData::find_newest_data(vector<string> year_name_vector_param) {
        string  year_name;
        int     size;
        Data    *ret_val;
+       Date    date;
+       int     val_int;
 
        ret_val = NULL;
        size    = year_name_vector_param.size();
        if (size > 0) {
                // dirs are alphabetically sorted
                year_name       = year_name_vector_param.at(size - 1);
-               ret_val         = find_newest_data(year_name);
-       }
-       return ret_val;
-}
-
-Data *DeviceData::find_oldest_data(string year_name_param) {
-       int             size;
-       unsigned int    ii;
-       string          year_dr;
-       string          mon_dr;
-       vector<string>  mon_vcr;
-       vector<string>  dta_vcr;
-       string          f_name;
-       StoreDay        *store;
-       Data            *ret_val;
-
-       ret_val = NULL;
-       year_dr = W1Util::concat_paths(device_dir, year_name_param);
-       mon_vcr = W1Util::get_subdirectories(year_dr);
-       for (ii = 0; ii < mon_vcr.size(); ii++) {
-               mon_dr  = mon_vcr.at(ii);
-               mon_dr  = W1Util::concat_paths(year_dr, mon_dr);
-               // scan data files from month dir
-               dta_vcr = W1Util::get_data_files(mon_dr);
-               size    = dta_vcr.size();
-               if (size > 0) {
-                       f_name  = dta_vcr.at(0);
-                       f_name  = W1Util::concat_paths(mon_dr, f_name);
-                       store   = new StoreDay(f_name);
-                       ret_val = store->get_oldest_data();
-                       delete(store);
-                       break;
-               }
+               string_to_number<int>(val_int, year_name, dec);
+               date.year       = val_int;
+               ret_val         = StoreCache::get_newest_data(&date, device_id, PERIOD_YEARLY);
        }
        return ret_val;
 }
@@ -123,13 +74,17 @@ Data *DeviceData::find_oldest_data(vector<string> year_name_vector_param) {
        int     size;
        string  year_name;
        Data    *ret_val;
+       Date    date;
+       int     val_int;
 
        ret_val = NULL;
        size    = year_name_vector_param.size();
        if (size > 0) {
                // dirs are alphabetically sorted
                year_name       = year_name_vector_param.at(0);
-               ret_val         = find_oldest_data(year_name);
+               string_to_number<int>(val_int, year_name, dec);
+               date.year       = val_int;
+               ret_val         = StoreCache::get_oldest_data(&date, device_id, PERIOD_YEARLY);
        }
        return ret_val;
 }