示例#1
0
        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;
            }
        }
示例#2
0
 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);
 }
示例#4
0
        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;
        }
示例#5
0
        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();
            }
        }
示例#6
0
                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;
                            }
                        }
                    }
                }
示例#7
0
 static MessagesParserDirection GetOppositeDirection(MessagesParserDirection direction)
 {
     return(direction == MessagesParserDirection.Backward ? MessagesParserDirection.Forward : MessagesParserDirection.Backward);
 }
示例#8
0
 public Comparer(MessagesParserDirection direction, int bufferSize)
 {
     this.inversionFlag = direction == MessagesParserDirection.Forward ? 1 : -1;
     this.bufferSize    = bufferSize;
 }
示例#9
0
        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);
        }
示例#10
0
        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);
        }