mirror of
https://github.com/Nheko-Reborn/nheko.git
synced 2024-11-29 14:18:49 +03:00
Add db migration that clears the cache
This fixes spaces or stickers not showing up for old databases as well as the wrong format of the state_keys db.
This commit is contained in:
parent
c7dc9fb17a
commit
63998a217a
2 changed files with 47 additions and 10 deletions
|
@ -35,7 +35,7 @@
|
||||||
|
|
||||||
//! Should be changed when a breaking change occurs in the cache format.
|
//! Should be changed when a breaking change occurs in the cache format.
|
||||||
//! This will reset client's data.
|
//! This will reset client's data.
|
||||||
static const std::string CURRENT_CACHE_FORMAT_VERSION("2020.10.20");
|
static const std::string CURRENT_CACHE_FORMAT_VERSION("2021.08.22");
|
||||||
static const std::string SECRET("secret");
|
static const std::string SECRET("secret");
|
||||||
|
|
||||||
//! Keys used for the DB
|
//! Keys used for the DB
|
||||||
|
@ -891,12 +891,6 @@ Cache::setNextBatchToken(lmdb::txn &txn, const std::string &token)
|
||||||
syncStateDb_.put(txn, NEXT_BATCH_KEY, token);
|
syncStateDb_.put(txn, NEXT_BATCH_KEY, token);
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
|
||||||
Cache::setNextBatchToken(lmdb::txn &txn, const QString &token)
|
|
||||||
{
|
|
||||||
setNextBatchToken(txn, token.toStdString());
|
|
||||||
}
|
|
||||||
|
|
||||||
bool
|
bool
|
||||||
Cache::isInitialized()
|
Cache::isInitialized()
|
||||||
{
|
{
|
||||||
|
@ -1137,6 +1131,51 @@ Cache::runMigrations()
|
||||||
nhlog::db()->info("Successfully migrated olm sessions.");
|
nhlog::db()->info("Successfully migrated olm sessions.");
|
||||||
return true;
|
return true;
|
||||||
}},
|
}},
|
||||||
|
{"2021.08.22",
|
||||||
|
[this]() {
|
||||||
|
try {
|
||||||
|
auto txn = lmdb::txn::begin(env_, nullptr);
|
||||||
|
auto try_drop = [this, &txn](const std::string &dbName) {
|
||||||
|
try {
|
||||||
|
auto db = lmdb::dbi::open(txn, dbName.c_str());
|
||||||
|
db.drop(txn, true);
|
||||||
|
} catch (std::exception &e) {
|
||||||
|
nhlog::db()->warning(
|
||||||
|
"Failed to drop '{}': {}", dbName, e.what());
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
auto room_ids = getRoomIds(txn);
|
||||||
|
|
||||||
|
for (const auto &room : room_ids) {
|
||||||
|
try_drop(room + "/state");
|
||||||
|
try_drop(room + "/state_by_key");
|
||||||
|
try_drop(room + "/account_data");
|
||||||
|
try_drop(room + "/members");
|
||||||
|
try_drop(room + "/mentions");
|
||||||
|
try_drop(room + "/events");
|
||||||
|
try_drop(room + "/event_order");
|
||||||
|
try_drop(room + "/event2order");
|
||||||
|
try_drop(room + "/msg2order");
|
||||||
|
try_drop(room + "/order2msg");
|
||||||
|
try_drop(room + "/pending");
|
||||||
|
try_drop(room + "/related");
|
||||||
|
}
|
||||||
|
|
||||||
|
// clear db, don't delete
|
||||||
|
roomsDb_.drop(txn, false);
|
||||||
|
setNextBatchToken(txn, "");
|
||||||
|
|
||||||
|
txn.commit();
|
||||||
|
} catch (const lmdb::error &) {
|
||||||
|
nhlog::db()->critical("Failed to clear cache!");
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
nhlog::db()->info(
|
||||||
|
"Successfully cleared the cache. Will do a clean sync after startup.");
|
||||||
|
return true;
|
||||||
|
}},
|
||||||
};
|
};
|
||||||
|
|
||||||
nhlog::db()->info("Running migrations, this may take a while!");
|
nhlog::db()->info("Running migrations, this may take a while!");
|
||||||
|
@ -3230,8 +3269,7 @@ Cache::isNotificationSent(const std::string &event_id)
|
||||||
std::vector<std::string>
|
std::vector<std::string>
|
||||||
Cache::getRoomIds(lmdb::txn &txn)
|
Cache::getRoomIds(lmdb::txn &txn)
|
||||||
{
|
{
|
||||||
auto db = lmdb::dbi::open(txn, ROOMS_DB, MDB_CREATE);
|
auto cursor = lmdb::cursor::open(txn, roomsDb_);
|
||||||
auto cursor = lmdb::cursor::open(txn, db);
|
|
||||||
|
|
||||||
std::vector<std::string> rooms;
|
std::vector<std::string> rooms;
|
||||||
|
|
||||||
|
|
|
@ -692,7 +692,6 @@ private:
|
||||||
std::optional<UserKeyCache> userKeys_(const std::string &user_id, lmdb::txn &txn);
|
std::optional<UserKeyCache> userKeys_(const std::string &user_id, lmdb::txn &txn);
|
||||||
|
|
||||||
void setNextBatchToken(lmdb::txn &txn, const std::string &token);
|
void setNextBatchToken(lmdb::txn &txn, const std::string &token);
|
||||||
void setNextBatchToken(lmdb::txn &txn, const QString &token);
|
|
||||||
|
|
||||||
lmdb::env env_;
|
lmdb::env env_;
|
||||||
lmdb::dbi syncStateDb_;
|
lmdb::dbi syncStateDb_;
|
||||||
|
|
Loading…
Reference in a new issue