newp = sp + 2^d; oldp = sp;
buf = getPage(f,sp);
clear(oldBuf); clear(newBuf);
for (i = 0; i < nTuples(buf); i++) {
tup = getTuple(buf,i);
p = bits(d+1,hash(tup.k));
if (p == newp)
addTuple(newBuf,tup);
else
addTuple(oldBuf,tup);
}
p = ovflow(buf); oldOv = newOv = 0;
while (p != NO_PAGE) {
ovbuf = getPage(ovf,p);
for (i = 0; i < nTuples(ovbuf); i++) {
tup = getTuple(buf,i);
p = bits(d+1,hash(tup.k));
if (p == newp) {
if (isFull(newBuf)) {
nextp = nextFree(ovf);
ovflow(newBuf) = nextp;
outf = newOv ? f : ovf;
writePage(outf, newp, newBuf);
newOv++; newp = nextp; clear(newBuf);
}
addTuple(newBuf, tup);
}
else {
if (isFull(oldBuf)) {
nextp = nextFree(ovf);
ovflow(oldBuf) = nextp;
outf = oldOv ? f : ovf;
writePage(outf, oldp, oldBuf);
oldOv++; oldp = nextp; clear(oldBuf);
}
addTuple(oldBuf, tup);
}
}
addToFreeList(ovf,p);
p = ovflow(buf);
}
sp++;
if (sp == 2^d) { d++; sp = 0; }
|