return ltx;
}
+
static MDB_txn *get_current_txn(struct lmdb_private *lmdb)
{
MDB_txn *txn;
- if (lmdb->read_txn != NULL) {
- return lmdb->read_txn;
- }
txn = lmdb_trans_get_tx(lmdb_private_trans_head(lmdb));
- if (txn == NULL) {
- int ret;
- ret = mdb_txn_begin(lmdb->env, NULL, MDB_RDONLY, &txn);
- if (ret != 0) {
- lmdb->error = ret;
- ldb_asprintf_errstring(lmdb->ldb,
- "%s failed: %s\n", __FUNCTION__,
- mdb_strerror(ret));
- }
- lmdb->read_txn = txn;
+ if (txn != NULL) {
+ return txn;
+ }
+ if (lmdb->read_txn != NULL) {
+ return lmdb->read_txn;
}
- return txn;
+ lmdb->error = MDB_BAD_TXN;
+ ldb_set_errstring(lmdb->ldb, __location__":No active transaction\n");
+ return NULL;
}
static int lmdb_store(struct ltdb_private *ltdb,
MDB_val value;
lmdb->error = mdb_get(txn, dbi, &mdb_key, &value);
if (lmdb->error != MDB_SUCCESS) {
- if (ltdb->read_lock_count == 0 && lmdb->read_txn != NULL) {
- mdb_txn_commit(lmdb->read_txn);
- lmdb->read_txn = NULL;
- }
return ldb_mdb_error(lmdb->ldb, lmdb->error);
}
mdb_flags = 0;
mdb_cursor_close(cursor);
}
- if (ltdb->read_lock_count == 0 && lmdb->read_txn != NULL) {
- mdb_txn_commit(lmdb->read_txn);
- lmdb->read_txn = NULL;
- }
-
if (lmdb->error != MDB_SUCCESS) {
return ldb_mdb_error(lmdb->ldb, lmdb->error);
}
if (lmdb->error != MDB_SUCCESS) {
/* TODO closing a handle should not even be necessary */
mdb_dbi_close(lmdb->env, dbi);
- if (ltdb->read_lock_count == 0 && lmdb->read_txn != NULL) {
- mdb_txn_commit(lmdb->read_txn);
- lmdb->read_txn = NULL;
- }
if (lmdb->error == MDB_NOTFOUND) {
return LDB_ERR_NO_SUCH_OBJECT;
}
/* TODO closing a handle should not even be necessary */
mdb_dbi_close(lmdb->env, dbi);
- /* We created a read transaction, commit it */
- if (ltdb->read_lock_count == 0 && lmdb->read_txn != NULL) {
- mdb_txn_commit(lmdb->read_txn);
- lmdb->read_txn = NULL;
- }
return parser(key, data, ctx);
}
}
lmdb->error = MDB_SUCCESS;
- if (ltdb->in_transaction == 0 &&
+ if (lmdb_transaction_active(ltdb) == false &&
ltdb->read_lock_count == 0) {
lmdb->error = mdb_txn_begin(lmdb->env,
NULL,
void *data = ldb_module_get_private(module);
struct ltdb_private *ltdb = talloc_get_type(data, struct ltdb_private);
- if (ltdb->in_transaction == 0 && ltdb->read_lock_count == 1) {
+ if (lmdb_transaction_active(ltdb) == false && ltdb->read_lock_count == 1) {
struct lmdb_private *lmdb = ltdb->lmdb_private;
mdb_txn_commit(lmdb->read_txn);
lmdb->read_txn = NULL;
return LDB_ERR_PROTOCOL_ERROR;
}
-
ltx_head = lmdb_private_trans_head(lmdb);
tx_parent = lmdb_trans_get_tx(ltx_head);