You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

74 lines
3.3 KiB

  1. #include <db/update.h>
  2. #include <db/statements/builder/InsertStatementBuilder.h>
  3. #include <db/statements/builder/SelectStatementBuilder.h>
  4. #include <db/statements/builder/UpdateStatementBuilder.h>
  5. #include <db/statements/builder/DeleteStatementBuilder.h>
  6. namespace db {
  7. uint32_t insert_events(sql::Database *db, const ical::IcalObject *object) {
  8. uint32_t event_id;
  9. for(auto const& event : object->get_events()) {
  10. stmt::Statement select_event_by_uid = stmt::Statement::select().columns("1").from_table("events").where("uid = \"" + event->get_uid() + "\"").exists();
  11. uint32_t ret = db->execAndGet(select_event_by_uid.str());
  12. if(ret > 0) {
  13. DEBUG << "Updating " << event->print();
  14. stmt::Statement update_event = stmt::Statement::update().table("events").set(event->update_row_string()).where("uid = \"" + event->get_uid() + "\"").close();
  15. DEBUG << update_event.str();
  16. db->exec(update_event.str());
  17. stmt::Statement get_event_id = stmt::Statement::select().columns("id").from_table("events").where("uid = \"" + event->get_uid() + "\"").close();
  18. uint32_t event_id = db->execAndGet(get_event_id.str());
  19. stmt::Statement delete_alarms = stmt::Statement::remove().table("alarms").where("event_id = \"" + std::to_string(event_id) + "\"").close();
  20. db->exec(delete_alarms.str());
  21. for(auto const& alarm : event->get_alarms()) {
  22. insert_alarm(db, &alarm, event_id);
  23. }
  24. } else {
  25. DEBUG << "Inserting " << event->print();
  26. stmt::Statement insert_object = stmt::Statement::insert().table("events").columns("uid, summary, dtstart, dtend, filename").values().row(event->get_db_row()).close();
  27. DEBUG << insert_object.str() << std::endl;
  28. db->exec(insert_object.str());
  29. event_id = db->execAndGet("SELECT last_insert_rowid();");
  30. for(auto const& alarm : event->get_alarms()) {
  31. insert_alarm(db, &alarm, event_id);
  32. }
  33. }
  34. }
  35. return 0;
  36. }
  37. uint32_t insert_alarm(sql::Database *db, const ical::Alarm *alarm, const uint32_t event_id) {
  38. std::vector<std::string> row = alarm->get_db_row();
  39. row.push_back(std::to_string(event_id));
  40. stmt::Statement insert_alarm = stmt::Statement::insert().table("alarms").columns("action, description, absolute_trigger, event_id").values().row(row).close();
  41. DEBUG << insert_alarm.str();
  42. try {
  43. db->exec(insert_alarm.str());
  44. } catch(sql::Exception &e) {
  45. WARN << e.what() << std::endl;
  46. }
  47. return 0;
  48. }
  49. uint32_t remove_events(sql::Database *db, const std::string &filename) {
  50. stmt::Statement delete_event = stmt::Statement::remove().table("events").where("filename = \"" + filename + "\"").close();
  51. DEBUG << delete_event.str();
  52. try {
  53. db->exec(delete_event.str());
  54. } catch(sql::Exception &e) {
  55. WARN << e.what() << std::endl;
  56. }
  57. return 0;
  58. }
  59. //uint32_t update_alarm(sql::Database *db, const ical::Alarm *alarm) {
  60. // std::vector<std::string> row = alarm->get_db_row();
  61. // row.push_back(std::to_string(event_id));
  62. // stmt::Statement insert_alarm = stmt::Statement::insert().table("alarms").columns("action, description, absolute_trigger, event_id").values().row(row).close();
  63. // DEBUG << insert_alarm.str();
  64. // db->exec(insert_alarm.str());
  65. // return 0;
  66. //}
  67. }