示例#1
0
        /// <inheritdoc />
        /// <remarks>Assumes nearly sequential access.</remarks>
        public byte ReadByte(long index)
        {
            IDataStreamHelpers.ReadByteArgsCheck(this, index);
            byte ret;

            lock (cacheLock)
            {
                if (!cache.TryReadByte(index, out ret))
                {
                    ByteCache.FillCache callback = delegate(byte[] buffer, out long cacheStart, out int cacheLength)
                    {
                        using (var reader = log.ReaderPool.Get())
                        {
                            // the file is more likely to be read from the beginning to the end
                            cacheStart  = Math.Max(0, index - 32);
                            cacheLength = (int)Math.Min(buffer.Length, Math.Min(int.MaxValue, length - cacheStart));
                            reader.ReadFileDataToBuffer(hint, buffer, cacheStart, cacheLength, 0);
                            ret = buffer[index - cacheStart];
                        }
                    };
                    cache.Cache(callback);
                }
            }
            return(ret);
        }
示例#2
0
 /// <inheritdoc/>
 public byte ReadByte(long index)
 {
     streamsLock.EnterReadLock();
     try
     {
         IDataStreamHelpers.ReadByteArgsCheck(this, index);
         int i = 0;
         while (index >= 0)
         {
             var stream = streams[i++];
             if (index >= stream.Length)
             {
                 index -= stream.Length;
             }
             else
             {
                 return(stream.ReadByte(index));
             }
         }
         // unreachable code
         throw new ArgumentOutOfRangeException();
     }
     finally
     {
         streamsLock.ExitReadLock();
     }
 }
示例#3
0
 /// <inheritdoc />
 public void ReadBytesToBuffer(byte[] buffer, long start = 0, int length = -1, int offset = 0)
 {
     IDataStreamHelpers.ReadBytesToBufferArgsCheck(this, buffer, start, ref length, offset);
     using (var reader = log.ReaderPool.Get())
     {
         reader.ReadFileDataToBuffer(hint, buffer, start, length, offset);
     }
 }
示例#4
0
 /// <inheritdoc/>
 public byte ReadByte(long index)
 {
     IDataStreamHelpers.ReadByteArgsCheck(this, index);
     lock (streamLock)
     {
         stream.Position = index;
         return((byte)stream.ReadByte());
     }
 }
示例#5
0
 /// <inheritdoc/>
 public void ReadBytesToBuffer(byte[] buffer, long start = 0, int length = -1, int offset = 0)
 {
     IDataStreamHelpers.ReadBytesToBufferArgsCheck(this, buffer, start, ref length, offset);
     if (length == -1)
     {
         length = (int)Math.Min(int.MaxValue, Length - start);
     }
     if (start + length > count || start < 0 || length < 0)
     {
         throw new ArgumentOutOfRangeException("wrong index or length");
     }
     stream.ReadBytesToBuffer(buffer, this.offset + start, length, offset);
 }
示例#6
0
        /// <inheritdoc/>
        public void ReadBytesToBuffer(byte[] buffer, long start = 0, int length = -1, int offset = 0)
        {
            streamsLock.EnterReadLock();
            try
            {
                IDataStreamHelpers.ReadBytesToBufferArgsCheck(this, buffer, start, ref length, offset);
                if (length == 0)
                {
                    return;
                }
                var workBuffer = new ArraySegment <byte>(buffer, offset, length);
                int i          = 0;
                var stream     = streams[0];
                // move to the stream containing the start
                while (start >= stream.Length)
                {
                    if (i == streams.Count)
                    {
                        throw new ArgumentOutOfRangeException();
                    }
                    start -= stream.Length;
                    stream = streams[++i];
                }

                do
                {
                    var len = (int)Math.Min(length, stream.Length - start);
                    length -= len;
                    stream.ReadBytesToBuffer(workBuffer.Array, start, len, workBuffer.Offset);
                    if (length > 0)
                    {
                        workBuffer = new ArraySegment <byte>(workBuffer.Array, workBuffer.Offset + len, workBuffer.Count - len);
                        i++;
                        if (i == streams.Count && length > 0)
                        {
                            throw new ArgumentOutOfRangeException();
                        }
                        if (i == streams.Count)
                        {
                            return;
                        }
                        stream = streams[i];
                        start  = 0;
                    }
                } while (length > 0);
            }
            finally
            {
                streamsLock.ExitReadLock();
            }
        }
示例#7
0
 /// <inheritdoc/>
 public void ReadBytesToBuffer(byte[] buffer, long start = 0, int length = -1, int offset = 0)
 {
     IDataStreamHelpers.ReadBytesToBufferArgsCheck(this, buffer, start, ref length, offset);
     lock (streamLock)
     {
         stream.Position = start;
         int read = 0;
         while (length > 0 && (read = stream.Read(buffer, offset, length)) != 0)
         {
             length -= read;
             offset += read;
         }
     }
 }
示例#8
0
        /// <inheritdoc/>
        public byte ReadByte(long index)
        {
            IDataStreamHelpers.ReadByteArgsCheck(this, index);
            byte ret;

            lock (dataLock)
            {
                if (cache.TryReadByte(index, out ret))
                {
                    return(ret);
                }
                seekToPosition(index);
                cache.TryReadByte(index, out ret);
                return(ret);
            }
        }
示例#9
0
 /// <inheritdoc/>
 public void ReadBytesToBuffer(byte[] buffer, long start = 0, int length = -1, int offset = 0)
 {
     IDataStreamHelpers.ReadBytesToBufferArgsCheck(this, buffer, start, ref length, offset);
     lock (dataLock)
     {
         while (length > 0)
         {
             int chunk = Math.Min(length, cache.MaxCacheSize);
             seekToPosition(start + chunk - 1);
             // no need to check these, because the cache is set so that it will be ok
             long firstRead;
             int  read;
             cache.TryReadBytesToBuffer(buffer, start, chunk, offset, out firstRead, out read);
             length -= chunk;
             start  += chunk;
             offset += chunk;
         }
     }
 }
示例#10
0
 /// <inheritdoc/>
 public byte ReadByte(long index)
 {
     IDataStreamHelpers.ReadByteArgsCheck(this, index);
     return(stream.ReadByte(offset + index));
 }
示例#11
0
 /// <inheritdoc/>
 public void ReadBytesToBuffer(byte[] buffer, long start = 0, int length = -1, int offset = 0)
 {
     IDataStreamHelpers.ReadBytesToBufferArgsCheck(this, buffer, start, ref length, offset);
     Array.Copy(arr, start, buffer, offset, length);
 }
示例#12
0
 /// <inheritdoc/>
 public byte ReadByte(long index)
 {
     IDataStreamHelpers.ReadByteArgsCheck(this, index);
     return arr[index];
 }