Ejemplo n.º 1
0
        private void InstantiateReader()
        {
            IndexSearcher searcher;

            if (_idxReader != null)
            {
                //use the Reopen() method for better near-realtime when the _writer ins't null
                var newReader = _idxReader.Reopen();
                if (_idxReader != newReader)
                {
                    //_idxReader.Dispose(); -- will get disposed upon disposing the searcher
                    Interlocked.Exchange(ref _idxReader, newReader);
                }

                searcher = new IndexSearcher(_idxReader);
            }
            else
            {
                // Note: disposing the IndexSearcher instance obtained from the next
                // statement will not close the underlying reader on dispose.
                searcher = new IndexSearcher(FSDirectory.Open(IndexFolder));
            }

            var reader     = new CachedReader(searcher);
            var cutoffTime = DateTime.Now - TimeSpan.FromSeconds(_readerTimeSpan * 10);

            lock (((ICollection)_oldReaders).SyncRoot)
            {
                CheckDisposed();
                _oldReaders.RemoveAll(r => r.LastUsed <= cutoffTime);
                _oldReaders.Add(reader);
                Interlocked.Exchange(ref _reader, reader);
            }
        }
Ejemplo n.º 2
0
 private void DisposeReaders()
 {
     lock (((ICollection)_oldReaders).SyncRoot)
     {
         foreach (var rdr in _oldReaders)
         {
             rdr.Dispose();
         }
         _oldReaders.Clear();
         _reader = null;
     }
 }
Ejemplo n.º 3
0
 private void DisposeReaders()
 {
     lock (((ICollection)_oldReaders).SyncRoot)
     {
         foreach (var rdr in _oldReaders)
         {
             rdr.Dispose();
         }
         _oldReaders.Clear();
         _reader = null;
     }
 }
Ejemplo n.º 4
0
        private void InstantiateReader()
        {
            IndexSearcher searcher;
            if (_idxReader != null)
            {
                //use the Reopen() method for better near-realtime when the _writer ins't null
                var newReader = _idxReader.Reopen();
                if (_idxReader != newReader)
                {
                    //_idxReader.Dispose(); -- will get disposed upon disposing the searcher
                    Interlocked.Exchange(ref _idxReader, newReader);
                }

                searcher = new IndexSearcher(_idxReader);
            }
            else
            {
                // Note: disposing the IndexSearcher instance obtained from the next
                // statement will not close the underlying reader on dispose.
                searcher = new IndexSearcher(FSDirectory.Open(IndexFolder));
            }

            var reader = new CachedReader(searcher);
            var cutoffTime = DateTime.Now - TimeSpan.FromSeconds(_readerTimeSpan*10);
            lock (((ICollection) _oldReaders).SyncRoot)
            {
                CheckDisposed();
                _oldReaders.RemoveAll(r => r.LastUsed <= cutoffTime);
                _oldReaders.Add(reader);
                Interlocked.Exchange(ref _reader, reader);
            }
        }
Ejemplo n.º 5
0
        private static Line ReadRange(LineReader lineReader, long position, int maxPrev, int maxNext, int maxPrevExtent, int maxNextExtent,
                                      List <Line> prev, List <Line> next, List <Extent> prevExtent, List <Extent> nextExtent, LineRange currentState = null,
                                      Action <RawLine> feedDetector = null)
        {
            prev.Clear();
            next.Clear();
            prevExtent.Clear();
            nextExtent.Clear();
            currentState = lineReader.StreamLength >= currentState?.StreamLength ? currentState : null;
            CachedReader reader  = new CachedReader(lineReader, currentState, feedDetector);
            Line         curLine = reader.Read(position);

            if (curLine != null)
            {
                Line l = curLine;
                for (int prevRead = 0; prevRead < maxPrev; ++prevRead)
                {
                    l = reader.ReadPrevious(l);
                    if (l != null)
                    {
                        prev.Insert(0, l);
                    }
                    else
                    {
                        break;
                    }
                }
                if (l != null)
                {
                    Extent e = l.Extent;
                    for (int prevRead = 0; prevRead < maxPrevExtent; ++prevRead)
                    {
                        e = reader.GetLineExtent(e.Begin - 1);
                        if (e != null)
                        {
                            prevExtent.Insert(0, e);
                        }
                        else
                        {
                            break;
                        }
                    }
                }

                l = curLine;
                for (int nextRead = 0; nextRead < maxNext; ++nextRead)
                {
                    l = reader.ReadNext(l);
                    if (l != null)
                    {
                        next.Add(l);
                    }
                    else
                    {
                        break;
                    }
                }
                if (l != null)
                {
                    Extent e = l.Extent;
                    for (int nextRead = 0; nextRead < maxNextExtent; ++nextRead)
                    {
                        e = reader.GetLineExtent(e.End);
                        if (e != null)
                        {
                            nextExtent.Add(e);
                        }
                        else
                        {
                            break;
                        }
                    }
                }
            }

            return(curLine);
        }