Example #1
0
        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));
                }
            }
        }
Example #2
0
        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);
        }