/// <summary> /// Get a new empty page - can be a reused page (EmptyPage) or a clean one (extend datafile) /// </summary> public T NewPage <T>(BasePage prevPage = null) where T : BasePage { // get header var header = this.GetPage <HeaderPage>(0); var pageID = (uint)0; var diskData = new byte[0]; // try get page from Empty free list if (header.FreeEmptyPageID != uint.MaxValue) { var free = this.GetPage <BasePage>(header.FreeEmptyPageID); // remove page from empty list this.AddOrRemoveToFreeList(false, free, header, ref header.FreeEmptyPageID); pageID = free.PageID; // if used page has original disk data, copy to my new page if (free.DiskData.Length > 0) { diskData = free.DiskData; } } else { pageID = ++header.LastPageID; // set header page as dirty after increment LastPageID this.SetDirty(header); } var page = BasePage.CreateInstance <T>(pageID); // copy disk data from re-used page (or be an empty) page.DiskData = diskData; // add page to cache with correct T type (could be an old Empty page type) this.SetDirty(page); // if there a page before, just fix NextPageID pointer if (prevPage != null) { page.PrevPageID = prevPage.PageID; prevPage.NextPageID = page.PageID; this.SetDirty(prevPage); } return(page); }
/// <summary> /// Get a new empty page - can be a reused page (EmptyPage) or a clean one (extend datafile) /// Set as Dirty /// </summary> public T NewPage <T>(BasePage prevPage = null) where T : BasePage { // get header and mark as dirty var header = this.GetPage <HeaderPage>(0, true); var pageID = (uint)0; // try get page from Empty free list if (header.FreeEmptyPageID != uint.MaxValue) { var free = this.GetPage <BasePage>(header.FreeEmptyPageID); // remove page from empty list this.AddOrRemoveToFreeList(false, free, header, ref header.FreeEmptyPageID); pageID = free.PageID; } else { pageID = ++header.LastPageID; } var page = BasePage.CreateInstance <T>(pageID); // mark new page as dirty as soon as possible this.SetDirty(page); // if there a page before, just fix NextPageID pointer if (prevPage != null) { this.SetDirty(prevPage); page.PrevPageID = prevPage.PageID; prevPage.NextPageID = page.PageID; } return(page); }