]> 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:19:40 +0000 (00:19 +0100)
libraries/liblmdb/mdb.c

index 4bb7fee47c60a048be1f41353f2298338b9ebc65..c2ce4c4c6e2c50318b2d488bf87ddd752828954a 100644 (file)
@@ -7790,13 +7790,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;