]> scripts.mit.edu Git - autoinstalls/mediawiki.git/blob - maintenance/attachLatest.php
MediaWiki 1.30.2-scripts
[autoinstalls/mediawiki.git] / maintenance / attachLatest.php
1 <?php
2 /**
3  * Corrects wrong values in the `page_latest` field in the database.
4  *
5  * Copyright © 2005 Brion Vibber <brion@pobox.com>
6  * https://www.mediawiki.org/
7  *
8  * This program is free software; you can redistribute it and/or modify
9  * it under the terms of the GNU General Public License as published by
10  * the Free Software Foundation; either version 2 of the License, or
11  * (at your option) any later version.
12  *
13  * This program is distributed in the hope that it will be useful,
14  * but WITHOUT ANY WARRANTY; without even the implied warranty of
15  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16  * GNU General Public License for more details.
17  *
18  * You should have received a copy of the GNU General Public License along
19  * with this program; if not, write to the Free Software Foundation, Inc.,
20  * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
21  * http://www.gnu.org/copyleft/gpl.html
22  *
23  * @file
24  * @ingroup Maintenance
25  */
26
27 require_once __DIR__ . '/Maintenance.php';
28
29 /**
30  * Maintenance script to correct wrong values in the `page_latest` field
31  * in the database.
32  *
33  * @ingroup Maintenance
34  */
35 class AttachLatest extends Maintenance {
36         public function __construct() {
37                 parent::__construct();
38                 $this->addOption( "fix", "Actually fix the entries, will dry run otherwise" );
39                 $this->addOption( "regenerate-all",
40                         "Regenerate the page_latest field for all records in table page" );
41                 $this->addDescription( 'Fix page_latest entries in the page table' );
42         }
43
44         public function execute() {
45                 $this->output( "Looking for pages with page_latest set to 0...\n" );
46                 $dbw = $this->getDB( DB_MASTER );
47                 $conds = [ 'page_latest' => 0 ];
48                 if ( $this->hasOption( 'regenerate-all' ) ) {
49                         $conds = '';
50                 }
51                 $result = $dbw->select( 'page',
52                         [ 'page_id', 'page_namespace', 'page_title' ],
53                         $conds,
54                         __METHOD__ );
55
56                 $n = 0;
57                 foreach ( $result as $row ) {
58                         $pageId = intval( $row->page_id );
59                         $title = Title::makeTitle( $row->page_namespace, $row->page_title );
60                         $name = $title->getPrefixedText();
61                         $latestTime = $dbw->selectField( 'revision',
62                                 'MAX(rev_timestamp)',
63                                 [ 'rev_page' => $pageId ],
64                                 __METHOD__ );
65                         if ( !$latestTime ) {
66                                 $this->output( wfWikiID() . " $pageId [[$name]] can't find latest rev time?!\n" );
67                                 continue;
68                         }
69
70                         $revision = Revision::loadFromTimestamp( $dbw, $title, $latestTime );
71                         if ( is_null( $revision ) ) {
72                                 $this->output( wfWikiID()
73                                         . " $pageId [[$name]] latest time $latestTime, can't find revision id\n" );
74                                 continue;
75                         }
76                         $id = $revision->getId();
77                         $this->output( wfWikiID() . " $pageId [[$name]] latest time $latestTime, rev id $id\n" );
78                         if ( $this->hasOption( 'fix' ) ) {
79                                 $page = WikiPage::factory( $title );
80                                 $page->updateRevisionOn( $dbw, $revision );
81                         }
82                         $n++;
83                 }
84                 $this->output( "Done! Processed $n pages.\n" );
85                 if ( !$this->hasOption( 'fix' ) ) {
86                         $this->output( "This was a dry run; rerun with --fix to update page_latest.\n" );
87                 }
88         }
89 }
90
91 $maintClass = "AttachLatest";
92 require_once RUN_MAINTENANCE_IF_MAIN;