From b660491d3fa359325cb3615a276bba78f32e2075 Mon Sep 17 00:00:00 2001 From: David Barbour Date: Fri, 5 Dec 2014 11:18:30 -0600 Subject: [PATCH] ITS#7994 Access to current transaction ID. I, David Barbour, hereby place the following modifications to OpenLDAP Software (and only these modifications) into the public domain. Hence, these modifications may be freely used and/or redistributed for any purpose with or without attribution and/or other notice. --- libraries/liblmdb/lmdb.h | 18 +++++++++++++++++- libraries/liblmdb/mdb.c | 7 +++++++ 2 files changed, 24 insertions(+), 1 deletion(-) diff --git a/libraries/liblmdb/lmdb.h b/libraries/liblmdb/lmdb.h index 4236218..803b286 100644 --- a/libraries/liblmdb/lmdb.h +++ b/libraries/liblmdb/lmdb.h @@ -226,6 +226,9 @@ typedef struct MDB_env MDB_env; */ typedef struct MDB_txn MDB_txn; +/** @brief Unique identifier for an active or recent transaction. */ +typedef size_t MDB_txnid_t; + /** @brief A handle for an individual database in the DB environment. */ typedef unsigned int MDB_dbi; @@ -448,7 +451,7 @@ typedef struct MDB_envinfo { void *me_mapaddr; /**< Address of map, if fixed */ size_t me_mapsize; /**< Size of the data memory map */ size_t me_last_pgno; /**< ID of the last used page */ - size_t me_last_txnid; /**< ID of the last committed transaction */ + MDB_txnid_t me_last_txnid; /**< ID of the last committed transaction */ unsigned int me_maxreaders; /**< max reader slots in the environment */ unsigned int me_numreaders; /**< max reader slots used in the environment */ } MDB_envinfo; @@ -950,6 +953,19 @@ int mdb_txn_begin(MDB_env *env, MDB_txn *parent, unsigned int flags, MDB_txn ** */ MDB_env *mdb_txn_env(MDB_txn *txn); + /** @brief Return the transaction's #MDB_txnid_t + * + * This returns the identifier associated with this transaction. For a + * read-only transaction, this corresponds to the snapshot being read; + * concurrent readers will frequently have the same transaction ID. For + * a write transaction, this is always the snapshot read plus one. When + * a write transaction aborts, the next transaction ID will be reused. + * + * @param[in] txn A transaction handle returned by #mdb_txn_begin() + * @return A transaction ID, valid if input is an active transaction. + */ +MDB_txnid_t mdb_txn_id(MDB_txn *txn); + /** @brief Commit all the operations of a transaction into the database. * * The transaction handle is freed. It and its cursors must not be used diff --git a/libraries/liblmdb/mdb.c b/libraries/liblmdb/mdb.c index a4f13e6..87aa4f8 100644 --- a/libraries/liblmdb/mdb.c +++ b/libraries/liblmdb/mdb.c @@ -2775,6 +2775,13 @@ mdb_txn_env(MDB_txn *txn) return txn->mt_env; } +MDB_txnid_t +mdb_txn_id(MDB_txn *txn) +{ + if(!txn) return (txnid_t)-1; + return txn->mt_txnid; +} + /** Export or close DBI handles opened in this txn. */ static void mdb_dbis_update(MDB_txn *txn, int keep)