public void FixedSizeItemsPage() { int pageSize = 32768; var dummyPageManager = new FileSystemPageManager(pageSize); var p = new Page(dummyPageManager, 0, new byte[pageSize]); var header = new FixedSizeItemsPageHeader(); var r = new Random(); foreach (var sizeRange in EnumHelper.FixedSizeItemsSizeRanges()) { header.SizeRange = sizeRange; PageFormatter.InitPage(p, header); var item = new DbItem(new byte[DbItem.GetMaxSize(header.SizeRange)]); r.NextBytes(item.RawData); // fill the page with the items short count = 0; bool spaceRemains = true; while (PageFormatter.HasFreeSpaceForFixedSizeItem(p)) { Assert.IsTrue(spaceRemains); PageFormatter.AddFixedSizeItem(p, item, out spaceRemains); count++; Assert.AreEqual(count, PageFormatter.ReadFixedSizeItemsCount(p)); } Assert.IsFalse(spaceRemains); // check if fetched objects are equal to originals for (short j = 0; j < PageFormatter.ReadFixedSizeItemsCount(p); j++) { DbItem readItem = PageFormatter.ReadFixedSizeItem(p, j); Assert.IsTrue(AreEqualByteArrays(item.RawData, readItem.RawData)); } // delete all added items short itemindex = 0; while (PageFormatter.ReadFixedSizeItemsCount(p) > 0) { PageFormatter.DeleteFixedSizeItem(p, itemindex); count--; itemindex++; Assert.AreEqual(count, PageFormatter.ReadFixedSizeItemsCount(p)); } } }
private DbItemReference AllocateSinglePage(DbItem item) { DbItemReference result; IPage page; var fsmValue = EnumHelper.FsmValueFromSizeRange(item.SizeRange); var index = _fsm.GetFreePageIndex(fsmValue); bool spaceRemains; if (index != -1) { // place object to existing page page = _pageManager.FetchPage(index); result = PageFormatter.AddFixedSizeItem(page, item, out spaceRemains); if (!spaceRemains) { _fsm.Set(index, FsmValue.Full); } } else { // allocate on a new page page = _pageManager.CreatePage(); var header = new FixedSizeItemsPageHeader { SizeRange = item.SizeRange }; PageFormatter.InitPage(page, header); result = PageFormatter.AddFixedSizeItem(page, item, out spaceRemains); _fsm.Set(result.PageIndex, spaceRemains ? fsmValue : FsmValue.Full); } _pageManager.UpdatePage(page); return(result); }