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))