From 8e804ff48d28c3bb74f0d732a50023556ed14309 Mon Sep 17 00:00:00 2001 From: Jason Volk Date: Tue, 22 May 2018 02:58:21 -0700 Subject: [PATCH] modules/m_room: Add head rebuilder w/ console cmd. --- modules/console.cc | 33 +++++++++++++++++++++++++++++++++ modules/m_room.cc | 39 +++++++++++++++++++++++++++++++++++++++ 2 files changed, 72 insertions(+) diff --git a/modules/console.cc b/modules/console.cc index 0e7a78106..5b7e93f64 100644 --- a/modules/console.cc +++ b/modules/console.cc @@ -3090,6 +3090,39 @@ console_cmd__room__head(opt &out, const string_view &line) return true; } +bool +console_cmd__room__head__rebuild(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 m::import head__rebuild + { + "m_room", "head__rebuild" + }; + + const size_t count + { + head__rebuild(room) + }; + + out << "done " << count << std::endl; + return true; +} + bool console_cmd__room__depth(opt &out, const string_view &line) { diff --git a/modules/m_room.cc b/modules/m_room.cc index a2349aeb5..517526b53 100644 --- a/modules/m_room.cc +++ b/modules/m_room.cc @@ -141,3 +141,42 @@ state__rebuild_history(const m::room &room) txn(); return ret; } + +extern "C" size_t +head__rebuild(const m::room &room) +{ + size_t ret{0}; + const m::room::state state{room}; + const auto create_id + { + state.get("m.room.create") + }; + + m::room::messages it + { + room, create_id + }; + + if(!it) + return ret; + + db::txn txn + { + *m::dbs::events + }; + + m::dbs::write_opts opts; + opts.op = db::op::SET; + opts.head = true; + opts.refs = true; + for(; it; ++it) + { + const m::event &event{*it}; + opts.event_idx = it.event_idx(); + m::dbs::_index__room_head(txn, event, opts); + ++ret; + } + + txn(); + return ret; +}