diff --git a/src/TDB2.cpp b/src/TDB2.cpp index f6cd261d1..d7edf7327 100644 --- a/src/TDB2.cpp +++ b/src/TDB2.cpp @@ -25,8 +25,155 @@ // //////////////////////////////////////////////////////////////////////////////// +#include #include + +//////////////////////////////////////////////////////////////////////////////// +TDB2::TDB2 () +: _location ("") +, _loaded_pending_tasks (false) +, _loaded_pending_lines (false) +, _loaded_pending_contents (false) +, _dirty_pending_tasks (false) +, _dirty_pending_lines (false) +, _dirty_pending_contents (false) +, _pending_contents ("") + +, _completed_contents ("") +, _backlog_contents ("") +, _undo_contents ("") +{ +} + +//////////////////////////////////////////////////////////////////////////////// +// Deliberately no file writes on destruct. TDB2::commit should have been +// already called, if data is to be preserved. +TDB2::~TDB2 () +{ +} + +//////////////////////////////////////////////////////////////////////////////// +void TDB2::set_location (const std::string& location) +{ + _location = location; +} + +//////////////////////////////////////////////////////////////////////////////// +std::vector & TDB2::get_pending_tasks () +{ + if (! _loaded_pending_tasks) + load_pending_tasks (); + + return _pending_tasks; +} + +//////////////////////////////////////////////////////////////////////////////// +std::vector & TDB2::get_pending_lines () +{ + if (! _loaded_pending_lines) + load_pending_lines (); + + return _pending_lines; +} + +//////////////////////////////////////////////////////////////////////////////// +std::string& TDB2::get_pending_contents () +{ + if (! _loaded_pending_contents) + load_pending_contents (); + + return _pending_contents; +} + +//////////////////////////////////////////////////////////////////////////////// +void TDB2::load_pending_tasks () +{ + if (! _loaded_pending_tasks) + { + if (! _loaded_pending_lines) + load_pending_lines (); + + std::vector ::iterator i; + for (i = _pending_lines.begin (); i != _pending_lines.end (); ++i) + _pending_tasks.push_back (Task (*i)); + + _loaded_pending_tasks = true; + } +} + +//////////////////////////////////////////////////////////////////////////////// +void TDB2::load_pending_lines () +{ + if (! _loaded_pending_lines) + { + if (! _loaded_pending_contents) + load_pending_contents (); + + split (_pending_lines, _pending_contents, '\n'); + _loaded_pending_lines = true; + } +} + +//////////////////////////////////////////////////////////////////////////////// +void TDB2::load_pending_contents () +{ + if (! _loaded_pending_contents) + { + _pending_contents = ""; + _dirty_pending_contents = false; + + // TODO pending_file = File (_location + "/pending.data"); + // TODO pending_file.openAndLock (); + // TODO pending_file.read (_pending_contents); + + _loaded_pending_contents = true; + } +} + +//////////////////////////////////////////////////////////////////////////////// +void TDB2::add (const Task& task) +{ + // TODO Handle pending vs completed/deleted + + _dirty_pending_tasks = true; +} + +//////////////////////////////////////////////////////////////////////////////// +void TDB2::modify (const Task& task) +{ + // TODO Handle pending vs completed/deleted + + _dirty_pending_tasks = true; +} + +//////////////////////////////////////////////////////////////////////////////// +void TDB2::commit () +{ + if (_dirty_pending_tasks) + { + // TODO Compose _pending_lines from _pending_tasks + _dirty_pending_tasks = false; + } + + if (_dirty_pending_lines) + { + _pending_contents = ""; // TODO Verify no resize. + join (_pending_contents, "\n", _pending_lines); + _dirty_pending_lines = false; + } + + if (_dirty_pending_contents) + { + // TODO Write _pending_contents to file. + // TODO _pending_file.write (_pending_contents); + + _dirty_pending_contents = false; + } +} + +//////////////////////////////////////////////////////////////////////////////// + #if 0 #include #include diff --git a/src/TDB2.h b/src/TDB2.h index f419b5cd1..8b54297b8 100644 --- a/src/TDB2.h +++ b/src/TDB2.h @@ -30,12 +30,48 @@ #include #include #include +#include +#include +#include class TDB2 { public: + TDB2 (); + ~TDB2 (); + + void set_location (const std::string&); + + std::vector & get_pending_tasks (); + std::vector & get_pending_lines (); + std::string& get_pending_contents (); + + void add (const Task&); + void modify (const Task&); + void commit (); private: + void load_pending_tasks (); + void load_pending_lines (); + void load_pending_contents (); + +private: + std::string _location; + + bool _loaded_pending_tasks; + bool _loaded_pending_lines; + bool _loaded_pending_contents; + bool _dirty_pending_tasks; + bool _dirty_pending_lines; + bool _dirty_pending_contents; + std::vector _pending_tasks; + std::vector _pending_lines; + std::string _pending_contents; + File _pending_file; + + std::string _completed_contents; + std::string _backlog_contents; + std::string _undo_contents; };