private void InitNew(ChunkHeader chunkHeader, int fileSize) { Ensure.NotNull(chunkHeader, "chunkHeader"); Ensure.Positive(fileSize, "fileSize"); _fileSize = fileSize; _isReadOnly = false; _chunkHeader = chunkHeader; _physicalDataSize = 0; _logicalDataSize = 0; if (_inMem) { CreateInMemChunk(chunkHeader, fileSize); } else { CreateWriterWorkItemForNewChunk(chunkHeader, fileSize); SetAttributes(); CreateReaderStreams(); } _readSide = chunkHeader.IsScavenged ? (IChunkReadSide) new TFChunkReadSideScavenged(this) : new TFChunkReadSideUnscavenged(this); }
private void InitOngoing(int writePosition, bool checkSize) { Ensure.Nonnegative(writePosition, "writePosition"); var fileInfo = new FileInfo(_filename); if (!fileInfo.Exists) { throw new CorruptDatabaseException(new ChunkNotFoundException(_filename)); } _fileSize = (int)fileInfo.Length; _isReadOnly = false; _physicalDataSize = writePosition; _logicalDataSize = writePosition; SetAttributes(); CreateWriterWorkItemForExistingChunk(writePosition, out _chunkHeader); if (_chunkHeader.Version != CurrentChunkVersion) { throw new CorruptDatabaseException(new WrongFileVersionException(_filename, _chunkHeader.Version, CurrentChunkVersion)); } CreateReaderStreams(); if (checkSize) { var expectedFileSize = _chunkHeader.ChunkSize + ChunkHeader.Size + ChunkFooter.Size; if (_writerWorkItem.StreamLength != expectedFileSize) { throw new CorruptDatabaseException(new BadChunkInDatabaseException( string.Format("Chunk file '{0}' should have file size {1} bytes, but instead has {2} bytes length.", _filename, expectedFileSize, _writerWorkItem.StreamLength))); } } _readSide = new TFChunkReadSideUnscavenged(this); }
private void InitCompleted(bool verifyHash) { var fileInfo = new FileInfo(_filename); if (!fileInfo.Exists) { throw new CorruptDatabaseException(new ChunkNotFoundException(_filename)); } _fileSize = (int)fileInfo.Length; _isReadOnly = true; SetAttributes(_filename, true); CreateReaderStreams(); var reader = GetReaderWorkItem(); try { _chunkHeader = ReadHeader(reader.Stream); Log.Debug("Opened completed " + _filename + " as version " + _chunkHeader.Version); if (_chunkHeader.Version != (byte)ChunkVersions.Unaligned && _chunkHeader.Version != (byte)ChunkVersions.Aligned) { throw new CorruptDatabaseException(new WrongFileVersionException(_filename, _chunkHeader.Version, CurrentChunkVersion)); } if (_chunkHeader.Version != (byte)ChunkVersions.Aligned && _unbuffered) { throw new Exception("You can only run unbuffered mode on v3 or higher chunk files. Please run scavenge on your database to upgrade your transaction file to v3."); } _chunkFooter = ReadFooter(reader.Stream); if (!_chunkFooter.IsCompleted) { throw new CorruptDatabaseException(new BadChunkInDatabaseException( string.Format("Chunk file '{0}' should be completed, but is not.", _filename))); } _logicalDataSize = _chunkFooter.LogicalDataSize; _physicalDataSize = _chunkFooter.PhysicalDataSize; var expectedFileSize = _chunkFooter.PhysicalDataSize + _chunkFooter.MapSize + ChunkHeader.Size + ChunkFooter.Size; if (_chunkHeader.Version == (byte)ChunkVersions.Unaligned && reader.Stream.Length != expectedFileSize) { throw new CorruptDatabaseException(new BadChunkInDatabaseException( string.Format("Chunk file '{0}' should have a file size of {1} bytes, but it has a size of {2} bytes.", _filename, expectedFileSize, reader.Stream.Length))); } } finally { ReturnReaderWorkItem(reader); } _readSide = _chunkHeader.IsScavenged ? (IChunkReadSide) new TFChunkReadSideScavenged(this) : new TFChunkReadSideUnscavenged(this); _readSide.Cache(); if (verifyHash) { VerifyFileHash(); } }
private void InitOngoing(int writePosition, bool checkSize) { Ensure.Nonnegative(writePosition, "writePosition"); var fileInfo = new FileInfo(_filename); if (!fileInfo.Exists) throw new CorruptDatabaseException(new ChunkNotFoundException(_filename)); _fileSize = (int)fileInfo.Length; _isReadOnly = false; _physicalDataSize = writePosition; _logicalDataSize = writePosition; SetAttributes(); CreateWriterWorkItemForExistingChunk(writePosition, out _chunkHeader); if (_chunkHeader.Version != CurrentChunkVersion) throw new CorruptDatabaseException(new WrongFileVersionException(_filename, _chunkHeader.Version, CurrentChunkVersion)); CreateReaderStreams(); if (checkSize) { var expectedFileSize = _chunkHeader.ChunkSize + ChunkHeader.Size + ChunkFooter.Size; if (_writerWorkItem.StreamLength != expectedFileSize) { throw new CorruptDatabaseException(new BadChunkInDatabaseException( string.Format("Chunk file '{0}' should have file size {1} bytes, but instead has {2} bytes length.", _filename, expectedFileSize, _writerWorkItem.StreamLength))); } } _readSide = new TFChunkReadSideUnscavenged(this); }
private void InitNew(ChunkHeader chunkHeader, int fileSize) { Ensure.NotNull(chunkHeader, "chunkHeader"); Ensure.Positive(fileSize, "fileSize"); _fileSize = fileSize; _isReadOnly = false; _chunkHeader = chunkHeader; _physicalDataSize = 0; _logicalDataSize = 0; if (_inMem) CreateInMemChunk(chunkHeader, fileSize); else { CreateWriterWorkItemForNewChunk(chunkHeader, fileSize); SetAttributes(); CreateReaderStreams(); } _readSide = chunkHeader.IsScavenged ? (IChunkReadSide) new TFChunkReadSideScavenged(this) : new TFChunkReadSideUnscavenged(this); }
private void InitCompleted(bool verifyHash) { var fileInfo = new FileInfo(_filename); if (!fileInfo.Exists) throw new CorruptDatabaseException(new ChunkNotFoundException(_filename)); _fileSize = (int)fileInfo.Length; _isReadOnly = true; SetAttributes(); CreateReaderStreams(); var reader = GetReaderWorkItem(); try { _chunkHeader = ReadHeader(reader.Stream); if (_chunkHeader.Version != CurrentChunkVersion) throw new CorruptDatabaseException(new WrongFileVersionException(_filename, _chunkHeader.Version, CurrentChunkVersion)); _chunkFooter = ReadFooter(reader.Stream); if (!_chunkFooter.IsCompleted) { throw new CorruptDatabaseException(new BadChunkInDatabaseException( string.Format("Chunk file '{0}' should be completed, but is not.", _filename))); } _logicalDataSize = _chunkFooter.LogicalDataSize; _physicalDataSize = _chunkFooter.PhysicalDataSize; var expectedFileSize = _chunkFooter.PhysicalDataSize + _chunkFooter.MapSize + ChunkHeader.Size + ChunkFooter.Size; if (reader.Stream.Length != expectedFileSize) { throw new CorruptDatabaseException(new BadChunkInDatabaseException( string.Format("Chunk file '{0}' should have file size {1} bytes, but instead has {2} bytes length.", _filename, expectedFileSize, reader.Stream.Length))); } } finally { ReturnReaderWorkItem(reader); } _readSide = _chunkHeader.IsScavenged ? (IChunkReadSide) new TFChunkReadSideScavenged(this) : new TFChunkReadSideUnscavenged(this); _readSide.Cache(); if (verifyHash) VerifyFileHash(); }
private void InitNew(ChunkHeader chunkHeader, int fileSize) { Ensure.NotNull(chunkHeader, "chunkHeader"); Ensure.Positive(fileSize, "fileSize"); _isReadOnly = false; _chunkHeader = chunkHeader; _actualDataSize = 0; CreateWriterWorkItemForNewChunk(chunkHeader, fileSize); CreateReaderStreams(); _readSide = new TFChunkReadSideUnscavenged(this); SetAttributes(); }