/// <summary> /// Rolls back transaction by copying all backed up data bask to master stream and closes the transaction. /// </summary> public void RollbackTransaction() { if (logStreamHeader != null) { if (logStreamHeader.TransactionCompleted) { throw new InvalidOperationException("Can't rollback completed transaction"); } logStream.Position = TransactionLogStreamMetadata.StructureSize; // Copy segments from log stream back to stream for (int i = 0; i < logStreamHeader.SegmentCount; i++) { SegmentMetadata sh = SegmentMetadata.Load(logStream); if (!sh.TransactionId.Equals(logStreamHeader.TransactionId)) { throw new InvalidOperationException("Wrong segment found in transaction log"); } masterStream.Position = sh.Position; CopyData(logStream, sh.Size, masterStream); } // Set back original stream length if (logStreamHeader.StreamLength < masterStream.Length) { masterStream.SetLength(logStreamHeader.StreamLength); } masterStream.Flush(); logStream.SetLength(0); logStream.Flush(); logStreamHeader = null; rollbackNeeded = false; } }