public void ConcurrentlyRunningTransactionsViewTheirOwnVersions()
        {
            var memoryManager = new MemoryManager();

            var content    = new byte[] { 0, 1 };
            var newContent = new byte[] { 2, 3 };

            var recordReference = VersionedRecord.CreateNew(content, 0, memoryManager);

            var snapshotData = new SnapshotData(new[] { 0 });

            var record = new VersionedRecord(memoryManager.Get(recordReference).RawData, memoryManager, snapshotData);

            var newReference = record.InsertOrUpdate(newContent, 1);

            record = new VersionedRecord(memoryManager.Get(newReference).RawData, memoryManager, snapshotData);

            Assert.IsTrue(newContent.SequenceEqual(record.GetMatchingVersion(1).RawData));
            Assert.IsTrue(content.SequenceEqual(record.GetMatchingVersion(2).RawData));
        }
Esempio n. 2
0
        /// <summary>
        /// Fetches value by its reference.
        /// </summary>
        /// <param name="reference">Reference to the value</param>
        /// <returns>The instance of value</returns>
        public TValue Fetch(DbItemReference reference)
        {
            var item = _memoryManager.Get(reference);

            if (IsVersioningEnabled)
            {
                var record = new VersionedRecord(item.RawData, _memoryManager, SnapshotData);

                if (record.HasVisibleVersionTo(DataTankerTransaction.Current.Id))
                {
                    item = record.GetMatchingVersion(DataTankerTransaction.Current.Id);
                }
            }

            return(_valueSerializer.Deserialize(item.RawData));
        }
        public void UpdateRecordCreatedByCommitedTransaction()
        {
            var memoryManager = new MemoryManager();

            var content    = new byte[] { 0, 1 };
            var newContent = new byte[] { 2, 3 };

            var recordReference = VersionedRecord.CreateNew(content, 0, memoryManager);

            var snapshotData = new SnapshotData(new[] { 0 }); // zero transaction is commited

            var record = new VersionedRecord(memoryManager.Get(recordReference).RawData, memoryManager, snapshotData);

            record.Update(newContent, 1);
            Assert.IsTrue(newContent.SequenceEqual(record.GetMatchingVersion(1).RawData));
        }
        public void UpdateProduceNewVersion()
        {
            var memoryManager = new MemoryManager();

            var oldContent = new byte[] { 0, 1 };
            var newContent = new byte[] { 2, 3 };

            var recordReference = VersionedRecord.CreateNew(oldContent, 0, memoryManager);

            var snapshotData = new SnapshotData(new int[] { });

            var record = new VersionedRecord(memoryManager.Get(recordReference).RawData, memoryManager, snapshotData);

            record.Update(newContent, 0);

            Assert.IsTrue(record.HasVisibleVersionTo(0));
            Assert.IsTrue(newContent.SequenceEqual(record.GetMatchingVersion(0).RawData));
        }
        public void UpdateRecordExpiredByRolledBackTransaction()
        {
            var memoryManager = new MemoryManager();

            var content    = new byte[] { 0, 1 };
            var newContent = new byte[] { 2, 3 };

            var recordReference = VersionedRecord.CreateNew(content, 0, memoryManager);

            var snapshotData = new SnapshotData(new[] { 0 });

            var record = new VersionedRecord(memoryManager.Get(recordReference).RawData, memoryManager, snapshotData);

            var newReference = record.Expire(1);

            snapshotData = new SnapshotData(new[] { 0 }, new[] { 1 });

            record = new VersionedRecord(memoryManager.Get(newReference).RawData, memoryManager, snapshotData);

            record.Update(newContent, 2);
            Assert.IsTrue(newContent.SequenceEqual(record.GetMatchingVersion(2).RawData));
        }
        public void ResurrectRecordExpiredByCommitedTransaction()
        {
            var memoryManager = new MemoryManager();

            var content    = new byte[] { 0, 1 };
            var newContent = new byte[] { 2, 3 };

            var recordReference = VersionedRecord.CreateNew(content, 0, memoryManager);

            var snapshotData = new SnapshotData(new int[] { });

            var record = new VersionedRecord(memoryManager.Get(recordReference).RawData, memoryManager, snapshotData);

            var newReference = record.Expire(0);

            snapshotData = new SnapshotData(new[] { 0 });

            record = new VersionedRecord(memoryManager.Get(newReference).RawData, memoryManager, snapshotData);

            record.Insert(newContent, 1);
            Assert.IsTrue(newContent.SequenceEqual(record.GetMatchingVersion(1).RawData));
        }