Example #1
0
        public bool GetCurrentMessageAndMoveToNextOne(TextMessageCapture capture)
        {
            if (capture == null)
            {
                throw new ArgumentNullException("capture");
            }

            CheckIsReading();

            if (CurrentMessageHeaderIsEmpty)
            {
                return(false);
            }

            if (capture.HeaderMatch == null || capture.HeaderMatch.OwnerRegex != re)
            {
                capture.HeaderMatch = re.CreateEmptyMatch();
            }

            if (direction == MessagesParserDirection.Forward)
            {
                return(GetCurrentMessageAndMoveToNextOneFwd(capture));
            }
            else
            {
                return(GetCurrentMessageAndMoveToNextOneBwd(capture));
            }
        }
Example #2
0
        bool GetCurrentMessageAndMoveToNextOneFwd(TextMessageCapture capture)
        {
            if (headerBeginPosition >= range.End)
            {
                return(false);
            }

            capture.HeaderBuffer = cachedCurrentBuffer;
            capture.HeaderMatch.CopyFrom(currentMessageHeaderMatch);
            capture.BeginPosition = headerBeginPosition;

            bool nextMessageFound = FindNextMessageStart();

            capture.BodyBuffer = cachedCurrentBuffer;

            if (nextMessageFound)
            {
                capture.BodyIndex     = prevHeaderPointer1;
                capture.BodyLength    = headerPointer2 - prevHeaderPointer1;
                capture.EndPosition   = headerBeginPosition;
                capture.IsLastMessage = capture.EndPosition >= range.End;
            }
            else
            {
                capture.BodyIndex     = headerPointer1;
                capture.BodyLength    = capture.BodyBuffer.Length - headerPointer1;
                capture.EndPosition   = textIterator.CharIndexToPosition(capture.BodyBuffer.Length);
                capture.IsLastMessage = true;
            }

            return(true);
        }
Example #3
0
        public SearchingParser(
            IPositionedMessagesReader owner,
            CreateSearchingParserParams p,
            TextStreamPositioningParams textStreamPositioningParams,
            DejitteringParams?dejitteringParams,
            Stream rawStream,
            Encoding streamEncoding,
            bool allowPlainTextSearchOptimization,
            LoadedRegex headerRe,
            ILogSourceThreads threads,
            ITraceSourceFactory traceSourceFactory,
            RegularExpressions.IRegexFactory regexFactory
            )
        {
            this.owner        = owner;
            this.parserParams = p;
            this.plainTextSearchOptimizationAllowed = allowPlainTextSearchOptimization && ((p.Flags & MessagesParserFlag.DisablePlainTextSearchOptimization) == 0);
            this.threads        = threads;
            this.requestedRange = p.Range;
            this.textStreamPositioningParams = textStreamPositioningParams;
            this.dejitteringParams           = dejitteringParams;
            this.rawStream      = rawStream;
            this.streamEncoding = streamEncoding;
            this.regexFactory   = regexFactory;
            this.trace          = traceSourceFactory.CreateTraceSource("LogSource", "srchp." + GetHashCode().ToString("x"));
            this.dummyFilter    = new Filter(FilterAction.Include, "", true, new Search.Options(), null, regexFactory);
            var continuationToken = p.ContinuationToken as ContinuationToken;

            if (continuationToken != null)
            {
                this.requestedRange = new FileRange.Range(continuationToken.NextPosition, requestedRange.End);
            }
            this.aligmentTextAccess      = new StreamTextAccess(rawStream, streamEncoding, textStreamPositioningParams);
            this.aligmentSplitter        = new MessagesSplitter(aligmentTextAccess, headerRe.Clone().Regex, headerRe.GetHeaderReSplitterFlags());
            this.aligmentCapture         = new TextMessageCapture();
            this.progressAndCancellation = new ProgressAndCancellation()
            {
                progressHandler   = p.ProgressHandler,
                cancellationToken = p.Cancellation,
                continuationToken = new ContinuationToken()
                {
                    NextPosition = requestedRange.Begin
                }
            };
            this.impl = Enum();
        }
Example #4
0
        bool GetCurrentMessageAndMoveToNextOneBwd(TextMessageCapture capture)
        {
            int  headerEnd = headerPointer2;
            long captureEndPos;

            if (headersCounter == 1)             // first message when reading backward is the last message
            {
                captureEndPos = textIterator.CharIndexToPosition(prevHeaderPointer1);
            }
            else
            {
                captureEndPos = prevHeaderBeginPosition;
            }

            if (captureEndPos <= range.Begin)
            {
                return(false);
            }

            capture.HeaderBuffer = cachedCurrentBuffer;
            capture.HeaderMatch.CopyFrom(currentMessageHeaderMatch);
            capture.BeginPosition = headerBeginPosition;
            capture.EndPosition   = captureEndPos;
            capture.BodyBuffer    = cachedCurrentBuffer;
            capture.BodyIndex     = headerEnd;

            if (headersCounter == 1)             // first message when reading backward is the last message
            {
                capture.BodyLength    = prevHeaderPointer1 - headerEnd;
                capture.IsLastMessage = true;
            }
            else
            {
                capture.BodyLength    = prevHeaderPointer1 - headerEnd;
                capture.IsLastMessage = false;
            }

            FindNextMessageStart();

            return(true);
        }
Example #5
0
 public bool GetCurrentMessageAndMoveToNextOne(TextMessageCapture capture)
 {
     return(underlyingSplitter.GetCurrentMessageAndMoveToNextOne(capture));
 }
Example #6
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);
        }