@@ -1613,6 +1613,13 @@ mdb_cursor_chk(MDB_cursor *mc)
1613
1613
}
1614
1614
if (mc -> mc_ki [i ] >= NUMKEYS (mc -> mc_pg [i ]))
1615
1615
printf ("ack!\n" );
1616
+ if (mc -> mc_xcursor && (mc -> mc_xcursor -> mx_cursor .mc_flags & C_INITIALIZED )) {
1617
+ node = NODEPTR (mc -> mc_pg [mc -> mc_top ], mc -> mc_ki [mc -> mc_top ]);
1618
+ if (((node -> mn_flags & (F_DUPDATA |F_SUBDATA )) == F_DUPDATA ) &&
1619
+ mc -> mc_xcursor -> mx_cursor .mc_pg [0 ] != NODEDATA (node )) {
1620
+ printf ("blah!\n" );
1621
+ }
1622
+ }
1616
1623
}
1617
1624
#endif
1618
1625
@@ -2423,10 +2430,10 @@ mdb_page_touch(MDB_cursor *mc)
2423
2430
m2 -> mc_pg [mc -> mc_top ] = np ;
2424
2431
if ((mc -> mc_db -> md_flags & MDB_DUPSORT ) &&
2425
2432
IS_LEAF (np ) &&
2426
- m2 -> mc_ki [ mc -> mc_top ] == mc -> mc_ki [ mc -> mc_top ] )
2433
+ ( m2 -> mc_xcursor -> mx_cursor . mc_flags & C_INITIALIZED ) )
2427
2434
{
2428
- MDB_node * leaf = NODEPTR (np , mc -> mc_ki [mc -> mc_top ]);
2429
- if (! (leaf -> mn_flags & F_SUBDATA ))
2435
+ MDB_node * leaf = NODEPTR (np , m2 -> mc_ki [mc -> mc_top ]);
2436
+ if ((leaf -> mn_flags & ( F_DUPDATA | F_SUBDATA )) == F_DUPDATA )
2430
2437
m2 -> mc_xcursor -> mx_cursor .mc_pg [0 ] = NODEDATA (leaf );
2431
2438
}
2432
2439
}
@@ -7623,6 +7630,7 @@ mdb_node_move(MDB_cursor *csrc, MDB_cursor *cdst, int fromleft)
7623
7630
data .mv_size = NODEDSZ (srcnode );
7624
7631
data .mv_data = NODEDATA (srcnode );
7625
7632
}
7633
+ mn .mc_xcursor = NULL ;
7626
7634
if (IS_BRANCH (cdst -> mc_pg [cdst -> mc_top ]) && cdst -> mc_ki [cdst -> mc_top ] == 0 ) {
7627
7635
unsigned int snum = cdst -> mc_snum ;
7628
7636
MDB_node * s2 ;
@@ -7694,6 +7702,12 @@ mdb_node_move(MDB_cursor *csrc, MDB_cursor *cdst, int fromleft)
7694
7702
m3 -> mc_ki [csrc -> mc_top ] = cdst -> mc_ki [cdst -> mc_top ];
7695
7703
m3 -> mc_ki [csrc -> mc_top - 1 ]++ ;
7696
7704
}
7705
+ if (m3 -> mc_xcursor && (m3 -> mc_xcursor -> mx_cursor .mc_flags & C_INITIALIZED ) &&
7706
+ IS_LEAF (mps )) {
7707
+ MDB_node * node = NODEPTR (m3 -> mc_pg [csrc -> mc_top ], m3 -> mc_ki [csrc -> mc_top ]);
7708
+ if ((node -> mn_flags & (F_DUPDATA |F_SUBDATA )) == F_DUPDATA )
7709
+ m3 -> mc_xcursor -> mx_cursor .mc_pg [0 ] = NODEDATA (node );
7710
+ }
7697
7711
}
7698
7712
} else
7699
7713
/* Adding on the right, bump others down */
@@ -7714,6 +7728,12 @@ mdb_node_move(MDB_cursor *csrc, MDB_cursor *cdst, int fromleft)
7714
7728
} else {
7715
7729
m3 -> mc_ki [csrc -> mc_top ]-- ;
7716
7730
}
7731
+ if (m3 -> mc_xcursor && (m3 -> mc_xcursor -> mx_cursor .mc_flags & C_INITIALIZED ) &&
7732
+ IS_LEAF (mps )) {
7733
+ MDB_node * node = NODEPTR (m3 -> mc_pg [csrc -> mc_top ], m3 -> mc_ki [csrc -> mc_top ]);
7734
+ if ((node -> mn_flags & (F_DUPDATA |F_SUBDATA )) == F_DUPDATA )
7735
+ m3 -> mc_xcursor -> mx_cursor .mc_pg [0 ] = NODEDATA (node );
7736
+ }
7717
7737
}
7718
7738
}
7719
7739
}
@@ -7838,6 +7858,7 @@ mdb_page_merge(MDB_cursor *csrc, MDB_cursor *cdst)
7838
7858
MDB_cursor mn ;
7839
7859
MDB_node * s2 ;
7840
7860
mdb_cursor_copy (csrc , & mn );
7861
+ mn .mc_xcursor = NULL ;
7841
7862
/* must find the lowest key below src */
7842
7863
rc = mdb_page_search_lowest (& mn );
7843
7864
if (rc )
@@ -7913,6 +7934,12 @@ mdb_page_merge(MDB_cursor *csrc, MDB_cursor *cdst)
7913
7934
m3 -> mc_ki [top - 1 ] > csrc -> mc_ki [top - 1 ]) {
7914
7935
m3 -> mc_ki [top - 1 ]-- ;
7915
7936
}
7937
+ if (m3 -> mc_xcursor && (m3 -> mc_xcursor -> mx_cursor .mc_flags & C_INITIALIZED ) &&
7938
+ IS_LEAF (psrc )) {
7939
+ MDB_node * node = NODEPTR (m3 -> mc_pg [top ], m3 -> mc_ki [top ]);
7940
+ if ((node -> mn_flags & (F_DUPDATA |F_SUBDATA )) == F_DUPDATA )
7941
+ m3 -> mc_xcursor -> mx_cursor .mc_pg [0 ] = NODEDATA (node );
7942
+ }
7916
7943
}
7917
7944
}
7918
7945
{
@@ -8171,6 +8198,11 @@ mdb_cursor_del0(MDB_cursor *mc)
8171
8198
else if (mc -> mc_db -> md_flags & MDB_DUPSORT )
8172
8199
m3 -> mc_xcursor -> mx_cursor .mc_flags &= ~C_INITIALIZED ;
8173
8200
}
8201
+ if (m3 -> mc_xcursor && (m3 -> mc_xcursor -> mx_cursor .mc_flags & C_INITIALIZED )) {
8202
+ MDB_node * node = NODEPTR (m3 -> mc_pg [mc -> mc_top ], m3 -> mc_ki [mc -> mc_top ]);
8203
+ if ((node -> mn_flags & (F_DUPDATA |F_SUBDATA )) == F_DUPDATA )
8204
+ m3 -> mc_xcursor -> mx_cursor .mc_pg [0 ] = NODEDATA (node );
8205
+ }
8174
8206
}
8175
8207
}
8176
8208
}
@@ -8353,6 +8385,7 @@ mdb_page_split(MDB_cursor *mc, MDB_val *newkey, MDB_val *newdata, pgno_t newpgno
8353
8385
}
8354
8386
8355
8387
mdb_cursor_copy (mc , & mn );
8388
+ mn .mc_xcursor = NULL ;
8356
8389
mn .mc_pg [mn .mc_top ] = rp ;
8357
8390
mn .mc_ki [ptop ] = mc -> mc_ki [ptop ]+ 1 ;
8358
8391
@@ -8683,6 +8716,12 @@ mdb_page_split(MDB_cursor *mc, MDB_val *newkey, MDB_val *newdata, pgno_t newpgno
8683
8716
m3 -> mc_ki [ptop ] >= mc -> mc_ki [ptop ]) {
8684
8717
m3 -> mc_ki [ptop ]++ ;
8685
8718
}
8719
+ if (m3 -> mc_xcursor && (m3 -> mc_xcursor -> mx_cursor .mc_flags & C_INITIALIZED ) &&
8720
+ IS_LEAF (mp )) {
8721
+ MDB_node * node = NODEPTR (m3 -> mc_pg [mc -> mc_top ], m3 -> mc_ki [mc -> mc_top ]);
8722
+ if ((node -> mn_flags & (F_DUPDATA |F_SUBDATA )) == F_DUPDATA )
8723
+ m3 -> mc_xcursor -> mx_cursor .mc_pg [0 ] = NODEDATA (node );
8724
+ }
8686
8725
}
8687
8726
}
8688
8727
DPRINTF (("mp left: %d, rp left: %d" , SIZELEFT (mp ), SIZELEFT (rp )));
0 commit comments