예제 #1
0
        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;
        }
예제 #2
0
 public TreeDataInTransaction(Tree tree)
 {
     _tree  = tree;
     _state = _tree.State.Clone();
 }