]> git.sur5r.net Git - openldap/commitdiff
ITS#8062 also handle subcursors
authorHoward Chu <hyc@openldap.org>
Wed, 15 Apr 2015 23:19:40 +0000 (00:19 +0100)
committerHoward Chu <hyc@openldap.org>
Wed, 15 Apr 2015 23:20:28 +0000 (00:20 +0100)
libraries/liblmdb/mdb.c

index 36898d639fa3106ab55acaf6988f58b4492ccf7e..a95c7cdb5cd42ec2b4424c8a2426eb23c8768440 100644 (file)
@@ -7910,13 +7910,23 @@ mdb_rebalance(MDB_cursor *mc)
                if (mc->mc_ki[ptop] == 0) {
                        rc = mdb_page_merge(&mn, mc);
                } else {
+                       MDB_cursor dummy;
                        oldki += NUMKEYS(mn.mc_pg[mn.mc_top]);
                        mn.mc_ki[mn.mc_top] += mc->mc_ki[mn.mc_top] + 1;
                        /* We want mdb_rebalance to find mn when doing fixups */
-                       mn.mc_next = mc->mc_txn->mt_cursors[mc->mc_dbi];
-                       mc->mc_txn->mt_cursors[mc->mc_dbi] = &mn;
+                       if (mc->mc_flags & C_SUB) {
+                               dummy.mc_next = mc->mc_txn->mt_cursors[mc->mc_dbi];
+                               mc->mc_txn->mt_cursors[mc->mc_dbi] = &dummy;
+                               dummy.mc_xcursor = (MDB_xcursor *)&mn;
+                       } else {
+                               mn.mc_next = mc->mc_txn->mt_cursors[mc->mc_dbi];
+                               mc->mc_txn->mt_cursors[mc->mc_dbi] = &mn;
+                       }
                        rc = mdb_page_merge(mc, &mn);
-                       mc->mc_txn->mt_cursors[mc->mc_dbi] = mn.mc_next;
+                       if (mc->mc_flags & C_SUB)
+                               mc->mc_txn->mt_cursors[mc->mc_dbi] = dummy.mc_next;
+                       else
+                               mc->mc_txn->mt_cursors[mc->mc_dbi] = mn.mc_next;
                        mdb_cursor_copy(&mn, mc);
                }
                mc->mc_flags &= ~C_EOF;