124c3e0d2SAndreas Gohr#!/usr/bin/php 224c3e0d2SAndreas Gohr<?php 378ba70a7Schrisif ('cli' != php_sapi_name()) die(); 424c3e0d2SAndreas Gohr 524c3e0d2SAndreas Gohrif(!defined('DOKU_INC')) define('DOKU_INC',realpath(dirname(__FILE__).'/../').'/'); 624c3e0d2SAndreas Gohrrequire_once(DOKU_INC.'inc/init.php'); 724c3e0d2SAndreas Gohrrequire_once(DOKU_INC.'inc/common.php'); 824c3e0d2SAndreas Gohrrequire_once(DOKU_INC.'inc/pageutils.php'); 924c3e0d2SAndreas Gohrrequire_once(DOKU_INC.'inc/search.php'); 1024c3e0d2SAndreas Gohrrequire_once(DOKU_INC.'inc/indexer.php'); 113a50618cSgweissbachrequire_once(DOKU_INC.'inc/auth.php'); 1224c3e0d2SAndreas Gohrrequire_once(DOKU_INC.'inc/cliopts.php'); 1324c3e0d2SAndreas Gohrsession_write_close(); 1424c3e0d2SAndreas Gohr 1566b95544STom N Harris// Version tag used to force rebuild on upgrade 1666b95544STom N Harris// Need to keep in sync with lib/exe/indexer.php 17a0c5c349STom N Harrisif(!defined('INDEXER_VERSION')) define('INDEXER_VERSION', 2); 1866b95544STom N Harris 1924c3e0d2SAndreas Gohr// handle options 20981f048aSGabriel Birke$short_opts = 'hcuq'; 21981f048aSGabriel Birke$long_opts = array('help', 'clear', 'update', 'quiet'); 2224c3e0d2SAndreas Gohr$OPTS = Doku_Cli_Opts::getOptions(__FILE__,$short_opts,$long_opts); 2324c3e0d2SAndreas Gohrif ( $OPTS->isError() ) { 2424c3e0d2SAndreas Gohr fwrite( STDERR, $OPTS->getMessage() . "\n"); 2524c3e0d2SAndreas Gohr _usage(); 2624c3e0d2SAndreas Gohr exit(1); 2724c3e0d2SAndreas Gohr} 2824c3e0d2SAndreas Gohr$CLEAR = false; 29981f048aSGabriel Birke$QUIET = false; 3024c3e0d2SAndreas Gohrforeach ($OPTS->options as $key => $val) { 3124c3e0d2SAndreas Gohr switch ($key) { 3224c3e0d2SAndreas Gohr case 'h': 3324c3e0d2SAndreas Gohr case 'help': 3424c3e0d2SAndreas Gohr _usage(); 3524c3e0d2SAndreas Gohr exit; 3624c3e0d2SAndreas Gohr case 'c': 3724c3e0d2SAndreas Gohr case 'clear': 3824c3e0d2SAndreas Gohr $CLEAR = true; 3924c3e0d2SAndreas Gohr break; 40981f048aSGabriel Birke case 'q': 41981f048aSGabriel Birke case 'quiet': 42981f048aSGabriel Birke $QUIET = true; 43981f048aSGabriel Birke break; 4424c3e0d2SAndreas Gohr } 4524c3e0d2SAndreas Gohr} 4624c3e0d2SAndreas Gohr 4724c3e0d2SAndreas Gohr#------------------------------------------------------------------------------ 4824c3e0d2SAndreas Gohr# Action 4924c3e0d2SAndreas Gohr 5024c3e0d2SAndreas Gohrif($CLEAR) _clearindex(); 5124c3e0d2SAndreas Gohr_update(); 5224c3e0d2SAndreas Gohr 5324c3e0d2SAndreas Gohr 5424c3e0d2SAndreas Gohr 5524c3e0d2SAndreas Gohr#------------------------------------------------------------------------------ 5624c3e0d2SAndreas Gohr 5724c3e0d2SAndreas Gohrfunction _usage() { 5824c3e0d2SAndreas Gohr print "Usage: indexer.php <options> 5924c3e0d2SAndreas Gohr 6024c3e0d2SAndreas Gohr Updates the searchindex by indexing all new or changed pages 6124c3e0d2SAndreas Gohr when the -c option is given the index is cleared first. 6224c3e0d2SAndreas Gohr 6324c3e0d2SAndreas Gohr OPTIONS 6424c3e0d2SAndreas Gohr -h, --help show this help and exit 6524c3e0d2SAndreas Gohr -c, --clear clear the index before updating 66981f048aSGabriel Birke -q, --quiet don't produce any output 6724c3e0d2SAndreas Gohr"; 6824c3e0d2SAndreas Gohr} 6924c3e0d2SAndreas Gohr 7024c3e0d2SAndreas Gohrfunction _update(){ 7124c3e0d2SAndreas Gohr global $conf; 72a0c5c349STom N Harris 73a0c5c349STom N Harris // upgrade to version 2 74a0c5c349STom N Harris if (!@file_exists($conf['indexdir'].'/pageword.idx')){ 75a0c5c349STom N Harris _lock(); 76a0c5c349STom N Harris idx_upgradePageWords(); 77a0c5c349STom N Harris _unlock(); 78a0c5c349STom N Harris } 79a0c5c349STom N Harris 8024c3e0d2SAndreas Gohr $data = array(); 81981f048aSGabriel Birke _quietecho("Searching pages... "); 82*9df39f14SRoland Alder search($data,$conf['datadir'],'search_allpages',array('skipacl' => true)); 83981f048aSGabriel Birke _quietecho(count($data)." pages found.\n"); 8424c3e0d2SAndreas Gohr 8524c3e0d2SAndreas Gohr foreach($data as $val){ 8624c3e0d2SAndreas Gohr _index($val['id']); 8724c3e0d2SAndreas Gohr } 8824c3e0d2SAndreas Gohr} 8924c3e0d2SAndreas Gohr 9024c3e0d2SAndreas Gohrfunction _index($id){ 9124c3e0d2SAndreas Gohr global $CLEAR; 9224c3e0d2SAndreas Gohr 9324c3e0d2SAndreas Gohr // if not cleared only update changed and new files 9424c3e0d2SAndreas Gohr if(!$CLEAR){ 9566b95544STom N Harris $idxtag = metaFN($id,'.indexed'); 9666b95544STom N Harris if(@file_exists($idxtag)){ 9766b95544STom N Harris if(io_readFile($idxtag) >= INDEXER_VERSION){ 9824c3e0d2SAndreas Gohr $last = @filemtime(metaFN($id,'.indexed')); 9924c3e0d2SAndreas Gohr if($last > @filemtime(wikiFN($id))) return; 10024c3e0d2SAndreas Gohr } 10166b95544STom N Harris } 10266b95544STom N Harris } 10324c3e0d2SAndreas Gohr 10424c3e0d2SAndreas Gohr _lock(); 105981f048aSGabriel Birke _quietecho("$id... "); 10624c3e0d2SAndreas Gohr idx_addPage($id); 10766b95544STom N Harris io_saveFile(metaFN($id,'.indexed'),INDEXER_VERSION); 108981f048aSGabriel Birke _quietecho("done.\n"); 10924c3e0d2SAndreas Gohr _unlock(); 11024c3e0d2SAndreas Gohr} 11124c3e0d2SAndreas Gohr 11224c3e0d2SAndreas Gohr/** 11324c3e0d2SAndreas Gohr * lock the indexer system 11424c3e0d2SAndreas Gohr */ 11524c3e0d2SAndreas Gohrfunction _lock(){ 11624c3e0d2SAndreas Gohr global $conf; 11724c3e0d2SAndreas Gohr $lock = $conf['lockdir'].'/_indexer.lock'; 11824c3e0d2SAndreas Gohr $said = false; 11944881d27STroels Liebe Bentsen while(!@mkdir($lock, $conf['dmode'])){ 12024c3e0d2SAndreas Gohr if(time()-@filemtime($lock) > 60*5){ 12124c3e0d2SAndreas Gohr // looks like a stale lock - remove it 12224c3e0d2SAndreas Gohr @rmdir($lock); 12324c3e0d2SAndreas Gohr }else{ 12424c3e0d2SAndreas Gohr if($said){ 125981f048aSGabriel Birke _quietecho("."); 12624c3e0d2SAndreas Gohr }else{ 127981f048aSGabriel Birke _quietecho("Waiting for lockfile (max. 5 min)"); 12824c3e0d2SAndreas Gohr $said = true; 12924c3e0d2SAndreas Gohr } 13024c3e0d2SAndreas Gohr sleep(15); 13124c3e0d2SAndreas Gohr } 13224c3e0d2SAndreas Gohr } 1331ca31cfeSAndreas Gohr if($conf['dperm']) chmod($lock, $conf['dperm']); 134981f048aSGabriel Birke if($said) _quietecho("\n"); 13524c3e0d2SAndreas Gohr} 13624c3e0d2SAndreas Gohr 13724c3e0d2SAndreas Gohr/** 13824c3e0d2SAndreas Gohr * unlock the indexer sytem 13924c3e0d2SAndreas Gohr */ 14024c3e0d2SAndreas Gohrfunction _unlock(){ 14124c3e0d2SAndreas Gohr global $conf; 14224c3e0d2SAndreas Gohr $lock = $conf['lockdir'].'/_indexer.lock'; 14324c3e0d2SAndreas Gohr @rmdir($lock); 14424c3e0d2SAndreas Gohr} 14524c3e0d2SAndreas Gohr 14624c3e0d2SAndreas Gohr/** 14724c3e0d2SAndreas Gohr * Clear all index files 14824c3e0d2SAndreas Gohr */ 14924c3e0d2SAndreas Gohrfunction _clearindex(){ 15024c3e0d2SAndreas Gohr global $conf; 15124c3e0d2SAndreas Gohr _lock(); 152981f048aSGabriel Birke _quietecho("Clearing index... "); 15366b95544STom N Harris io_saveFile($conf['indexdir'].'/page.idx',''); 15466b95544STom N Harris $dir = @opendir($conf['indexdir']); 15566b95544STom N Harris if($dir!==false){ 15666b95544STom N Harris while(($f = readdir($dir)) !== false){ 15766b95544STom N Harris if(substr($f,-4)=='.idx' && 15866b95544STom N Harris (substr($f,0,1)=='i' || substr($f,0,1)=='w')) 15966b95544STom N Harris @unlink($conf['indexdir']."/$f"); 16066b95544STom N Harris } 16166b95544STom N Harris } 162981f048aSGabriel Birke _quietecho("done.\n"); 16324c3e0d2SAndreas Gohr _unlock(); 16424c3e0d2SAndreas Gohr} 16524c3e0d2SAndreas Gohr 166981f048aSGabriel Birkefunction _quietecho($msg) { 167981f048aSGabriel Birke global $QUIET; 168981f048aSGabriel Birke if(!$QUIET) echo $msg; 169981f048aSGabriel Birke} 170981f048aSGabriel Birke 17124c3e0d2SAndreas Gohr//Setup VIM: ex: et ts=2 enc=utf-8 : 172