]> git.sur5r.net Git - openldap/blobdiff - libraries/libmdb/mdb.c
Cleanup unused code
[openldap] / libraries / libmdb / mdb.c
index 126827c21a59d46e57b9062ddd7e5be1d89578b9..6db8c1caa08cd4222c96292017559bdd8954ed6a 100644 (file)
@@ -539,7 +539,7 @@ static size_t       mdb_branch_size(MDB_env *env, MDB_val *key);
 
 static void mdb_default_cmp(MDB_txn *txn, MDB_dbi dbi);
 
-static MDB_cmp_func    memncmp, memnrcmp, intcmp;
+static MDB_cmp_func    memncmp, memnrcmp, intcmp, cintcmp;
 
 #ifdef _WIN32
 static SECURITY_DESCRIPTOR mdb_null_sd;
@@ -1937,6 +1937,7 @@ mdb_env_close(MDB_env *env)
        free(env);
 }
 
+/* only for aligned ints */
 static int
 intcmp(const MDB_val *a, const MDB_val *b)
 {
@@ -1954,6 +1955,26 @@ intcmp(const MDB_val *a, const MDB_val *b)
        }
 }
 
+/* ints must always be the same size */
+static int
+cintcmp(const MDB_val *a, const MDB_val *b)
+{
+#if __BYTE_ORDER == __LITTLE_ENDIAN
+       unsigned char *u, *c;
+       int x;
+
+       u = a->mv_data + a->mv_size;
+       c = b->mv_data + a->mv_size;
+       while(u > (unsigned char *)a->mv_data) {
+               x = *--u - *--c;
+               if (x) break;
+       }
+       return x;
+#else
+       return memcmp(a->mv_data, b->mv_data, a->mv_size);
+#endif
+}
+
 static int
 memncmp(const MDB_val *a, const MDB_val *b)
 {
@@ -2065,6 +2086,8 @@ mdb_search_node(MDB_txn *txn, MDB_dbi dbi, MDB_page *mp, MDB_val *key,
 
        if (rc > 0) {   /* Found entry is less than the key. */
                i++;    /* Skip to get the smallest entry larger than key. */
+               if (!IS_LEAF2(mp))
+                       node = NODEPTR(mp, i);
        }
        if (exactp)
                *exactp = (rc == 0);
@@ -2299,7 +2322,7 @@ mdb_get(MDB_txn *txn, MDB_dbi dbi,
 {
        MDB_cursor      mc;
        MDB_xcursor     mx;
-       int exact;
+       int exact = 0;
        DKBUF;
 
        assert(key);
@@ -3148,22 +3171,12 @@ mdb_cursor_del(MDB_cursor *mc, unsigned int flags)
                        MDB_ppage *top, *parent;
                        MDB_node *ni;
                        unsigned int i;
-#if 0
-                       MDB_dpage *dp;
-                       ID2     mid;
-                       int dirty_root = 0;
-#endif
 
                        mc->mc_txn->mt_dbs[mc->mc_dbi].md_entries -=
                                mc->mc_xcursor->mx_txn.mt_dbs[mc->mc_xcursor->mx_cursor.mc_dbi].md_entries;
 
                        cursor_pop_page(&mc->mc_xcursor->mx_cursor);
                        if (mc->mc_xcursor->mx_cursor.mc_snum) {
-#if 0
-                               if (mc->mc_xcursor->mx_cursor.mc_stack[0].mp_page->mp_flags & P_DIRTY) {
-                                       dirty_root = 1;
-                               }
-#endif
                                while (mc->mc_xcursor->mx_cursor.mc_snum > 1) {
                                        top = CURSOR_TOP(&mc->mc_xcursor->mx_cursor);
                                        parent = CURSOR_PARENT(&mc->mc_xcursor->mx_cursor);
@@ -3174,40 +3187,16 @@ mdb_cursor_del(MDB_cursor *mc, unsigned int flags)
                                                pg = NODEPGNO(ni);
                                                if ((rc = mdb_get_page(mc->mc_txn, pg, &mp)))
                                                        return rc;
-#if 0
-                                               if (mp->mp_flags & P_DIRTY) {
-                                                       /* drop it */
-                                                       mid.mid = pg;
-                                                       mdb_mid2l_delete(mc->mc_txn->mt_u.dirty_list, &mid);
-                                                       dp = mid.mptr;
-                                                       dp->h.md_parent = (MDB_page *)mc->mc_txn->mt_env->me_dpages;
-                                                       mc->mc_txn->mt_env->me_dpages = dp;
-                                               } else
-#endif
-                                               {
-                                                       /* free it */
-                                                       mdb_midl_append(mc->mc_txn->mt_free_pgs, pg);
-                                               }
+                                               /* free it */
+                                               mdb_midl_append(mc->mc_txn->mt_free_pgs, pg);
                                        }
                                        rc = mdb_sibling(&mc->mc_xcursor->mx_cursor, 1);
                                        if (rc) break;
                                }
                        }
-#if 0
-                       if (dirty_root) {
-                               /* drop it */
-                               mid.mid = mc->mc_xcursor->mx_txn.mt_dbs[mc->mc_xcursor->mx_cursor.mc_dbi].md_root;
-                               mdb_mid2l_delete(mc->mc_txn->mt_u.dirty_list, &mid);
-                               dp = mid.mptr;
-                               dp->h.md_parent = (MDB_page *)mc->mc_txn->mt_env->me_dpages;
-                               mc->mc_txn->mt_env->me_dpages = dp;
-                       } else
-#endif
-                       {
-                               /* free it */
-                               mdb_midl_append(mc->mc_txn->mt_free_pgs,
-                                       mc->mc_xcursor->mx_txn.mt_dbs[mc->mc_xcursor->mx_cursor.mc_dbi].md_root);
-                       }
+                       /* free it */
+                       mdb_midl_append(mc->mc_txn->mt_free_pgs,
+                               mc->mc_xcursor->mx_txn.mt_dbs[mc->mc_xcursor->mx_cursor.mc_dbi].md_root);
                }
        }
 
@@ -3452,6 +3441,7 @@ mdb_xcursor_init0(MDB_cursor *mc)
        mx->mx_dbxs[dbn+1].md_rel = mx->mx_dbxs[dbn].md_rel;
        mx->mx_dbxs[dbn+1].md_dirty = 0;
        mx->mx_txn.mt_numdbs = dbn+2;
+       mx->mx_txn.mt_u = mc->mc_txn->mt_u;
 
        mx->mx_cursor.mc_xcursor = NULL;
        mx->mx_cursor.mc_txn = &mx->mx_txn;
@@ -3480,7 +3470,6 @@ mdb_xcursor_init1(MDB_cursor *mc, MDB_page *mp, MDB_node *node)
        mx->mx_dbxs[dbn].md_name.mv_data = NODEKEY(node);
        mx->mx_dbxs[dbn].md_name.mv_size = node->mn_ksize;
        mx->mx_txn.mt_next_pgno = mc->mc_txn->mt_next_pgno;
-       mx->mx_txn.mt_u = mc->mc_txn->mt_u;
        mx->mx_cursor.mc_snum = 0;
        mx->mx_cursor.mc_flags = 0;
 }
@@ -3674,7 +3663,16 @@ mdb_move_node(MDB_txn *txn, MDB_dbi dbi, MDB_pageparent *src, indx_t srcindx,
                data.mv_size = 0;
                data.mv_data = NULL;
        } else {
-               srcnode = NODEPTR(src->mp_page, srcindx);
+               if (srcindx == 0 && IS_BRANCH(src->mp_page)) {
+                       /* must find the lowest key below src */
+                       MDB_pageparent mpp;
+                       mpp.mp_page = src->mp_page;
+                       mpp.mp_pi = 0;
+                       mdb_search_page_root(txn, dbi, NULL, NULL, 0, &mpp);
+                       srcnode = NODEPTR(mpp.mp_page, 0);
+               } else {
+                       srcnode = NODEPTR(src->mp_page, srcindx);
+               }
                key.mv_size = NODEKSZ(srcnode);
                key.mv_data = NODEKEY(srcnode);
                data.mv_size = NODEDSZ(srcnode);
@@ -3698,17 +3696,17 @@ mdb_move_node(MDB_txn *txn, MDB_dbi dbi, MDB_pageparent *src, indx_t srcindx,
         */
        mdb_del_node(src->mp_page, srcindx, key.mv_size);
 
-       /* The key value just changed due to del_node, find it again.
-        */
-       if (!IS_LEAF2(src->mp_page)) {
-               srcnode = NODEPTR(src->mp_page, srcindx);
-               key.mv_data = NODEKEY(srcnode);
-       }
-
        /* Update the parent separators.
         */
        if (srcindx == 0) {
                if (src->mp_pi != 0) {
+                       if (IS_LEAF2(src->mp_page)) {
+                               key.mv_data = LEAF2KEY(src->mp_page, srcindx, key.mv_size);
+                       } else {
+                               srcnode = NODEPTR(src->mp_page, srcindx);
+                               key.mv_size = NODEKSZ(srcnode);
+                               key.mv_data = NODEKEY(srcnode);
+                       }
                        DPRINTF("update separator for source page %lu to [%s]",
                                src->mp_page->mp_pgno, DKEY(&key));
                        if ((rc = mdb_update_key(src->mp_parent, src->mp_pi,
@@ -3724,6 +3722,13 @@ mdb_move_node(MDB_txn *txn, MDB_dbi dbi, MDB_pageparent *src, indx_t srcindx,
 
        if (dstindx == 0) {
                if (dst->mp_pi != 0) {
+                       if (IS_LEAF2(src->mp_page)) {
+                               key.mv_data = LEAF2KEY(dst->mp_page, 0, key.mv_size);
+                       } else {
+                               srcnode = NODEPTR(dst->mp_page, 0);
+                               key.mv_size = NODEKSZ(srcnode);
+                               key.mv_data = NODEKEY(srcnode);
+                       }
                        DPRINTF("update separator for destination page %lu to [%s]",
                                dst->mp_page->mp_pgno, DKEY(&key));
                        if ((rc = mdb_update_key(dst->mp_parent, dst->mp_pi,
@@ -4337,12 +4342,10 @@ mdb_env_stat(MDB_env *env, MDB_stat *arg)
 static void
 mdb_default_cmp(MDB_txn *txn, MDB_dbi dbi)
 {
-       if (txn->mt_dbs[dbi].md_flags & (MDB_REVERSEKEY
-#if __BYTE_ORDER == __LITTLE_ENDIAN
-               |MDB_INTEGERKEY
-#endif
-       ))
+       if (txn->mt_dbs[dbi].md_flags & MDB_REVERSEKEY)
                txn->mt_dbxs[dbi].md_cmp = memnrcmp;
+       else if (txn->mt_dbs[dbi].md_flags & MDB_INTEGERKEY)
+               txn->mt_dbxs[dbi].md_cmp = cintcmp;
        else
                txn->mt_dbxs[dbi].md_cmp = memncmp;
 
@@ -4351,11 +4354,7 @@ mdb_default_cmp(MDB_txn *txn, MDB_dbi dbi)
                        if (txn->mt_dbs[dbi].md_flags & MDB_DUPFIXED)
                                txn->mt_dbxs[dbi].md_dcmp = intcmp;
                        else
-#if __BYTE_ORDER == __LITTLE_ENDIAN
-                               txn->mt_dbxs[dbi].md_dcmp = memnrcmp;
-#else
-                               txn->mt_dbxs[dbi].md_dcmp = memncmp;
-#endif
+                               txn->mt_dbxs[dbi].md_dcmp = cintcmp;
                } else if (txn->mt_dbs[dbi].md_flags & MDB_REVERSEDUP) {
                        txn->mt_dbxs[dbi].md_dcmp = memnrcmp;
                } else {