private long FindContinuationOffset(PostingListAddress address)
        {
            var offset = address.Offset;
            var buffer = new byte[PostingListReader.ReadBufferSize];

            while (true)
            {
                int read = persistentStorage.Read(offset, buffer, 0, buffer.Length);
                if (read == 0)
                {
                    break;
                }

                offset += read;

                for (int i = 0; i < read; ++i)
                {
                    if (buffer[i] == EmptyContinuationAddress[0])
                    {
                        var readNext       = persistentStorage.Read(offset - read + i, buffer, 0, EmptyContinuationAddress.Length);
                        var nextOffsetText = System.Text.Encoding.UTF8.GetString(buffer, 4, 8);
                        var nextOffset     = Convert.ToInt32(nextOffsetText, 16);
                        if (nextOffset < 0)
                        {
                            return(offset - read + i);
                        }

                        offset = nextOffset;
                        break;
                    }
                }
            }

            return(-1);
        }
Exemplo n.º 2
0
        public IPostingList Get(PostingListAddress address)
        {
            var offset = address.Offset;
            var line   = new StringBuilder();
            var buffer = new byte[ReadBufferSize];
            var done   = false;

            while (!done)
            {
                int read = persistentStorage.Read(offset, buffer, 0, buffer.Length);
                if (read == 0)
                {
                    break;
                }

                offset += read;

                for (int i = 0; i < read; ++i)
                {
                    if (buffer[i] == PostingListWriter.EmptyContinuationAddress[0])
                    {
                        read = persistentStorage.Read(offset - read + i, buffer, 0, PostingListWriter.EmptyContinuationAddress.Length);
                        var nextOffsetText = System.Text.Encoding.UTF8.GetString(buffer, 4, 8);
                        var nextOffset     = Convert.ToInt32(nextOffsetText, 16);
                        if (nextOffset < 0)
                        {
                            done = true;
                            break;
                        }

                        line.Append(';');
                        offset = nextOffset;
                        break;
                    }

                    //if (buffer[i] == '\r' || buffer[i] == '\n')
                    //{
                    //    done = true;
                    //    break;
                    //}

                    line.Append((char)buffer[i]);
                }
            }

            return(new PostingListArray(line.ToString().Split(';').Select(Occurrence.Parse).ToArray()));
        }
Exemplo n.º 3
0
            private bool NextChar()
            {
                if (indxInBuffer + 1 >= dataInBuffer)
                {
                    int read = persistentStorage.Read(readOffset, buffer, 0, buffer.Length);
                    if (read == 0)
                    {
                        isEof = true;
                        return(false);
                    }

                    readOffset  += read;
                    dataInBuffer = read;
                    indxInBuffer = 0;
                    return(true);
                }

                indxInBuffer++;
                return(true);
            }
Exemplo n.º 4
0
        private int GetFileBufferForIndex(long index)
        {
            var offset = index * recordSize + headerSize;

            if (!(bufferFileOffset <= offset && (offset + recordSize) <= (bufferFileOffset + bufferDataSize)))
            {
                FlushBuffer();

                int read = persistentStorage.Read(offset, buffer, 0, buffer.Length);
                Array.Clear(buffer, read, buffer.Length - read);

                bufferFileOffset = offset;
                bufferDataSize   = buffer.Length; //TODO: Extend file size to cover buffer?
                dataChanged      = false;
            }

            checked
            {
                return((int)(offset - bufferFileOffset));
            }
        }
Exemplo n.º 5
0
 public int Read(long fileOffset, byte[] buffer, int offset, int count)
 {
     return(instance.Read(fileOffset, buffer, offset, count));
 }