public void should_read_and_write_records()
        {
            const ushort objectType = 128;

            var strings = new[]
            {
                "The short brown lazy dog couldn't jump over anything",
                "One, two, buckle my shoe",
                "YARD (Yet Another Relational Database)",
                "This is a test, one, two, three, testing",
                "Blah blah blah",
                "This should be on a second index page",
                "OK, I think that's enough now"
            };

            var transaction = _database.BeginTransaction(null);

            _pageStore.BeginTransaction(transaction);

            var firstPageNumber = _pageStore.GetFirstIndexPage(objectType);

            _accessor.Clear(firstPageNumber, transaction);

            foreach (var s in strings)
            {
                var buffer         = Encoding.UTF8.GetBytes(s);
                var recordLocation = _accessor.Append(firstPageNumber, transaction, (uint)buffer.LongLength);
                _accessor.Write(transaction, recordLocation, buffer);
            }

            _database.CommitTransaction(transaction);
            _pageStore.CommitTransaction(transaction);
            _pageStore.FinalizeTransaction(transaction);

            transaction = _database.BeginTransaction(null);
            _pageStore.BeginTransaction(transaction);

            Action <PageLocation, string> check = (location, expected) =>
            {
                Assert.IsNotNull(location);

                var data   = location.ReadAll(transaction, CacheHints.None);
                var actual = Encoding.UTF8.GetString(data);

                Assert.AreEqual(expected, actual);
            };

            var record = _accessor.LocateFirst(firstPageNumber, transaction, out object indexLocation);

            Assert.IsNotNull(record);

            foreach (var s in strings)
            {
                check(record, s);
                record = _accessor.LocateNext(firstPageNumber, transaction, indexLocation);
            }

            Assert.IsNull(record);

            _database.RollbackTransaction(transaction);
            _pageStore.RollbackTransaction(transaction);
        }
예제 #2
0
        public void should_isolate_transactions()
        {
            var transaction1 = _database.BeginTransaction(null);
            var transaction2 = _database.BeginTransaction(null);
            var transaction3 = _database.BeginTransaction(null);

            _pageStore.BeginTransaction(transaction1);
            _pageStore.BeginTransaction(transaction2);

            _pageStore.Update(
                transaction2, new[]
            {
                new PageUpdate
                {
                    SequenceNumber = 1,
                    PageNumber     = 1,
                    Offset         = 10,
                    Data           = new byte[] { 1, 2, 3 }
                }
            });

            _pageStore.BeginTransaction(transaction3);

            using (var page = _pageStore.Get(transaction1, 1, CacheHints.None))
            {
                Assert.AreEqual(0, page.Data[10]);
                Assert.AreEqual(0, page.Data[11]);
                Assert.AreEqual(0, page.Data[12]);
            }

            using (var page = _pageStore.Get(transaction2, 1, CacheHints.None))
            {
                Assert.AreEqual(1, page.Data[10]);
                Assert.AreEqual(2, page.Data[11]);
                Assert.AreEqual(3, page.Data[12]);
            }

            using (var page = _pageStore.Get(transaction3, 1, CacheHints.None))
            {
                Assert.AreEqual(0, page.Data[10]);
                Assert.AreEqual(0, page.Data[11]);
                Assert.AreEqual(0, page.Data[12]);
            }

            _pageStore.RollbackTransaction(transaction1);
            _pageStore.RollbackTransaction(transaction3);

            _database.CommitTransaction(transaction2);
            _pageStore.CommitTransaction(transaction2);
            _pageStore.FinalizeTransaction(transaction2);

            var transaction4 = _database.BeginTransaction(null);

            _pageStore.BeginTransaction(transaction4);

            using (var page = _pageStore.Get(transaction4, 1, CacheHints.None))
            {
                Assert.AreEqual(1, page.Data[10]);
                Assert.AreEqual(2, page.Data[11]);
                Assert.AreEqual(3, page.Data[12]);
            }

            _pageStore.RollbackTransaction(transaction4);
        }