diff --git a/src/Cache.cpp b/src/Cache.cpp index 7e25fed2..6b3067db 100644 --- a/src/Cache.cpp +++ b/src/Cache.cpp @@ -169,13 +169,35 @@ Cache::setup() nhlog::db()->debug("setting up cache"); + // Previous location of the cache directory + auto oldCache = QString("%1/%2%3") + .arg(QStandardPaths::writableLocation(QStandardPaths::CacheLocation)) + .arg(QString::fromUtf8(localUserId_.toUtf8().toHex())) + .arg(QString::fromUtf8(settings->profile().toUtf8().toHex())); + cacheDirectory_ = QString("%1/%2%3") - .arg(QStandardPaths::writableLocation(QStandardPaths::CacheLocation)) + .arg(QStandardPaths::writableLocation(QStandardPaths::AppDataLocation)) .arg(QString::fromUtf8(localUserId_.toUtf8().toHex())) .arg(QString::fromUtf8(settings->profile().toUtf8().toHex())); 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()); + } + nhlog::db()->info("completed state migration"); + } + env_ = lmdb::env::create(); env_.set_mapsize(DB_SIZE); env_.set_max_dbs(MAX_DBS); diff --git a/src/main.cpp b/src/main.cpp index b1dfa9f6..a890a6fd 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -93,9 +93,9 @@ screenCenter(int width, int height) } void -createCacheDirectory() +createStandardDirectory(QStandardPaths::StandardLocation path) { - auto dir = QStandardPaths::writableLocation(QStandardPaths::CacheLocation); + auto dir = QStandardPaths::writableLocation(path); if (!QDir().mkpath(dir)) { throw std::runtime_error( @@ -188,7 +188,8 @@ main(int argc, char *argv[]) http::init(); - createCacheDirectory(); + createStandardDirectory(QStandardPaths::CacheLocation); + createStandardDirectory(QStandardPaths::AppDataLocation); registerSignalHandlers();