[ Index ]

PHP Cross Reference of MediaWiki-1.24.0

title

Body

[close]

/maintenance/ -> updateSearchIndex.php (source)

   1  <?php
   2  /**
   3   * Periodic off-peak updating of the search index.
   4   *
   5   * Usage: php updateSearchIndex.php [-s START] [-e END] [-p POSFILE] [-l LOCKTIME] [-q]
   6   * Where START is the starting timestamp
   7   * END is the ending timestamp
   8   * POSFILE is a file to load timestamps from and save them to, searchUpdate.WIKI_ID.pos by default
   9   * LOCKTIME is how long the searchindex and revision tables will be locked for
  10   * -q means quiet
  11   *
  12   * This program is free software; you can redistribute it and/or modify
  13   * it under the terms of the GNU General Public License as published by
  14   * the Free Software Foundation; either version 2 of the License, or
  15   * (at your option) any later version.
  16   *
  17   * This program is distributed in the hope that it will be useful,
  18   * but WITHOUT ANY WARRANTY; without even the implied warranty of
  19   * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  20   * GNU General Public License for more details.
  21   *
  22   * You should have received a copy of the GNU General Public License along
  23   * with this program; if not, write to the Free Software Foundation, Inc.,
  24   * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
  25   * http://www.gnu.org/copyleft/gpl.html
  26   *
  27   * @file
  28   * @ingroup Maintenance
  29   */
  30  
  31  require_once  __DIR__ . '/Maintenance.php';
  32  
  33  /**
  34   * Maintenance script for periodic off-peak updating of the search index.
  35   *
  36   * @ingroup Maintenance
  37   */
  38  class UpdateSearchIndex extends Maintenance {
  39  
  40  	public function __construct() {
  41          parent::__construct();
  42          $this->mDescription = "Script for periodic off-peak updating of the search index";
  43          $this->addOption( 's', 'starting timestamp', false, true );
  44          $this->addOption( 'e', 'Ending timestamp', false, true );
  45          $this->addOption(
  46              'p',
  47              'File for saving/loading timestamps, searchUpdate.WIKI_ID.pos by default',
  48              false,
  49              true
  50          );
  51          $this->addOption(
  52              'l',
  53              'How long the searchindex and revision tables will be locked for',
  54              false,
  55              true
  56          );
  57      }
  58  
  59  	public function getDbType() {
  60          return Maintenance::DB_ADMIN;
  61      }
  62  
  63  	public function execute() {
  64          $posFile = $this->getOption( 'p', 'searchUpdate.' . wfWikiId() . '.pos' );
  65          $end = $this->getOption( 'e', wfTimestampNow() );
  66          if ( $this->hasOption( 's' ) ) {
  67              $start = $this->getOption( 's' );
  68          } elseif ( is_readable( 'searchUpdate.pos' ) ) {
  69              # B/c to the old position file name which was hardcoded
  70              # We can safely delete the file when we're done though.
  71              $start = file_get_contents( 'searchUpdate.pos' );
  72              unlink( 'searchUpdate.pos' );
  73          } elseif ( is_readable( $posFile ) ) {
  74              $start = file_get_contents( $posFile );
  75          } else {
  76              $start = wfTimestamp( TS_MW, time() - 86400 );
  77          }
  78          $lockTime = $this->getOption( 'l', 20 );
  79  
  80          $this->doUpdateSearchIndex( $start, $end, $lockTime );
  81          if ( is_writable( dirname( realpath( $posFile ) ) ) ) {
  82              $file = fopen( $posFile, 'w' );
  83              if ( $file !== false ) {
  84                  fwrite( $file, $end );
  85                  fclose( $file );
  86              } else {
  87                  $this->error( "*** Couldn't write to the $posFile!\n" );
  88              }
  89          } else {
  90              $this->error( "*** Couldn't write to the $posFile!\n" );
  91          }
  92      }
  93  
  94  	private function doUpdateSearchIndex( $start, $end, $maxLockTime ) {
  95          global $wgDisableSearchUpdate;
  96  
  97          $wgDisableSearchUpdate = false;
  98  
  99          $dbw = wfGetDB( DB_MASTER );
 100          $recentchanges = $dbw->tableName( 'recentchanges' );
 101  
 102          $this->output( "Updating searchindex between $start and $end\n" );
 103  
 104          # Select entries from recentchanges which are on top and between the specified times
 105          $start = $dbw->timestamp( $start );
 106          $end = $dbw->timestamp( $end );
 107  
 108          $page = $dbw->tableName( 'page' );
 109          $sql = "SELECT rc_cur_id FROM $recentchanges
 110              JOIN $page ON rc_cur_id=page_id AND rc_this_oldid=page_latest
 111              WHERE rc_type != " . RC_LOG . " AND rc_timestamp BETWEEN '$start' AND '$end'";
 112          $res = $dbw->query( $sql, __METHOD__ );
 113  
 114          $this->updateSearchIndex( $maxLockTime, array( $this, 'searchIndexUpdateCallback' ), $dbw, $res );
 115  
 116          $this->output( "Done\n" );
 117      }
 118  
 119  	public function searchIndexUpdateCallback( $dbw, $row ) {
 120          $this->updateSearchIndexForPage( $dbw, $row->rc_cur_id );
 121      }
 122  }
 123  
 124  $maintClass = "UpdateSearchIndex";
 125  require_once RUN_MAINTENANCE_IF_MAIN;


Generated: Fri Nov 28 14:03:12 2014 Cross-referenced by PHPXref 0.7.1