@Override long getDiskSpaceUsed() { return index.getPageStore().getPageSize(); }
@Override public boolean canRemove() { return changeCount < index.getPageStore().getChangeCount(); }
@Override void setRowCountStored(int rowCount) { this.rowCount = rowCount; if (rowCountStored != rowCount) { rowCountStored = rowCount; index.getPageStore().logUndo(this, data); if (written) { changeCount = index.getPageStore().getChangeCount(); writeHead(); } index.getPageStore().update(this); } }
private void updateRowCount(int offset) { if (rowCount != UNKNOWN_ROWCOUNT) { rowCount += offset; } if (rowCountStored != UNKNOWN_ROWCOUNT) { rowCountStored = UNKNOWN_ROWCOUNT; index.getPageStore().logUndo(this, data); if (written) { writeHead(); } index.getPageStore().update(this); } }
/** * Change the parent page id. * * @param id the new parent page id */ void setParentPageId(int id) { index.getPageStore().logUndo(this, data); parentPageId = id; if (written) { changeCount = index.getPageStore().getChangeCount(); data.setInt(START_PARENT, parentPageId); } }
@Override void freeRecursive() { index.getPageStore().logUndo(this, data); index.getPageStore().free(getPos()); freeOverflow(); }
@Override public void write() { writeData(); index.getPageStore().writePage(getPos(), data); data.truncate(index.getPageStore().getPageSize()); }
private void addChild(int x, int childPageId, long key) { index.getPageStore().logUndo(this, data); written = false; changeCount = index.getPageStore().getChangeCount(); childPageIds = insert(childPageIds, entryCount + 1, x + 1, childPageId); keys = insert(keys, entryCount, x, key); entryCount++; length += 4 + Data.getVarLongLen(key); }
/** * Set the overflow page id. * * @param old the old overflow page id * @param overflow the new overflow page id */ void setOverflow(int old, int overflow) { if (SysProperties.CHECK && old != firstOverflowPageId) { DbException.throwInternalError("move " + this + " " + firstOverflowPageId); } index.getPageStore().logUndo(this, data); firstOverflowPageId = overflow; if (written) { changeCount = index.getPageStore().getChangeCount(); writeHead(); data.writeInt(firstOverflowPageId); } index.getPageStore().update(this); }
/** * Change the page id. * * @param id the new page id */ void setPageId(int id) { int old = getPos(); index.getPageStore().removeFromCache(getPos()); setPos(id); index.getPageStore().logUndo(this, null); remapChildren(old); }
private void memoryChange(boolean add, Row r) { int diff = r == null ? 0 : 4 + 8 + Constants.MEMORY_POINTER + r.getMemory(); memoryData += add ? diff : -diff; index.memoryChange((Constants.MEMORY_PAGE_DATA + memoryData + index.getPageStore().getPageSize()) >> 2); }
@Override void freeRecursive() { index.getPageStore().logUndo(this, data); index.getPageStore().free(getPos()); for (int i = 0; i < entryCount + 1; i++) { int child = childPageIds[i]; index.getPage(child, getPos()).freeRecursive(); } }
@Override public void write() { writeData(); index.getPageStore().writePage(getPos(), data); }
private void removeChild(int i) { index.getPageStore().logUndo(this, data); written = false; changeCount = index.getPageStore().getChangeCount(); int removedKeyIndex = i < entryCount ? i : i - 1; entryCount--; length -= 4 + Data.getVarLongLen(keys[removedKeyIndex]); if (entryCount < 0) { DbException.throwInternalError("" + entryCount); } keys = remove(keys, entryCount + 1, removedKeyIndex); childPageIds = remove(childPageIds, entryCount + 2, i); }
/** * Create a new page. * * @param index the index * @param pageId the page id * @param parentPageId the parent * @return the page */ static PageDataNode create(PageDataIndex index, int pageId, int parentPageId) { PageDataNode p = new PageDataNode(index, pageId, index.getPageStore().createData()); index.getPageStore().logUndo(p, null); p.parentPageId = parentPageId; p.writeHead(); // 4 bytes for the rightmost child page id p.length = p.data.length() + 4; return p; }
@Override boolean remove(long key) { int i = find(key); if (keys == null || keys[i] != key) { throw DbException.get(ErrorCode.ROW_NOT_FOUND_WHEN_DELETING_1, index.getSQL() + ": " + key + " " + (keys == null ? -1 : keys[i])); } index.getPageStore().logUndo(this, data); if (entryCount == 1) { freeRecursive(); return true; } removeRow(i); index.getPageStore().update(this); return false; }
@Override protected void remapChildren(int old) { if (firstOverflowPageId == 0) { return; } PageDataOverflow overflow = index.getPageOverflow(firstOverflowPageId); overflow.setParentPageId(getPos()); index.getPageStore().update(overflow); }
@Override protected void remapChildren(int old) { for (int i = 0; i < entryCount + 1; i++) { int child = childPageIds[i]; PageData p = index.getPage(child, old); p.setParentPageId(getPos()); index.getPageStore().update(p); } }
@Override PageData split(int splitPoint) { int newPageId = index.getPageStore().allocatePage(); PageDataLeaf p2 = PageDataLeaf.create(index, newPageId, parentPageId); while (splitPoint < entryCount) { int split = p2.addRowTry(getRowAt(splitPoint)); if (split != -1) { DbException.throwInternalError("split " + split); } removeRow(splitPoint); } return p2; }
@Override PageData split(int splitPoint) { int newPageId = index.getPageStore().allocatePage(); PageDataNode p2 = PageDataNode.create(index, newPageId, parentPageId); int firstChild = childPageIds[splitPoint]; while (splitPoint < entryCount) { p2.addChild(p2.entryCount, childPageIds[splitPoint + 1], keys[splitPoint]); removeChild(splitPoint); } int lastChild = childPageIds[splitPoint - 1]; removeChild(splitPoint - 1); childPageIds[splitPoint - 1] = lastChild; p2.childPageIds[0] = firstChild; p2.remapChildren(getPos()); return p2; }