private void ReadParts(PartStreamImpl listingPartStream) { using (var reader = BuildXLReader.Create(listingPartStream)) { var partStreamCount = reader.ReadInt32(); for (int i = 0; i < partStreamCount; i++) { m_parts.Add(PartStreamImpl.ReadPartStream(this, i, reader)); } } }
/// <summary> /// Creates a part stream using the specified block size. /// </summary> /// <remarks> /// Ensure that <see cref="PartStream.Index"/> is persisted in order to open the part stream /// during deserialization using <see cref="OpenReadPartStream(int)"/> /// </remarks> public PartStream CreateWritePartStream(int blockSize = DefaultBlockSize) { Contract.Requires(blockSize >= 1024, "Part block size must be >= 1024 bytes"); lock (m_createWritePartLock) { var partId = m_parts.Count; var partStream = new PartStreamImpl(this, partId, blockSize); m_parts.Add(partStream); return(partStream); } }
/// <summary> /// Writes a block for the current buffer in the part stream /// </summary> private long WriteBlock(PartStreamImpl partStream, bool finalBlock = false) { lock (m_lock) { var buffer = partStream.CurrentBlockWriteBufferStream.GetBuffer(); Contract.Assert(finalBlock || partStream.BlockSize == buffer.Length); var blockStart = AllocateBlock(buffer.Length); m_writeStream.Seek(blockStart, SeekOrigin.Begin); m_writeStream.Write(buffer, 0, (int)partStream.CurrentBlockWriteBufferStream.Position); return(blockStart); } }
/// <summary> /// Create a compound stream for write /// </summary> private CompoundStream(Stream writeStream, int initialStreamBlockSize) { Contract.Requires(writeStream.CanSeek, "Compound stream requires a seekable stream"); m_writeStream = writeStream; m_startPosition = m_writeStream.Position; m_nextBlockStart = m_startPosition; // Allow initial region for blocks of listing block starts AllocateBlock(ListingPartStreamInitializationRegionLength); m_listingPartStream = new PartStreamImpl(this, ListingPartStreamIndex, blockSize: ListingPartStreamBlockSize); var initialPartStream = (PartStreamImpl)CreateWritePartStream(initialStreamBlockSize); Contract.Assert(initialPartStream.Index == DefaultPartStreamIndex); InitialPartStream = initialPartStream; }
/// <summary> /// Create a compound stream for read /// </summary> private CompoundStream(Func <Stream> readStreamFactory, long startPosition = 0) { m_readStreamFactory = readStreamFactory; using (var listingPartBaseReadStream = m_readStreamFactory()) { m_startPosition = startPosition; listingPartBaseReadStream.Position = startPosition; using (var listingPartReader = BuildXLReader.Create(listingPartBaseReadStream)) using (var listingPartStream = PartStreamImpl.ReadPartStream(this, ListingPartStreamIndex, listingPartReader)) { listingPartStream.InitializeRead(listingPartBaseReadStream); ReadParts(listingPartStream); } } InitialPartStream = OpenReadPartStream(DefaultPartStreamIndex); }