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); }
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); }