0
0
Fork 0
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:
Jason Volk 2018-04-16 15:16:51 -07:00
parent cae6964fa5
commit e009d6763e
3 changed files with 81 additions and 86 deletions

View file

@ -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;

View file

@ -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

View file

@ -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;