/** * Generate compound index file */ private function _generateCFS() { $cfsFile = $this->_directory->createFile($this->_name . '.cfs'); $cfsFile->writeVInt(count($this->_files)); $dataOffsetPointers = array(); foreach ($this->_files as $fileName) { $dataOffsetPointers[$fileName] = $cfsFile->tell(); $cfsFile->writeLong(0); // write dummy data $cfsFile->writeString($fileName); } foreach ($this->_files as $fileName) { // Get actual data offset $dataOffset = $cfsFile->tell(); // Seek to the data offset pointer $cfsFile->seek($dataOffsetPointers[$fileName]); // Write actual data offset value $cfsFile->writeLong($dataOffset); // Seek back to the end of file $cfsFile->seek($dataOffset); $dataFile = $this->_directory->getFileObject($fileName); $cfsFile->writeBytes($dataFile->readBytes($this->_directory->fileLength($fileName))); $this->_directory->deleteFile($fileName); } }
/** * Opens the index for writing * * IndexWriter constructor needs Directory as a parameter. It should be * a string with a path to the index folder or a Directory object. * Second constructor parameter create is optional - true to create the * index or overwrite the existing one. * * @param ZSearchDirectory $directory * @param boolean $create */ public function __construct(ZSearchDirectory $directory, $create = false) { $this->_directory = $directory; if ($create) { foreach ($this->_directory->fileList() as $file) { if ($file == 'deletable' || $file == 'segments' || substr($file, strlen($file) - 4) == '.cfs') { $this->_directory->deleteFile($file); } } $segmentsFile = $this->_directory->createFile('segments'); $segmentsFile->writeInt((int) 0xffffffff); // write version $segmentsFile->writeLong(0); // write name counter $segmentsFile->writeInt(0); // write segment counter $segmentsFile->writeInt(0); $deletableFile = $this->_directory->createFile('deletable'); // write counter $deletableFile->writeInt(0); $this->_version = 0; $this->_segmentNameCounter = 0; $this->_segments = 0; } else { $segmentsFile = $this->_directory->getFileObject('segments'); $format = $segmentsFile->readInt(); if ($format != (int) 0xffffffff) { throw new Zend_Search_Lucene_Exception('Wrong segments file format'); } // read version $this->_version = $segmentsFile->readLong(); // read counter $this->_segmentNameCounter = $segmentsFile->readInt(); // read segment counter $this->_segments = $segmentsFile->readInt(); } $this->_newSegments = array(); $this->_currentSegment = null; }