]> pilppa.org Git - lib1wire.git/blob - src/W1DataList.cc
Initial support for reading log-data.
[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
10 #include "W1Util.hh"
11 #include "W1DataList.hh"
12 #include "W1Store.hh"
13
14 using namespace w1;
15 using namespace std;
16
17 Data::~Data() {
18         free(date_time);
19 }
20
21 DataRange::~DataRange() {
22         if (first_data != NULL) {
23                 delete(first_data);
24                 first_data      = NULL;
25         }
26         if (last_data != NULL) {
27                 delete(last_data);
28                 last_data       = NULL;
29         }
30 }
31
32 W1DataList::W1DataList(string device_id_param) {
33         string          base_dir;
34
35         device_id       = device_id_param;
36         base_dir        = W1Store::get_location_base_dir();
37         device_dir      = W1Util::concat_paths(base_dir.c_str(), device_id.c_str());
38 }
39
40 W1DataList::~W1DataList() {
41         //delete(device_dir);
42 }
43
44 Data *W1DataList::find_first_data(vector<string> year_vector) {
45         int             ii;
46         string          year_dir;
47         string          month_dir;
48         vector<string>  month_vector;
49         vector<string>  data_vector;
50         string          first_file;
51         Data            *ret_val;
52
53         ret_val = NULL;
54         if (year_vector.size() > 0) {
55                 // dirs are alphabetically sorted
56                 year_dir        = year_vector.at(0);
57                 year_dir        = W1Util::concat_paths(device_dir.c_str(), year_dir.c_str());
58                 month_vector    = W1Util::get_subdirectories(year_dir);
59                 for (ii = 0; ii < month_vector.size(); ii++) {
60                         month_dir       = month_vector.at(ii);
61                         month_dir       = W1Util::concat_paths(year_dir.c_str(), month_dir.c_str());
62                         // scan data files from month dir
63                         data_vector     = W1Util::get_data_files(month_dir);
64                         if (data_vector.size() > 0) {
65                                 first_file      = data_vector.at(0);
66                                 first_file      = W1Util::concat_paths(month_dir.c_str(), first_file.c_str());
67                                 ret_val         = W1Util::load_first_data_row(first_file.c_str());
68                                 break;
69                         }
70                 }
71         }
72         return ret_val;
73 }
74
75 Data *W1DataList::find_last_data(vector<string> year_vector) {
76         int             ii;
77         string          year_dir;
78         string          month_dir;
79         vector<string>  month_vector;
80         vector<string>  data_vector;
81         string          last_file;
82         Data            *ret_val;
83         int             size;
84
85         ret_val = NULL;
86         size    = year_vector.size();
87         if (size > 0) {
88                 // dirs are alphabetically sorted
89                 year_dir        = year_vector.at(size - 1);
90                 year_dir        = W1Util::concat_paths(device_dir.c_str(), year_dir.c_str());
91                 month_vector    = W1Util::get_subdirectories(year_dir);
92                 for (ii = month_vector.size() - 1; ii >= 0; ii--) {
93                         month_dir       = month_vector.at(ii);
94                         month_dir       = W1Util::concat_paths(year_dir.c_str(), month_dir.c_str());
95                         // scan data files from month dir
96                         data_vector     = W1Util::get_data_files(month_dir);
97                         size    = data_vector.size();
98                         if (size > 0) {
99                                 last_file       = data_vector.at(size - 1);
100                                 last_file       = W1Util::concat_paths(month_dir.c_str(), last_file.c_str());
101                                 ret_val         = W1Util::load_last_data_row(last_file.c_str());
102                                 break;
103                         }
104                 }
105         }
106         return ret_val;
107 }
108
109 DataRange *W1DataList::get_data_range() {
110         DataRange       *ret_val;
111         DIR             *data_dir;
112         struct dirent   *year_dirent;
113         vector<string>  year_list;
114         Data            *first_data;
115         Data            *last_data;
116
117         ret_val         = NULL;
118         year_list       = W1Util::get_subdirectories(device_dir);
119         first_data      = find_first_data(year_list);
120         if (first_data != NULL) {
121                 last_data       = find_last_data(year_list);
122                 if (last_data != NULL) {
123                         ret_val = new DataRange();
124                         ret_val->first_data     = first_data;
125                         ret_val->last_data      = last_data;
126                 }
127         }
128         return ret_val;
129 }