4 * Created on: Jan 6, 2011
10 #include "StoreCache.hh"
11 #include "StoreDay.hh"
12 #include "DeviceConfig.hh"
19 StoreCache::StoreCache(string device_id_param,
20 Date *date_time_param): Store(device_id_param, date_time_param) {
22 store_fname = get_file_name(device_id_param,
29 StoreCache::~StoreCache() {
32 string StoreCache::get_dir_name(string device_id_param,
33 Date *date_time_param,
34 EnumSummaryPeriod period_type_param,
35 EnumSummaryCalculationType calc_type_param) {
40 snprintf(buffer, 30, "%d/%02d", date_time_param->year, date_time_param->month);
41 bd_name = DeviceConfig::get_base_dir_name();
42 bd_name = W1Util::concat_paths(bd_name, CACHE_DIR_NAME);
43 bd_name = W1Util::concat_paths(bd_name, device_id_param);
44 bd_name = W1Util::concat_paths(bd_name, SUMMARY_PERIOD_NAMES_ARRAY[period_type_param]);
45 bd_name = W1Util::concat_paths(bd_name, CALCULATION_TYPE_NAMES_ARRAY[calc_type_param]);
46 ret_val = bd_name + "/" + buffer;
50 string StoreCache::get_file_name(string device_id_param,
51 Date *date_time_param,
52 EnumSummaryPeriod period_type_param,
53 EnumSummaryCalculationType calc_type_param) {
58 snprintf(buffer, 30, "%d-%02d-%02d",
59 date_time_param->year,
60 date_time_param->month,
61 date_time_param->day);
63 fname = fname + DATAFILE_SUFFIX;
64 ret_val = get_dir_name(device_id_param, date_time_param, period_type_param, calc_type_param);
65 ret_val = W1Util::concat_paths(ret_val, fname);
69 DataRange *StoreCache::get_mean(EnumSummaryPeriod period_type_param) {
77 fname = get_file_name(device_id,
81 if (store_data == NULL) {
82 if (access(fname.c_str(), R_OK) == 0) {
86 if (store_data != NULL) {
87 row_count = store_data->get_count();
89 ret_val = new DataRange();
90 dta = store_data->get(0);
95 if (ret_val == NULL) {
96 store = new StoreDay(device_id, date);
97 ret_val = store->get_mean(period_type_param);
98 save(fname, ret_val, 4);
104 DataRange *StoreCache::get_sum(EnumSummaryPeriod period_type_param) {
112 fname = get_file_name(device_id,
116 if (store_data == NULL) {
117 if (access(fname.c_str(), R_OK) == 0) {
121 if (store_data != NULL) {
122 row_count = store_data->get_count();
124 ret_val = new DataRange();
125 dta = store_data->get(0);
130 if (ret_val == NULL) {
131 store = new StoreDay(device_id, date);
132 ret_val = store->get_sum(period_type_param);
133 save(fname, ret_val, 4);
139 DataRange *StoreCache::get_delta(EnumSummaryPeriod period_type_param) {
147 fname = get_file_name(device_id,
151 if (store_data == NULL) {
152 if (access(fname.c_str(), R_OK) == 0) {
153 // read from cache file
157 if (store_data != NULL) {
158 row_count = store_data->get_count();
160 ret_val = new DataRange();
161 dta = store_data->get(0);
166 if (ret_val == NULL) {
167 store = new StoreDay(device_id, date);
168 ret_val = store->get_delta(period_type_param);
169 save(fname, ret_val, 4);
175 DataRange *StoreCache::get_max(EnumSummaryPeriod period_type_param) {
183 fname = get_file_name(device_id,
187 if (store_data == NULL) {
188 if (access(fname.c_str(), R_OK) == 0) {
192 if (store_data != NULL) {
193 row_count = store_data->get_count();
195 ret_val = new DataRange();
196 dta = store_data->get(0);
201 if (ret_val == NULL) {
202 store = new StoreDay(device_id, date);
203 ret_val = store->get_max(period_type_param);
204 save(fname, ret_val, 4);
210 DataRange *StoreCache::get_min(EnumSummaryPeriod period_type_param) {
218 fname = get_file_name(device_id,
222 if (store_data == NULL) {
223 if (access(fname.c_str(), R_OK) == 0) {
227 if (store_data != NULL) {
228 row_count = store_data->get_count();
230 ret_val = new DataRange();
231 dta = store_data->get(0);
236 if (ret_val == NULL) {
237 store = new StoreDay(device_id, date);
238 ret_val = store->get_min(period_type_param);
239 save(fname, ret_val, 4);
245 void StoreCache::save(std::string fname_param, plp::DataRange *datarange_param, int decimal_count_param) {
252 cnt = datarange_param->get_count();
254 log_info("[%s] cacheing %d data values.\n", device_id.c_str(), cnt);
255 ostream = W1Util::open_for_writing(fname_param.c_str());
256 if ((ostream != NULL) &&
257 (ostream->is_open() == true)) {
258 // TODO: add mutex to protect string_list while it's read and emptied
259 for(ii = 0; ii < cnt; ii++) {
260 data = datarange_param->get(ii);
262 line = data->to_string(decimal_count_param);
263 if (line.length() > 0) {
264 *ostream << line << endl;
271 log_error("[%s] File open for data save failed: %s\n", device_id.c_str(), fname_param.c_str());
273 if (ostream != NULL) {