0
0
Fork 0
mirror of https://github.com/matrix-construct/construct synced 2024-06-28 14:58:20 +02:00

ircd:Ⓜ️:dbs: Add a reverse reference for previous state in event refs index.

This commit is contained in:
Jason Volk 2019-03-11 14:44:43 -07:00
parent 06c548699a
commit 3444bed245
2 changed files with 37 additions and 11 deletions

View file

@ -148,6 +148,7 @@ enum class ircd::m::dbs::ref
PREV = 0x00,
AUTH = 0x01,
STATE = 0x02,
PREV_STATE = 0x04,
// m.receipt
M_RECEIPT__M_READ = 0x10,

View file

@ -355,7 +355,8 @@ ircd::m::dbs::_index_event_refs(db::txn &txn,
if(opts.event_refs.test(uint(ref::AUTH)))
_index_event_refs_auth(txn, event, opts);
if(opts.event_refs.test(uint(ref::STATE)))
if(opts.event_refs.test(uint(ref::STATE)) ||
opts.event_refs.test(uint(ref::PREV_STATE)))
_index_event_refs_state(txn, event, opts);
if(opts.event_refs.test(uint(ref::M_RECEIPT__M_READ)))
@ -455,7 +456,8 @@ ircd::m::dbs::_index_event_refs_state(db::txn &txn,
const event &event,
const write_opts &opts)
{
assert(opts.event_refs.test(uint(ref::STATE)));
assert(opts.event_refs.test(uint(ref::STATE)) ||
opts.event_refs.test(uint(ref::PREV_STATE)));
if(!json::get<"room_id"_>(event))
return;
@ -483,18 +485,38 @@ ircd::m::dbs::_index_event_refs_state(db::txn &txn,
thread_local char buf[EVENT_REFS_KEY_MAX_SIZE];
assert(opts.event_idx != 0 && prev_state_idx != 0);
const string_view &key
{
event_refs_key(buf, prev_state_idx, ref::STATE, opts.event_idx)
};
db::txn::append
if(opts.event_refs.test(uint(ref::STATE)))
{
txn, dbs::event_refs,
const string_view &key
{
opts.op, key, string_view{}
}
};
event_refs_key(buf, prev_state_idx, ref::STATE, opts.event_idx)
};
db::txn::append
{
txn, dbs::event_refs,
{
opts.op, key, string_view{}
}
};
}
if(opts.event_refs.test(uint(ref::PREV_STATE)))
{
const string_view &key
{
event_refs_key(buf, opts.event_idx, ref::PREV_STATE, prev_state_idx)
};
db::txn::append
{
txn, dbs::event_refs,
{
opts.op, key, string_view{}
}
};
}
}
void
@ -1314,6 +1336,9 @@ ircd::m::dbs::reflect(const ref &type)
case ref::STATE:
return "STATE";
case ref::PREV_STATE:
return "PREV_STATE";
case ref::M_RECEIPT__M_READ:
return "M_RECEIPT__M_READ";