mirror of
https://git.openldap.org/openldap/openldap.git
synced 2025-01-06 10:46:21 +08:00
Fix mdb_split, fix MDB_GET_BOTH
This commit is contained in:
parent
d38ef26425
commit
2197928aaa
@ -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;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user