]> git.sur5r.net Git - openldap/commitdiff
Fix mdb_split, fix MDB_GET_BOTH
authorHoward Chu <highlandsun@gmail.com>
Sun, 4 Sep 2011 03:11:07 +0000 (20:11 -0700)
committerHoward Chu <highlandsun@gmail.com>
Sun, 4 Sep 2011 03:12:09 +0000 (20:12 -0700)
libraries/libmdb/mdb.c

index 32beaaf54ee46b16aa29026026a48fde4cb121d2..ae2affcfdc771b00a0e761266c71997f1e6b1eef 100644 (file)
@@ -2572,6 +2572,7 @@ set2:
                                int ex2, *ex2p;
                                if (op == MDB_GET_BOTH) {
                                        ex2p = &ex2;
+                                       ex2 = 0;
                                } else {
                                        ex2p = NULL;
                                }
@@ -3654,34 +3655,32 @@ mdb_split(MDB_txn *txn, MDB_dbi dbi, MDB_page **mpp, unsigned int *newindxp,
                /* Maximum free space in an empty page */
                pmax = txn->mt_env->me_psize - PAGEHDRSZ;
                nsize = mdb_leaf_size(txn->mt_env, newkey, newdata);
-               if (newindx <= split_indx) {
-split1:
+               if (newindx < split_indx) {
                        psize = nsize;
                        for (i=0; i<split_indx; i++) {
                                node = NODEPTR(&mdp->p, i);
-                               psize += NODESIZE + NODEKSZ(node);
+                               psize += NODESIZE + NODEKSZ(node) + sizeof(indx_t);
                                if (F_ISSET(node->mn_flags, F_BIGDATA))
                                        psize += sizeof(pgno_t);
                                else
                                        psize += NODEDSZ(node);
                                if (psize > pmax) {
-                                       split_indx--;
-                                       goto split1;
+                                       split_indx = i;
+                                       break;
                                }
                        }
                } else {
-split2:
                        psize = nsize;
-                       for (i=split_indx; i<nkeys; i++) {
+                       for (i=nkeys-1; i>=split_indx; i--) {
                                node = NODEPTR(&mdp->p, i);
-                               psize += NODESIZE + NODEKSZ(node);
+                               psize += NODESIZE + NODEKSZ(node) + sizeof(indx_t);
                                if (F_ISSET(node->mn_flags, F_BIGDATA))
                                        psize += sizeof(pgno_t);
                                else
                                        psize += NODEDSZ(node);
                                if (psize > pmax) {
-                                       split_indx++;
-                                       goto split2;
+                                       split_indx = i+1;
+                                       break;
                                }
                        }
                }