/// <summary> /// Builds the allocation chain following an interval /// </summary> /// <param name="database">The database.</param> /// <param name="pageAddress">The page address.</param> protected virtual void BuildChain(Database database, PageAddress pageAddress) { var page = new AllocationPage(database, pageAddress); if (page.Header.PageType == PageType.Iam) { //throw new ArgumentException(); } Pages.Add(page); SinglePageSlots.AddRange(page.SinglePageSlots); interval = Database.AllocationInterval; var pageCount = (int)Math.Ceiling(database.FileSize(pageAddress.FileId) / (decimal)interval); if (pageCount > 1) { for (var i = 1; i < pageCount; i++) { Pages.Add(new AllocationPage(database, new PageAddress(pageAddress.FileId, pageAddress.PageId + (i * interval)))); } } }
/// <summary> /// Initializes a new instance of the <see cref="Allocation"/> class. /// </summary> /// <param name="page">The page.</param> public Allocation(AllocationPage page) { FileId = page.PageAddress.FileId; MultiFile = false; Pages.Add(page); interval = Database.AllocationInterval; SinglePageSlots.AddRange(page.SinglePageSlots); }
/// <summary> /// Refreshes this instance. /// </summary> public void Refresh() { SinglePageSlots.Clear(); foreach (var page in Pages) { page.Refresh(); SinglePageSlots.AddRange(page.SinglePageSlots); } }
/// <summary> /// Builds an allocation chain based on linkage through the headers. /// </summary> /// <param name="database"></param> /// <param name="pageAddress"></param> protected new void BuildChain(Database database, PageAddress pageAddress) { var page = new AllocationPage(database, pageAddress); Pages.Add(page); SinglePageSlots.AddRange(page.SinglePageSlots); if (page.Header.NextPage != PageAddress.Empty) { BuildChain(database, page.Header.NextPage); } }