*
* @param pagenumber
* the number of the page to be released!
*/
public void releasePage(final int pagenumber) {
this.bufferManager.releasePage(new PageAddress(pagenumber, this.filename));
if (pagenumber == this.maxNumberPages) {
this.maxNumberPages--;
this.storeMaxNumberPagesAndFreePageBeforeEndOfFile();
} else {
// store the released page on the first page
// (or one of its succeeding pages)
int index = 0;
try {
byte[] currentPage = this.bufferManager.getPage(this.pagesize, new PageAddress(index, this.filename));
do {
int max = (0xFF & currentPage[4]) << 8 | (0xFF & currentPage[5]);
if (max + 4 < this.pagesize) {
final byte[] newPage = new byte[max + 4];
System.arraycopy(currentPage, 0, newPage, 0, max);
int number = pagenumber;
newPage[max + 3] = (byte) number;
number >>>= 8;
newPage[max + 2] = (byte) number;
number >>>= 8;
newPage[max + 1] = (byte) number;
number >>>= 8;
newPage[max] = (byte) number;
max += 4;
newPage[5] = (byte) max;
newPage[4] = (byte) (max >>> 8);
this.freePageBeforeEndOfFile = true;
this.storeMaxNumberPagesAndFreePageBeforeEndOfFile();
this.bufferManager.modifyPage(this.pagesize, new PageAddress(index, this.filename), newPage);
return;
}
final int oldindex = index;
index = (((0xFF & currentPage[0]) << 8 | (0xFF & currentPage[1])) << 8 | (0xFF & currentPage[2])) << 8 | (0xFF & currentPage[3]);
if (index == 0) {
// prepare to store more released pages
// by preparing the page pagenumber
// to store more released pages.
int number = pagenumber;
currentPage[3] = (byte) number;
number >>>= 8;
currentPage[2] = (byte) number;
number >>>= 8;
currentPage[1] = (byte) number;
number >>>= 8;
currentPage[0] = (byte) number;
this.bufferManager.modifyPage(this.pagesize, new PageAddress(oldindex, this.filename), currentPage);
currentPage = new byte[6];
currentPage[0] = (byte) 0;
currentPage[1] = (byte) 0;
currentPage[2] = (byte) 0;
currentPage[3] = (byte) 0;
currentPage[4] = (byte) 0;
currentPage[5] = (byte) 6;
this.freePageBeforeEndOfFile = true;
this.storeMaxNumberPagesAndFreePageBeforeEndOfFile();
this.bufferManager.modifyPage(this.pagesize, new PageAddress(pagenumber, this.filename), currentPage);
return;
} else {
currentPage = this.bufferManager.getPage(this.pagesize, new PageAddress(index, this.filename));
}
} while (true);
} catch (final IOException e) {
System.err.println(e);
e.printStackTrace();