private Page GetPage(ScrollRequest scroll, FileSearchResult fileSearchResult) { var first = scroll.SpecifiedByPosition ? IndexOf(scroll.Position) : scroll.FirstIndex; var chainSize = 0; while (fileSearchResult != null) { chainSize += fileSearchResult.Count; fileSearchResult = fileSearchResult.Previous as FileSearchResult; } var size = scroll.PageSize; if (scroll.Mode == ScrollReason.Tail) { first = size > chainSize ? 0 : chainSize - size; } else { if (scroll.FirstIndex + size >= chainSize) { first = chainSize - size; } } first = Math.Max(0, first); size = Math.Min(size, chainSize); return(new Page(first, size)); }
private Page GetPage(ScrollRequest scroll, IndexCollection indexCollection) { var first = scroll.FirstIndex; var size = scroll.PageSize; var indexCollectionsCount = 0; //collect files line count while (indexCollection != null) { if (indexCollection.Indicies.Length > 0 && indexCollection.Indicies.Any(t => t.Indicies.Count == 0)) { indexCollection = indexCollection.Previous as IndexCollection; continue; } indexCollectionsCount += indexCollection.Count; indexCollection = indexCollection.Previous as IndexCollection; } if (scroll.Mode == ScrollReason.Tail) { first = size > indexCollectionsCount ? 0 : indexCollectionsCount - size; } else if (scroll.FirstIndex + size >= indexCollectionsCount) { first = indexCollectionsCount - size; } first = Math.Max(0, first); size = Math.Min(size, indexCollectionsCount); return(new Page(first, size)); }
private Page GetPage(ScrollRequest scroll) { int first; if (scroll.SpecifiedByPosition) { //get line number fro first = IndexOf(scroll.Position); } else { first = scroll.FirstIndex; } int size = scroll.PageSize; if (scroll.Mode == ScrollReason.Tail) { first = size > Count ? 0 : Count - size; } else { if (scroll.FirstIndex + size >= Count) { first = Count - size; } } first = Math.Max(0, first); size = Math.Min(size, Count); return(new Page(first, size)); }
private IEnumerable <Line> ReadLinesByIndex(ScrollRequest scroll) { var page = GetPage(scroll); var relativeIndex = CalculateRelativeIndex(page.Start); if (relativeIndex == null) { yield break; } var offset = relativeIndex.LinesOffset; using (var stream = File.Open(Info.FullName, FileMode.Open, FileAccess.Read, FileShare.Delete | FileShare.ReadWrite)) { using (var reader = new StreamReaderExtended(stream, Encoding, false)) { //go to starting point stream.Seek(relativeIndex.Start, SeekOrigin.Begin); if (offset > 0) { //skip number of lines offset for (int i = 0; i < offset; i++) { reader.ReadLine(); } } //if estimate move to the next start of line if (relativeIndex.IsEstimate && relativeIndex.Start != 0) { reader.ReadLine(); } foreach (var i in Enumerable.Range(page.Start, page.Size)) { var startPosition = reader.AbsolutePosition(); var line = reader.ReadLine(); var endPosition = reader.AbsolutePosition(); var info = new LineInfo(i + 1, i, startPosition, endPosition); var ontail = startPosition >= TailInfo.TailStartsAt && DateTime.Now.Subtract(TailInfo.LastTail).TotalSeconds < 1 ? DateTime.Now : (DateTime?)null; yield return(new Line(info, line, ontail)); } } } }
public IEnumerable <Line> ReadLines(ScrollRequest scroll) { var page = GetPage(scroll); if (page.Size == 0) { yield break; } using (var stream = File.Open(Info.FullName, FileMode.Open, FileAccess.Read, FileShare.Delete | FileShare.ReadWrite)) { using (var reader = new StreamReaderExtended(stream, Encoding, false)) { if (page.Size == 0) { yield break; } foreach (var i in Enumerable.Range(page.Start, page.Size)) { if (i > Count - 1) { continue; } var start = Matches[i]; var startPosition = reader.AbsolutePosition(); if (startPosition != start) { reader.DiscardBufferedData(); reader.BaseStream.Seek(start, SeekOrigin.Begin); } startPosition = reader.AbsolutePosition(); var line = reader.ReadLine(); var endPosition = reader.AbsolutePosition(); var info = new LineInfo(i + 1, i, startPosition, endPosition); var ontail = endPosition >= TailInfo.TailStartsAt && DateTime.Now.Subtract(TailInfo.LastTail).TotalSeconds < 1 ? DateTime.Now : (DateTime?)null; yield return(new Line(info, line, ontail)); } } } }
/// <summary> /// Reads the lines. /// </summary> /// <param name="scroll">The scroll.</param> /// <returns></returns> public IEnumerable <Line> ReadLines(ScrollRequest scroll) { if (scroll.SpecifiedByPosition) { foreach (var line in ReadLinesByPosition(scroll)) { yield return(line); } } else { foreach (var line in ReadLinesByIndex(scroll)) { yield return(line); } } }
private IEnumerable <Line> ReadLinesByPosition(ScrollRequest scroll) { //TODO: Calculate initial index of first item. //scroll from specified position using ( var stream = File.Open(Info.FullName, FileMode.Open, FileAccess.Read, FileShare.Delete | FileShare.ReadWrite)) { var taken = 0; using (var reader = new StreamReaderExtended(stream, Encoding, false)) { var startPosition = scroll.Position; var first = (int)CalculateIndexByPositon(startPosition); reader.BaseStream.Seek(startPosition, SeekOrigin.Begin); do { var line = reader.ReadLine(); if (line == null) { yield break; } var endPosition = reader.AbsolutePosition(); var info = new LineInfo(first + taken + 1, first + taken, startPosition, endPosition); var ontail = endPosition >= TailInfo.TailStartsAt && DateTime.Now.Subtract(TailInfo.LastTail).TotalSeconds < 1 ? DateTime.Now : (DateTime?)null; yield return(new Line(info, line, ontail)); startPosition = endPosition; taken++; } while (taken < scroll.PageSize); } } }
private Page GetPage(ScrollRequest scroll) { var first = scroll.FirstIndex; var size = scroll.PageSize; if (scroll.Mode == ScrollReason.Tail) { first = size > Count ? 0 : Count - size; } else { if (scroll.FirstIndex + size >= Count) { first = Count - size; } } first = Math.Max(0, first); size = Math.Min(size, Count); return(new Page(first, size)); }
public IEnumerable <Line> ReadLinesImpl(ScrollRequest scroll) { var currentPage = _lines.ReadLines(scroll).Where(line => !_itemsToExclude(line.Text)).ToArray(); foreach (var line in currentPage) { yield return(line); } if (currentPage.Length == scroll.PageSize) { yield break; } var deficit = scroll.PageSize - currentPage.Length; //work backwards through the file until we have enough lines var traverseUpTail = YieldTail(scroll.PageSize, scroll.FirstIndex - scroll.PageSize, deficit); foreach (var line in traverseUpTail) { yield return(line); } }
public IEnumerable <Line> ReadLines(ScrollRequest scroll) { yield break; }
public IEnumerable <Line> ReadLines(ScrollRequest scroll) { var current = ReverseLinking(this); var page = GetPage(scroll, this); var lastValueWrapper = new LastValueWrapper(); if (page.Size == 0) { yield break; } while (current != null) { using ( var stream = File.Open(current.Info.FullName, FileMode.Open, FileAccess.Read, FileShare.Delete | FileShare.ReadWrite)) { using (var reader = new StreamReaderExtended(stream, current.Encoding, false)) { if (page.Size == 0) { yield break; } if (lastValueWrapper.LastPageIndex == page.Start + page.Size) { yield break; } var counter = 0; long lastEndPos = 0; foreach ( var i in Enumerable.Range( lastValueWrapper.LastPageIndex > 0 ? lastValueWrapper.LastPageIndex : page.Start, page.Size - counter)) { if (i == page.Start + page.Size) { yield break; } if (i - lastValueWrapper.LastMatchesSize > current.Count - 1) { lastValueWrapper.LastEndPosition += lastEndPos + 1; lastValueWrapper.LastMatchesSize += current.Count; break; } var start = current.Matches[i - lastValueWrapper.LastMatchesSize]; var startPosition = reader.AbsolutePosition(); if (startPosition != start) { reader.DiscardBufferedData(); reader.BaseStream.Seek(start, SeekOrigin.Begin); } startPosition = reader.AbsolutePosition(); var line = reader.ReadLine(); var endPosition = reader.AbsolutePosition(); var info = new LineInfo(i + 1, i, startPosition + lastValueWrapper.LastEndPosition, endPosition + lastValueWrapper.LastEndPosition); var ontail = endPosition >= TailInfo.TailStartsAt && DateTime.Now.Subtract(TailInfo.LastTail).TotalSeconds < 1 ? DateTime.Now : (DateTime?)null; yield return(new Line(info, line, ontail)); lastValueWrapper.LastPageIndex = i + 1; counter++; lastEndPos = endPosition; if (reader.EndOfStream) { lastValueWrapper.LastEndPosition += endPosition + 1; lastValueWrapper.LastMatchesSize += current.Count; break; } } } } current = current.Next as FileSearchResult; } }
public static IEnumerable <LineInfo> GetIndicies(this FileSearchResult source, ScrollRequest scroll) { if (source == null) { throw new ArgumentNullException(nameof(source)); } if (scroll == null) { throw new ArgumentNullException(nameof(scroll)); } int first = scroll.FirstIndex; int size = scroll.PageSize; if (scroll.Mode == ScrollReason.Tail) { first = size > source.Count ? 0 : source.Count - size; } else { if (scroll.FirstIndex + size >= source.Count) { first = source.Count - size; } } first = Math.Max(0, first); size = Math.Min(size, source.Count); if (size == 0) { yield break; } foreach (var i in Enumerable.Range(first, size)) { if (i > source.Count - 1) { continue; } var start = source.Matches[i]; yield return(new LineInfo(0, i, start, (long)0)); } }
public IEnumerable <Line> ReadLines(ScrollRequest scroll) { return(ReadLinesImpl(scroll).OrderBy(line => line.Index)); }
private IEnumerable <Line> ReadLinesByIndex(ScrollRequest scroll) { var page = GetPage(scroll); var relativeIndex = CalculateRelativeIndex(page.Start); if (relativeIndex == null) { yield break; } var offset = relativeIndex.LinesOffset; using (var stream = File.Open(Info.FullName, FileMode.Open, FileAccess.Read, FileShare.Delete | FileShare.ReadWrite)) { using (var reader = new StreamReaderExtended(stream, Encoding, false)) { //go to starting point stream.Seek(relativeIndex.Start, SeekOrigin.Begin); if (offset > 0) { //skip number of lines offset for (int i = 0; i < offset; i++) { reader.ReadLine(); } } //if estimate move to the next start of line if (relativeIndex.IsEstimate && relativeIndex.Start != 0) { reader.ReadLine(); } foreach (var i in Enumerable.Range(page.Start, page.Size)) { var startPosition = reader.AbsolutePosition(); var line = reader.ReadLine(); var endPosition = reader.AbsolutePosition(); var info = new LineInfo(i + 1, i, startPosition, endPosition); var ontail = startPosition >= TailInfo.TailStartsAt && DateTime.UtcNow.Subtract(TailInfo.LastTail).TotalSeconds < 1 ? DateTime.UtcNow : (DateTime?)null; if (!line.StartsWith("{")) { yield return(new Line(info, line, ontail)); } else { var data = JsonSerializer.Deserialize <Dictionary <string, object> >(line); var timestamp = DateTime.Parse(data["@t"].ToString()); string message = data["@mt"].ToString(); var timestampPrefix = timestamp.ToString("[dd/MM/yyyy hh:mm:ss.fff tt] "); string formattedMessage = SubstituteRegex.Replace(message, match => { var name = match.Groups["exp"].Value; return(data[name].ToString()); }); if (data.TryGetValue("@x", out var exception) && !string.IsNullOrEmpty(exception.ToString())) { yield return(new Line(info, timestampPrefix + formattedMessage + " (" + exception.ToString() + ")", ontail)); } else { yield return(new Line(info, timestampPrefix + formattedMessage, ontail)); } } } } } }
private IEnumerable <Line> ReadLinesByIndex(ScrollRequest scroll) { var current = this; var lastValueWrapper = new LastValueWrapper(); var iterationCounter = 0; var page = GetPage(scroll, current); var relativeIndex = CalculateRelativeIndex(page.Start, ref current, lastValueWrapper); while (relativeIndex != null && current != null) { if (current.Indicies.Length > 0 && current.Indicies.Any(t => t.Indicies.Count == 0)) { iterationCounter++; current = current.Previous as IndexCollection; continue; } if (lastValueWrapper.LastPageIndex == page.Start + page.Size) { yield break; } var offset = relativeIndex.LinesOffset; using ( var stream = File.Open(current.Info.FullName, FileMode.Open, FileAccess.Read, FileShare.Delete | FileShare.ReadWrite)) { using (var reader = new StreamReaderExtended(stream, current.Encoding, false)) { //go to starting point stream.Seek((iterationCounter > 0) ? 0 : relativeIndex.Start, SeekOrigin.Begin); if (iterationCounter == 0 && offset > 0) { //skip number of lines offset for (var i = 0; i < offset; i++) { reader.ReadLine(); } } //if estimate move to the next start of line if (iterationCounter == 0 && relativeIndex.IsEstimate && relativeIndex.Start != 0) { reader.ReadLine(); } foreach ( var i in Enumerable.Range((iterationCounter > 0) ? lastValueWrapper.LastPageIndex : page.Start, page.Size)) { if (i == page.Start + page.Size) { yield break; } var startPosition = reader.AbsolutePosition() + lastValueWrapper.LastEndPosition; var line = reader.ReadLine(); var endPosition = reader.AbsolutePosition() + lastValueWrapper.LastEndPosition; var info = new LineInfo(i + 1, i, startPosition, endPosition); var ontail = startPosition >= current.TailInfo.TailStartsAt && DateTime.Now.Subtract(current.TailInfo.LastTail).TotalSeconds < 1 ? DateTime.Now : (DateTime?)null; yield return(new Line(info, line, ontail)); lastValueWrapper.LastPageIndex = i + 1; if (reader.EndOfStream) { lastValueWrapper.LastEndPosition += endPosition + 1; break; } } } } iterationCounter++; current = current.Previous as IndexCollection; } }