summary refs log tree commit diff
path: root/src/Cache.cpp
diff options
context:
space:
mode:
authorNicolas Werner <nicolas.werner@hotmail.de>2020-05-02 17:24:45 +0200
committerNicolas Werner <nicolas.werner@hotmail.de>2020-05-02 17:24:45 +0200
commitd6685e8d61baf7ac90daffa7457422daead55426 (patch)
treea9bfae6a1cd69ddde2c076e04b181c2adc1062fd /src/Cache.cpp
parentAdd support for db migrations (diff)
downloadnheko-d6685e8d61baf7ac90daffa7457422daead55426.tar.xz
Add delete pending_receipts migration
Diffstat (limited to '')
-rw-r--r--src/Cache.cpp43
1 files changed, 42 insertions, 1 deletions
diff --git a/src/Cache.cpp b/src/Cache.cpp
index 1a097cff..1ae7a846 100644
--- a/src/Cache.cpp
+++ b/src/Cache.cpp
@@ -36,7 +36,7 @@
 
 //! Should be changed when a breaking change occurs in the cache format.
 //! This will reset client's data.
-static const std::string CURRENT_CACHE_FORMAT_VERSION("2018.09.21");
+static const std::string CURRENT_CACHE_FORMAT_VERSION("2020.05.01");
 static const std::string SECRET("secret");
 
 static lmdb::val NEXT_BATCH_KEY("next_batch");
@@ -669,6 +669,47 @@ Cache::deleteData()
 bool
 Cache::runMigrations()
 {
+        auto txn = lmdb::txn::begin(env_, nullptr, MDB_RDONLY);
+
+        lmdb::val current_version;
+        bool res = lmdb::dbi_get(txn, syncStateDb_, CACHE_FORMAT_VERSION_KEY, current_version);
+
+        txn.commit();
+
+        if (!res)
+                return false;
+
+        std::string stored_version(current_version.data(), current_version.size());
+
+        std::vector<std::pair<std::string, std::function<bool()>>> migrations{
+          {"2020.05.01",
+           [this]() {
+                   try {
+                           auto txn = lmdb::txn::begin(env_, nullptr);
+                           auto pending_receipts =
+                             lmdb::dbi::open(txn, "pending_receipts", MDB_CREATE);
+                           lmdb::dbi_drop(txn, pending_receipts, true);
+                           txn.commit();
+                   } catch (const lmdb::error &) {
+                           nhlog::db()->critical(
+                             "Failed to delete pending_receipts database in migration!");
+                           return false;
+                   }
+
+                   nhlog::db()->info("Successfully deleted pending receipts database.");
+                   return true;
+           }},
+        };
+
+        for (const auto &[target_version, migration] : migrations) {
+                if (target_version > stored_version)
+                        if (!migration()) {
+                                nhlog::db()->critical("migration failure!");
+                                return false;
+                        }
+        }
+
+        setCurrentFormat();
         return true;
 }