mirror of
https://git.openldap.org/openldap/openldap.git
synced 2024-12-21 03:10:25 +08:00
Guarantee nodes are 2-byte aligned
Also fix xcursor_init1 md_dirty flag Also another mdb_cmp refactoring fix
This commit is contained in:
parent
293df78b2b
commit
5e6a864513
@ -2661,7 +2661,7 @@ set3:
|
||||
MDB_val d2;
|
||||
if ((rc = mdb_read_data(cursor->mc_txn, leaf, &d2)) != MDB_SUCCESS)
|
||||
return rc;
|
||||
rc = cursor->mc_txn->mt_dbxs[cursor->mc_dbi].md_cmp(data, &d2);
|
||||
rc = cursor->mc_txn->mt_dbxs[cursor->mc_dbi].md_dcmp(data, &d2);
|
||||
if (rc) {
|
||||
if (op == MDB_GET_BOTH || rc > 0)
|
||||
return MDB_NOTFOUND;
|
||||
@ -3125,7 +3125,7 @@ mdb_cursor_del(MDB_cursor *mc, unsigned int flags)
|
||||
MDB_pageparent mp2;
|
||||
|
||||
if (flags != MDB_NODUPDATA) {
|
||||
/* mdb_xcursor_init2(mc); */
|
||||
mdb_xcursor_init2(mc);
|
||||
rc = mdb_cursor_del(&mc->mc_xcursor->mx_cursor, 0);
|
||||
mdb_xcursor_fini(mc);
|
||||
/* If sub-DB still has entries, we're done */
|
||||
@ -3251,6 +3251,7 @@ mdb_leaf_size(MDB_env *env, MDB_val *key, MDB_val *data)
|
||||
/* put on overflow page */
|
||||
sz -= data->mv_size - sizeof(pgno_t);
|
||||
}
|
||||
sz += sz & 1;
|
||||
|
||||
return sz + sizeof(indx_t);
|
||||
}
|
||||
@ -3326,6 +3327,7 @@ mdb_add_node(MDB_txn *txn, MDB_dbi dbi, MDB_page *mp, indx_t indx,
|
||||
node_size += data->mv_size;
|
||||
}
|
||||
}
|
||||
node_size += node_size & 1;
|
||||
|
||||
if (node_size + sizeof(indx_t) > SIZELEFT(mp)) {
|
||||
DPRINTF("not enough room in page %lu, got %u ptrs",
|
||||
@ -3408,6 +3410,7 @@ mdb_del_node(MDB_page *mp, indx_t indx, int ksize)
|
||||
else
|
||||
sz += NODEDSZ(node);
|
||||
}
|
||||
sz += sz & 1;
|
||||
|
||||
ptr = mp->mp_ptrs[indx];
|
||||
numkeys = NUMKEYS(mp);
|
||||
@ -3465,6 +3468,7 @@ mdb_xcursor_init1(MDB_cursor *mc, MDB_page *mp, MDB_node *node)
|
||||
mx->mx_dbs[1] = mc->mc_txn->mt_dbs[1];
|
||||
if (mc->mc_dbi > 1) {
|
||||
mx->mx_dbs[2] = mc->mc_txn->mt_dbs[mc->mc_dbi];
|
||||
mx->mx_dbxs[2].md_dirty = mc->mc_txn->mt_dbxs[mc->mc_dbi].md_dirty;
|
||||
dbn = 3;
|
||||
} else {
|
||||
dbn = 2;
|
||||
@ -3490,6 +3494,7 @@ mdb_xcursor_init2(MDB_cursor *mc)
|
||||
mx->mx_dbs[1] = mc->mc_txn->mt_dbs[1];
|
||||
if (mc->mc_dbi > 1) {
|
||||
mx->mx_dbs[2] = mc->mc_txn->mt_dbs[mc->mc_dbi];
|
||||
mx->mx_dbxs[2].md_dirty = mc->mc_txn->mt_dbxs[mc->mc_dbi].md_dirty;
|
||||
dbn = 3;
|
||||
} else {
|
||||
dbn = 2;
|
||||
@ -3506,8 +3511,6 @@ mdb_xcursor_fini(MDB_cursor *mc)
|
||||
mc->mc_txn->mt_next_pgno = mx->mx_txn.mt_next_pgno;
|
||||
mc->mc_txn->mt_dbs[0] = mx->mx_dbs[0];
|
||||
mc->mc_txn->mt_dbs[1] = mx->mx_dbs[1];
|
||||
mc->mc_txn->mt_dbxs[0].md_dirty = mx->mx_dbxs[0].md_dirty;
|
||||
mc->mc_txn->mt_dbxs[1].md_dirty = mx->mx_dbxs[1].md_dirty;
|
||||
if (mc->mc_dbi > 1) {
|
||||
mc->mc_txn->mt_dbs[mc->mc_dbi] = mx->mx_dbs[2];
|
||||
mc->mc_txn->mt_dbxs[mc->mc_dbi].md_dirty = mx->mx_dbxs[2].md_dirty;
|
||||
@ -4104,6 +4107,7 @@ mdb_split(MDB_txn *txn, MDB_dbi dbi, MDB_page **mpp, unsigned int *newindxp,
|
||||
psize += sizeof(pgno_t);
|
||||
else
|
||||
psize += NODEDSZ(node);
|
||||
psize += psize & 1;
|
||||
if (psize > pmax) {
|
||||
split_indx = i;
|
||||
break;
|
||||
@ -4118,6 +4122,7 @@ mdb_split(MDB_txn *txn, MDB_dbi dbi, MDB_page **mpp, unsigned int *newindxp,
|
||||
psize += sizeof(pgno_t);
|
||||
else
|
||||
psize += NODEDSZ(node);
|
||||
psize += psize & 1;
|
||||
if (psize > pmax) {
|
||||
split_indx = i+1;
|
||||
break;
|
||||
|
Loading…
Reference in New Issue
Block a user