/** * 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); } }