summary refs log tree commit diff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/Cache.cpp53
1 files changed, 39 insertions, 14 deletions
diff --git a/src/Cache.cpp b/src/Cache.cpp
index aae7acde..1b0a8df0 100644
--- a/src/Cache.cpp
+++ b/src/Cache.cpp
@@ -289,6 +289,17 @@ Cache::Cache(const QString &userId, QObject *parent)
     setup();
 }
 
+static QString
+cacheDirectoryName(const QString &userid, const QString &profile)
+{
+    QCryptographicHash hash(QCryptographicHash::Algorithm::Sha256);
+    hash.addData(userid.toUtf8());
+    hash.addData(profile.toUtf8());
+    return QStringLiteral("%1/db-%2")
+      .arg(QStandardPaths::writableLocation(QStandardPaths::AppDataLocation))
+      .arg(hash.result().toHex());
+}
+
 void
 Cache::setup()
 {
@@ -297,31 +308,45 @@ Cache::setup()
     nhlog::db()->debug("setting up cache");
 
     // Previous location of the cache directory
-    auto oldCache =
+    auto oldCache2 =
       QStringLiteral("%1/%2%3").arg(QStandardPaths::writableLocation(QStandardPaths::CacheLocation),
                                     QString::fromUtf8(localUserId_.toUtf8().toHex()),
                                     QString::fromUtf8(settings->profile().toUtf8().toHex()));
 
-    cacheDirectory_ = QStringLiteral("%1/%2%3").arg(
+    auto oldCache = QStringLiteral("%1/%2%3").arg(
       QStandardPaths::writableLocation(QStandardPaths::AppDataLocation),
       QString::fromUtf8(localUserId_.toUtf8().toHex()),
       QString::fromUtf8(settings->profile().toUtf8().toHex()));
 
+    cacheDirectory_ = cacheDirectoryName(localUserId_, settings->profile());
+
+    nhlog::db()->debug("Database at: {}", cacheDirectory_.toStdString());
+
     bool isInitial = !QFile::exists(cacheDirectory_);
 
     // NOTE: If both cache directories exist it's better to do nothing: it
     // could mean a previous migration failed or was interrupted.
-    bool needsMigration = isInitial && QFile::exists(oldCache);
-
-    if (needsMigration) {
-        nhlog::db()->info("found old state directory, migrating");
-        if (!QDir().rename(oldCache, cacheDirectory_)) {
-            throw std::runtime_error(("Unable to migrate the old state directory (" + oldCache +
-                                      ") to the new location (" + cacheDirectory_ + ")")
-                                       .toStdString()
-                                       .c_str());
+    if (isInitial) {
+        if (QFile::exists(oldCache)) {
+            nhlog::db()->info("found old state directory, migrating");
+            if (!QDir().rename(oldCache, cacheDirectory_)) {
+                throw std::runtime_error(("Unable to migrate the old state directory (" + oldCache +
+                                          ") to the new location (" + cacheDirectory_ + ")")
+                                           .toStdString()
+                                           .c_str());
+            }
+            nhlog::db()->info("completed state migration");
+        } else if (QFile::exists(oldCache2)) {
+            nhlog::db()->info("found very old state directory, migrating");
+            if (!QDir().rename(oldCache2, cacheDirectory_)) {
+                throw std::runtime_error(("Unable to migrate the very old state directory (" +
+                                          oldCache2 + ") to the new location (" + cacheDirectory_ +
+                                          ")")
+                                           .toStdString()
+                                           .c_str());
+            }
+            nhlog::db()->info("completed state migration");
         }
-        nhlog::db()->info("completed state migration");
     }
 
     auto openEnv = [](const QString &name) {
@@ -356,8 +381,8 @@ Cache::setup()
         env_ = openEnv(cacheDirectory_);
 
         if (needsCompact) {
-            auto compactDir  = QStringLiteral("%1-compacting").arg(cacheDirectory_);
-            auto toDeleteDir = QStringLiteral("%1-olddb").arg(cacheDirectory_);
+            auto compactDir  = cacheDirectory_ + "-compacting";
+            auto toDeleteDir = cacheDirectory_ + "-olddb";
             if (QFile::exists(cacheDirectory_))
                 QDir(compactDir).removeRecursively();
             if (QFile::exists(toDeleteDir))