From 28c7826032e5c0be1a5ae48620c6f0c2debfd85c Mon Sep 17 00:00:00 2001 From: Jason Volk Date: Fri, 9 Mar 2018 16:21:23 -0800 Subject: [PATCH] ircd::db: Add txn::append optimization allowing tuple to make direct column deltas. --- include/ircd/db/txn.h | 22 ++++++++++++++++++++++ ircd/m/dbs.cc | 2 +- 2 files changed, 23 insertions(+), 1 deletion(-) diff --git a/include/ircd/db/txn.h b/include/ircd/db/txn.h index 310d7b4e7..e1d6eaa77 100644 --- a/include/ircd/db/txn.h +++ b/include/ircd/db/txn.h @@ -71,6 +71,7 @@ struct ircd::db::txn::append append(txn &, const delta &); append(txn &, const string_view &key, const json::iov &); template append(txn &, const string_view &key, const json::tuple &); + template append(txn &, const string_view &key, const json::tuple &, std::array &); }; struct ircd::db::txn::checkpoint @@ -103,3 +104,24 @@ ircd::db::txn::append::append(txn &txn, }; }); } + +template +ircd::db::txn::append::append(txn &txn, + const string_view &key, + const json::tuple &tuple, + std::array &col) +{ + size_t i{0}; + for_each(tuple, [&txn, &key, &col, &i](const auto &, auto&& val) + { + if(defined(val)) append + { + txn, col.at(i), column::delta + { + key, byte_view{val} + } + }; + + ++i; + }); +} diff --git a/ircd/m/dbs.cc b/ircd/m/dbs.cc index b064b4700..4e3f99348 100644 --- a/ircd/m/dbs.cc +++ b/ircd/m/dbs.cc @@ -106,7 +106,7 @@ ircd::m::dbs::write(db::txn &txn, { db::txn::append { - txn, at<"event_id"_>(event), event + txn, at<"event_id"_>(event), event, event_column }; if(defined(json::get<"state_key"_>(event)))