Bug Fix - recurrence

- Fixed bug whereby handleRecurrence was being called after the tasks
  were loaded and filtered, and thus handleRecurrence operated on a
  filtered set, and failed.  The fix is to move the call to before the
  TDB::load call, and to add another TDB::loadPending call inside
  handleRecurrence.  This means TDB::load needs to be reentrant without
  re-reading the file, and can therefore be called twice, with the
  likelihood of there being a different filter for each call.  This in
  turn led to the problem whereby handleRecurrence would generate the
  synthetic tasks, which then sat uncommitted in TDB::mNew.  The fix
  for this is that every call to TDB::loadPending gets the contents of
  TDB::mNew appended (with correct IDs).  This bug is what you might
  call a good one.
This commit is contained in:
Paul Beckingham 2009-06-19 00:15:38 -04:00
parent 20bd2cf594
commit 8dab95e200
7 changed files with 62 additions and 43 deletions

View file

@ -53,8 +53,12 @@ extern Context context;
////////////////////////////////////////////////////////////////////////////////
// Scans all tasks, and for any recurring tasks, determines whether any new
// child tasks need to be generated to fill gaps.
void handleRecurrence (std::vector <Task>& tasks)
void handleRecurrence ()
{
std::vector <Task> tasks;
Filter filter;
context.tdb.loadPending (tasks, filter);
std::vector <Task> modified;
// Look at all tasks and find any recurring ones.
@ -97,7 +101,6 @@ void handleRecurrence (std::vector <Task>& tasks)
changed = true;
Task rec (*t); // Clone the parent.
rec.id = context.tdb.nextId (); // Assign a unique id.
rec.set ("uuid", uuid ()); // New UUID.
rec.setStatus (Task::pending); // Shiny.
rec.set ("parent", t->get ("uuid")); // Remember mom.