From 03b2099858fb9e87e316eb10a0f684e3fdb27a46 Mon Sep 17 00:00:00 2001 From: Mika Laitio Date: Mon, 1 Nov 2010 01:20:43 +0200 Subject: [PATCH] store each days file separately to year/month/id_year-month-day.txt subdir. Fix also duplicate data error --- src/W1Device.cc | 24 +--------------------- src/W1Store.cc | 54 ++++++++++++++++++++++++++++++++++++++++++------- src/W1Store.hh | 2 +- 3 files changed, 49 insertions(+), 31 deletions(-) diff --git a/src/W1Device.cc b/src/W1Device.cc index fef721c..bc86d83 100644 --- a/src/W1Device.cc +++ b/src/W1Device.cc @@ -93,27 +93,5 @@ void W1Device::add_to_memory_cache(std::string formatted_data) { } void W1Device::store() { - W1Store::store(id, memory_cache); -/* - string file_path = "/tmp/" + id + ".txt"; - string text_line; - ofstream data_file(file_path.c_str(), ios::app); - - cout << "storing to " << file_path << "data size " << memory_cache.size() << endl; - // TODO: add mutex to protect memory_cache while it's read and emptied - if (data_file.is_open()) { - while(memory_cache.size() > 0) { - text_line = memory_cache.front(); - memory_cache.pop_front(); - if (text_line.length() > 0) { - cout << "storing line: " << text_line << endl; - data_file << text_line << endl; - } - } - data_file.close(); - } - else { - cout << "could not open file " << file_path << " for writing data." << endl; - } -*/ + W1Store::store(id, &memory_cache); } diff --git a/src/W1Store.cc b/src/W1Store.cc index 9801583..a6bbaa0 100644 --- a/src/W1Store.cc +++ b/src/W1Store.cc @@ -11,6 +11,10 @@ #include #include +#include +#include +#include +#include #include "W1Store.hh" @@ -28,21 +32,57 @@ W1Store::~W1Store() { } void W1Store::set_location(string location_param) { + string::size_type pos; + location = location_param; + pos = location.find_last_of("/"); + if (pos != location.length()) { + location = location + "/"; + } + } -void W1Store::store(std::string device_id, std::list string_list) { +void W1Store::store(std::string device_id, std::list *string_list) { - string file_path = location + device_id + ".txt"; + string file_path; string text_line; - ofstream data_file(file_path.c_str(), ios::app); - cout << "storing to " << file_path << ", data size " << string_list.size() << endl; + time_t wtime; + struct tm *ltime; + char buffer[80]; + string year; + string month; + string date; + + time(&wtime); + ltime = localtime(&wtime); + strftime(buffer, 80, "%Y", ltime); + year = buffer; + strftime(buffer, 80, "%m", ltime); + month = buffer; + strftime(buffer, 80, "%Y-%m-%d", ltime); + date = buffer; + + struct tm * gmtime(const time_t *timer); + struct tm * localtime(const time_t * timer); + struct stat st; + + file_path = location + year; + if (stat(file_path.c_str() ,&st) != 0) { + mkdir(file_path.c_str(), 0755); + } + file_path = file_path + "/" + month; + if (stat(file_path.c_str() ,&st) != 0) { + mkdir(file_path.c_str(), 0755); + } + file_path = file_path + "/" + device_id + "_" + date + ".txt"; + ofstream data_file(file_path.c_str(), ios::app); + cout << "storing to " << file_path << ", data size " << string_list->size() << endl; // TODO: add mutex to protect string_list while it's read and emptied if (data_file.is_open()) { - while(string_list.size() > 0) { - text_line = string_list.front(); - string_list.pop_front(); + while(string_list->size() > 0) { + text_line = string_list->front(); + string_list->pop_front(); if (text_line.length() > 0) { cout << "storing line: " << text_line << endl; data_file << text_line << endl; diff --git a/src/W1Store.hh b/src/W1Store.hh index abdc0b6..c096816 100644 --- a/src/W1Store.hh +++ b/src/W1Store.hh @@ -18,7 +18,7 @@ namespace w1 { virtual ~W1Store(); static std::string location; static void set_location(std::string location_param); - static void store(std::string device_id, std::list string_list); + static void store(std::string device_id, std::list *string_list); }; } -- 2.41.0