]> scripts.mit.edu Git - autoinstallsdev/mediawiki.git/blob - maintenance/updateSearchIndex.php
MediaWiki 1.30.2
[autoinstallsdev/mediawiki.git] / maintenance / updateSearchIndex.php
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->addDescription( '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 = $this->getDB( 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, [ $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;