xref: /dokuwiki/bin/indexer.php (revision 9df39f145412a47b64ed00e58d49195eb529acf8)
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