1 #include "CalendarDataStorage.h"
7 static int callback(void *NotUsed, int argc, char **argv, char **azColName){
11 CalendarDataStorage::CalendarDataStorage(){
13 // Initialise the SQLite database.
15 sqlite3_open_v2(":memory:", &db, SQLITE_OPEN_READWRITE | SQLITE_OPEN_FULLMUTEX, nullptr);
20 CalendarDataStorage::~CalendarDataStorage(){
22 // Destory the SQLite database.
28 void CalendarDataStorage::SetupTables(){
30 // Setup the tables for the Calendar Data Storage.
32 char *setupTablesErrMsg = nullptr;
35 // Setup the accounts table.
37 const char *accountsTableString;
38 accountsTableString = "CREATE TABLE accounts(id INTEGER PRIMARY KEY "
42 resultCode = sqlite3_exec(db, accountsTableString, callback, nullptr, &setupTablesErrMsg);
45 DataStorageInitOK = false;
49 // Setup the calendars table.
51 const char *calendarTableString;
52 calendarTableString = "CREATE TABLE calendars(id INTEGER PRIMARY KEY "
59 resultCode = sqlite3_exec(db, calendarTableString, callback, nullptr, &setupTablesErrMsg);
62 DataStorageInitOK = false;
66 // Setup the calendar entries table.
68 const char *calendarentriesTableString;
69 calendarentriesTableString = "CREATE TABLE calendarentries(id INTEGER PRIMARY KEY "
70 ", calendarid INTEGER"
72 ", entrydescription TEXT"
73 ", entrystartyear INTEGER"
74 ", entrystartmonth INTEGER"
75 ", entrystartday INTEGER"
76 ", entrystarthour INTEGER"
77 ", entrystartminute INTEGER"
78 ", entrystartsecond INTEGER"
79 ", entryendyear INTEGER"
80 ", entryendmonth INTEGER"
81 ", entryendday INTEGER"
82 ", entryendhour INTEGER"
83 ", entryendminute INTEGER"
84 ", entryendsecond INTEGER"
85 ", entrydurationweek INTEGER"
86 ", entrydurationday INTEGER"
87 ", entrydurationhour INTEGER"
88 ", entrydurationminute INTEGER"
89 ", entrydurationsecond INTEGER"
92 resultCode = sqlite3_exec(db, calendarentriesTableString, callback, nullptr, &setupTablesErrMsg);
95 DataStorageInitOK = false;
99 // Setup the checksums table.
101 const char *checksumsTableString;
102 checksumsTableString = "CREATE TABLE checksums(hashname TEXT PRIMARY KEY "
103 ", hashvalue TEXT);";
105 resultCode = sqlite3_exec(db, checksumsTableString, callback, nullptr, &setupTablesErrMsg);
107 if (resultCode != 0){
108 DataStorageInitOK = false;
112 DataStorageInitOK = true;
116 bool CalendarDataStorage::DidInitOK()
119 return DataStorageInitOK;
123 CDSAccountResult CalendarDataStorage::AddAccount(string accountName)
126 CDSAccountResult addResult = CDSACCOUNT_UNITTESTFAIL;
129 sqlite3_stmt *statementHandle;
131 resultCode = sqlite3_prepare_v2(db, "INSERT INTO accounts (name) VALUES(?1);", -1, &statementHandle, nullptr);
133 if (resultCode != 0){
134 return CDSACCOUNT_FAILED;
137 resultCode = sqlite3_bind_text(statementHandle, 1, accountName.c_str(), -1, SQLITE_STATIC);
139 if (resultCode != 0){
140 return CDSACCOUNT_FAILED;
143 resultCode = sqlite3_step(statementHandle);
145 if (resultCode != SQLITE_DONE){
146 return CDSACCOUNT_FAILED;
149 addResult = CDSACCOUNT_OK;
155 CDSAccountList CalendarDataStorage::GetAccountList()
158 CDSAccountList accountList;
160 // Check if calendar exists first.
164 sqlite3_stmt *statementHandle;
166 resultCode = sqlite3_prepare_v2(db, "SELECT id, name from accounts;", -1, &statementHandle, nullptr);
168 if (resultCode != 0){
169 accountList.getAccountListResult = CDSACCOUNT_FAILED;
173 if (resultCode != 0){
174 accountList.getAccountListResult = CDSACCOUNT_FAILED;
178 resultCode = sqlite3_step(statementHandle);
180 if (resultCode == SQLITE_ROW){
182 } else if (resultCode == SQLITE_DONE) {
183 accountList.getAccountListResult = CDSACCOUNT_NOACCOUNT;
186 accountList.getAccountListResult = CDSACCOUNT_FAILED;
190 while (resultCode == SQLITE_ROW){
192 CDSGetAccountInfo accountInfo;
194 accountInfo.accountID = sqlite3_column_int(statementHandle, 0);
196 stringstream calendarStream;
198 calendarStream << sqlite3_column_text(statementHandle, 1);
200 accountInfo.accountName = calendarStream.str();
201 accountInfo.accountInfoResult = CDSACCOUNT_OK;
203 accountList.accountList.push_back(accountInfo);
205 resultCode = sqlite3_step(statementHandle);
209 accountList.getAccountListResult = CDSACCOUNT_OK;
215 CDSGetAccountInfo CalendarDataStorage::GetAccount(string accountName)
218 CDSGetAccountInfo accountInfo;
219 accountInfo.accountInfoResult = CDSACCOUNT_UNITTESTFAIL;
222 sqlite3_stmt *statementHandle;
224 resultCode = sqlite3_prepare_v2(db, "SELECT name, id FROM accounts WHERE name=(?1);", -1, &statementHandle, nullptr);
226 if (resultCode != 0){
227 accountInfo.accountInfoResult = CDSACCOUNT_FAILED;
231 resultCode = sqlite3_bind_text(statementHandle, 1, accountName.c_str(), -1, SQLITE_STATIC);
233 if (resultCode != 0){
234 accountInfo.accountInfoResult = CDSACCOUNT_FAILED;
238 resultCode = sqlite3_step(statementHandle);
240 if (resultCode == SQLITE_DONE){
242 accountInfo.accountInfoResult = CDSACCOUNT_NOACCOUNT;
245 } else if (resultCode == SQLITE_ROW){
247 // Get the result data.
249 stringstream accountNameStream;
251 accountNameStream << sqlite3_column_text(statementHandle, 0);
253 accountInfo.accountName = accountNameStream.str();
254 accountInfo.accountID = sqlite3_column_int(statementHandle, 1);
256 accountInfo.accountInfoResult = CDSACCOUNT_OK;
261 accountInfo.accountInfoResult = CDSACCOUNT_FAILED;
270 CDSAccountResult CalendarDataStorage::UpdateAccount(int accountID, string accountName)
273 CDSAccountResult updateResult = CDSACCOUNT_UNITTESTFAIL;
276 sqlite3_stmt *findHandle;
277 sqlite3_stmt *statementHandle;
279 // Check if account exists first.
281 resultCode = sqlite3_prepare_v2(db, "SELECT id from accounts WHERE id=(?1);", -1, &findHandle, nullptr);
283 if (resultCode != 0){
284 return CDSACCOUNT_FAILED;
287 resultCode = sqlite3_bind_int(findHandle, 1, accountID);
289 if (resultCode != 0){
290 return CDSACCOUNT_FAILED;
293 resultCode = sqlite3_step(findHandle);
295 if (resultCode == SQLITE_ROW){
297 } else if (resultCode == SQLITE_DONE) {
298 return CDSACCOUNT_NOACCOUNT;
300 return CDSACCOUNT_FAILED;
303 // Update the account.
305 resultCode = sqlite3_prepare_v2(db, "UPDATE accounts SET name=(?1) WHERE id=(?2);", -1, &statementHandle, nullptr);
307 if (resultCode != 0){
308 return CDSACCOUNT_FAILED;
311 resultCode = sqlite3_bind_text(statementHandle, 1, accountName.c_str(), -1, SQLITE_STATIC);
313 if (resultCode != 0){
314 return CDSACCOUNT_FAILED;
317 resultCode = sqlite3_bind_int(statementHandle, 2, accountID);
319 if (resultCode != 0){
320 return CDSACCOUNT_FAILED;
323 resultCode = sqlite3_step(statementHandle);
325 if (resultCode != SQLITE_DONE){
326 return CDSACCOUNT_FAILED;
329 updateResult = CDSACCOUNT_OK;
335 CDSAccountResult CalendarDataStorage::DeleteAccount(int accountID)
338 CDSAccountResult deleteResult = CDSACCOUNT_UNITTESTFAIL;
340 // Check if account exists first.
342 sqlite3_stmt *findHandle;
343 sqlite3_stmt *statementHandle;
344 sqlite3_stmt *calendarHandle;
347 resultCode = sqlite3_prepare_v2(db, "SELECT id from accounts WHERE id=(?1);", -1, &findHandle, nullptr);
349 if (resultCode != 0){
350 return CDSACCOUNT_FAILED;
353 resultCode = sqlite3_bind_int(findHandle, 1, accountID);
355 if (resultCode != 0){
356 return CDSACCOUNT_FAILED;
359 resultCode = sqlite3_step(findHandle);
361 if (resultCode == SQLITE_ROW){
363 } else if (resultCode == SQLITE_DONE) {
364 return CDSACCOUNT_NOACCOUNT;
366 return CDSACCOUNT_FAILED;
369 // Delete the account.
371 resultCode = sqlite3_prepare_v2(db, "DELETE FROM accounts WHERE id=(?1);", -1, &statementHandle, nullptr);
373 if (resultCode != 0){
374 return CDSACCOUNT_FAILED;
377 resultCode = sqlite3_bind_int(statementHandle, 1, accountID);
379 if (resultCode != 0){
380 return CDSACCOUNT_FAILED;
383 resultCode = sqlite3_step(statementHandle);
385 if (resultCode == SQLITE_DONE){
386 //deleteResult = CDSACCOUNT_OK;
388 return CDSACCOUNT_FAILED;
391 // Get the calendar IDs and delete each calendar (and associated entries).
393 resultCode = sqlite3_prepare_v2(db, "SELECT id FROM calendars WHERE accountid=(?1);", -1, &calendarHandle, nullptr);
395 if (resultCode != 0){
396 return CDSACCOUNT_FAILED;
399 resultCode = sqlite3_bind_int(calendarHandle, 1, accountID);
401 if (resultCode != 0){
402 return CDSACCOUNT_FAILED;
405 resultCode = sqlite3_step(calendarHandle);
407 if (resultCode == SQLITE_DONE || resultCode == SQLITE_ROW){
408 deleteResult = CDSACCOUNT_OK;
410 return CDSACCOUNT_FAILED;
413 while (resultCode == SQLITE_ROW){
415 int calendarDeleteID = sqlite3_column_int(calendarHandle, 0);
417 DeleteCalendar(calendarDeleteID);
419 resultCode = sqlite3_step(calendarHandle);
423 deleteResult = CDSACCOUNT_OK;
430 CDSCalendarResult CalendarDataStorage::AddCalendar(int accountID, string calendarName, string calendarID, Colour calendarColour)
433 CDSCalendarResult addResult = CDSCALENDAR_UNITTESTFAIL;
436 sqlite3_stmt *statementHandle;
438 resultCode = sqlite3_prepare_v2(db, "INSERT INTO calendars (name, calendarid, accountid, colour) VALUES(?1, ?2, ?3, ?4);", -1, &statementHandle, nullptr);
440 if (resultCode != 0){
441 return CDSCALENDAR_FAILED;
444 resultCode = sqlite3_bind_text(statementHandle, 1, calendarName.c_str(), -1, SQLITE_STATIC);
446 if (resultCode != 0){
447 return CDSCALENDAR_FAILED;
450 resultCode = sqlite3_bind_text(statementHandle, 2, calendarID.c_str(), -1, SQLITE_STATIC);
452 if (resultCode != 0){
453 return CDSCALENDAR_FAILED;
456 resultCode = sqlite3_bind_int(statementHandle, 3, accountID);
458 if (resultCode != 0){
459 return CDSCALENDAR_FAILED;
462 resultCode = sqlite3_bind_text(statementHandle, 4, ((string)calendarColour).c_str(), -1, SQLITE_STATIC);
464 if (resultCode != 0){
465 return CDSCALENDAR_FAILED;
468 resultCode = sqlite3_step(statementHandle);
470 if (resultCode != SQLITE_DONE){
471 return CDSCALENDAR_FAILED;
474 addResult = CDSCALENDAR_OK;
480 CDSGetCalendarInfo CalendarDataStorage::GetCalendar(std::string accountName, std::string calendarTextID)
483 CDSGetAccountInfo accountResult;
484 CDSGetCalendarInfo calendarResult;
485 sqlite3_stmt *statementHandle;
488 // Check if the account exists.
490 accountResult = GetAccount(accountName);
492 switch (accountResult.accountInfoResult){
495 calendarResult.accountName = accountResult.accountName;
496 calendarResult.accountInfoResult = CDSACCOUNT_OK;
498 case CDSACCOUNT_FAILED:
499 calendarResult.accountInfoResult = CDSACCOUNT_FAILED;
500 calendarResult.calendarInfoResult = CDSCALENDAR_FAILED;
501 return calendarResult;
502 case CDSACCOUNT_NOACCOUNT:
503 calendarResult.accountInfoResult = CDSACCOUNT_NOACCOUNT;
504 calendarResult.calendarInfoResult = CDSCALENDAR_NOCALENDAR;
505 return calendarResult;
509 // Check if the calendar exists.
511 resultCode = sqlite3_prepare_v2(db, "SELECT id, accountid, name, calendarid, colour FROM calendars WHERE accountid=(?1) AND calendarid=(?2);", -1, &statementHandle, nullptr);
513 if (resultCode != 0){
514 calendarResult.calendarInfoResult = CDSCALENDAR_FAILED;
515 return calendarResult;
518 resultCode = sqlite3_bind_int(statementHandle, 1, accountResult.accountID);
520 if (resultCode != 0){
521 calendarResult.calendarInfoResult = CDSCALENDAR_FAILED;
522 return calendarResult;
525 resultCode = sqlite3_bind_text(statementHandle, 2, calendarTextID.c_str(), -1, SQLITE_STATIC);
527 if (resultCode != 0){
528 calendarResult.calendarInfoResult = CDSCALENDAR_FAILED;
529 return calendarResult;
532 resultCode = sqlite3_step(statementHandle);
534 if (resultCode == SQLITE_DONE){
536 calendarResult.calendarInfoResult = CDSCALENDAR_NOCALENDAR;
537 return calendarResult;
539 } else if (resultCode == SQLITE_ROW){
541 // Get the calendar name.
543 stringstream calendarStream;
545 calendarStream << sqlite3_column_text(statementHandle, 2);
546 calendarResult.calendarName = calendarStream.str();
548 calendarStream.str("");
549 calendarStream << sqlite3_column_text(statementHandle, 3);
550 calendarResult.calendarTextID = calendarStream.str();
552 calendarStream.str("");
553 calendarStream << sqlite3_column_text(statementHandle, 4);
554 calendarResult.calendarColour = calendarStream.str();
556 calendarResult.calendarID = sqlite3_column_int(statementHandle, 0);
557 calendarResult.accountID = sqlite3_column_int(statementHandle, 1);
558 calendarResult.calendarInfoResult = CDSCALENDAR_OK;
559 return calendarResult;
563 calendarResult.calendarInfoResult = CDSCALENDAR_FAILED;
564 return calendarResult;
568 return calendarResult;
572 CDSCalendarResult CalendarDataStorage::UpdateCalendar(int calendarID, string calendarName)
575 CDSCalendarResult updateResult = CDSCALENDAR_UNITTESTFAIL;
578 sqlite3_stmt *findHandle;
579 sqlite3_stmt *statementHandle;
581 // Check if calendar exists first.
583 resultCode = sqlite3_prepare_v2(db, "SELECT id from calendars WHERE id=(?1);", -1, &findHandle, nullptr);
585 if (resultCode != 0){
586 return CDSCALENDAR_FAILED;
589 resultCode = sqlite3_bind_int(findHandle, 1, calendarID);
591 if (resultCode != 0){
592 return CDSCALENDAR_FAILED;
595 resultCode = sqlite3_step(findHandle);
597 if (resultCode == SQLITE_ROW){
599 } else if (resultCode == SQLITE_DONE) {
600 return CDSCALENDAR_NOCALENDAR;
602 return CDSCALENDAR_FAILED;
605 // Update the account.
607 resultCode = sqlite3_prepare_v2(db, "UPDATE calendars SET name=(?1) WHERE id=(?2);", -1, &statementHandle, nullptr);
609 if (resultCode != 0){
610 return CDSCALENDAR_FAILED;
613 resultCode = sqlite3_bind_text(statementHandle, 1, calendarName.c_str(), -1, SQLITE_STATIC);
615 if (resultCode != 0){
616 return CDSCALENDAR_FAILED;
619 resultCode = sqlite3_bind_int(statementHandle, 2, calendarID);
621 if (resultCode != 0){
622 return CDSCALENDAR_FAILED;
625 resultCode = sqlite3_step(statementHandle);
627 if (resultCode != SQLITE_DONE){
628 return CDSCALENDAR_FAILED;
631 updateResult = CDSCALENDAR_OK;
637 CDSCalendarResult CalendarDataStorage::DeleteCalendar(int calendarID)
640 CDSCalendarResult deleteResult = CDSCALENDAR_UNITTESTFAIL;
642 // Check if account exists first.
644 sqlite3_stmt *findHandle;
645 sqlite3_stmt *statementHandle;
646 sqlite3_stmt *entriesHandle;
649 resultCode = sqlite3_prepare_v2(db, "SELECT id from calendars WHERE id=(?1);", -1, &findHandle, nullptr);
651 if (resultCode != 0){
652 return CDSCALENDAR_FAILED;
655 resultCode = sqlite3_bind_int(findHandle, 1, calendarID);
657 if (resultCode != 0){
658 return CDSCALENDAR_FAILED;
661 resultCode = sqlite3_step(findHandle);
663 if (resultCode == SQLITE_ROW){
665 } else if (resultCode == SQLITE_DONE) {
666 return CDSCALENDAR_NOCALENDAR;
668 return CDSCALENDAR_FAILED;
671 // Delete the calendar.
673 resultCode = sqlite3_prepare_v2(db, "DELETE FROM calendars WHERE id=(?1);", -1, &statementHandle, nullptr);
675 if (resultCode != 0){
676 return CDSCALENDAR_FAILED;
679 resultCode = sqlite3_bind_int(statementHandle, 1, calendarID);
681 if (resultCode != 0){
682 return CDSCALENDAR_FAILED;
685 resultCode = sqlite3_step(statementHandle);
687 if (resultCode != SQLITE_DONE){
688 return CDSCALENDAR_FAILED;
691 // Delete the calendar entries.
693 resultCode = sqlite3_prepare_v2(db, "DELETE FROM calendarentries WHERE calendarid=(?1);", -1, &entriesHandle, nullptr);
695 if (resultCode != 0){
696 return CDSCALENDAR_FAILED;
699 resultCode = sqlite3_bind_int(entriesHandle, 1, calendarID);
701 if (resultCode != 0){
702 return CDSCALENDAR_FAILED;
705 resultCode = sqlite3_step(entriesHandle);
707 if (resultCode == SQLITE_DONE){
708 deleteResult = CDSCALENDAR_OK;
710 return CDSCALENDAR_FAILED;
717 CDSAddEntryResult CalendarDataStorage::AddEvent(int calendarID, std::string filename)
720 CDSAddEntryResult addResult;
721 addResult.addEventResult = CDSENTRY_UNITTESTFAIL;
723 // Load the event file.
725 CalendarEventObject eventData;
726 CalendarObjectLoadResult eventLoadResult = eventData.LoadFile(filename);
728 // Check the result of the event file load.
730 switch (eventLoadResult){
732 case CALENDAROBJECTLOAD_OK:
734 case CALENDAROBJECTLOAD_MISSING:
735 addResult.addEventResult = CDSENTRY_MISSINGFILE;
737 case CALENDAROBJECTLOAD_INVALIDFORMAT:
738 addResult.addEventResult = CDSENTRY_INVALIDFILE;
740 case CALENDAROBJECTLOAD_CANNOTOPEN:
741 addResult.addEventResult = CDSENTRY_CANNOTOPENFILE;
746 // Check if calendar exists first.
750 sqlite3_stmt *findHandle;
751 sqlite3_stmt *statementHandle;
753 resultCode = sqlite3_prepare_v2(db, "SELECT id from calendars WHERE id=(?1);", -1, &findHandle, nullptr);
755 if (resultCode != 0){
756 addResult.addEventResult = CDSENTRY_FAILED;
760 resultCode = sqlite3_bind_int(findHandle, 1, calendarID);
762 if (resultCode != 0){
763 addResult.addEventResult = CDSENTRY_FAILED;
767 resultCode = sqlite3_step(findHandle);
769 if (resultCode == SQLITE_ROW){
771 } else if (resultCode == SQLITE_DONE) {
772 addResult.addEventResult = CDSENTRY_NOCALENDAR;
775 addResult.addEventResult = CDSENTRY_FAILED;
779 // Get the required values from the event object.
781 int eventStartYear = 0;
782 int eventStartMonth = 0;
783 int eventStartDay = 0;
784 int eventStartHour = 0;
785 int eventStartMinute = 0;
786 int eventStartSecond = 0;
787 int eventStartDuration = 0;
788 std::string eventString = "";
792 if (eventData.DateTimeStartData.size() < 16){
794 addResult.addEventResult = CDSENTRY_INVALIDFILE;
799 eventString = eventData.DateTimeStartData.substr(0,4);
801 if (all_of(eventString.begin(), eventString.end(), ::isdigit)){
803 eventStartYear = atoi(eventString.c_str());
807 addResult.addEventResult = CDSENTRY_INVALIDFILE;
812 eventString = eventData.DateTimeStartData.substr(4,2);
814 if (all_of(eventString.begin(), eventString.end(), ::isdigit)){
816 eventStartMonth = atoi(eventString.c_str());
820 addResult.addEventResult = CDSENTRY_INVALIDFILE;
825 eventString = eventData.DateTimeStartData.substr(6,2);
827 if (all_of(eventString.begin(), eventString.end(), ::isdigit)){
829 eventStartDay = atoi(eventString.c_str());
833 addResult.addEventResult = CDSENTRY_INVALIDFILE;
838 eventString = eventData.DateTimeStartData.substr(9,2);
840 if (all_of(eventString.begin(), eventString.end(), ::isdigit)){
842 eventStartHour = atoi(eventString.c_str());
846 addResult.addEventResult = CDSENTRY_INVALIDFILE;
851 eventString = eventData.DateTimeStartData.substr(11,2);
853 if (all_of(eventString.begin(), eventString.end(), ::isdigit)){
855 eventStartMinute = atoi(eventString.c_str());
859 addResult.addEventResult = CDSENTRY_INVALIDFILE;
864 eventString = eventData.DateTimeStartData.substr(13,2);
866 if (all_of(eventString.begin(), eventString.end(), ::isdigit)){
868 eventStartSecond = atoi(eventString.c_str());
872 addResult.addEventResult = CDSENTRY_INVALIDFILE;
877 //eventYear = eventStartDate.substr(0, 4);
881 int eventEndYear = 0;
882 int eventEndMonth = 0;
884 int eventEndHour = 0;
885 int eventEndMinute = 0;
886 int eventEndSecond = 0;
887 int eventEndDuration = 0;
889 if (eventData.DateTimeEndData != ""){
891 if (eventData.DateTimeEndData.size() < 16){
893 addResult.addEventResult = CDSENTRY_INVALIDFILE;
898 eventString = eventData.DateTimeEndData.substr(0,4);
900 if (all_of(eventString.begin(), eventString.end(), ::isdigit)){
902 eventEndYear = atoi(eventString.c_str());
906 addResult.addEventResult = CDSENTRY_INVALIDFILE;
911 eventString = eventData.DateTimeEndData.substr(4,2);
913 if (all_of(eventString.begin(), eventString.end(), ::isdigit)){
915 eventEndMonth = atoi(eventString.c_str());
919 addResult.addEventResult = CDSENTRY_INVALIDFILE;
924 eventString = eventData.DateTimeEndData.substr(6,2);
926 if (all_of(eventString.begin(), eventString.end(), ::isdigit)){
928 eventEndDay = atoi(eventString.c_str());
932 addResult.addEventResult = CDSENTRY_INVALIDFILE;
937 eventString = eventData.DateTimeEndData.substr(9,2);
939 if (all_of(eventString.begin(), eventString.end(), ::isdigit)){
941 eventEndHour = atoi(eventString.c_str());
945 addResult.addEventResult = CDSENTRY_INVALIDFILE;
950 eventString = eventData.DateTimeEndData.substr(11,2);
952 if (all_of(eventString.begin(), eventString.end(), ::isdigit)){
954 eventEndMinute = atoi(eventString.c_str());
958 addResult.addEventResult = CDSENTRY_INVALIDFILE;
963 eventString = eventData.DateTimeEndData.substr(13,2);
965 if (all_of(eventString.begin(), eventString.end(), ::isdigit)){
967 eventEndSecond = atoi(eventString.c_str());
971 addResult.addEventResult = CDSENTRY_INVALIDFILE;
978 eventString = eventData.DurationData;
980 // Process the duration data.
982 int eventDurationWeeks = 0;
983 int eventDurationDays = 0;
984 int eventDurationHours = 0;
985 int eventDurationMinutes = 0;
986 int eventDurationSeconds = 0;
988 // Get the duration (if DTEND hasn't been specified).
990 if (eventData.DurationData.size() > 0){
994 bool DateTimeMode = false;
996 std::string::iterator eventDataChar = eventData.DurationData.begin();
997 std::string currentValue = "";
999 if (*eventDataChar != 'P'){
1001 eventDataChar = eventData.DurationData.end();
1005 for(eventDataChar; eventDataChar != eventData.DurationData.end(); eventDataChar++){
1007 // Check if value is a digit.
1009 if (isdigit(*eventDataChar)){
1011 currentValue += *eventDataChar;
1015 // Check that the value matches one of the letters.
1017 if (*eventDataChar == 'W' && DateTimeMode == false){
1019 eventDurationWeeks = atoi(currentValue.c_str());
1021 } else if (*eventDataChar == 'D' && DateTimeMode == false){
1023 eventDurationDays = atoi(currentValue.c_str());
1025 } else if (*eventDataChar == 'T' && DateTimeMode == false){
1027 DateTimeMode = true;
1029 } else if (*eventDataChar == 'H'){
1031 eventDurationHours = atoi(currentValue.c_str());
1033 } else if (*eventDataChar == 'M'){
1035 eventDurationMinutes = atoi(currentValue.c_str());
1037 } else if (*eventDataChar == 'S'){
1039 eventDurationSeconds = atoi(currentValue.c_str());
1043 // Reset the current value.
1053 // Add the calendar entry.
1055 std::string sqlParameter = "INSERT INTO calendarentries (calendarid, entryname, entrydescription,"
1056 " entrystartyear, entrystartmonth, entrystartday, entrystarthour, entrystartminute, entrystartsecond,"
1057 " entryendyear, entryendmonth, entryendday, entryendhour, entryendminute, entryendsecond, "
1058 " entrydurationweek, entrydurationday, entrydurationhour, entrydurationminute, entrydurationsecond)"
1059 " VALUES ((?1), (?2), (?3), (?4), (?5), (?6), (?7), (?8), (?9), (?10), "
1060 " (?11), (?12), (?13), (?14), (?15), (?16), (?17), (?18), (?19), (?20))";
1062 resultCode = sqlite3_prepare_v2(db, sqlParameter.c_str(), -1, &statementHandle, nullptr);
1064 resultCode = sqlite3_bind_int(statementHandle, 1, calendarID);
1066 if (resultCode != 0){
1067 addResult.addEventResult = CDSENTRY_FAILED;
1071 // Process Entry Name.
1073 resultCode = sqlite3_bind_text(statementHandle, 2, eventData.SummaryData.c_str(), -1, SQLITE_STATIC);
1075 if (resultCode != 0){
1076 addResult.addEventResult = CDSENTRY_FAILED;
1080 // Process Entry Description.
1082 string eventDescription;
1085 eventDescription = eventData.DescriptionList.at(0);
1088 catch (out_of_range &err){
1089 eventDescription = "";
1092 resultCode = sqlite3_bind_text(statementHandle, 3, eventDescription.c_str(), -1, SQLITE_STATIC);
1094 if (resultCode != 0){
1095 addResult.addEventResult = CDSENTRY_FAILED;
1099 // Process Entry Start Date information.
1101 resultCode = sqlite3_bind_int(statementHandle, 4, eventStartYear);
1103 if (resultCode != 0){
1104 addResult.addEventResult = CDSENTRY_FAILED;
1108 resultCode = sqlite3_bind_int(statementHandle, 5, eventStartMonth);
1110 if (resultCode != 0){
1111 addResult.addEventResult = CDSENTRY_FAILED;
1115 resultCode = sqlite3_bind_int(statementHandle, 6, eventStartDay);
1117 if (resultCode != 0){
1118 addResult.addEventResult = CDSENTRY_FAILED;
1122 resultCode = sqlite3_bind_int(statementHandle, 7, eventStartHour);
1124 if (resultCode != 0){
1125 addResult.addEventResult = CDSENTRY_FAILED;
1129 resultCode = sqlite3_bind_int(statementHandle, 8, eventStartMinute);
1131 if (resultCode != 0){
1132 addResult.addEventResult = CDSENTRY_FAILED;
1136 resultCode = sqlite3_bind_int(statementHandle, 9, eventStartSecond);
1138 if (resultCode != 0){
1139 addResult.addEventResult = CDSENTRY_FAILED;
1143 // Process Entry Start End information.
1145 resultCode = sqlite3_bind_int(statementHandle, 10, eventEndYear);
1147 if (resultCode != 0){
1148 addResult.addEventResult = CDSENTRY_FAILED;
1152 resultCode = sqlite3_bind_int(statementHandle, 11, eventEndMonth);
1154 if (resultCode != 0){
1155 addResult.addEventResult = CDSENTRY_FAILED;
1159 resultCode = sqlite3_bind_int(statementHandle, 12, eventEndDay);
1161 if (resultCode != 0){
1162 addResult.addEventResult = CDSENTRY_FAILED;
1166 resultCode = sqlite3_bind_int(statementHandle, 13, eventEndHour);
1168 if (resultCode != 0){
1169 addResult.addEventResult = CDSENTRY_FAILED;
1173 resultCode = sqlite3_bind_int(statementHandle, 14, eventEndMinute);
1175 if (resultCode != 0){
1176 addResult.addEventResult = CDSENTRY_FAILED;
1180 resultCode = sqlite3_bind_int(statementHandle, 15, eventEndSecond);
1182 if (resultCode != 0){
1183 addResult.addEventResult = CDSENTRY_FAILED;
1187 resultCode = sqlite3_bind_int(statementHandle, 16, eventDurationWeeks);
1189 if (resultCode != 0){
1190 addResult.addEventResult = CDSENTRY_FAILED;
1194 resultCode = sqlite3_bind_int(statementHandle, 17, eventDurationDays);
1196 if (resultCode != 0){
1197 addResult.addEventResult = CDSENTRY_FAILED;
1201 resultCode = sqlite3_bind_int(statementHandle, 18, eventDurationHours);
1203 if (resultCode != 0){
1204 addResult.addEventResult = CDSENTRY_FAILED;
1208 resultCode = sqlite3_bind_int(statementHandle, 19, eventDurationMinutes);
1210 if (resultCode != 0){
1211 addResult.addEventResult = CDSENTRY_FAILED;
1215 resultCode = sqlite3_bind_int(statementHandle, 20, eventDurationSeconds);
1217 if (resultCode != 0){
1218 addResult.addEventResult = CDSENTRY_FAILED;
1222 resultCode = sqlite3_step(statementHandle);
1224 if (resultCode != SQLITE_DONE){
1225 addResult.addEventResult = CDSENTRY_FAILED;
1229 addResult.calendarEntryID = sqlite3_last_insert_rowid(db);
1230 addResult.addEventResult = CDSENTRY_OK;
1236 CDSGetCalendarEntryInfo CalendarDataStorage::GetEvent(int calendarEntryID)
1239 CDSGetCalendarEntryInfo entryResult;
1241 // Check if the calendar entry exists.
1245 sqlite3_stmt *findHandle;
1246 sqlite3_stmt *statementHandle;
1248 resultCode = sqlite3_prepare_v2(db, "SELECT id FROM calendarentries WHERE id=(?1);", -1, &findHandle, nullptr);
1250 if (resultCode != 0){
1251 entryResult.getEventResult = CDSENTRY_FAILED;
1255 resultCode = sqlite3_bind_int(findHandle, 1, calendarEntryID);
1257 if (resultCode != 0){
1258 entryResult.getEventResult = CDSENTRY_FAILED;
1262 resultCode = sqlite3_step(findHandle);
1264 if (resultCode == SQLITE_ROW){
1266 } else if (resultCode == SQLITE_DONE) {
1267 entryResult.getEventResult = CDSENTRY_NOENTRY;
1270 entryResult.getEventResult = CDSENTRY_FAILED;
1274 // Get the calendar entry data.
1276 std::string sqlParameter = "SELECT entryname, entrydescription,"
1277 " entrystartyear, entrystartmonth, entrystartday, entrystarthour, entrystartminute, entrystartsecond,"
1278 " entryendyear, entryendmonth, entryendday, entryendhour, entryendminute, entryendsecond, "
1279 " entrydurationweek, entrydurationday, entrydurationhour, entrydurationminute, entrydurationsecond "
1280 " FROM calendarentries WHERE id=(?1)";
1282 resultCode = sqlite3_prepare_v2(db, sqlParameter.c_str(), -1, &statementHandle, nullptr);
1284 if (resultCode != 0){
1285 entryResult.getEventResult = CDSENTRY_FAILED;
1289 resultCode = sqlite3_bind_int(statementHandle, 1, calendarEntryID);
1291 if (resultCode != 0){
1292 entryResult.getEventResult = CDSENTRY_FAILED;
1296 resultCode = sqlite3_step(statementHandle);
1298 if (resultCode == SQLITE_ROW){
1300 // Get the calendar entry name,
1302 stringstream entryStream;
1304 entryStream << sqlite3_column_text(statementHandle, 0);
1305 entryResult.entryName = entryStream.str();
1307 entryStream.str("");
1309 // Get the calendar entry description.
1311 entryStream << sqlite3_column_text(statementHandle, 1);
1312 entryResult.entryDescription = entryStream.str();
1314 entryStream.str("");
1316 entryResult.entryStartYear = sqlite3_column_int(statementHandle, 2);
1317 entryResult.entryStartMonth = sqlite3_column_int(statementHandle, 3);
1318 entryResult.entryStartDay = sqlite3_column_int(statementHandle, 4);
1319 entryResult.entryStartHour = sqlite3_column_int(statementHandle, 5);
1320 entryResult.entryStartMinute = sqlite3_column_int(statementHandle, 6);
1321 entryResult.entryStartSecond = sqlite3_column_int(statementHandle, 7);
1322 entryResult.entryEndYear = sqlite3_column_int(statementHandle, 8);
1323 entryResult.entryEndMonth = sqlite3_column_int(statementHandle, 9);
1324 entryResult.entryEndDay = sqlite3_column_int(statementHandle, 10);
1325 entryResult.entryEndHour = sqlite3_column_int(statementHandle, 11);
1326 entryResult.entryEndMinute = sqlite3_column_int(statementHandle, 12);
1327 entryResult.entryEndSecond = sqlite3_column_int(statementHandle, 13);
1328 entryResult.entryDurationWeeks = sqlite3_column_int(statementHandle, 14);
1329 entryResult.entryDurationDays = sqlite3_column_int(statementHandle, 15);
1330 entryResult.entryDurationHours = sqlite3_column_int(statementHandle, 16);
1331 entryResult.entryDurationMinutes = sqlite3_column_int(statementHandle, 17);
1332 entryResult.entryDurationSeconds = sqlite3_column_int(statementHandle, 18);
1334 } else if (resultCode == SQLITE_DONE) {
1335 entryResult.getEventResult = CDSENTRY_NOCALENDAR;
1338 entryResult.getEventResult = CDSENTRY_FAILED;
1342 entryResult.getEventResult = CDSENTRY_OK;
1348 CDSEntryResult CalendarDataStorage::DeleteEvent(int calendarEntryID)
1351 CDSEntryResult deleteResult = CDSENTRY_UNITTESTFAIL;
1353 // Check if the calendar entry exists.
1357 sqlite3_stmt *findHandle;
1358 sqlite3_stmt *statementHandle;
1360 resultCode = sqlite3_prepare_v2(db, "SELECT id FROM calendarentries WHERE id=(?1);", -1, &findHandle, nullptr);
1362 if (resultCode != 0){
1363 return CDSENTRY_FAILED;
1366 resultCode = sqlite3_bind_int(findHandle, 1, calendarEntryID);
1368 if (resultCode != 0){
1369 return CDSENTRY_FAILED;
1372 resultCode = sqlite3_step(findHandle);
1374 if (resultCode == SQLITE_ROW){
1376 } else if (resultCode == SQLITE_DONE) {
1377 return CDSENTRY_NOENTRY;
1379 return CDSENTRY_FAILED;
1382 // Delete the account.
1384 resultCode = sqlite3_prepare_v2(db, "DELETE FROM calendarentries WHERE id=(?1);", -1, &statementHandle, nullptr);
1386 if (resultCode != 0){
1387 return CDSENTRY_FAILED;
1390 resultCode = sqlite3_bind_int(statementHandle, 1, calendarEntryID);
1392 if (resultCode != 0){
1393 return CDSENTRY_FAILED;
1396 resultCode = sqlite3_step(statementHandle);
1398 if (resultCode == SQLITE_DONE){
1399 deleteResult = CDSENTRY_OK;
1401 return CDSENTRY_FAILED;
1404 return deleteResult;
1408 CDSEntryList CalendarDataStorage::GetEventList(int calendarID){
1410 CDSEntryList entryList;
1411 entryList.getEventListResult = CDSENTRY_UNITTESTFAIL;
1413 // Check if calendar exists first.
1417 sqlite3_stmt *findHandle;
1418 sqlite3_stmt *calendarHandle;
1420 resultCode = sqlite3_prepare_v2(db, "SELECT id from calendars WHERE id=(?1);", -1, &findHandle, nullptr);
1422 if (resultCode != 0){
1423 entryList.getEventListResult = CDSENTRY_FAILED;
1427 resultCode = sqlite3_bind_int(findHandle, 1, calendarID);
1429 if (resultCode != 0){
1430 entryList.getEventListResult = CDSENTRY_FAILED;
1434 resultCode = sqlite3_step(findHandle);
1436 if (resultCode == SQLITE_ROW){
1438 } else if (resultCode == SQLITE_DONE) {
1439 entryList.getEventListResult = CDSENTRY_NOCALENDAR;
1442 entryList.getEventListResult = CDSENTRY_FAILED;
1446 // Get the list of entry IDs.
1448 resultCode = sqlite3_prepare_v2(db, "SELECT id FROM calendarentries WHERE calendarid=(?1);", -1, &calendarHandle, nullptr);
1450 if (resultCode != 0){
1451 entryList.getEventListResult = CDSENTRY_FAILED;
1455 resultCode = sqlite3_bind_int(calendarHandle, 1, calendarID);
1457 if (resultCode != 0){
1458 entryList.getEventListResult = CDSENTRY_FAILED;
1462 resultCode = sqlite3_step(calendarHandle);
1464 if (resultCode == SQLITE_DONE || resultCode == SQLITE_ROW){
1466 entryList.getEventListResult = CDSENTRY_FAILED;
1470 while (resultCode == SQLITE_ROW){
1472 int calendarID = sqlite3_column_int(calendarHandle, 0);
1474 entryList.entryList.push_back(calendarID);
1476 resultCode = sqlite3_step(calendarHandle);
1480 entryList.getEventListResult = CDSENTRY_OK;
1486 CDSCalendarList CalendarDataStorage::GetCalendarList(int accountID){
1488 CDSCalendarList calendarList;
1489 calendarList.getCalendarListResult = CDSCALENDAR_UNITTESTFAIL;
1491 // Check if calendar exists first.
1495 sqlite3_stmt *findHandle;
1496 sqlite3_stmt *calendarHandle;
1498 resultCode = sqlite3_prepare_v2(db, "SELECT id from accounts WHERE id=(?1);", -1, &findHandle, nullptr);
1500 if (resultCode != 0){
1501 calendarList.getCalendarListResult = CDSCALENDAR_FAILED;
1502 return calendarList;
1505 resultCode = sqlite3_bind_int(findHandle, 1, accountID);
1507 if (resultCode != 0){
1508 calendarList.getCalendarListResult = CDSCALENDAR_FAILED;
1509 return calendarList;
1512 resultCode = sqlite3_step(findHandle);
1514 if (resultCode == SQLITE_ROW){
1516 } else if (resultCode == SQLITE_DONE) {
1517 calendarList.getCalendarListResult = CDSCALENDAR_NOCALENDAR;
1518 return calendarList;
1520 calendarList.getCalendarListResult = CDSCALENDAR_FAILED;
1521 return calendarList;
1524 // Get the list of entry IDs.
1526 resultCode = sqlite3_prepare_v2(db, "SELECT id, calendarid FROM calendars WHERE accountid=(?1);", -1, &calendarHandle, nullptr);
1528 if (resultCode != 0){
1529 calendarList.getCalendarListResult = CDSCALENDAR_FAILED;
1530 return calendarList;
1533 resultCode = sqlite3_bind_int(calendarHandle, 1, accountID);
1535 if (resultCode != 0){
1536 calendarList.getCalendarListResult = CDSCALENDAR_FAILED;
1537 return calendarList;
1540 resultCode = sqlite3_step(calendarHandle);
1542 if (resultCode == SQLITE_DONE || resultCode == SQLITE_ROW){
1544 calendarList.getCalendarListResult = CDSCALENDAR_FAILED;
1545 return calendarList;
1548 while (resultCode == SQLITE_ROW){
1550 int calendarID = sqlite3_column_int(calendarHandle, 0);
1552 stringstream calendarStream;
1554 calendarStream << sqlite3_column_text(calendarHandle, 1);
1556 calendarList.calendarList.push_back(calendarID);
1557 calendarList.calendarListTextID.push_back(calendarStream.str());
1559 calendarStream.str("");
1561 resultCode = sqlite3_step(calendarHandle);
1565 calendarList.getCalendarListResult = CDSCALENDAR_OK;
1567 return calendarList;