* \return error code - accepting RW transactions can fail with LMDB.
*/
int (*commit)(kr_cdb_pt db, struct kr_cdb_stats *stat, bool accept_rw, bool reset_ro);
+ /** Run before a row of operations to ensure they happen in a single RW transaction,
+ * at least in case of successes. */
+ int (*txn_open_rw)(kr_cdb_pt db, struct kr_cdb_stats *stat/*unused*/);
/* Data access */
int (*read)(kr_cdb_pt db, struct kr_cdb_stats *stat,
const knot_db_val_t *key, knot_db_val_t *val, int maxcount);
+ /* TODO: the behavior of write() around transactions is a bit complex. */
int (*write)(kr_cdb_pt db, struct kr_cdb_stats *stat, const knot_db_val_t *key,
knot_db_val_t *val, int maxcount);
return ret;
}
+static int cdb_txn_open_rw(kr_cdb_pt db, struct kr_cdb_stats *stat/*unused*/)
+{
+ struct lmdb_env *env = db2env(db);
+ MDB_txn *txn = NULL;
+ return txn_get(env, &txn, false);
+}
+
/** Obtain a read-only cursor (and a read-only transaction).
* TODO: allow RW transaction (for ruledb iterator) */
static int txn_curs_get(struct lmdb_env *env, MDB_cursor **curs, struct kr_cdb_stats *stats)
{
static const struct kr_cdb_api api = {
"lmdb",
- cdb_init, cdb_deinit, cdb_count, cdb_clear, cdb_commit,
+ cdb_init, cdb_deinit, cdb_count, cdb_clear,
+ cdb_commit, cdb_txn_open_rw,
cdb_readv, cdb_writev, cdb_remove,
cdb_match,
cdb_read_leq, cdb_read_less,