From 5b0af2f5090155f0f632b9971da2af2d056660f1 Mon Sep 17 00:00:00 2001 From: Jason Volk Date: Tue, 13 Nov 2018 17:33:18 -0800 Subject: [PATCH] modules/m_room: Add utility to clear the state root entries for all room events. --- modules/console.cc | 33 +++++++++++++++++++++++++++++++ modules/m_room.cc | 49 ++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 82 insertions(+) diff --git a/modules/console.cc b/modules/console.cc index f39cecea2..7edc540dc 100644 --- a/modules/console.cc +++ b/modules/console.cc @@ -6419,6 +6419,39 @@ console_cmd__room__state__rebuild__history(opt &out, const string_view &line) return true; } +bool +console_cmd__room__state__history__clear(opt &out, const string_view &line) +{ + const params param{line, " ", + { + "room_id" + }}; + + const auto &room_id + { + m::room_id(param.at(0)) + }; + + const m::room room + { + room_id + }; + + using prototype = size_t (const m::room &); + static mods::import state__clear_history + { + "m_room", "state__clear_history" + }; + + const size_t count + { + state__clear_history(room) + }; + + out << "done " << count << std::endl; + return true; +} + bool console_cmd__room__state__prefetch(opt &out, const string_view &line) { diff --git a/modules/m_room.cc b/modules/m_room.cc index 114d6c697..f8c6200dc 100644 --- a/modules/m_room.cc +++ b/modules/m_room.cc @@ -467,6 +467,55 @@ state__rebuild_history(const m::room &room) return ret; } +//TODO: state btree. +extern "C" size_t +state__clear_history(const m::room &room) +{ + static const db::gopts gopts + { + db::get::NO_CACHE + }; + + db::txn txn + { + *m::dbs::events + }; + + auto it + { + m::dbs::room_events.begin(room.room_id, gopts) + }; + + size_t ret{0}; + for(; it; ++it, ret++) + { + const auto pair + { + m::dbs::room_events_key(it->first) + }; + + const auto &depth{std::get<0>(pair)}; + const auto &event_idx{std::get<1>(pair)}; + thread_local char buf[m::dbs::ROOM_EVENTS_KEY_MAX_SIZE]; + const string_view key + { + m::dbs::room_events_key(buf, room.room_id, depth, event_idx) + }; + + db::txn::append + { + txn, m::dbs::room_events, + { + db::op::SET, + key + } + }; + } + + txn(); + return ret; +} + conf::item state__prefetch__yield_modulus {