public void AddIndexs(RowIndexCollection indexCollection) { m_AddedIndexes.Clear(); m_ChangedIndexes.Clear(); m_Lock.EnterWriteLock(); try { if (m_RowIndexes.Count == 0) { foreach (KeyValuePair <string, List <LogRowIndex> > index in indexCollection.IndexesByItem) { m_RowIndexes.Add(index.Key, index.Value); m_ChangedIndexes.Add(new LogIndexChangeRange(index.Key, 0, index.Value.Count)); } m_AddedIndexes.AddRange(indexCollection.IndexesByItem.Keys); } else { List <LogRowIndex> itemIndex; foreach (KeyValuePair <string, List <LogRowIndex> > index in indexCollection.IndexesByItem) { if (m_RowIndexes.TryGetValue(index.Key, out itemIndex)) { m_ChangedIndexes.Add(new LogIndexChangeRange(index.Key, itemIndex.Count, index.Value.Count)); itemIndex.AddRange(index.Value); } else { m_ChangedIndexes.Add(new LogIndexChangeRange(index.Key, 0, index.Value.Count)); m_RowIndexes.Add(index.Key, index.Value); m_AddedIndexes.Add(index.Key); } } } m_LogRowIndexes.AddRange(indexCollection.Indexes); } finally { m_Lock.ExitWriteLock(); } if (m_AddedIndexes.Count > 0) { if (OnIndexesAdded != null) { OnIndexesAdded(this, new LogIndexAddedEventArgs(m_AddedIndexes.ToArray())); } } if (m_ChangedIndexes.Count > 0) { if (OnIndexesChanged != null) { OnIndexesChanged(this, new LogIndexChangesEventArgs(m_ChangedIndexes.ToArray())); } } }
private void ReadFromFile(int bufferSize) { byte[] readBuffer = new byte[bufferSize]; byte[] buffer = new byte[bufferSize]; RowIndexCollection indexCollection = new RowIndexCollection(); try { using (Stream stream = new FileStream(Filename, FileMode.Open, FileAccess.Read, FileShare.ReadWrite, 1024 * 1024, FileOptions.Asynchronous | FileOptions.SequentialScan)) { //Test log file for invalid null if (m_Position == 0) { stream.Seek(-1, SeekOrigin.End); int value = stream.ReadByte(); if (value == 0) { throw new IOException("Invalid null in log file!"); } } stream.Position = m_Position; CleanFromUTF8FormatEncoding(stream); int version = CheckVersion(stream); m_ParseStarted = DateTime.UtcNow; m_Length = stream.Length; IAsyncResult ar = stream.BeginRead(readBuffer, 0, readBuffer.Length, null, null); while (!m_Abort) { int read = stream.EndRead(ar); if (read == 0) { break; } Buffer.BlockCopy(readBuffer, 0, buffer, 0, read); ar = stream.BeginRead(readBuffer, 0, readBuffer.Length, null, null); ParseBuffer(buffer, read, indexCollection); m_Position += read; SendProgress(ProgressStateEnum.InProgress, m_Position, m_Length, m_ParseStarted); } } } finally { if (indexCollection.Count > 0) { SendItems(indexCollection); } } }
private void AddLogRowIndex(string itemID, RowIndexCollection indexCollection, LogRowIndex index) { if (m_FilteredItems == null) { indexCollection.Add(itemID, index); } else if (m_FilteredItems.Contains(itemID)) { indexCollection.Add(itemID, index); } }
internal void ParseRowBuffer(char[] rowBuffer, RowIndexCollection indexCollection) { if (rowBuffer[0] != '#') { string itemID; LogRowIndex index; ParseRow(rowBuffer, m_RowBufferCount, m_StartPos, m_Separator, out index, out itemID); ReplaceItemname(ref itemID); AddLogRowIndex(itemID, indexCollection, index); } else { ParseComment(rowBuffer, m_RowBufferCount, m_StartPos - m_RowBufferCount, (ushort)m_RowBufferCount); } }
internal void ParseBuffer(byte[] buffer, int bufferLength, RowIndexCollection indexCollection) { const byte nl = (byte)'\n'; //Loop through all characters in the buffer int bufferIndex = 0; while (bufferIndex < bufferLength && m_RowBufferCount < m_RowBuffer.Length) { m_RowBuffer[m_RowBufferCount++] = (char)buffer[bufferIndex]; if (buffer[bufferIndex++] == nl) { ParseRowBuffer(m_RowBuffer, indexCollection); m_StartPos += m_RowBufferCount; m_RowBufferCount = 0; //SendItems(items); } } }
public void SendItems(RowIndexCollection indexCollection) { m_Indexes.AddIndexs(indexCollection); }