public void InsertVariableSizeItemAfterDelete() { int pageSize = 4096; var dummyPageManager = new FileSystemPageManager(pageSize); var p = new Page(dummyPageManager, 0, new byte[pageSize]); var header = new RadixTreeNodesPageHeader { FreeSpace = (ushort)PageFormatter.GetMaximalFreeSpace((PageSize)p.Length) }; PageFormatter.InitPage(p, header); var r = new Random(); var items = new List <byte[]>(); var item = new byte[r.Next(100) + 1]; r.NextBytes(item); short itemIndex = 0; while (itemIndex != -1) { itemIndex = PageFormatter.AddVariableSizeItem(p, item); items.Add(item); item = new byte[r.Next(100) + 1]; r.NextBytes(item); } bool hasRemainingItems; // replace with the same PageFormatter.DeleteVariableSizeItem(p, 1, out hasRemainingItems); Assert.AreEqual(1, PageFormatter.AddVariableSizeItem(p, items[1])); item = PageFormatter.ReadVariableSizeItem(p, 1); Assert.IsTrue(AreEqualByteArrays(items[1], item)); // replace with smaller one PageFormatter.DeleteVariableSizeItem(p, 1, out hasRemainingItems); var smallItem = new byte[items[1].Length / 2 + 1]; r.NextBytes(smallItem); Assert.AreEqual(1, PageFormatter.AddVariableSizeItem(p, smallItem)); item = PageFormatter.ReadVariableSizeItem(p, 1); Assert.IsTrue(AreEqualByteArrays(smallItem, item)); // and put original again PageFormatter.DeleteVariableSizeItem(p, 1, out hasRemainingItems); PageFormatter.AddVariableSizeItem(p, items[1]); item = PageFormatter.ReadVariableSizeItem(p, 1); Assert.IsTrue(AreEqualByteArrays(items[1], item)); }
public void PageHasNoRemainingItemsAfterDelete() { int pageSize = 4096; var dummyPageManager = new FileSystemPageManager(pageSize); var p = new Page(dummyPageManager, 0, new byte[pageSize]); var header = new RadixTreeNodesPageHeader { FreeSpace = (ushort)PageFormatter.GetMaximalFreeSpace((PageSize)p.Length) }; PageFormatter.InitPage(p, header); var r = new Random(); var items = new List <byte[]>(); var item = new byte[r.Next(100) + 1]; r.NextBytes(item); short itemIndex = 0; while (itemIndex != -1) { itemIndex = PageFormatter.AddVariableSizeItem(p, item); if (itemIndex == -1) { continue; } items.Add(item); item = new byte[r.Next(100) + 1]; r.NextBytes(item); } bool hasRemainingItems; for (short i = 0; i < items.Count; i++) { PageFormatter.DeleteVariableSizeItem(p, i, out hasRemainingItems); if (i < items.Count - 1) { Assert.IsTrue(hasRemainingItems); } else { Assert.IsFalse(hasRemainingItems); } } }
public void ReadVariableSizeItems() { int pageSize = 4096; var dummyPageManager = new FileSystemPageManager(pageSize); var p = new Page(dummyPageManager, 0, new byte[pageSize]); var header = new RadixTreeNodesPageHeader { FreeSpace = (ushort)PageFormatter.GetMaximalFreeSpace((PageSize)p.Length) }; PageFormatter.InitPage(p, header); var r = new Random(); var items = new List <byte[]>(); var item = new byte[r.Next(100) + 1]; r.NextBytes(item); while (PageFormatter.AddVariableSizeItem(p, item) != -1) { items.Add(item); item = new byte[r.Next(100) + 1]; r.NextBytes(item); } for (short i = 0; i < items.Count; i++) { item = PageFormatter.ReadVariableSizeItem(p, i); Assert.IsTrue(AreEqualByteArrays(items[i], item)); } bool hasRemainingItems; PageFormatter.DeleteVariableSizeItem(p, 0, out hasRemainingItems); PageFormatter.DeleteVariableSizeItem(p, 2, out hasRemainingItems); PageFormatter.DeleteVariableSizeItem(p, (short)(items.Count - 1), out hasRemainingItems); Assert.Throws <PageFormatException>(() => PageFormatter.ReadVariableSizeItem(p, 0)); Assert.Throws <PageFormatException>(() => PageFormatter.ReadVariableSizeItem(p, 2)); Assert.Throws <PageFormatException>(() => PageFormatter.ReadVariableSizeItem(p, (short)(items.Count - 1))); }
protected override void Init() { base.Init(); //add access-method page IPage amPage = PageManager.CreatePage(); Debug.Assert(amPage.Index == 2, "The first access method page should have index 2"); var header = new RadixTreeNodesPageHeader { FreeSpace = (ushort)PageFormatter.GetMaximalFreeSpace((PageSize)PageManager.PageSize) }; PageFormatter.InitPage(amPage, header); PageManager.UpdatePage(amPage); }