From 79a29953dd92b9c025a8b9915aeb56d1d78e5607 Mon Sep 17 00:00:00 2001 From: Nicolas Werner Date: Sat, 4 Jul 2020 02:09:12 +0200 Subject: [PATCH] Persist event order --- src/Cache.cpp | 20 ++++++++++++++++++++ src/Cache_p.h | 6 ++++++ 2 files changed, 26 insertions(+) diff --git a/src/Cache.cpp b/src/Cache.cpp index 27f4e694..2824960b 100644 --- a/src/Cache.cpp +++ b/src/Cache.cpp @@ -1957,9 +1957,21 @@ Cache::saveTimelineMessages(lmdb::txn &txn, auto db = getMessagesDb(txn, room_id); auto eventsDb = getEventsDb(txn, room_id); + auto orderDb = getEventOrderDb(txn, room_id); + if (res.limited) + lmdb::dbi_drop(txn, orderDb, false); + using namespace mtx::events; using namespace mtx::events::state; + lmdb::val indexVal, val; + int64_t index = 0; + auto cursor = lmdb::cursor::open(txn, orderDb); + if (cursor.get(indexVal, val, MDB_LAST)) { + index = *indexVal.data(); + } + + bool first = true; for (const auto &e : res.events) { auto event = mtx::accessors::serialize_event(e); if (auto redaction = @@ -1982,6 +1994,14 @@ Cache::saveTimelineMessages(lmdb::txn &txn, eventsDb, lmdb::val(event["event_id"].get()), lmdb::val(event.dump())); + + ++index; + + lmdb::cursor_put(cursor.handle(), + lmdb::val(&index, sizeof(index)), + lmdb::val(first ? res.prev_batch : ""), + MDB_APPEND); + first = false; } } } diff --git a/src/Cache_p.h b/src/Cache_p.h index e657447b..5f01f736 100644 --- a/src/Cache_p.h +++ b/src/Cache_p.h @@ -416,6 +416,12 @@ private: return lmdb::dbi::open(txn, std::string(room_id + "/events").c_str(), MDB_CREATE); } + lmdb::dbi getEventOrderDb(lmdb::txn &txn, const std::string &room_id) + { + return lmdb::dbi::open( + txn, std::string(room_id + "/event_order").c_str(), MDB_CREATE | MDB_INTEGERKEY); + } + lmdb::dbi getInviteStatesDb(lmdb::txn &txn, const std::string &room_id) { return lmdb::dbi::open(