mirror of
https://github.com/matrix-construct/construct
synced 2024-09-29 04:08:54 +02:00
ircd::db: Fix issues with txn interface.
This commit is contained in:
parent
cae6964fa5
commit
e009d6763e
3 changed files with 81 additions and 86 deletions
|
@ -15,8 +15,7 @@ namespace ircd::db
|
|||
{
|
||||
struct txn;
|
||||
|
||||
bool test(const txn &, const std::function<bool (const delta &)> &);
|
||||
bool until(const txn &, const std::function<bool (const delta &)> &);
|
||||
bool for_each(const txn &, const std::function<bool (const delta &)> &);
|
||||
void for_each(const txn &, const std::function<void (const delta &)> &);
|
||||
std::string debug(const txn &);
|
||||
|
||||
|
@ -38,17 +37,21 @@ struct ircd::db::txn
|
|||
struct append;
|
||||
struct handler;
|
||||
|
||||
using delta_closure = std::function<void (const delta &)>;
|
||||
using delta_closure_bool = std::function<bool (const delta &)>;
|
||||
using value_closure = std::function<void (const string_view &)>;
|
||||
|
||||
explicit operator const rocksdb::WriteBatch &() const;
|
||||
explicit operator const database &() const;
|
||||
explicit operator rocksdb::WriteBatch &();
|
||||
explicit operator database &();
|
||||
|
||||
string_view get(const op &, const string_view &col, const string_view &key) const;
|
||||
string_view at(const op &, const string_view &col, const string_view &key) const;
|
||||
bool get(const op &, const string_view &col, const string_view &key, const value_closure &) const;
|
||||
void at(const op &, const string_view &col, const string_view &key, const value_closure &) const;
|
||||
bool has(const op &, const string_view &col, const string_view &key) const;
|
||||
|
||||
delta get(const op &, const string_view &col) const;
|
||||
delta at(const op &, const string_view &col) const;
|
||||
bool get(const op &, const string_view &col, const delta_closure &) const;
|
||||
void at(const op &, const string_view &col, const delta_closure &) const;
|
||||
bool has(const op &, const string_view &col) const;
|
||||
bool has(const op &) const;
|
||||
|
||||
|
|
129
ircd/db.cc
129
ircd/db.cc
|
@ -2581,11 +2581,8 @@ ircd::db::for_each(const txn &t,
|
|||
wb.Iterate(&h);
|
||||
}
|
||||
|
||||
/// Iterate the txn using the "until protocol"
|
||||
/// reminder: the closure remains-true-until-the-end; false to break;
|
||||
/// returns true if the end reached; false if broken early
|
||||
bool
|
||||
ircd::db::until(const txn &t,
|
||||
ircd::db::for_each(const txn &t,
|
||||
const std::function<bool (const delta &)> &closure)
|
||||
{
|
||||
const database &d(t);
|
||||
|
@ -2595,20 +2592,6 @@ ircd::db::until(const txn &t,
|
|||
return h._continue;
|
||||
}
|
||||
|
||||
/// Iterate the txn using the "test protocol"
|
||||
/// reminder: the closure returns true to break, false to continue;
|
||||
/// returns true if broken early, false if the end reached.
|
||||
bool
|
||||
ircd::db::test(const txn &t,
|
||||
const std::function<bool (const delta &)> &closure)
|
||||
{
|
||||
return !until(t, [&closure]
|
||||
(const delta &delta)
|
||||
{
|
||||
return !closure(delta);
|
||||
});
|
||||
}
|
||||
|
||||
///
|
||||
/// handler (db/database/txn.h)
|
||||
///
|
||||
|
@ -2821,12 +2804,46 @@ ircd::db::txn::has(const op &op,
|
|||
const string_view &col)
|
||||
const
|
||||
{
|
||||
return test(*this, [&op, &col]
|
||||
return !for_each(*this, delta_closure_bool{[&op, &col]
|
||||
(const auto &delta)
|
||||
{
|
||||
return std::get<delta.OP>(delta) == op &&
|
||||
std::get<delta.COL>(delta) == col;
|
||||
});
|
||||
}});
|
||||
}
|
||||
|
||||
void
|
||||
ircd::db::txn::at(const op &op,
|
||||
const string_view &col,
|
||||
const delta_closure &closure)
|
||||
const
|
||||
{
|
||||
if(!get(op, col, closure))
|
||||
throw not_found
|
||||
{
|
||||
"db::txn::at(%s, %s): no matching delta in transaction",
|
||||
reflect(op),
|
||||
col
|
||||
};
|
||||
}
|
||||
|
||||
bool
|
||||
ircd::db::txn::get(const op &op,
|
||||
const string_view &col,
|
||||
const delta_closure &closure)
|
||||
const
|
||||
{
|
||||
return !for_each(*this, delta_closure_bool{[&op, &col, &closure]
|
||||
(const delta &delta)
|
||||
{
|
||||
if(std::get<delta.OP>(delta) == op &&
|
||||
std::get<delta.COL>(delta) == col)
|
||||
{
|
||||
closure(delta);
|
||||
return false;
|
||||
}
|
||||
else return true;
|
||||
}});
|
||||
}
|
||||
|
||||
bool
|
||||
|
@ -2835,85 +2852,51 @@ ircd::db::txn::has(const op &op,
|
|||
const string_view &key)
|
||||
const
|
||||
{
|
||||
return test(*this, [&op, &col, &key]
|
||||
return !for_each(*this, delta_closure_bool{[&op, &col, &key]
|
||||
(const auto &delta)
|
||||
{
|
||||
return std::get<delta.OP>(delta) == op &&
|
||||
std::get<delta.COL>(delta) == col &&
|
||||
std::get<delta.KEY>(delta) == key;
|
||||
});
|
||||
}});
|
||||
}
|
||||
|
||||
ircd::db::delta
|
||||
ircd::db::txn::at(const op &op,
|
||||
const string_view &col)
|
||||
const
|
||||
{
|
||||
const auto ret(get(op, col));
|
||||
if(unlikely(!std::get<ret.KEY>(ret)))
|
||||
throw not_found("db::txn::at(%s, %s): no matching delta in transaction",
|
||||
reflect(op),
|
||||
col);
|
||||
return ret;
|
||||
}
|
||||
|
||||
ircd::db::delta
|
||||
ircd::db::txn::get(const op &op,
|
||||
const string_view &col)
|
||||
const
|
||||
{
|
||||
delta ret;
|
||||
test(*this, [&ret, &op, &col]
|
||||
(const delta &delta)
|
||||
{
|
||||
if(std::get<delta.OP>(delta) == op &&
|
||||
std::get<delta.COL>(delta) == col)
|
||||
{
|
||||
ret = delta;
|
||||
return true;
|
||||
}
|
||||
else return false;
|
||||
});
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
ircd::string_view
|
||||
void
|
||||
ircd::db::txn::at(const op &op,
|
||||
const string_view &col,
|
||||
const string_view &key)
|
||||
const string_view &key,
|
||||
const value_closure &closure)
|
||||
const
|
||||
{
|
||||
const auto ret(get(op, col, key));
|
||||
if(unlikely(!ret))
|
||||
throw not_found("db::txn::at(%s, %s, %s): no matching delta in transaction",
|
||||
if(!get(op, col, key, closure))
|
||||
throw not_found
|
||||
{
|
||||
"db::txn::at(%s, %s, %s): no matching delta in transaction",
|
||||
reflect(op),
|
||||
col,
|
||||
key);
|
||||
return ret;
|
||||
key
|
||||
};
|
||||
}
|
||||
|
||||
ircd::string_view
|
||||
bool
|
||||
ircd::db::txn::get(const op &op,
|
||||
const string_view &col,
|
||||
const string_view &key)
|
||||
const string_view &key,
|
||||
const value_closure &closure)
|
||||
const
|
||||
{
|
||||
string_view ret;
|
||||
test(*this, [&ret, &op, &col, &key]
|
||||
return !for_each(*this, delta_closure_bool{[&op, &col, &key, &closure]
|
||||
(const delta &delta)
|
||||
{
|
||||
if(std::get<delta.OP>(delta) == op &&
|
||||
std::get<delta.COL>(delta) == col &&
|
||||
std::get<delta.KEY>(delta) == key)
|
||||
{
|
||||
ret = std::get<delta.VAL>(delta);
|
||||
return true;
|
||||
closure(std::get<delta.VAL>(delta));
|
||||
return false;
|
||||
}
|
||||
else return false;
|
||||
});
|
||||
|
||||
return ret;
|
||||
else return true;
|
||||
}});
|
||||
}
|
||||
|
||||
ircd::db::txn::operator
|
||||
|
|
|
@ -839,9 +839,18 @@ try
|
|||
for_each(database, seqnum, db::seq_closure_bool{[&out, &limit]
|
||||
(db::txn &txn, const uint64_t &seqnum) -> bool
|
||||
{
|
||||
if(txn.has(db::op::SET, "event_id"))
|
||||
m::event::id::buf event_id;
|
||||
txn.get(db::op::SET, "event_id", [&event_id]
|
||||
(const db::delta &delta)
|
||||
{
|
||||
event_id = std::get<delta.KEY>(delta);
|
||||
});
|
||||
|
||||
if(event_id)
|
||||
return true;
|
||||
|
||||
out << std::setw(12) << std::right << seqnum << " : "
|
||||
<< std::get<db::delta::KEY>(txn.get(db::op::SET, "event_id"))
|
||||
<< string_view{event_id}
|
||||
<< std::endl;
|
||||
|
||||
return --limit;
|
||||
|
|
Loading…
Reference in a new issue