Example #1
0
    /**
     * Opens the index.
     *
     * IndexReader constructor needs Directory as a parameter. It should be
     * a string with a path to the index folder or a Directory object.
     *
     * @param mixed $directory
     * @throws Zend_Search_Lucene_Exception
     */
    public function __construct($directory = null, $create = false)
    {
        if ($directory === null) {
            throw new Zend_Search_Exception('No index directory specified');
        }

        if ($directory instanceof Zend_Search_Lucene_Storage_Directory_Filesystem) {
            $this->_directory      = $directory;
            $this->_closeDirOnExit = false;
        } else {
            $this->_directory      = new Zend_Search_Lucene_Storage_Directory_Filesystem($directory);
            $this->_closeDirOnExit = true;
        }


        // Get a shared lock to the index
        $this->_lock = $this->_directory->createFile('index.lock');

        $this->_segmentInfos = array();

        if ($create) {
            // Throw an exception if index is under processing now
            if (!$this->_lock->lock(LOCK_EX, true)) {
                throw new Zend_Search_Lucene_Exception('Can\'t create index. It\'s under processing now');
            }

            // Writer will create segments file for empty segments list
            $this->_writer = new Zend_Search_Lucene_Index_Writer($this->_directory, $this->_segmentInfos, true);

            if (!$this->_lock->lock(LOCK_SH)) {
                throw new Zend_Search_Lucene_Exception('Can\'t reduce lock level from Exclusive to Shared');
            }
        } else {
            // Wait if index is under switching from one set of segments to another (Index_Writer::_updateSegments())
            if (!$this->_lock->lock(LOCK_SH)) {
                throw new Zend_Search_Lucene_Exception('Can\'t obtain shared index lock');
            }
            $this->_writer = null;
        }


        $segmentsFile = $this->_directory->getFileObject('segments');

        $format = $segmentsFile->readInt();

        if ($format != (int)0xFFFFFFFF) {
            throw new Zend_Search_Lucene_Exception('Wrong segments file format');
        }

        // read version
        // $segmentsFile->readLong();
        $segmentsFile->readInt(); $segmentsFile->readInt();

        // read segment name counter
        $segmentsFile->readInt();

        $segments = $segmentsFile->readInt();

        $this->_docCount = 0;

        // read segmentInfos
        for ($count = 0; $count < $segments; $count++) {
            $segName = $segmentsFile->readString();
            $segSize = $segmentsFile->readInt();
            $this->_docCount += $segSize;

            $this->_segmentInfos[] =
                                new Zend_Search_Lucene_Index_SegmentInfo($segName,
                                                                         $segSize,
                                                                         $this->_directory);
        }
    }