コード例 #1
0
 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));
         }
     }
 }
コード例 #2
0
        /// <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);
            }
        }
コード例 #3
0
        /// <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);
            }
        }
コード例 #4
0
        /// <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;
        }
コード例 #5
0
        /// <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);
        }