]> git.sur5r.net Git - openldap/blobdiff - libraries/liblmdb/mdb.c
Pass cursor to mdb_page_get(), mdb_node_read().
[openldap] / libraries / liblmdb / mdb.c
index 27bcd026cedf118f093b0aa4ea60974970d4730d..6e84d4c28513b6b2cf329c4acad9a757826f20a6 100644 (file)
@@ -1301,7 +1301,7 @@ enum {
 #define MDB_END_SLOT MDB_NOTLS /**< release any reader slot if #MDB_NOTLS */
 static void mdb_txn_end(MDB_txn *txn, unsigned mode);
 
-static int  mdb_page_get(MDB_txn *txn, pgno_t pgno, MDB_page **mp, int *lvl);
+static int  mdb_page_get(MDB_cursor *mc, pgno_t pgno, MDB_page **mp, int *lvl);
 static int  mdb_page_search_root(MDB_cursor *mc,
                            MDB_val *key, int modify);
 #define MDB_PS_MODIFY  1
@@ -1330,7 +1330,7 @@ static int  mdb_node_add(MDB_cursor *mc, indx_t indx,
 static void mdb_node_del(MDB_cursor *mc, int ksize);
 static void mdb_node_shrink(MDB_page *mp, indx_t indx);
 static int     mdb_node_move(MDB_cursor *csrc, MDB_cursor *cdst, int fromleft);
-static int  mdb_node_read(MDB_txn *txn, MDB_node *leaf, MDB_val *data);
+static int  mdb_node_read(MDB_cursor *mc, MDB_node *leaf, MDB_val *data);
 static size_t  mdb_leaf_size(MDB_env *env, MDB_val *key, MDB_val *data);
 static size_t  mdb_branch_size(MDB_env *env, MDB_val *key);
 
@@ -1846,7 +1846,7 @@ mdb_pages_xkeep(MDB_cursor *mc, unsigned pflags, int all)
 {
        enum { Mask = P_SUBP|P_DIRTY|P_LOOSE|P_KEEP };
        MDB_txn *txn = mc->mc_txn;
-       MDB_cursor *m3;
+       MDB_cursor *m3, *m0 = mc;
        MDB_xcursor *mx;
        MDB_page *dp, *mp;
        MDB_node *leaf;
@@ -1889,7 +1889,7 @@ mdb_pages_xkeep(MDB_cursor *mc, unsigned pflags, int all)
                                pgno_t pgno = txn->mt_dbs[i].md_root;
                                if (pgno == P_INVALID)
                                        continue;
-                               if ((rc = mdb_page_get(txn, pgno, &dp, &level)) != MDB_SUCCESS)
+                               if ((rc = mdb_page_get(m0, pgno, &dp, &level)) != MDB_SUCCESS)
                                        break;
                                if ((dp->mp_flags & Mask) == pflags && level <= 1)
                                        dp->mp_flags ^= P_KEEP;
@@ -2193,7 +2193,7 @@ mdb_page_alloc(MDB_cursor *mc, int num, MDB_page **mp)
                }
                np = m2.mc_pg[m2.mc_top];
                leaf = NODEPTR(np, m2.mc_ki[m2.mc_top]);
-               if ((rc = mdb_node_read(txn, leaf, &data)) != MDB_SUCCESS)
+               if ((rc = mdb_node_read(&m2, leaf, &data)) != MDB_SUCCESS)
                        return rc;
 
                idl = (MDB_ID *) data.mv_data;
@@ -5219,15 +5219,16 @@ mdb_cursor_push(MDB_cursor *mc, MDB_page *mp)
 }
 
 /** Find the address of the page corresponding to a given page number.
- * @param[in] txn the transaction for this access.
+ * @param[in] mc the cursor accessing the page.
  * @param[in] pgno the page number for the page to retrieve.
  * @param[out] ret address of a pointer where the page's address will be stored.
  * @param[out] lvl dirty_list inheritance level of found page. 1=current txn, 0=mapped page.
  * @return 0 on success, non-zero on failure.
  */
 static int
-mdb_page_get(MDB_txn *txn, pgno_t pgno, MDB_page **ret, int *lvl)
+mdb_page_get(MDB_cursor *mc, pgno_t pgno, MDB_page **ret, int *lvl)
 {
+       MDB_txn *txn = mc->mc_txn;
        MDB_env *env = txn->mt_env;
        MDB_page *p = NULL;
        int level;
@@ -5322,7 +5323,7 @@ mdb_page_search_root(MDB_cursor *mc, MDB_val *key, int flags)
                mdb_cassert(mc, i < NUMKEYS(mp));
                node = NODEPTR(mp, i);
 
-               if ((rc = mdb_page_get(mc->mc_txn, NODEPGNO(node), &mp, NULL)) != 0)
+               if ((rc = mdb_page_get(mc, NODEPGNO(node), &mp, NULL)) != 0)
                        return rc;
 
                mc->mc_ki[mc->mc_top] = i;
@@ -5364,7 +5365,7 @@ mdb_page_search_lowest(MDB_cursor *mc)
        MDB_node        *node = NODEPTR(mp, 0);
        int rc;
 
-       if ((rc = mdb_page_get(mc->mc_txn, NODEPGNO(node), &mp, NULL)) != 0)
+       if ((rc = mdb_page_get(mc, NODEPGNO(node), &mp, NULL)) != 0)
                return rc;
 
        mc->mc_ki[mc->mc_top] = 0;
@@ -5416,7 +5417,7 @@ mdb_page_search(MDB_cursor *mc, MDB_val *key, int flags)
                                                return MDB_NOTFOUND;
                                        if ((leaf->mn_flags & (F_DUPDATA|F_SUBDATA)) != F_SUBDATA)
                                                return MDB_INCOMPATIBLE; /* not a named DB */
-                                       rc = mdb_node_read(mc->mc_txn, leaf, &data);
+                                       rc = mdb_node_read(&mc2, leaf, &data);
                                        if (rc)
                                                return rc;
                                        memcpy(&flags, ((char *) data.mv_data + offsetof(MDB_db, md_flags)),
@@ -5440,7 +5441,7 @@ mdb_page_search(MDB_cursor *mc, MDB_val *key, int flags)
 
        mdb_cassert(mc, root > 1);
        if (!mc->mc_pg[0] || mc->mc_pg[0]->mp_pgno != root)
-               if ((rc = mdb_page_get(mc->mc_txn, root, &mc->mc_pg[0], NULL)) != 0)
+               if ((rc = mdb_page_get(mc, root, &mc->mc_pg[0], NULL)) != 0)
                        return rc;
 
        mc->mc_snum = 1;
@@ -5537,13 +5538,13 @@ release:
 }
 
 /** Return the data associated with a given node.
- * @param[in] txn The transaction for this operation.
+ * @param[in] mc The cursor for this operation.
  * @param[in] leaf The node being read.
  * @param[out] data Updated to point to the node's data.
  * @return 0 on success, non-zero on failure.
  */
 static int
-mdb_node_read(MDB_txn *txn, MDB_node *leaf, MDB_val *data)
+mdb_node_read(MDB_cursor *mc, MDB_node *leaf, MDB_val *data)
 {
        MDB_page        *omp;           /* overflow page */
        pgno_t           pgno;
@@ -5559,7 +5560,7 @@ mdb_node_read(MDB_txn *txn, MDB_node *leaf, MDB_val *data)
         */
        data->mv_size = NODEDSZ(leaf);
        memcpy(&pgno, NODEDATA(leaf), sizeof(pgno));
-       if ((rc = mdb_page_get(txn, pgno, &omp, NULL)) != 0) {
+       if ((rc = mdb_page_get(mc, pgno, &omp, NULL)) != 0) {
                DPRINTF(("read overflow page %"Z"u failed", pgno));
                return rc;
        }
@@ -5633,7 +5634,7 @@ mdb_cursor_sibling(MDB_cursor *mc, int move_right)
        mdb_cassert(mc, IS_BRANCH(mc->mc_pg[mc->mc_top]));
 
        indx = NODEPTR(mc->mc_pg[mc->mc_top], mc->mc_ki[mc->mc_top]);
-       if ((rc = mdb_page_get(mc->mc_txn, NODEPGNO(indx), &mp, NULL)) != 0) {
+       if ((rc = mdb_page_get(mc, NODEPGNO(indx), &mp, NULL)) != 0) {
                /* mc will be inconsistent if caller does mc_snum++ as above */
                mc->mc_flags &= ~(C_INITIALIZED|C_EOF);
                return rc;
@@ -5716,7 +5717,7 @@ skip:
                mdb_xcursor_init1(mc, leaf);
        }
        if (data) {
-               if ((rc = mdb_node_read(mc->mc_txn, leaf, data)) != MDB_SUCCESS)
+               if ((rc = mdb_node_read(mc, leaf, data)) != MDB_SUCCESS)
                        return rc;
 
                if (F_ISSET(leaf->mn_flags, F_DUPDATA)) {
@@ -5799,7 +5800,7 @@ mdb_cursor_prev(MDB_cursor *mc, MDB_val *key, MDB_val *data, MDB_cursor_op op)
                mdb_xcursor_init1(mc, leaf);
        }
        if (data) {
-               if ((rc = mdb_node_read(mc->mc_txn, leaf, data)) != MDB_SUCCESS)
+               if ((rc = mdb_node_read(mc, leaf, data)) != MDB_SUCCESS)
                        return rc;
 
                if (F_ISSET(leaf->mn_flags, F_DUPDATA)) {
@@ -5981,7 +5982,7 @@ set1:
                } else if (op == MDB_GET_BOTH || op == MDB_GET_BOTH_RANGE) {
                        MDB_val olddata;
                        MDB_cmp_func *dcmp;
-                       if ((rc = mdb_node_read(mc->mc_txn, leaf, &olddata)) != MDB_SUCCESS)
+                       if ((rc = mdb_node_read(mc, leaf, &olddata)) != MDB_SUCCESS)
                                return rc;
                        dcmp = mc->mc_dbx->md_dcmp;
 #if UINT_MAX < SIZE_MAX
@@ -5999,7 +6000,7 @@ set1:
                } else {
                        if (mc->mc_xcursor)
                                mc->mc_xcursor->mx_cursor.mc_flags &= ~(C_INITIALIZED|C_EOF);
-                       if ((rc = mdb_node_read(mc->mc_txn, leaf, data)) != MDB_SUCCESS)
+                       if ((rc = mdb_node_read(mc, leaf, data)) != MDB_SUCCESS)
                                return rc;
                }
        }
@@ -6048,7 +6049,7 @@ mdb_cursor_first(MDB_cursor *mc, MDB_val *key, MDB_val *data)
                        if (rc)
                                return rc;
                } else {
-                       if ((rc = mdb_node_read(mc->mc_txn, leaf, data)) != MDB_SUCCESS)
+                       if ((rc = mdb_node_read(mc, leaf, data)) != MDB_SUCCESS)
                                return rc;
                }
        }
@@ -6093,7 +6094,7 @@ mdb_cursor_last(MDB_cursor *mc, MDB_val *key, MDB_val *data)
                        if (rc)
                                return rc;
                } else {
-                       if ((rc = mdb_node_read(mc->mc_txn, leaf, data)) != MDB_SUCCESS)
+                       if ((rc = mdb_node_read(mc, leaf, data)) != MDB_SUCCESS)
                                return rc;
                }
        }
@@ -6139,7 +6140,7 @@ mdb_cursor_get(MDB_cursor *mc, MDB_val *key, MDB_val *data,
                                        if (F_ISSET(leaf->mn_flags, F_DUPDATA)) {
                                                rc = mdb_cursor_get(&mc->mc_xcursor->mx_cursor, data, NULL, MDB_GET_CURRENT);
                                        } else {
-                                               rc = mdb_node_read(mc->mc_txn, leaf, data);
+                                               rc = mdb_node_read(mc, leaf, data);
                                        }
                                }
                        }
@@ -6232,7 +6233,7 @@ fetchm:
                        MDB_node *leaf = NODEPTR(mc->mc_pg[mc->mc_top], mc->mc_ki[mc->mc_top]);
                        if (!F_ISSET(leaf->mn_flags, F_DUPDATA)) {
                                MDB_GET_KEY(leaf, key);
-                               rc = mdb_node_read(mc->mc_txn, leaf, data);
+                               rc = mdb_node_read(mc, leaf, data);
                                break;
                        }
                }
@@ -6616,7 +6617,7 @@ current:
                        int level, ovpages, dpages = OVPAGES(data->mv_size, env->me_psize);
 
                        memcpy(&pg, olddata.mv_data, sizeof(pg));
-                       if ((rc2 = mdb_page_get(mc->mc_txn, pg, &omp, &level)) != 0)
+                       if ((rc2 = mdb_page_get(mc, pg, &omp, &level)) != 0)
                                return rc2;
                        ovpages = omp->mp_pages;
 
@@ -6922,7 +6923,7 @@ mdb_cursor_del(MDB_cursor *mc, unsigned int flags)
                pgno_t pg;
 
                memcpy(&pg, NODEDATA(leaf), sizeof(pg));
-               if ((rc = mdb_page_get(mc->mc_txn, pg, &omp, NULL)) ||
+               if ((rc = mdb_page_get(mc, pg, &omp, NULL)) ||
                        (rc = mdb_ovpage_free(mc, omp)))
                        goto fail;
        }
@@ -8081,7 +8082,7 @@ mdb_rebalance(MDB_cursor *mc)
                        if (rc)
                                return rc;
                        mc->mc_db->md_root = NODEPGNO(NODEPTR(mp, 0));
-                       rc = mdb_page_get(mc->mc_txn,mc->mc_db->md_root,&mc->mc_pg[0],NULL);
+                       rc = mdb_page_get(mc, mc->mc_db->md_root, &mc->mc_pg[0], NULL);
                        if (rc)
                                return rc;
                        mc->mc_db->md_depth--;
@@ -8142,7 +8143,7 @@ mdb_rebalance(MDB_cursor *mc)
                DPUTS("reading right neighbor");
                mn.mc_ki[ptop]++;
                node = NODEPTR(mc->mc_pg[ptop], mn.mc_ki[ptop]);
-               rc = mdb_page_get(mc->mc_txn,NODEPGNO(node),&mn.mc_pg[mn.mc_top],NULL);
+               rc = mdb_page_get(mc, NODEPGNO(node), &mn.mc_pg[mn.mc_top], NULL);
                if (rc)
                        return rc;
                mn.mc_ki[mn.mc_top] = 0;
@@ -8154,7 +8155,7 @@ mdb_rebalance(MDB_cursor *mc)
                DPUTS("reading left neighbor");
                mn.mc_ki[ptop]--;
                node = NODEPTR(mc->mc_pg[ptop], mn.mc_ki[ptop]);
-               rc = mdb_page_get(mc->mc_txn,NODEPGNO(node),&mn.mc_pg[mn.mc_top],NULL);
+               rc = mdb_page_get(mc, NODEPGNO(node), &mn.mc_pg[mn.mc_top], NULL);
                if (rc)
                        return rc;
                mn.mc_ki[mn.mc_top] = NUMKEYS(mn.mc_pg[mn.mc_top]) - 1;
@@ -8904,7 +8905,6 @@ static int ESECT
 mdb_env_cwalk(mdb_copy *my, pgno_t *pg, int flags)
 {
        MDB_cursor mc = {0};
-       MDB_txn *txn = my->mc_txn;
        MDB_node *ni;
        MDB_page *mo, *mp, *leaf;
        char *buf, *ptr;
@@ -8916,9 +8916,9 @@ mdb_env_cwalk(mdb_copy *my, pgno_t *pg, int flags)
                return MDB_SUCCESS;
 
        mc.mc_snum = 1;
-       mc.mc_txn = txn;
+       mc.mc_txn = my->mc_txn;
 
-       rc = mdb_page_get(my->mc_txn, *pg, &mc.mc_pg[0], NULL);
+       rc = mdb_page_get(&mc, *pg, &mc.mc_pg[0], NULL);
        if (rc)
                return rc;
        rc = mdb_page_search_root(&mc, NULL, MDB_PS_FIRST);
@@ -8962,7 +8962,7 @@ mdb_env_cwalk(mdb_copy *my, pgno_t *pg, int flags)
                                                }
 
                                                memcpy(&pg, NODEDATA(ni), sizeof(pg));
-                                               rc = mdb_page_get(txn, pg, &omp, NULL);
+                                               rc = mdb_page_get(&mc, pg, &omp, NULL);
                                                if (rc)
                                                        goto done;
                                                if (my->mc_wlen[toggle] >= MDB_WBUF) {
@@ -9013,7 +9013,7 @@ mdb_env_cwalk(mdb_copy *my, pgno_t *pg, int flags)
 again:
                                ni = NODEPTR(mp, mc.mc_ki[mc.mc_top]);
                                pg = NODEPGNO(ni);
-                               rc = mdb_page_get(txn, pg, &mp, NULL);
+                               rc = mdb_page_get(&mc, pg, &mp, NULL);
                                if (rc)
                                        goto done;
                                mc.mc_top++;
@@ -9696,7 +9696,7 @@ mdb_drop0(MDB_cursor *mc, int subs)
                                                MDB_page *omp;
                                                pgno_t pg;
                                                memcpy(&pg, NODEDATA(ni), sizeof(pg));
-                                               rc = mdb_page_get(txn, pg, &omp, NULL);
+                                               rc = mdb_page_get(mc, pg, &omp, NULL);
                                                if (rc != 0)
                                                        goto done;
                                                mdb_cassert(mc, IS_OVERFLOW(omp));