+}
+
+CDSChecksumResult CalendarDataStorage::AddChecksum(string checksumName, string checksumValue){
+
+ int resultCode;
+
+ // Check if the checksum already exists.
+
+ sqlite3_stmt *findHandle;
+ sqlite3_stmt *checksumHandle;
+
+ resultCode = sqlite3_prepare_v2(db, "SELECT checksumvalue from checksums WHERE checksumname=(?1);", -1, &findHandle, nullptr);
+
+ if (resultCode != 0){
+ return CDSCHECKSUM_FAILED;
+ }
+
+ resultCode = sqlite3_bind_text(findHandle, 1, checksumName.c_str(), -1, SQLITE_STATIC);
+
+ if (resultCode != 0){
+ return CDSCHECKSUM_FAILED;
+ }
+
+ resultCode = sqlite3_step(findHandle);
+
+ if (resultCode == SQLITE_ROW){
+ return CDSCHECKSUM_CHECKSUMALREADYEXISTS;
+ } else if (resultCode == SQLITE_DONE) {
+
+ } else {
+ return CDSCHECKSUM_FAILED;
+ }
+
+ // Add the checksum to the checksum table.
+
+ resultCode = sqlite3_prepare_v2(db, "INSERT INTO checksums (checksumname, checksumvalue) VALUES(?1, ?2);", -1, &checksumHandle, nullptr);
+
+ if (resultCode != 0){
+ return CDSCHECKSUM_FAILED;
+ }
+
+ resultCode = sqlite3_bind_text(checksumHandle, 1, checksumName.c_str(), -1, SQLITE_STATIC);
+
+ if (resultCode != 0){
+ return CDSCHECKSUM_FAILED;
+ }
+
+ resultCode = sqlite3_bind_text(checksumHandle, 2, checksumValue.c_str(), -1, SQLITE_STATIC);
+
+ if (resultCode != 0){
+ return CDSCHECKSUM_FAILED;
+ }
+
+ resultCode = sqlite3_step(checksumHandle);
+
+ if (resultCode != SQLITE_DONE){
+ return CDSCHECKSUM_FAILED;
+ }
+
+ return CDSCHECKSUM_OK;
+
+}
+
+CDSGetChecksumResult CalendarDataStorage::GetChecksum(string checksumName){
+
+ CDSGetChecksumResult getChecksumResult;
+
+ int resultCode;
+
+ // Check if the checksum already exists.
+
+ sqlite3_stmt *getHandle;
+
+ resultCode = sqlite3_prepare_v2(db, "SELECT checksumvalue from checksums WHERE checksumname=(?1);", -1, &getHandle, nullptr);
+
+ if (resultCode != 0){
+ getChecksumResult.getChecksumResult = CDSCHECKSUM_FAILED;
+ return getChecksumResult;
+ }
+
+ resultCode = sqlite3_bind_text(getHandle, 1, checksumName.c_str(), -1, SQLITE_STATIC);
+
+ if (resultCode != 0){
+ getChecksumResult.getChecksumResult = CDSCHECKSUM_FAILED;
+ return getChecksumResult;
+ }
+
+ resultCode = sqlite3_step(getHandle);
+
+ if (resultCode == SQLITE_ROW){
+ } else if (resultCode == SQLITE_DONE) {
+ getChecksumResult.getChecksumResult = CDSCHECKSUM_NOHASH;
+ return getChecksumResult;
+ } else {
+ getChecksumResult.getChecksumResult = CDSCHECKSUM_FAILED;
+ return getChecksumResult;
+ }
+
+ stringstream checksumStream;
+
+ checksumStream << sqlite3_column_text(getHandle, 0);
+
+ getChecksumResult.checksumValue = checksumStream.str();
+
+ getChecksumResult.getChecksumResult = CDSCHECKSUM_OK;
+
+ return getChecksumResult;
+
+}
+
+CDSChecksumResult CalendarDataStorage::UpdateChecksum(std::string checksumName, std::string checksumValue){
+
+ int resultCode;
+
+ // Check if the checksum already exists.
+
+ sqlite3_stmt *getHandle;
+ sqlite3_stmt *statementHandle;
+
+ resultCode = sqlite3_prepare_v2(db, "SELECT checksumvalue from checksums WHERE checksumname=(?1);", -1, &getHandle, nullptr);
+
+ if (resultCode != 0){
+ return CDSCHECKSUM_FAILED;
+ }
+
+ resultCode = sqlite3_bind_text(getHandle, 1, checksumName.c_str(), -1, SQLITE_STATIC);
+
+ if (resultCode != 0){
+ return CDSCHECKSUM_FAILED;
+ }
+
+ resultCode = sqlite3_step(getHandle);
+
+ if (resultCode == SQLITE_ROW){
+ } else if (resultCode == SQLITE_DONE) {
+ return CDSCHECKSUM_NOHASH;
+ } else {
+ return CDSCHECKSUM_FAILED;
+ }
+
+ // Update the checksum.
+
+ resultCode = sqlite3_prepare_v2(db, "UPDATE checksums SET checksumvalue=(?1) WHERE checksumname=(?2);", -1, &statementHandle, nullptr);
+
+ if (resultCode != 0){
+ return CDSCHECKSUM_FAILED;
+ }
+
+ resultCode = sqlite3_bind_text(statementHandle, 1, checksumValue.c_str(), -1, SQLITE_STATIC);
+
+ if (resultCode != 0){
+ return CDSCHECKSUM_FAILED;
+ }
+
+ resultCode = sqlite3_bind_text(statementHandle, 2, checksumName.c_str(), -1, SQLITE_STATIC);
+
+ if (resultCode != 0){
+ return CDSCHECKSUM_FAILED;
+ }
+
+ resultCode = sqlite3_step(statementHandle);
+
+ if (resultCode != SQLITE_DONE){
+ return CDSCHECKSUM_FAILED;
+ }
+
+ return CDSCHECKSUM_OK;
+