Add mdb_cursor_renew()
authorHoward Chu <hyc@symas.com>
Mon, 17 Sep 2012 11:41:13 +0000 (04:41 -0700)
committerHoward Chu <hyc@symas.com>
Mon, 17 Sep 2012 11:41:13 +0000 (04:41 -0700)
Allow cursors on read-only txns to be reused with later txns.

libraries/libmdb/mdb.c
libraries/libmdb/mdb.h

index ed1ecbb..345ebf4 100644 (file)
@@ -5285,6 +5285,19 @@ mdb_cursor_open(MDB_txn *txn, MDB_dbi dbi, MDB_cursor **ret)
        return MDB_SUCCESS;
 }
 
+int
+mdb_cursor_renew(MDB_txn *txn, MDB_cursor *mc)
+{
+       if (txn == NULL || mc == NULL || mc->mc_dbi >= txn->mt_numdbs)
+               return EINVAL;
+
+       if (txn->mt_cursors)
+               return EINVAL;
+
+       mdb_cursor_init(mc, txn, mc->mc_dbi, mc->mc_xcursor);
+       return MDB_SUCCESS;
+}
+
 /* Return the count of duplicate data items for the current key */
 int
 mdb_cursor_count(MDB_cursor *mc, size_t *countp)
index 43eb789..6e9cd2b 100644 (file)
@@ -904,6 +904,23 @@ int  mdb_cursor_open(MDB_txn *txn, MDB_dbi dbi, MDB_cursor **cursor);
         */
 void mdb_cursor_close(MDB_cursor *cursor);
 
+       /** @brief Renew a cursor handle.
+        *
+        * Cursors are associated with a specific transaction and database and
+        * may not span threads. Cursors that are only used in read-only
+        * transactions may be re-used, to avoid unnecessary malloc/free overhead.
+        * The cursor may be associated with a new read-only transaction, and
+        * referencing the same database handle as it was created with.
+        * @param[in] txn A transaction handle returned by #mdb_txn_begin()
+        * @param[in] cursor A cursor handle returned by #mdb_cursor_open()
+        * @return A non-zero error value on failure and 0 on success. Some possible
+        * errors are:
+        * <ul>
+        *      <li>EINVAL - an invalid parameter was specified.
+        * </ul>
+        */
+int  mdb_cursor_renew(MDB_txn *txn, MDB_cursor *cursor);
+
        /** @brief Return the cursor's transaction handle.
         *
         * @param[in] cursor A cursor handle returned by #mdb_cursor_open()