void SetCurrentDirection(MessagesParserDirection direction) { this.direction = direction; if (direction == MessagesParserDirection.Forward) { re = forwardModeRe; if (forwardModeMatch == null) { forwardModeMatch = re.CreateEmptyMatch(); } currentMessageHeaderMatch = forwardModeMatch; // It happened that grepping newline with ^ is expensive. // It's cheaper to manually find newline in the input string and // then run the regexp starting from found position. // This flag enables manual search. quickNewLineOptimizationAvailable = re.Pattern.StartsWith("^"); } else { if (backwardModeRe == null) { backwardModeRe = forwardModeRe.Factory.Create(forwardModeRe.Pattern, forwardModeRe.Options | ReOptions.RightToLeft); } re = backwardModeRe; if (backwardModeMatch == null) { backwardModeMatch = re.CreateEmptyMatch(); } currentMessageHeaderMatch = backwardModeMatch; quickNewLineOptimizationAvailable = false; } }
public CreateParserParams( long startPosition, FileRange.Range?range = null, MessagesParserFlag flags = MessagesParserFlag.Default, MessagesParserDirection direction = MessagesParserDirection.Forward, Func <IMessagesPostprocessor> postprocessor = null ) { this.StartPosition = startPosition; this.Range = range; this.Flags = flags; this.Direction = direction; this.PostprocessorsFactory = postprocessor; }
public CreateParserParams( long startPosition, FileRange.Range?range = null, MessagesParserFlag flags = MessagesParserFlag.Default, MessagesParserDirection direction = MessagesParserDirection.Forward, Func <IMessagesPostprocessor> postprocessor = null, CancellationToken?cancellation = null ) { this.StartPosition = startPosition; this.Range = range; this.Flags = flags; this.Direction = direction; this.PostprocessorsFactory = postprocessor; this.Cancellation = cancellation.GetValueOrDefault(CancellationToken.None); }
public void BeginSplittingSession(FileRange.Range range, long startPosition, MessagesParserDirection direction) { if (sessionIsOpen) { throw new InvalidOperationException("Cannot start more than one reading session for a single splitter"); } try { TryBeginSplittingSession(range, startPosition, direction); } catch { ReadingSessionCleanup(); throw; } sessionIsOpen = true; }
void TryBeginSplittingSession(FileRange.Range range, long startPosition, MessagesParserDirection direction) { bool posIsOutOfRange = DetectOutOfRangeCondition(range, startPosition, direction); if (!posIsOutOfRange) { TextAccessDirection accessDirection = direction == MessagesParserDirection.Forward ? TextAccessDirection.Forward : TextAccessDirection.Backward; textIterator = textAccess.OpenIterator(startPosition, accessDirection); try { headerPointer1 = textIterator.PositionToCharIndex(startPosition); prevHeaderPointer1 = headerPointer1; } catch (ArgumentOutOfRangeException) { posIsOutOfRange = true; } } headersCounter = 0; if (posIsOutOfRange) { this.range = new FileRange.Range(); SetCachedCurrentBuffer(""); currentMessageHeaderMatch = null; ReadingSessionCleanup(); } else { this.range = range; SetCurrentDirection(direction); UpdateCachedCurrentBuffer(); FindNextMessageStart(); } }
public Parser(TestReader reader, long startPosition, LogJoint.FileRange.Range?range, MessagesParserDirection direction) { this.reader = reader; this.range = range; this.direction = direction; if (direction == MessagesParserDirection.Forward) { for (positionIndex = 0; positionIndex < reader.positions.Length; ++positionIndex) { if (reader.positions[positionIndex] >= startPosition) { break; } } } else { for (positionIndex = reader.positions.Length - 1; positionIndex >= 0; --positionIndex) { if (reader.positions[positionIndex] < startPosition) { break; } } } }
static MessagesParserDirection GetOppositeDirection(MessagesParserDirection direction) { return(direction == MessagesParserDirection.Backward ? MessagesParserDirection.Forward : MessagesParserDirection.Backward); }
public Comparer(MessagesParserDirection direction, int bufferSize) { this.inversionFlag = direction == MessagesParserDirection.Forward ? 1 : -1; this.bufferSize = bufferSize; }
public void BeginSplittingSession(FileRange.Range range, long startPosition, MessagesParserDirection direction) { if (direction == MessagesParserDirection.Forward) { if (startPosition > range.Begin) { long?fixedStartPosition = null; underlyingSplitter.BeginSplittingSession(range, startPosition, MessagesParserDirection.Backward); try { TextMessageCapture capt = new TextMessageCapture(); if (underlyingSplitter.GetCurrentMessageAndMoveToNextOne(capt)) { fixedStartPosition = capt.EndPosition; } } finally { underlyingSplitter.EndSplittingSession(); } if (fixedStartPosition != null) { underlyingSplitter.BeginSplittingSession(range, fixedStartPosition.Value, direction); try { TextMessageCapture capt = new TextMessageCapture(); while (underlyingSplitter.GetCurrentMessageAndMoveToNextOne(capt)) { if (capt.BeginPosition >= startPosition) { break; } fixedStartPosition = capt.EndPosition; } } finally { underlyingSplitter.EndSplittingSession(); } startPosition = fixedStartPosition.Value; } } } else { if (startPosition < range.End) { long?fixedStartPosition = null; underlyingSplitter.BeginSplittingSession(range, startPosition, MessagesParserDirection.Forward); try { TextMessageCapture capt = new TextMessageCapture(); if (underlyingSplitter.GetCurrentMessageAndMoveToNextOne(capt)) { fixedStartPosition = capt.BeginPosition; } } finally { underlyingSplitter.EndSplittingSession(); } if (fixedStartPosition != null) { underlyingSplitter.BeginSplittingSession(range, fixedStartPosition.Value, direction); try { TextMessageCapture capt = new TextMessageCapture(); while (underlyingSplitter.GetCurrentMessageAndMoveToNextOne(capt)) { if (capt.EndPosition <= startPosition) { break; } fixedStartPosition = capt.BeginPosition; } } finally { underlyingSplitter.EndSplittingSession(); } startPosition = fixedStartPosition.Value; } } } underlyingSplitter.BeginSplittingSession(range, startPosition, direction); }
static bool DetectOutOfRangeCondition(FileRange.Range range, long startPosition, MessagesParserDirection direction) { bool posIsOutOfRange = !range.IsInRange(startPosition); if (posIsOutOfRange && direction == MessagesParserDirection.Backward && startPosition == range.End) { // it's ok to start reading from end position when we move backward posIsOutOfRange = false; } return(posIsOutOfRange); }