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); }
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())); }
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); }
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)); } }
public int Read(long fileOffset, byte[] buffer, int offset, int count) { return(instance.Read(fileOffset, buffer, offset, count)); }