private ulong NextNumber()
            {
                if (indxInBuffer >= dataInBuffer)
                {
                    var toRead = buffer.Length;
                    if (listEndOffset - readOffset < toRead)
                    {
                        checked
                        {
                            toRead = (int)(listEndOffset - readOffset);
                        }
                    }

                    if (toRead == 0)
                    {
                        isEof = true;
                        return(0);
                    }

                    persistentStorage.ReadAll(readOffset, buffer, 0, toRead);

                    for (int i = toRead; i < buffer.Length; ++i)
                    {
                        buffer[i] = 0;
                    }

                    readOffset  += toRead;
                    dataInBuffer = toRead;
                    indxInBuffer = 0;
                }

                indxInBuffer += VarInt.ReadVUInt64(buffer, indxInBuffer, out var result);
                return(result);
            }
        public TextReader GetText(long textStart)
        {
            var result    = new StringBuilder();
            var buffer    = new byte[4096];
            var offset    = textStart;
            var chunkSize = 0;

            persistentStorage.ReadAll(offset, buffer, 0, sizeof(int));
            offset   += sizeof(int);
            chunkSize = BitConverter.ToInt32(buffer, 0);
            while (chunkSize > 0)
            {
                if (buffer.Length < chunkSize)
                {
                    buffer = new byte[4096 * ((chunkSize + 4095) / 4096)];
                }

                persistentStorage.ReadAll(offset, buffer, 0, chunkSize);
                offset += chunkSize;

                result.Append(Encoding.UTF8.GetString(buffer, 0, chunkSize));

                persistentStorage.ReadAll(offset, buffer, 0, sizeof(int));
                offset   += sizeof(int);
                chunkSize = BitConverter.ToInt32(buffer, 0);
            }
            return(new StringReader(result.ToString()));
        }
            private bool EnsureBuffer(int size)
            {
                if (isEof)
                {
                    return(size <= (dataInBuffer - indxInBuffer));
                }

                if (size > buffer.Length)
                {
                    throw new Exception("Resize buffer");
                }

                if (indxInBuffer + size >= dataInBuffer)
                {
                    Array.Copy(buffer, indxInBuffer, buffer, 0, dataInBuffer - indxInBuffer);
                    dataInBuffer = dataInBuffer - indxInBuffer;
                    indxInBuffer = 0;
                    var toRead = (int)Math.Min(buffer.Length - dataInBuffer, (listEndOffset - readOffset));
                    if (toRead == 0)
                    {
                        isEof = true;
                    }
                    else
                    {
                        persistentStorage.ReadAll(readOffset, buffer, dataInBuffer, toRead);
                        readOffset   += toRead;
                        dataInBuffer += toRead;
                    }
                    return(size <= dataInBuffer);
                }

                return(true);
            }
        // TODO: Need unit test for this
        public IPostingList GetBasic(PostingListAddress address)
        {
            var offset      = address.Offset;
            var buffer      = new byte[sizeof(long) + sizeof(int)];
            var occurrences = new List <Occurrence>();

            while (true)
            {
                persistentStorage.ReadAll(offset, buffer, 0, buffer.Length);

                long continuationOffset = BitConverter.ToInt64(buffer, 0);
                int  length             = BitConverter.ToInt32(buffer, sizeof(long));

                var dataBuffer = new byte[length];
                persistentStorage.ReadAll(offset + sizeof(long) + sizeof(int), dataBuffer, 0, dataBuffer.Length);

                ParseBufferTo(dataBuffer, occurrences);

                if (continuationOffset == 0)
                {
                    break;
                }
                else
                {
                    offset = continuationOffset;
                }
            }

            return(new PostingListArray(occurrences.ToArray()));
        }
Example #5
0
        private (long indexOffset, long dataOffset, int dataSize) FindKeyRecord(TKey key)
        {
            if (key == null)
            {
                throw new ArgumentNullException(nameof(key));
            }

            var index  = (long)((ulong)GetKeyHash(key) % (ulong)capacity);
            var offset = headerSize + index * IndexRecordSize;

            dataStorage.ReadAll(offset, valueBuffer, 0, IndexRecordSize);
            var dataOffset = BitConverter.ToInt64(valueBuffer, 0);
            var dataSize   = BitConverter.ToInt32(valueBuffer, sizeof(long));

            return(offset, dataOffset, dataSize);
        }
            public void ReadHeader(IPersistentStorage persistentStorage)
            {
                persistentStorage.ReadAll(0, headerData, 0, headerData.Length);

                if (Text != HeaderText)
                {
                    throw new InvalidOperationException("Header text mismatch");
                }
            }
Example #7
0
        public TValue this[long index]
        {
            get
            {
                var offset = linearIndex[index];
                if (offset == 0)
                {
                    throw new ArgumentOutOfRangeException(nameof(index));
                }

                dataStorage.ReadAll(offset, sizeBuffer, 0, sizeBuffer.Length);
                int dataSize = BitConverter.ToInt32(sizeBuffer, 0);

                //TODO: Improve serializer, no need to reallocate
                if (valueBuffer == null || valueBuffer.Length != dataSize)
                {
                    valueBuffer = new byte[dataSize];
                }

                dataStorage.ReadAll(offset + sizeBuffer.Length, valueBuffer, 0, valueBuffer.Length);

                return(valueSerializer.GetValue(valueBuffer));
            }
            set
            {
                var offset = linearIndex[index];
                if (offset == 0)
                {
                    offset             = dataStorage.Length;
                    linearIndex[index] = dataStorage.Length;
                }

                var data     = valueSerializer.GetBytes(value);
                var dataSize = BitConverter.GetBytes(data.Length);

                dataStorage.WriteAll(offset, dataSize, 0, dataSize.Length);
                dataStorage.WriteAll(offset + dataSize.Length, data, 0, data.Length);
            }
        }
 public PersistentDictionaryFst(IPersistentStorage storage,
                                int maxTokenLength,
                                ITextEncoding encoding)
 {
     this.maxTokenByteLength = encoding.GetMaxEncodedLength(maxTokenLength);
     this.storage            = storage;
     this.encoding           = encoding;
     if (storage.Length > 0)
     {
         var buffer = new byte[storage.Length];
         storage.ReadAll(0, buffer, 0, buffer.Length);
         this.fst = FST <int> .FromBytesCompressed(buffer, FSTVarIntOutput.Instance);
     }
 }
Example #9
0
        public void UpdateNextList(PostingListAddress address, PostingListAddress nextList)
        {
            var buffer = new byte[sizeof(long)];
            var offset = address.Offset;

            while (true)
            {
                persistentStorage.ReadAll(offset, buffer, 0, buffer.Length);
                long continuationOffset = BitConverter.ToInt64(buffer, 0);

                if (continuationOffset == 0)
                {
                    persistentStorage.WriteAll(offset, BitConverter.GetBytes(nextList.Offset), 0, sizeof(long));
                    break;
                }
                else
                {
                    offset = continuationOffset;
                }
            }
        }
Example #10
0
 public void ReadAll(long fileOffset, byte[] buffer, int offset, int count)
 {
     instance.ReadAll(fileOffset, buffer, offset, count);
 }