コード例 #1
0
        public void HeaderPage_Savepoint()
        {
            var data   = new byte[Constants.PAGE_SIZE];
            var buffer = new PageBuffer(data, 0, 1);

            // mark buffer as writable (debug propose)
            buffer.ShareCounter = Constants.BUFFER_WRITABLE;

            // create new header page
            var header = new HeaderPage(buffer, 0);

            header.InsertCollection("my-col1", 1);
            header.InsertCollection("my-col2", 2);

            header.GetCollections().Count().Should().Be(2);

            // savepoint alse execute UpdateBuffer
            var sp = header.Savepoint();

            header.DeleteCollection("my-col1");
            header.DeleteCollection("my-col2");

            header.UpdateBuffer();

            header.GetCollections().Count().Should().Be(0);

            // now, restore header
            header.Restore(sp);

            header.GetCollections().Count().Should().Be(2);

            buffer.ShareCounter = 0;
        }
コード例 #2
0
ファイル: BasePage_Tests.cs プロジェクト: mercan01/LiteDB
        public void BasePage_Insert_Full_Items_Page()
        {
            // create new memory area
            var data   = new byte[Constants.PAGE_SIZE];
            var buffer = new PageBuffer(data, 0, 1);

            // mark buffer as writable (debug propose)
            buffer.ShareCounter = Constants.BUFFER_WRITABLE;

            // create new base page
            var page = new BasePage(buffer, 1, PageType.Empty);

            // create 255 page segments
            for (byte i = 0; i < byte.MaxValue; i++)
            {
                page.Insert(10, out var index).Fill(i);
            }

            Assert.AreEqual(255, page.ItemsCount);
            Assert.AreEqual(2550, page.UsedBytes);
            Assert.AreEqual(0, page.FreeBytes);
            Assert.AreEqual(32 + 2550, page.NextFreePosition);

            buffer.ShareCounter = 0;
        }
コード例 #3
0
        public void HeaderPage_Collections()
        {
            var data   = new byte[Constants.PAGE_SIZE];
            var buffer = new PageBuffer(data, 0, 1);

            // mark buffer as writable (debug propose)
            buffer.ShareCounter = Constants.BUFFER_WRITABLE;

            // create new header page
            var header = new HeaderPage(buffer, 0);

            header.InsertCollection("my-col1", 1);
            header.InsertCollection("my-col2", 2);

            header.GetCollections().Count().Should().Be(2);
            ((int)header.GetCollectionPageID("my-col1")).Should().Be(1);
            ((int)header.GetCollectionPageID("my-col2")).Should().Be(2);
            header.GetAvaiableCollectionSpace().Should().Be(7981);

            header.UpdateBuffer();

            // read header
            var h2 = new HeaderPage(buffer);

            h2.GetCollections().Count().Should().Be(2);
            ((int)h2.GetCollectionPageID("my-col1")).Should().Be(1);
            ((int)h2.GetCollectionPageID("my-col2")).Should().Be(2);
            h2.GetAvaiableCollectionSpace().Should().Be(7981);

            buffer.ShareCounter = 0;
        }
コード例 #4
0
ファイル: Pragma_Tests.cs プロジェクト: swpuzhang/LiteDB
        public void Pragma_RunTests()
        {
            var data   = new byte[Constants.PAGE_SIZE];
            var buffer = new PageBuffer(data, 0, 1);

            // mark buffer as writable (debug propose)
            buffer.ShareCounter = Constants.BUFFER_WRITABLE;

            // create new header page
            var header = new HeaderPage(buffer, 0);


            this.Invoking(x => header.Pragmas.Get("INEXISTENT_PRAGMA")).Should().Throw <Exception>();

            this.Invoking(x => header.Pragmas.Set("USER_VERSION", "invalid value", true)).Should().Throw <Exception>();
            this.Invoking(x => header.Pragmas.Set("USER_VERSION", 1, true)).Should().NotThrow();

            this.Invoking(x => header.Pragmas.Set("COLLATION", "en-US/IgnoreCase", true)).Should().Throw <Exception>();

            this.Invoking(x => header.Pragmas.Set("TIMEOUT", -1, true)).Should().Throw <Exception>();
            this.Invoking(x => header.Pragmas.Set("TIMEOUT", 1, true)).Should().NotThrow();

            this.Invoking(x => header.Pragmas.Set("LIMIT_SIZE", 1000, true)).Should().Throw <Exception>();
            this.Invoking(x => header.Pragmas.Set("LIMIT_SIZE", (Convert.ToInt32(header.LastPageID)) * Constants.PAGE_SIZE - 1, true)).Should().Throw <Exception>();
            this.Invoking(x => header.Pragmas.Set("LIMIT_SIZE", 1024L * 1024L * 1024L * 1024L, true)).Should().NotThrow();

            this.Invoking(x => header.Pragmas.Set("UTC_DATE", true, true)).Should().NotThrow();

            this.Invoking(x => header.Pragmas.Set("CHECKPOINT", -1, true)).Should().Throw <Exception>();
        }
コード例 #5
0
ファイル: Pragma_Tests.cs プロジェクト: zamis/LiteDB
        public void Pragma_RunTests()
        {
            var data   = new byte[Constants.PAGE_SIZE];
            var buffer = new PageBuffer(data, 0, 1);

            // create new header page
            var header = new HeaderPage(buffer, 0);

            this.Invoking(x => header.Pragmas.Get("INEXISTENT_PRAGMA")).Should().Throw <Exception>();

            this.Invoking(x => header.Pragmas.Set(Pragmas.USER_VERSION, "invalid value", true)).Should().Throw <Exception>();
            this.Invoking(x => header.Pragmas.Set(Pragmas.USER_VERSION, 1, true)).Should().NotThrow();

            this.Invoking(x => header.Pragmas.Set(Pragmas.COLLATION, "en-US/IgnoreCase", true)).Should().Throw <Exception>();

            this.Invoking(x => header.Pragmas.Set(Pragmas.TIMEOUT, -1, true)).Should().Throw <Exception>();
            this.Invoking(x => header.Pragmas.Set(Pragmas.TIMEOUT, 1, true)).Should().NotThrow();

            this.Invoking(x => header.Pragmas.Set(Pragmas.LIMIT_SIZE, 1000, true)).Should().Throw <Exception>();
            this.Invoking(x => header.Pragmas.Set(Pragmas.LIMIT_SIZE, (Convert.ToInt32(header.LastPageID)) * Constants.PAGE_SIZE - 1, true)).Should().Throw <Exception>();
            this.Invoking(x => header.Pragmas.Set(Pragmas.LIMIT_SIZE, 1024L * 1024L * 1024L * 1024L, true)).Should().NotThrow();

            this.Invoking(x => header.Pragmas.Set(Pragmas.UTC_DATE, true, true)).Should().NotThrow();

            this.Invoking(x => header.Pragmas.Set(Pragmas.CHECKPOINT, -1, true)).Should().Throw <Exception>();
        }
コード例 #6
0
ファイル: BasePage_Tests.cs プロジェクト: mercan01/LiteDB
        public void BasePage_Delete()
        {
            var data   = new byte[Constants.PAGE_SIZE];
            var buffer = new PageBuffer(data, 0, 0);

            // mark buffer as writable (debug propose)
            buffer.ShareCounter = Constants.BUFFER_WRITABLE;

            // create new base page
            var page = new BasePage(buffer, 1, PageType.Empty);

            var seg0 = page.Insert(100, out var index0);
            var seg1 = page.Insert(200, out var index1);
            var seg2 = page.Insert(300, out var index2);

            Assert.AreEqual(2, page.HighestIndex);
            Assert.AreEqual(3, page.ItemsCount);
            Assert.AreEqual(600, page.UsedBytes);
            Assert.AreEqual(32 + 600, page.NextFreePosition);
            Assert.AreEqual(8192 - 32 - 12 - 600, page.FreeBytes); // page size - header - footer - used
            Assert.AreEqual(0, page.FragmentedBytes);

            // deleting 300b (end of page)
            page.Delete(index2);

            Assert.AreEqual(1, page.HighestIndex);
            Assert.AreEqual(2, page.ItemsCount);
            Assert.AreEqual(300, page.UsedBytes);
            Assert.AreEqual(32 + 300, page.NextFreePosition);
            Assert.AreEqual(8192 - 32 - 8 - 300, page.FreeBytes);
            Assert.AreEqual(0, page.FragmentedBytes);

            // deleting 100b (middle of page) - create data fragment
            page.Delete(index0);

            Assert.AreEqual(1, page.HighestIndex);
            Assert.AreEqual(1, page.ItemsCount);
            Assert.AreEqual(200, page.UsedBytes);
            Assert.AreEqual(32 + 300, page.NextFreePosition); // 200 + 100 (fragmented)
            Assert.AreEqual(8192 - 32 - 8 - 200, page.FreeBytes);
            Assert.AreEqual(100, page.FragmentedBytes);

            // delete 200b - last item
            page.Delete(index1);

            // after delete last item page will be defrag

            Assert.AreEqual(byte.MaxValue, page.HighestIndex);
            Assert.AreEqual(0, page.ItemsCount);
            Assert.AreEqual(0, page.UsedBytes);
            Assert.AreEqual(32, page.NextFreePosition);
            Assert.AreEqual(8192 - 32, page.FreeBytes);
            Assert.AreEqual(0, page.FragmentedBytes);

            buffer.ShareCounter = 0;
        }
コード例 #7
0
        private void ConsumeNewPages(int[] segmentSizes)
        {
            var m = new MemoryCache(segmentSizes);

            // Test some additional segments using last segment size more than once
            var totalSegments = segmentSizes.Sum() + 10;

            for (int i = 1; i <= totalSegments; i++)
            {
                PageBuffer p = m.NewPage();
                p.UniqueID.Should().Be(i);

                // Set ShareCounter to 0 to proper disposal (not needed in this test)
                p.ShareCounter = 0;
            }
        }
コード例 #8
0
ファイル: BasePage_Tests.cs プロジェクト: mercan01/LiteDB
        public void BasePage_Insert()
        {
            // create new memory area with 10 bytes offset (just for fun)
            var data   = new byte[Constants.PAGE_SIZE + 10];
            var buffer = new PageBuffer(data, 10, 1);

            // mark buffer as writable (debug propose)
            buffer.ShareCounter = Constants.BUFFER_WRITABLE;

            // create new base page
            var page = new BasePage(buffer, 1, PageType.Empty);

            page.Insert(10, out var index0).Fill(1);
            page.Insert(20, out var index1).Fill(2);
            page.Insert(30, out var index2).Fill(3);
            page.Insert(40, out var index3).Fill(4);

            Assert.AreEqual(0, page.FragmentedBytes);
            Assert.AreEqual(100, page.UsedBytes);
            Assert.AreEqual(32 + 100, page.NextFreePosition);
            Assert.AreEqual(4 * 4, page.FooterSize);
            Assert.AreEqual(8192 - 32 - 100 - (4 * 4), page.FreeBytes);

            Assert.IsTrue(page.Get(index0).All(1));
            Assert.IsTrue(page.Get(index1).All(2));
            Assert.IsTrue(page.Get(index2).All(3));
            Assert.IsTrue(page.Get(index3).All(4));

            // update header buffer
            page.UpdateBuffer();

            // let's create another page instance based on same page buffer
            var page2 = new BasePage(buffer);

            Assert.AreEqual(1, (int)page.PageID);
            Assert.AreEqual(PageType.Empty, page.PageType);

            Assert.IsTrue(page.Get(index0).All(1));
            Assert.IsTrue(page.Get(index1).All(2));
            Assert.IsTrue(page.Get(index2).All(3));
            Assert.IsTrue(page.Get(index3).All(4));

            buffer.ShareCounter = 0;
        }
コード例 #9
0
ファイル: BasePage_Tests.cs プロジェクト: zamis/LiteDB
        public void BasePage_Defrag()
        {
            var data   = new byte[Constants.PAGE_SIZE];
            var buffer = new PageBuffer(data, 0, 0);

            // mark buffer as writable (debug propose)
            buffer.ShareCounter = Constants.BUFFER_WRITABLE;

            var page = new BasePage(buffer, 1, PageType.Empty);

            page.Insert(100, out var index0).Fill(101);
            page.Insert(200, out var index1).Fill(102);
            page.Insert(300, out var index2).Fill(103);
            page.Insert(400, out var index3).Fill(104);

            page.FragmentedBytes.Should().Be(0);
            page.UsedBytes.Should().Be(1000);
            page.NextFreePosition.Should().Be(32 + 1000);

            page.Delete(index0);
            page.Delete(index1);

            page.FragmentedBytes.Should().Be(300);
            page.UsedBytes.Should().Be(700);
            page.NextFreePosition.Should().Be(32 + 1000);

            // fill all page
            page.Insert(7440, out var index4).Fill(105); // 8192 - 32 - (4 * 4) - 700

            page.FragmentedBytes.Should().Be(0);
            page.UsedBytes.Should().Be(8140);
            page.NextFreePosition.Should().Be(8172);

            page.Get(index2).All(103).Should().BeTrue();
            page.Get(index3).All(104).Should().BeTrue();
            page.Get(index4).All(105).Should().BeTrue();

            page.GetUsedIndexs().ToArray().Should().Equal(0, 2, 3);

            buffer.ShareCounter = 0;
        }
コード例 #10
0
ファイル: BasePage_Tests.cs プロジェクト: mercan01/LiteDB
        public void BasePage_Defrag()
        {
            var data   = new byte[Constants.PAGE_SIZE];
            var buffer = new PageBuffer(data, 0, 0);

            // mark buffer as writable (debug propose)
            buffer.ShareCounter = Constants.BUFFER_WRITABLE;

            var page = new BasePage(buffer, 1, PageType.Empty);

            page.Insert(100, out var index0).Fill(101);
            page.Insert(200, out var index1).Fill(102);
            page.Insert(300, out var index2).Fill(103);
            page.Insert(400, out var index3).Fill(104);

            Assert.AreEqual(0, page.FragmentedBytes);
            Assert.AreEqual(1000, page.UsedBytes);
            Assert.AreEqual(32 + 1000, page.NextFreePosition);

            page.Delete(index0);
            page.Delete(index1);

            Assert.AreEqual(300, page.FragmentedBytes);
            Assert.AreEqual(700, page.UsedBytes);
            Assert.AreEqual(32 + 1000, page.NextFreePosition);

            page.Defrag();

            Assert.AreEqual(0, page.FragmentedBytes);
            Assert.AreEqual(700, page.UsedBytes);
            Assert.AreEqual(32 + 700, page.NextFreePosition);

            Assert.IsTrue(page.Get(index2).All(103));
            Assert.IsTrue(page.Get(index3).All(104));

            CollectionAssert.AreEqual(new byte[] { 2, 3 }, page.GetUsedIndexs().ToArray());

            buffer.ShareCounter = 0;
        }
コード例 #11
0
ファイル: BasePage_Tests.cs プロジェクト: mercan01/LiteDB
        public void BasePage_Insert_Full_Bytes_Page()
        {
            // create new memory area
            var data   = new byte[Constants.PAGE_SIZE];
            var buffer = new PageBuffer(data, 0, 1);

            // mark buffer as writable (debug propose)
            buffer.ShareCounter = Constants.BUFFER_WRITABLE;

            // create new base page
            var page = new BasePage(buffer, 1, PageType.Empty);

            var full = page.FreeBytes - BasePage.SLOT_SIZE;

            page.Insert((ushort)full, out var index0).Fill(1);

            Assert.AreEqual(1, page.ItemsCount);
            Assert.AreEqual(full, page.UsedBytes);
            Assert.AreEqual(0, page.FreeBytes);
            Assert.AreEqual(32 + full, page.NextFreePosition);

            buffer.ShareCounter = 0;
        }
コード例 #12
0
ファイル: BasePage_Tests.cs プロジェクト: zamis/LiteDB
        public void BasePage_Test_Output()
        {
            var data   = new byte[Constants.PAGE_SIZE];
            var buffer = new PageBuffer(data, 0, 0);

            // mark buffer as writable (debug propose)
            buffer.ShareCounter = Constants.BUFFER_WRITABLE;

            var page = new BasePage(buffer, 1, PageType.Empty);

            page.Insert(100, out var index0).Fill(101);
            page.Insert(7900, out var index1).Fill(102);
            page.Insert(100, out var index2).Fill(103);

            page.FragmentedBytes.Should().Be(0);
            page.UsedBytes.Should().Be(8100);
            page.NextFreePosition.Should().Be(8132);

            page.Delete(index1);

            page.Insert(7948 - 4, out var index3).Fill(104);

            buffer.ShareCounter = 0;
        }
コード例 #13
0
ファイル: BasePage_Tests.cs プロジェクト: mercan01/LiteDB
        public void BasePage_Update()
        {
            var data   = new byte[Constants.PAGE_SIZE];
            var buffer = new PageBuffer(data, 0, 0);

            // mark buffer as writable (debug propose)
            buffer.ShareCounter = Constants.BUFFER_WRITABLE;

            var page = new BasePage(buffer, 1, PageType.Empty);

            page.Insert(100, out var index0).Fill(101);
            page.Insert(200, out var index1).Fill(102);
            page.Insert(300, out var index2).Fill(103);
            page.Insert(400, out var index3).Fill(104);

            Assert.AreEqual(0, page.FragmentedBytes);
            Assert.AreEqual(1000, page.UsedBytes);
            Assert.AreEqual(32 + 1000, page.NextFreePosition);

            // update same segment length
            page.Update(index0, 100).Fill(201);

            Assert.IsTrue(page.Get(index0).All(201));
            Assert.AreEqual(0, page.FragmentedBytes);
            Assert.AreEqual(1000, page.UsedBytes);
            Assert.AreEqual(32 + 1000, page.NextFreePosition);

            // less bytes (segment in middle of page)
            page.Update(index1, 150).Fill(202);

            Assert.IsTrue(page.Get(index1).All(202));
            Assert.AreEqual(50, page.FragmentedBytes);
            Assert.AreEqual(950, page.UsedBytes);
            Assert.AreEqual(32 + 1000, page.NextFreePosition);

            // less bytes (segment in end of page)
            page.Update(index3, 350).Fill(204);

            Assert.IsTrue(page.Get(index3).All(204));
            Assert.AreEqual(50, page.FragmentedBytes);
            Assert.AreEqual(900, page.UsedBytes);
            Assert.AreEqual(32 + 950, page.NextFreePosition);

            // more bytes (segment in end of page)
            page.Update(index3, 550).Fill(214);

            Assert.IsTrue(page.Get(index3).All(214));
            Assert.AreEqual(50, page.FragmentedBytes);
            Assert.AreEqual(1100, page.UsedBytes);
            Assert.AreEqual(32 + 1150, page.NextFreePosition);

            // more bytes (segment in middle of page)
            page.Update(index0, 200).Fill(211);

            Assert.IsTrue(page.Get(index0).All(211));
            Assert.AreEqual(150, page.FragmentedBytes);
            Assert.AreEqual(1200, page.UsedBytes);
            Assert.AreEqual(32 + 1350, page.NextFreePosition);

            buffer.ShareCounter = 0;
        }
コード例 #14
0
ファイル: BasePage_Tests.cs プロジェクト: zamis/LiteDB
        public void BasePage_Delete_Full()
        {
            var data   = new byte[Constants.PAGE_SIZE];
            var buffer = new PageBuffer(data, 0, 0);

            // mark buffer as writable (debug propose)
            buffer.ShareCounter = Constants.BUFFER_WRITABLE;

            // create new base page
            var page = new BasePage(buffer, 1, PageType.Empty);

            var seg0 = page.Insert(100, out var index0);
            var seg1 = page.Insert(200, out var index1);
            var seg2 = page.Insert(8192 - 32 - (100 + 200 + 8) - 4, out var index2); // 7848

            seg0.Fill(10);
            seg1.Fill(11);
            seg2.Fill(12);

            page.HighestIndex.Should().Be(2);
            page.ItemsCount.Should().Be(3);
            page.UsedBytes.Should().Be(8148);
            page.NextFreePosition.Should().Be(8180); // no next free position
            page.FreeBytes.Should().Be(0);           // full used
            page.FragmentedBytes.Should().Be(0);

            // deleting 200b (end of page)
            page.Delete(index1);

            page.HighestIndex.Should().Be(2);
            page.ItemsCount.Should().Be(2);
            page.UsedBytes.Should().Be(8148 - 200);
            page.NextFreePosition.Should().Be(8180);
            page.FreeBytes.Should().Be(200);
            page.FragmentedBytes.Should().Be(200);

            page.Delete(index0);

            page.HighestIndex.Should().Be(2);
            page.ItemsCount.Should().Be(1);
            page.UsedBytes.Should().Be(8148 - 200 - 100);
            page.NextFreePosition.Should().Be(8180);
            page.FreeBytes.Should().Be(300);
            page.FragmentedBytes.Should().Be(300);

            var seg3 = page.Insert(250, out var index3);

            seg3.Fill(13);

            page.HighestIndex.Should().Be(2);
            page.ItemsCount.Should().Be(2);
            page.UsedBytes.Should().Be(8148 - 200 - 100 + 250);
            page.NextFreePosition.Should().Be(8180 - 50);
            page.FreeBytes.Should().Be(50);
            page.FragmentedBytes.Should().Be(0);

            var seg3f = page.Get(index3);

            seg3f.All(13).Should().BeTrue();



            buffer.ShareCounter = 0;
        }