]> pilppa.org Git - lib1wire.git/blob - src/W1DataList.cc
Optimisations and cleanups
[lib1wire.git] / src / W1DataList.cc
1 /*
2  * W1DataList.cc
3  *
4  *  Created on: Nov 7, 2010
5  *      Author: lamikr
6  */
7 #include <dirent.h>
8 #include <malloc.h>
9 #include <errno.h>
10 #include <string.h>
11
12 #include "W1Util.hh"
13 #include "W1DataList.hh"
14 #include "W1Store.hh"
15
16 #include "plp/log.h"
17
18 using namespace w1;
19 using namespace std;
20 using namespace plp;
21
22 W1DataList::W1DataList(string device_id_param) {
23         string          base_dir;
24
25         device_id       = device_id_param;
26         base_dir        = W1Store::get_store_base_dir();
27         device_dir      = W1Util::concat_paths(base_dir, device_id);
28         device_ch_dir   = W1Util::concat_paths(base_dir, "cache");
29         device_ch_dir   = W1Util::concat_paths(device_ch_dir, device_id);
30 }
31
32 W1DataList::~W1DataList() {
33         //delete(device_dir);
34 }
35
36 Data *W1DataList::find_oldest_data(vector<string> year_vector) {
37         int             ii;
38         string          year_dir;
39         string          month_dir;
40         vector<string>  month_vector;
41         vector<string>  data_vector;
42         string          f_name;
43         W1Store         *store;
44         Data            *ret_val;
45
46         ret_val = NULL;
47         if (year_vector.size() > 0) {
48                 // dirs are alphabetically sorted
49                 year_dir        = year_vector.at(0);
50                 year_dir        = W1Util::concat_paths(device_dir, year_dir);
51                 month_vector    = W1Util::get_subdirectories(year_dir);
52                 for (ii = 0; ii < month_vector.size(); ii++) {
53                         month_dir       = month_vector.at(ii);
54                         month_dir       = W1Util::concat_paths(year_dir, month_dir);
55                         // scan data files from month dir
56                         data_vector     = W1Util::get_data_files(month_dir);
57                         if (data_vector.size() > 0) {
58                                 f_name  = data_vector.at(0);
59                                 f_name  = W1Util::concat_paths(month_dir, f_name);
60                                 store   = new W1Store(f_name);
61                                 ret_val = store->get_oldest_data();
62                                 delete(store);
63                                 break;
64                         }
65                 }
66         }
67         return ret_val;
68 }
69
70 Data *W1DataList::find_newest_data(vector<string> year_vector) {
71         int             ii;
72         string          year_dir;
73         string          month_dir;
74         vector<string>  month_vector;
75         vector<string>  data_vector;
76         string          f_name;
77         Data            *ret_val;
78         int             size;
79         W1Store         *store;
80
81         ret_val = NULL;
82         size    = year_vector.size();
83         if (size > 0) {
84                 // dirs are alphabetically sorted
85                 year_dir        = year_vector.at(size - 1);
86                 year_dir        = W1Util::concat_paths(device_dir, year_dir);
87                 month_vector    = W1Util::get_subdirectories(year_dir);
88                 for (ii = month_vector.size() - 1; ii >= 0; ii--) {
89                         month_dir       = month_vector.at(ii);
90                         month_dir       = W1Util::concat_paths(year_dir, month_dir);
91                         // scan data files from month dir
92                         data_vector     = W1Util::get_data_files(month_dir);
93                         size    = data_vector.size();
94                         if (size > 0) {
95                                 f_name  = data_vector.at(size - 1);
96                                 f_name  = W1Util::concat_paths(month_dir, f_name);
97                                 store   = new W1Store(f_name);
98                                 ret_val = store->get_newest_data();
99                                 delete(store);
100                                 break;
101                         }
102                 }
103         }
104         return ret_val;
105 }
106
107 DataRange *W1DataList::get_data_range() {
108         DataRange       *ret_val;
109         DIR             *data_dir;
110         struct dirent   *year_dirent;
111         vector<string>  year_list;
112         Data            *first_data;
113         Data            *newest_data;
114
115         ret_val         = NULL;
116         year_list       = W1Util::get_subdirectories(device_dir);
117         first_data      = find_oldest_data(year_list);
118         if (first_data != NULL) {
119                 newest_data     = find_newest_data(year_list);
120                 if (newest_data != NULL) {
121                         ret_val = new DataRange(*first_data);
122                         ret_val->add_data(*newest_data);
123                         delete(newest_data);
124                 }
125                 delete(first_data);
126         }
127         return ret_val;
128 }
129
130 long int get_interval_type(Date *start_date,
131                         Date *end_date) {
132         int     diff;
133         int     ret_val;
134
135         ret_val = 0;
136         diff    = end_date->year - start_date->year;
137         if (diff != 0) {
138                 ret_val = 0;
139         }
140         else {
141                 diff    = end_date->month - start_date->month;
142                 if (diff != 0) {
143                         ret_val = 1;
144                 }
145                 else {
146                         diff    = end_date->day - start_date->day;
147                         if (diff != 0) {
148                                 ret_val = 2;
149                         }
150                         else {
151                                 diff    = end_date->hour - start_date->hour;
152                                 if (diff != 0) {
153                                         ret_val = 3;
154                                 }
155                                 else {
156                                         diff    = end_date->min - start_date->min;
157                                         if (diff != 0) {
158                                                 ret_val = 4;
159                                         }
160                                         else {
161                                                 ret_val = 5;
162                                         }
163                                 }
164                         }
165                 }
166         }
167         return ret_val;
168 }
169
170 string W1DataList::get_day_data(Date *date) {
171         string ret_val;
172
173         ret_val = W1Store::get_store_file_name(device_id, date);
174         return ret_val;
175 }
176
177 Data *W1DataList::get_avg_day_data(Date *date) {
178         Data    *data;
179         W1Store *store;
180
181         store   = new W1Store(device_id, date);
182         store->load();
183         data    = store->get_mean();
184         data->printout();
185         delete(store);
186
187         return data;
188 }
189
190 DataRange *W1DataList::get_avg_day_data(Date *start_date,
191                                         Date *end_date) {
192         DataRange       *ret_val;
193         Data            *data;
194         Date            *date;
195
196         ret_val = NULL;
197         date    = start_date->clone();
198         while(date->before(*end_date)) {
199                 data    = get_avg_day_data(date);
200                 if (ret_val == NULL) {
201                         ret_val = new DataRange(*data);
202                 }
203                 else {
204                         ret_val->add_data(*data);
205                 }
206                 delete(data);
207                 date->tomorrow();
208         }
209         delete(date);
210         return ret_val;
211 }
212
213 DataRange *W1DataList::get_data(Date *start_date,
214                                 Date *end_date) {
215         DataRange       *ret_val;
216         int             int_type;
217
218         ret_val         = NULL;
219         start_date->printout();
220         end_date->printout();
221         int_type        = get_interval_type(start_date, end_date);
222         switch(int_type) {
223                 case 0:
224                         log_debug("get avg year data\n");
225                         break;
226                 case 1:
227                         log_debug("get avg month data\n");
228                         break;
229                 case 2:
230                         log_debug("get avg day data\n");
231                         ret_val = get_avg_day_data(start_date, end_date);
232                         break;
233                 case 3:
234                         log_debug("get avg hour data\n");
235                         break;
236                 case 4:
237                         log_debug("get avg min data\n");
238                         break;
239                 case 5:
240                         log_debug("get avg sec data\n");
241                         break;
242         }
243         return ret_val;
244 }