diff --git a/src/Cache.cpp b/src/Cache.cpp index 5d87f9f2..41b84e11 100644 --- a/src/Cache.cpp +++ b/src/Cache.cpp @@ -1669,7 +1669,7 @@ Cache::calculateRoomReadStatus(const std::string &room_id) } void -Cache::updateState(const std::string &room, const mtx::responses::StateEvents &state) +Cache::updateState(const std::string &room, const mtx::responses::StateEvents &state, bool wipe) { auto txn = lmdb::txn::begin(env_); auto statesdb = getStatesDb(txn, room); @@ -1677,6 +1677,12 @@ Cache::updateState(const std::string &room, const mtx::responses::StateEvents &s auto membersdb = getMembersDb(txn, room); auto eventsDb = getEventsDb(txn, room); + if (wipe) { + membersdb.drop(txn); + statesdb.drop(txn); + stateskeydb.drop(txn); + } + saveStateEvents(txn, statesdb, stateskeydb, membersdb, eventsDb, room, state.events); RoomInfo updatedInfo; diff --git a/src/Cache_p.h b/src/Cache_p.h index 6712e48e..40ce6e5c 100644 --- a/src/Cache_p.h +++ b/src/Cache_p.h @@ -118,7 +118,9 @@ public: std::size_t len = 30); size_t memberCount(const std::string &room_id); - void updateState(const std::string &room, const mtx::responses::StateEvents &state); + void updateState(const std::string &room, + const mtx::responses::StateEvents &state, + bool wipe = false); void saveState(const mtx::responses::Sync &res); bool isInitialized(); bool isDatabaseReady() { return databaseReady_ && isInitialized(); } diff --git a/src/timeline/TimelineModel.cpp b/src/timeline/TimelineModel.cpp index 62dbdae6..46f8e57c 100644 --- a/src/timeline/TimelineModel.cpp +++ b/src/timeline/TimelineModel.cpp @@ -496,7 +496,7 @@ TimelineModel::TimelineModel(TimelineViewManager *manager, QString room_id, QObj showEventTimer.callOnTimeout(this, &TimelineModel::scrollTimerEvent); connect(this, &TimelineModel::newState, this, [this](mtx::responses::StateEvents events_) { - cache::client()->updateState(room_id_.toStdString(), events_); + cache::client()->updateState(room_id_.toStdString(), events_, true); this->syncState({std::move(events_.events)}); }); }