internal void ShrinkOverflowPage(long pageNumber, int newSize, TreeMutableState treeState) { if (_disposed != TxState.None) { ThrowObjectDisposed(); } PageFromScratchBuffer value; if (_scratchPagesTable.TryGetValue(pageNumber, out value) == false) { throw new InvalidOperationException("The page " + pageNumber + " was not previous allocated in this transaction"); } var page = _env.ScratchBufferPool.ReadPage(this, value.ScratchFileNumber, value.PositionInScratchBuffer); if (page.IsOverflow == false || page.OverflowSize < newSize) { throw new InvalidOperationException("The page " + pageNumber + " was is not an overflow page greater than " + newSize); } var prevNumberOfPages = VirtualPagerLegacyExtensions.GetNumberOfOverflowPages(page.OverflowSize); page.OverflowSize = newSize; var lowerNumberOfPages = VirtualPagerLegacyExtensions.GetNumberOfOverflowPages(newSize); Debug.Assert(lowerNumberOfPages != 0); if (prevNumberOfPages == lowerNumberOfPages) { return; } for (int i = lowerNumberOfPages; i < prevNumberOfPages; i++) { FreePage(page.PageNumber + i); } // need to set the proper number of pages in the scratch page var shrinked = _env.ScratchBufferPool.ShrinkOverflowPage(value, lowerNumberOfPages); _scratchPagesTable[pageNumber] = shrinked; _transactionPages.Remove(value); _transactionPages.Add(shrinked); treeState.OverflowPages -= prevNumberOfPages - lowerNumberOfPages; }
public TreeDataInTransaction(Tree tree) { _tree = tree; _state = _tree.State.Clone(); }