/// <summary> /// Delete one dataBlock /// </summary> public DataBlock Delete(CollectionPage col, PageAddress blockAddress) { // get page and mark as dirty var page = _pager.GetPage <DataPage>(blockAddress.PageID); var block = page.GetBlock(blockAddress.Index); // if there a extended page, delete all if (block.ExtendPageID != uint.MaxValue) { _pager.DeletePage(block.ExtendPageID, true); } // delete block inside page page.DeleteBlock(block); // set page as dirty here _pager.SetDirty(page); // if there is no more datablocks, lets delete all page if (page.BlocksCount == 0) { // first, remove from free list _pager.AddOrRemoveToFreeList(false, page, col, ref col.FreeDataPageID); _pager.DeletePage(page.PageID); } else { // add or remove to free list _pager.AddOrRemoveToFreeList(page.FreeBytes > DataPage.DATA_RESERVED_BYTES, page, col, ref col.FreeDataPageID); } col.DocumentCount--; // mark collection page as dirty _pager.SetDirty(col); return(block); }
internal void Write(PageAddress value) { this.Write(value.PageID); this.Write(value.Index); }
/// <summary> /// Get a data block from a DataPage using address /// </summary> public DataBlock GetBlock(PageAddress blockAddress) { var page = _pager.GetPage <DataPage>(blockAddress.PageID); return(page.GetBlock(blockAddress.Index)); }