/** * Add a page to the free list. The undo log entry must have been written. * * @param pageId the page id */ public synchronized void free(int pageId) { free(pageId, true); }
/** * Free this page and all data pages. Pages after the last used data page * (if within this list) are empty and therefore not just freed, but marked * as not used. * * @param lastUsedPage the last used data page * @return the number of pages freed */ int free(int lastUsedPage) { store.free(getPos(), false); int freed = 1; boolean notUsed = false; for (int i = 0; i < pageCount; i++) { int page = pageIds[i]; if (notUsed) { store.freeUnused(page); } else { store.free(page, false); } freed++; if (page == lastUsedPage) { notUsed = true; } } return freed; }
@Override public void moveTo(Session session, int newPos) { // the old data does not need to be copied, as free-list pages // at the end of the file are not required store.free(getPos(), false); }
/** * Free this page. */ void free() { store.logUndo(this, data); store.free(getPos()); }
@Override void freeRecursive() { index.getPageStore().logUndo(this, data); index.getPageStore().free(getPos()); }
@Override public void remove(Session session) { if (trace.isDebugEnabled()) { trace.debug("remove"); } removeAllRows(); store.free(rootPageId); store.removeMeta(this, session); }
@Override public void remove(Session session) { if (trace.isDebugEnabled()) { trace.debug("{0} remove", this); } removeAllRows(); store.free(rootPageId); store.removeMeta(this, session); }
/** * Free up all reserved pages. */ void freeReserved() { if (reservedPages.size() > 0) { int[] array = new int[reservedPages.size()]; reservedPages.toArray(array); reservedPages = new IntArray(); reserved = 0; for (int p : array) { store.free(p, false); } } }
@Override void freeRecursive() { index.getPageStore().logUndo(this, data); index.getPageStore().free(getPos()); freeOverflow(); }
@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).freeRecursive(); } }
@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 moveTo(Session session, int newPos) { PageStore store = index.getPageStore(); readAllRows(); PageBtreeLeaf p2 = PageBtreeLeaf.create(index, newPos, parentPageId); store.logUndo(this, data); store.logUndo(p2, null); p2.rows = rows; p2.entryCount = entryCount; p2.offsets = offsets; p2.onlyPosition = onlyPosition; p2.parentPageId = parentPageId; p2.start = start; store.update(p2); if (parentPageId == ROOT) { index.setRootPageId(session, newPos); } else { PageBtreeNode p = (PageBtreeNode) store.getPage(parentPageId); p.moveChild(getPos(), newPos); } store.free(getPos()); }
@Override boolean remove(long key) { int at = find(key); // merge is not implemented to allow concurrent usage // TODO maybe implement merge PageData page = index.getPage(childPageIds[at], getPos()); boolean empty = page.remove(key); index.getPageStore().logUndo(this, data); updateRowCount(-1); if (!empty) { // the first row didn't change - nothing to do return false; } // this child is now empty index.getPageStore().free(page.getPos()); if (entryCount < 1) { // no more children - this page is empty as well return true; } removeChild(at); index.getPageStore().update(this); return false; }
@Override public void moveTo(Session session, int newPos) { // load the pages into the cache, to ensure old pages // are written Page parent = store.getPage(parentPageId); if (parent == null) { throw DbException.throwInternalError(); } PageDataOverflow next = null; if (nextPage != 0) { next = (PageDataOverflow) store.getPage(nextPage); } store.logUndo(this, data); PageDataOverflow p2 = PageDataOverflow.create(store, newPos, type, parentPageId, nextPage, data, start, size); store.update(p2); if (next != null) { next.setParentPageId(newPos); store.update(next); } if (parent instanceof PageDataOverflow) { PageDataOverflow p1 = (PageDataOverflow) parent; p1.setNext(getPos(), newPos); } else { PageDataLeaf p1 = (PageDataLeaf) parent; p1.setOverflow(getPos(), newPos); } store.update(parent); store.free(getPos()); }
if (t == null) { if (it.canDelete()) { store.free(firstTrunkPage, false);
store.update(p); store.free(getPos());
store.update(p); store.free(getPos());
p.moveChild(getPos(), newPos); store.free(getPos());
} else if (last == row) { index.getPageStore().free(page.getPos()); if (entryCount < 1) {