From 61cedc3ad1ff9356437e34484e91728aa902a060 Mon Sep 17 00:00:00 2001 From: Paul Beckingham Date: Wed, 17 Jun 2009 00:59:31 -0400 Subject: [PATCH] Enhancement - import command - Implemented import command - Implemented Context::clearMessages to remove all accumulated messages. This is needed because parts of the import process are recursive and we don't want Context to dump messages for every import record on completion. --- src/Context.cpp | 8 +++ src/Context.h | 4 +- src/import.cpp | 168 +++++++++++++++++++++++---------------------- src/tests/Makefile | 3 +- 4 files changed, 99 insertions(+), 84 deletions(-) diff --git a/src/Context.cpp b/src/Context.cpp index 2d431d2f3..be0ba51ef 100644 --- a/src/Context.cpp +++ b/src/Context.cpp @@ -572,3 +572,11 @@ void Context::footnote (const std::string& input) } //////////////////////////////////////////////////////////////////////////////// +void Context::clearMessages () +{ + headers.clear (); + messages.clear (); + footnotes.clear (); +} + +//////////////////////////////////////////////////////////////////////////////// diff --git a/src/Context.h b/src/Context.h index 63b353e9e..6fd47cc60 100644 --- a/src/Context.h +++ b/src/Context.h @@ -55,10 +55,12 @@ public: void header (const std::string&); // Header sink void message (const std::string&); // Message sink void footnote (const std::string&); // Footnote sink + void clearMessages (); + + void parse (); private: void loadCorrectConfigFile (); - void parse (); void autoFilter (); public: diff --git a/src/import.cpp b/src/import.cpp index 77681e1b8..854ba95b5 100644 --- a/src/import.cpp +++ b/src/import.cpp @@ -181,9 +181,10 @@ static void decorateTask (Task& task) //////////////////////////////////////////////////////////////////////////////// static std::string importTask_1_4_3 (const std::vector & lines) { -/* std::vector failed; + context.tdb.lock (context.config.get ("locking", true)); + std::vector ::const_iterator it; for (it = lines.begin (); it != lines.end (); ++it) { @@ -229,7 +230,7 @@ static std::string importTask_1_4_3 (const std::vector & lines) throw "unrecoverable"; // Build up this task ready for insertion. - T task; + Task task; // Handle the 12 fields. for (unsigned int f = 0; f < fields.size (); ++f) @@ -237,14 +238,14 @@ static std::string importTask_1_4_3 (const std::vector & lines) switch (f) { case 0: // 'uuid' - task.setUUID (fields[f].substr (1, 36)); + task.set ("uuid", fields[f].substr (1, 36)); break; case 1: // 'status' - if (fields[f] == "'pending'") task.setStatus (T::pending); - else if (fields[f] == "'recurring'") task.setStatus (T::recurring); - else if (fields[f] == "'deleted'") task.setStatus (T::deleted); - else if (fields[f] == "'completed'") task.setStatus (T::completed); + if (fields[f] == "'pending'") task.setStatus (Task::pending); + else if (fields[f] == "'recurring'") task.setStatus (Task::recurring); + else if (fields[f] == "'deleted'") task.setStatus (Task::deleted); + else if (fields[f] == "'completed'") task.setStatus (Task::completed); break; case 2: // 'tags' @@ -299,13 +300,12 @@ static std::string importTask_1_4_3 (const std::vector & lines) case 11: // 'description' if (fields[f].length () > 2) - task.setDescription (fields[f].substr (1, fields[f].length () - 2)); + task.set ("description", fields[f].substr (1, fields[f].length () - 2)); break; } } - if (! tdb.addT (task)) - failed.push_back (*it); + context.tdb.add (task); } catch (...) @@ -313,10 +313,11 @@ static std::string importTask_1_4_3 (const std::vector & lines) failed.push_back (*it); } } -*/ + + context.tdb.commit (); + context.tdb.unlock (); std::stringstream out; -/* out << "Imported " << (lines.size () - failed.size () - 1) << " tasks successfully, with " @@ -330,16 +331,17 @@ static std::string importTask_1_4_3 (const std::vector & lines) join (bad, "\n", failed); return out.str () + "\nCould not import:\n\n" + bad; } -*/ + return out.str (); } //////////////////////////////////////////////////////////////////////////////// static std::string importTask_1_5_0 (const std::vector & lines) { -/* std::vector failed; + context.tdb.lock (context.config.get ("locking", true)); + std::vector ::const_iterator it; for (it = lines.begin (); it != lines.end (); ++it) { @@ -385,7 +387,7 @@ static std::string importTask_1_5_0 (const std::vector & lines) throw "unrecoverable"; // Build up this task ready for insertion. - T task; + Task task; // Handle the 13 fields. for (unsigned int f = 0; f < fields.size (); ++f) @@ -393,14 +395,14 @@ static std::string importTask_1_5_0 (const std::vector & lines) switch (f) { case 0: // 'uuid' - task.setUUID (fields[f].substr (1, 36)); + task.set ("uuid", fields[f].substr (1, 36)); break; case 1: // 'status' - if (fields[f] == "'pending'") task.setStatus (T::pending); - else if (fields[f] == "'recurring'") task.setStatus (T::recurring); - else if (fields[f] == "'deleted'") task.setStatus (T::deleted); - else if (fields[f] == "'completed'") task.setStatus (T::completed); + if (fields[f] == "'pending'") task.setStatus (Task::pending); + else if (fields[f] == "'recurring'") task.setStatus (Task::recurring); + else if (fields[f] == "'deleted'") task.setStatus (Task::deleted); + else if (fields[f] == "'completed'") task.setStatus (Task::completed); break; case 2: // 'tags' @@ -460,13 +462,12 @@ static std::string importTask_1_5_0 (const std::vector & lines) case 12: // 'description' if (fields[f].length () > 2) - task.setDescription (fields[f].substr (1, fields[f].length () - 2)); + task.set ("description", fields[f].substr (1, fields[f].length () - 2)); break; } } - if (! tdb.addT (task)) - failed.push_back (*it); + context.tdb.add (task); } catch (...) @@ -475,9 +476,10 @@ static std::string importTask_1_5_0 (const std::vector & lines) } } -*/ + context.tdb.commit (); + context.tdb.unlock (); + std::stringstream out; -/* out << "Imported " << (lines.size () - failed.size () - 1) << " tasks successfully, with " @@ -491,7 +493,6 @@ static std::string importTask_1_5_0 (const std::vector & lines) join (bad, "\n", failed); return out.str () + "\nCould not import:\n\n" + bad; } -*/ return out.str (); } @@ -499,9 +500,10 @@ static std::string importTask_1_5_0 (const std::vector & lines) //////////////////////////////////////////////////////////////////////////////// static std::string importTask_1_6_0 (const std::vector & lines) { -/* std::vector failed; + context.tdb.lock (context.config.get ("locking", true)); + std::vector ::const_iterator it; for (it = lines.begin (); it != lines.end (); ++it) { @@ -547,7 +549,7 @@ static std::string importTask_1_6_0 (const std::vector & lines) throw "unrecoverable"; // Build up this task ready for insertion. - T task; + Task task; // Handle the 13 fields. for (unsigned int f = 0; f < fields.size (); ++f) @@ -555,14 +557,14 @@ static std::string importTask_1_6_0 (const std::vector & lines) switch (f) { case 0: // 'uuid' - task.setUUID (fields[f].substr (1, 36)); + task.set ("uuid", fields[f].substr (1, 36)); break; case 1: // 'status' - if (fields[f] == "'pending'") task.setStatus (T::pending); - else if (fields[f] == "'recurring'") task.setStatus (T::recurring); - else if (fields[f] == "'deleted'") task.setStatus (T::deleted); - else if (fields[f] == "'completed'") task.setStatus (T::completed); + if (fields[f] == "'pending'") task.setStatus (Task::pending); + else if (fields[f] == "'recurring'") task.setStatus (Task::recurring); + else if (fields[f] == "'deleted'") task.setStatus (Task::deleted); + else if (fields[f] == "'completed'") task.setStatus (Task::completed); break; case 2: // 'tags' @@ -622,13 +624,12 @@ static std::string importTask_1_6_0 (const std::vector & lines) case 12: // 'description' if (fields[f].length () > 2) - task.setDescription (fields[f].substr (1, fields[f].length () - 2)); + task.set ("description", fields[f].substr (1, fields[f].length () - 2)); break; } } - if (! tdb.addT (task)) - failed.push_back (*it); + context.tdb.add (task); } catch (...) @@ -636,10 +637,11 @@ static std::string importTask_1_6_0 (const std::vector & lines) failed.push_back (*it); } } -*/ + + context.tdb.commit (); + context.tdb.unlock (); std::stringstream out; -/* out << "Imported " << (lines.size () - failed.size () - 1) << " tasks successfully, with " @@ -653,14 +655,13 @@ static std::string importTask_1_6_0 (const std::vector & lines) join (bad, "\n", failed); return out.str () + "\nCould not import:\n\n" + bad; } -*/ + return out.str (); } //////////////////////////////////////////////////////////////////////////////// static std::string importTaskCmdLine (const std::vector & lines) { -/* std::vector failed; std::vector ::const_iterator it; @@ -673,21 +674,21 @@ static std::string importTaskCmdLine (const std::vector & lines) std::vector args; split (args, std::string ("add ") + line, ' '); - T task; - std::string command; - parse (args, command, task); + context.task.clear (); + context.cmd.command = ""; + context.parse (); handleAdd (); + context.clearMessages (); } catch (...) { + context.clearMessages (); failed.push_back (line); } } -*/ std::stringstream out; -/* out << "Imported " << (lines.size () - failed.size ()) << " tasks successfully, with " @@ -701,7 +702,6 @@ static std::string importTaskCmdLine (const std::vector & lines) join (bad, "\n", failed); return out.str () + "\nCould not import:\n\n" + bad; } -*/ return out.str (); } @@ -709,9 +709,10 @@ static std::string importTaskCmdLine (const std::vector & lines) //////////////////////////////////////////////////////////////////////////////// static std::string importTodoSh_2_0 (const std::vector & lines) { -/* std::vector failed; + context.tdb.lock (context.config.get ("locking", true)); + std::vector ::const_iterator it; for (it = lines.begin (); it != lines.end (); ++it) { @@ -780,37 +781,39 @@ static std::string importTodoSh_2_0 (const std::vector & lines) } } - T task; - std::string command; - parse (args, command, task); - decorateTask (task); + context.task.clear (); + context.cmd.command = ""; + context.parse (); + decorateTask (context.task); if (isPending) { - task.setStatus (T::pending); + context.task.setStatus (Task::pending); } else { - task.setStatus (T::completed); + context.task.setStatus (Task::completed); char end[16]; sprintf (end, "%u", (unsigned int) endDate.toEpoch ()); - task.set ("end", end); + context.task.set ("end", end); } - if (! tdb.addT (task)) - failed.push_back (*it); + context.tdb.add (context.task); + context.clearMessages (); } catch (...) { + context.clearMessages (); failed.push_back (*it); } } -*/ + + context.tdb.commit (); + context.tdb.unlock (); std::stringstream out; -/* out << "Imported " << (lines.size () - failed.size ()) << " tasks successfully, with " @@ -824,17 +827,17 @@ static std::string importTodoSh_2_0 (const std::vector & lines) join (bad, "\n", failed); return out.str () + "\nCould not import:\n\n" + bad; } -*/ return out.str (); } //////////////////////////////////////////////////////////////////////////////// static std::string importText (const std::vector & lines) { -/* std::vector failed; int count = 0; + context.tdb.lock (context.config.get ("locking", true)); + std::vector ::const_iterator it; for (it = lines.begin (); it != lines.end (); ++it) { @@ -854,25 +857,27 @@ static std::string importText (const std::vector & lines) std::vector args; split (args, std::string ("add ") + line, ' '); - T task; - std::string command; - parse (args, command, task); - decorateTask (task); + context.task.clear (); + context.cmd.command = ""; + context.parse (); + decorateTask (context.task); - if (! tdb.addT (task)) - failed.push_back (*it); + context.tdb.add (context.task); + context.clearMessages (); } catch (...) { + context.clearMessages (); failed.push_back (line); } } } -*/ + + context.tdb.commit (); + context.tdb.unlock (); std::stringstream out; -/* out << "Imported " << count << " tasks successfully, with " @@ -886,7 +891,6 @@ static std::string importText (const std::vector & lines) join (bad, "\n", failed); return out.str () + "\nCould not import:\n\n" + bad; } -*/ return out.str (); } @@ -894,9 +898,10 @@ static std::string importText (const std::vector & lines) //////////////////////////////////////////////////////////////////////////////// static std::string importCSV (const std::vector & lines) { -/* std::vector failed; + context.tdb.lock (context.config.get ("locking", true)); + // Set up mappings. Assume no fields match. std::map mapping; mapping ["id"] = -1; @@ -1045,20 +1050,20 @@ static std::string importCSV (const std::vector & lines) std::vector fields; split (fields, *it, ','); - T task; + Task task; int f; if ((f = mapping["uuid"]) != -1) - task.setUUID (lowerCase (unquoteText (trim (fields[f])))); + task.set ("uuid", lowerCase (unquoteText (trim (fields[f])))); if ((f = mapping["status"]) != -1) { std::string value = lowerCase (unquoteText (trim (fields[f]))); - if (value == "recurring") task.setStatus (T::recurring); - else if (value == "deleted") task.setStatus (T::deleted); - else if (value == "completed") task.setStatus (T::completed); - else task.setStatus (T::pending); + if (value == "recurring") task.setStatus (Task::recurring); + else if (value == "deleted") task.setStatus (Task::deleted); + else if (value == "completed") task.setStatus (Task::completed); + else task.setStatus (Task::pending); } if ((f = mapping["tags"]) != -1) @@ -1102,10 +1107,9 @@ static std::string importCSV (const std::vector & lines) task.set ("bg", lowerCase (unquoteText (trim (fields[f])))); if ((f = mapping["description"]) != -1) - task.setDescription (unquoteText (trim (fields[f]))); + task.set ("description", unquoteText (trim (fields[f]))); - if (! tdb.addT (task)) - failed.push_back (*it); + context.tdb.add (task); } catch (...) @@ -1113,10 +1117,11 @@ static std::string importCSV (const std::vector & lines) failed.push_back (*it); } } -*/ + + context.tdb.commit (); + context.tdb.unlock (); std::stringstream out; -/* out << "Imported " << (lines.size () - failed.size () - 1) << " tasks successfully, with " @@ -1130,7 +1135,6 @@ static std::string importCSV (const std::vector & lines) join (bad, "\n", failed); return out.str () + "\nCould not import:\n\n" + bad; } -*/ return out.str (); } diff --git a/src/tests/Makefile b/src/tests/Makefile index 2d5a6b96b..acd669328 100644 --- a/src/tests/Makefile +++ b/src/tests/Makefile @@ -7,7 +7,8 @@ OBJECTS = ../TDB.o ../Task.o ../valid.o ../text.o ../Date.o ../Table.o \ ../Duration.o ../util.o ../Config.o ../Sequence.o ../Att.o ../Cmd.o \ ../Record.o ../StringTable.o ../Subst.o ../Nibbler.o ../Location.o \ ../Filter.o ../Context.o ../Keymap.o ../command.o ../interactive.o \ - ../report.o ../Grid.o ../color.o ../rules.o ../recur.o ../custom.o + ../report.o ../Grid.o ../color.o ../rules.o ../recur.o ../custom.o \ + ../import.o ../edit.o all: $(PROJECT)