0
0
Fork 0
mirror of https://github.com/matrix-construct/construct synced 2024-12-27 07:54:05 +01:00

ircd:Ⓜ️ Split events iterations into namespace.

This commit is contained in:
Jason Volk 2018-04-18 00:33:38 -07:00
parent 5a3f105afc
commit 7f3919dd17
6 changed files with 131 additions and 98 deletions

26
include/ircd/m/events.h Normal file
View file

@ -0,0 +1,26 @@
// Matrix Construct
//
// Copyright (C) Matrix Construct Developers, Authors & Contributors
// Copyright (C) 2016-2018 Jason Volk <jason@zemos.net>
//
// Permission to use, copy, modify, and/or distribute this software for any
// purpose with or without fee is hereby granted, provided that the above
// copyright notice and this permission notice is present in all copies. The
// full license for this software is available in the LICENSE file.
#pragma once
#define HAVE_IRCD_M_EVENTS_H
namespace ircd::m::events
{
using id_closure_bool = std::function<bool (const event::idx &, const event::id &)>;
using closure_bool = std::function<bool (const event::idx &, const event &)>;
// counts up from start
bool for_each(const uint64_t &start, const id_closure_bool &);
bool for_each(const uint64_t &start, const closure_bool &);
// -1 starts at newest event; counts down
bool rfor_each(const uint64_t &start, const id_closure_bool &);
bool rfor_each(const uint64_t &start, const closure_bool &);
}

View file

@ -61,6 +61,7 @@ namespace ircd
#include "room.h" #include "room.h"
#include "user.h" #include "user.h"
#include "rooms.h" #include "rooms.h"
#include "events.h"
#include "node.h" #include "node.h"
#include "login.h" #include "login.h"
#include "register.h" #include "register.h"

View file

@ -922,6 +922,104 @@ ircd::m::node::room::room(const m::node &node)
static_cast<m::room &>(*this) = room_id; static_cast<m::room &>(*this) = room_id;
} }
///////////////////////////////////////////////////////////////////////////////
//
// m/events.h
//
bool
ircd::m::events::rfor_each(const uint64_t &start,
const closure_bool &closure)
{
event::fetch event;
return rfor_each(start, id_closure_bool{[&event, &closure]
(const event::idx &event_idx, const event::id &event_id)
{
if(!seek(event, event_idx, std::nothrow))
return true;
return closure(event_idx, event);
}});
}
bool
ircd::m::events::rfor_each(const uint64_t &start,
const id_closure_bool &closure)
{
static constexpr auto column_idx
{
json::indexof<event, "event_id"_>()
};
auto &column
{
dbs::event_column.at(column_idx)
};
if(start == uint64_t(-1))
{
for(auto it(column.rbegin()); it; ++it)
if(!closure(byte_view<event::idx>(it->first), it->second))
return false;
return true;
}
auto it
{
column.lower_bound(byte_view<string_view>(start))
};
for(; it; ++it)
if(!closure(byte_view<event::idx>(it->first), it->second))
return false;
return true;
}
bool
ircd::m::events::for_each(const uint64_t &start,
const closure_bool &closure)
{
event::fetch event;
return for_each(start, id_closure_bool{[&event, &closure]
(const event::idx &event_idx, const event::id &event_id)
{
if(!seek(event, event_idx, std::nothrow))
return true;
return closure(event_idx, event);
}});
}
bool
ircd::m::events::for_each(const uint64_t &start,
const id_closure_bool &closure)
{
static constexpr auto column_idx
{
json::indexof<event, "event_id"_>()
};
auto &column
{
dbs::event_column.at(column_idx)
};
auto it
{
start > 0?
column.lower_bound(byte_view<string_view>(start)):
column.begin()
};
for(; it; ++it)
if(!closure(byte_view<event::idx>(it->first), it->second))
return false;
return true;
}
/////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////
// //
// m/rooms.h // m/rooms.h

View file

@ -528,99 +528,6 @@ ircd::m::vm::write(eval &eval)
txn(); txn();
} }
bool
ircd::m::vm::events::rfor_each(const uint64_t &start,
const closure_bool &closure)
{
event::fetch event;
return rfor_each(start, id_closure_bool{[&event, &closure]
(const event::idx &event_idx, const event::id &event_id)
{
if(!seek(event, event_idx, std::nothrow))
return true;
return closure(event_idx, event);
}});
}
bool
ircd::m::vm::events::rfor_each(const uint64_t &start,
const id_closure_bool &closure)
{
static constexpr auto column_idx
{
json::indexof<event, "event_id"_>()
};
auto &column
{
dbs::event_column.at(column_idx)
};
if(start == uint64_t(-1))
{
for(auto it(column.rbegin()); it; ++it)
if(!closure(byte_view<event::idx>(it->first), it->second))
return false;
return true;
}
auto it
{
column.lower_bound(byte_view<string_view>(start))
};
for(; it; ++it)
if(!closure(byte_view<event::idx>(it->first), it->second))
return false;
return true;
}
bool
ircd::m::vm::events::for_each(const uint64_t &start,
const closure_bool &closure)
{
event::fetch event;
return for_each(start, id_closure_bool{[&event, &closure]
(const event::idx &event_idx, const event::id &event_id)
{
if(!seek(event, event_idx, std::nothrow))
return true;
return closure(event_idx, event);
}});
}
bool
ircd::m::vm::events::for_each(const uint64_t &start,
const id_closure_bool &closure)
{
static constexpr auto column_idx
{
json::indexof<event, "event_id"_>()
};
auto &column
{
dbs::event_column.at(column_idx)
};
auto it
{
start > 0?
column.lower_bound(byte_view<string_view>(start)):
column.begin()
};
for(; it; ++it)
if(!closure(byte_view<event::idx>(it->first), it->second))
return false;
return true;
}
const uint64_t & const uint64_t &
ircd::m::vm::sequence(const eval &eval) ircd::m::vm::sequence(const eval &eval)
{ {

View file

@ -187,7 +187,8 @@ try
std::map<std::string, std::vector<std::string>, std::less<>> r; std::map<std::string, std::vector<std::string>, std::less<>> r;
m::vm::events::for_each(since, [&] bool limited{false};
m::events::for_each(since, [&]
(const uint64_t &sequence, const m::event &event) (const uint64_t &sequence, const m::event &event)
{ {
if(!r.empty() && (since - _since > 128)) if(!r.empty() && (since - _since > 128))

View file

@ -1454,11 +1454,11 @@ console_cmd__key__fetch(opt &out, const string_view &line)
} }
// //
// vm // events
// //
bool bool
console_cmd__vm__events(opt &out, const string_view &line) console_cmd__events(opt &out, const string_view &line)
{ {
const params param{line, " ", const params param{line, " ",
{ {
@ -1475,7 +1475,7 @@ console_cmd__vm__events(opt &out, const string_view &line)
param.at<size_t>(1, 32) param.at<size_t>(1, 32)
}; };
m::vm::events::rfor_each(start, [&out, &limit] m::events::rfor_each(start, [&out, &limit]
(const uint64_t &seq, const m::event &event) (const uint64_t &seq, const m::event &event)
{ {
out << seq << " " << pretty_oneline(event) << std::endl;; out << seq << " " << pretty_oneline(event) << std::endl;;
@ -1568,7 +1568,7 @@ console_cmd__event__dump(opt &out, const string_view &line)
char *pos{data(buf)}; char *pos{data(buf)};
size_t foff{0}, ecount{0}, acount{0}, errcount{0}; size_t foff{0}, ecount{0}, acount{0}, errcount{0};
m::vm::events::for_each(0, [&](const uint64_t &seq, const m::event &event) m::events::for_each(0, [&](const uint64_t &seq, const m::event &event)
{ {
const auto remain const auto remain
{ {