diff --git a/src/Cache.cpp b/src/Cache.cpp
index 274b0840..3e72b7ad 100644
--- a/src/Cache.cpp
+++ b/src/Cache.cpp
@@ -1893,6 +1893,14 @@ Cache::saveState(const mtx::responses::Sync &res)
auto membersdb = getMembersDb(txn, room.first);
auto eventsDb = getEventsDb(txn, room.first);
+ // nhlog::db()->critical(
+ // "Saving events for room: {}, state {}, timeline {}, account {}, ephemeral {}",
+ // room.first,
+ // room.second.state.events.size(),
+ // room.second.timeline.events.size(),
+ // room.second.account_data.events.size(),
+ // room.second.ephemeral.events.size());
+
saveStateEvents(
txn, statesdb, stateskeydb, membersdb, eventsDb, room.first, room.second.state.events);
saveStateEvents(
@@ -1901,13 +1909,12 @@ Cache::saveState(const mtx::responses::Sync &res)
saveTimelineMessages(txn, eventsDb, room.first, room.second.timeline);
RoomInfo updatedInfo;
+ std::string_view originalRoomInfoDump;
{
// retrieve the old tags and modification ts
- std::string_view data;
- if (roomsDb_.get(txn, room.first, data)) {
+ if (roomsDb_.get(txn, room.first, originalRoomInfoDump)) {
try {
- RoomInfo tmp = nlohmann::json::parse(std::string_view(data.data(), data.size()))
- .get<RoomInfo>();
+ RoomInfo tmp = nlohmann::json::parse(originalRoomInfoDump).get<RoomInfo>();
updatedInfo.tags = std::move(tmp.tags);
updatedInfo.approximate_last_modification_ts =
@@ -1915,7 +1922,7 @@ Cache::saveState(const mtx::responses::Sync &res)
} catch (const nlohmann::json::exception &e) {
nhlog::db()->warn("failed to parse room info: room_id ({}), {}: {}",
room.first,
- std::string(data.data(), data.size()),
+ originalRoomInfoDump,
e.what());
}
}
@@ -2004,7 +2011,12 @@ Cache::saveState(const mtx::responses::Sync &res)
std::visit([](const auto &e) -> uint64_t { return e.origin_server_ts; }, e);
}
- roomsDb_.put(txn, room.first, nlohmann::json(updatedInfo).dump());
+ if (auto newRoomInfoDump = nlohmann::json(updatedInfo).dump();
+ newRoomInfoDump != originalRoomInfoDump) {
+ nhlog::db()->critical(
+ "Writing out new room info:\n{}\n{}", originalRoomInfoDump, newRoomInfoDump);
+ roomsDb_.put(txn, room.first, newRoomInfoDump);
+ }
for (const auto &e : room.second.ephemeral.events) {
if (auto receiptsEv =
@@ -2135,7 +2147,20 @@ Cache::savePresence(
const std::vector<mtx::events::Event<mtx::events::presence::Presence>> &presenceUpdates)
{
for (const auto &update : presenceUpdates) {
- presenceDb_.put(txn, update.sender, nlohmann::json(update.content).dump());
+ auto toWrite = nlohmann::json(update.content);
+ // Nheko currently doesn't use those and it causes lots of db writes :)
+ toWrite.erase("currently_active");
+ toWrite.erase("last_active_ago");
+ auto toWriteStr = toWrite.dump();
+
+ std::string_view oldPresenceVal;
+
+ presenceDb_.get(txn, update.sender, oldPresenceVal);
+ if (oldPresenceVal != toWriteStr) {
+ // nhlog::db()->critical(
+ // "Presence update for {}: {} -> {}", update.sender, oldPresenceVal, toWriteStr);
+ presenceDb_.put(txn, update.sender, toWriteStr);
+ }
}
}
|