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