/// <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, true); var block = page.DataBlocks[blockAddress.Index]; // mark collection page as dirty _pager.SetDirty(col); // if there a extended page, delete all if (block.ExtendPageID != uint.MaxValue) { _pager.DeletePage(block.ExtendPageID, true); } // delete block inside page page.DataBlocks.Remove(block.Position.Index); // update freebytes + itemcount page.UpdateItemCount(); // if there is no more datablocks, lets delete the page if (page.DataBlocks.Count == 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--; return(block); }
public static string Dump(this PageAddress address) { return(address.PageID.Dump() + ":" + address.Index.Dump()); }
public void Write(PageAddress value) { this.Write(value.PageID); this.Write(value.Index); }