/src/tracking/db_saver.cpp

http://urtconnector.googlecode.com/ · C++ · 96 lines · 77 code · 15 blank · 4 comment · 0 complexity · 0dc4dd3725e128492714387792b45757 MD5 · raw file

  1. #include "db_saver.h"
  2. #include <memory>
  3. #include <exception>
  4. #include <common/qt_syslog.h>
  5. #include <database/sqlite_database.h>
  6. #include "manager.h"
  7. #include "task.h"
  8. #include "common.h"
  9. SYSLOG_MODULE(db_saver)
  10. namespace tracking
  11. {
  12. db_saver::db_saver(manager* list, const condition_factory_p& conds,
  13. const action_factory_p& acts, QObject* parent)
  14. : QObject(parent)
  15. , list_(list)
  16. {
  17. // initialize database
  18. try
  19. {
  20. database* db = database::instance();
  21. db->query
  22. (
  23. "CREATE TABLE IF NOT EXISTS tracking_tasks"
  24. "("
  25. " id VARCHAR(255),"
  26. " body TEXT,"
  27. " PRIMARY KEY(id)"
  28. ");"
  29. );
  30. // load list
  31. database::result_set res = database::instance()->query("SELECT * FROM tracking_tasks;");
  32. foreach (const database::result_row& row, res)
  33. {
  34. std::auto_ptr<task_t> task(new task_t(list_));
  35. QString body = row[1];
  36. QByteArray ba = QByteArray::fromBase64(body.toAscii());
  37. QDataStream ds(ba);
  38. settings_t s;
  39. ds >> s;
  40. task->load(s, conds, acts);
  41. list_->add_task(task.get());
  42. task.release();
  43. }
  44. }
  45. catch(const std::exception& e)
  46. {
  47. LOG_ERR << e.what();
  48. }
  49. connect(list_, SIGNAL(task_added(task_t*)), SLOT(task_added(task_t*)));
  50. connect(list_, SIGNAL(task_changed(task_t*)), SLOT(task_changed(task_t*)));
  51. connect(list_, SIGNAL(task_removed(QString)), SLOT(task_removed(QString)));
  52. }
  53. void db_saver::task_added(task_t* t)
  54. {
  55. task_changed(t);
  56. }
  57. void db_saver::task_changed(task_t* t)
  58. {
  59. // removing old record if any
  60. task_removed(t->id());
  61. // inserting new record
  62. settings_t s;
  63. t->save(s);
  64. QByteArray ba;
  65. {
  66. QDataStream ds(&ba, QIODevice::WriteOnly);
  67. ds << s;
  68. }
  69. QString body = ba.toBase64();
  70. database* db = database::instance();
  71. db->query(QString("INSERT INTO tracking_tasks VALUES('%1', '%2');")
  72. .arg(t->id())
  73. .arg(body)
  74. );
  75. }
  76. void db_saver::task_removed(const QString& id)
  77. {
  78. database* db = database::instance();
  79. db->query(QString("DELETE FROM tracking_tasks WHERE id='%1';").arg(id));
  80. }
  81. }