X-Git-Url: https://scripts.mit.edu/gitweb/autoinstallsdev/mediawiki.git/blobdiff_plain/19e297c21b10b1b8a3acad5e73fc71dcb35db44a..6932310fd58ebef145fa01eb76edf7150284d8ea:/maintenance/orphans.php diff --git a/maintenance/orphans.php b/maintenance/orphans.php index dbbddb9c..644fb958 100644 --- a/maintenance/orphans.php +++ b/maintenance/orphans.php @@ -1,12 +1,12 @@ - * http://www.mediawiki.org/ + * Copyright © 2005 Brion Vibber + * https://www.mediawiki.org/ * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -23,25 +23,33 @@ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. * http://www.gnu.org/copyleft/gpl.html * + * @file * @author * @ingroup Maintenance */ -require_once( dirname( __FILE__ ) . '/Maintenance.php' ); +require_once __DIR__ . '/Maintenance.php'; +use Wikimedia\Rdbms\IMaintainableDatabase; + +/** + * Maintenance script that looks for 'orphan' revisions hooked to pages which + * don't exist and 'childless' pages with no revisions. + * + * @ingroup Maintenance + */ class Orphans extends Maintenance { public function __construct() { parent::__construct(); - $this->mDescription = "Look for 'orphan' revisions hooked to pages which don't exist\n" . - "And 'childless' pages with no revisions\n" . - "Then, kill the poor widows and orphans\n" . - "Man this is depressing"; + $this->addDescription( "Look for 'orphan' revisions hooked to pages which don't exist\n" . + "and 'childless' pages with no revisions\n" . + "Then, kill the poor widows and orphans\n" . + "Man this is depressing" + ); $this->addOption( 'fix', 'Actually fix broken entries' ); } public function execute() { - global $wgTitle; - $wgTitle = Title::newFromText( 'Orphan revision cleanup script' ); $this->checkOrphans( $this->hasOption( 'fix' ) ); $this->checkSeparation( $this->hasOption( 'fix' ) ); # Does not work yet, do not use @@ -50,44 +58,56 @@ class Orphans extends Maintenance { /** * Lock the appropriate tables for the script - * @param $db Database object - * @param $extraTable String The name of any extra tables to lock (eg: text) + * @param IMaintainableDatabase $db + * @param string[] $extraTable The name of any extra tables to lock (eg: text) */ - private function lockTables( &$db, $extraTable = null ) { - $tbls = array( 'page', 'revision', 'redirect' ); - if ( $extraTable ) - $tbls[] = $extraTable; - $db->lockTables( array(), $tbls, __METHOD__, false ); + private function lockTables( $db, $extraTable = [] ) { + $tbls = [ 'page', 'revision', 'redirect' ]; + if ( $extraTable ) { + $tbls = array_merge( $tbls, $extraTable ); + } + $db->lockTables( [], $tbls, __METHOD__, false ); } /** * Check for orphan revisions - * @param $fix bool Whether to fix broken revisions when found + * @param bool $fix Whether to fix broken revisions when found */ private function checkOrphans( $fix ) { - $dbw = wfGetDB( DB_MASTER ); - $page = $dbw->tableName( 'page' ); - $revision = $dbw->tableName( 'revision' ); + $dbw = $this->getDB( DB_MASTER ); + $commentStore = new CommentStore( 'rev_comment' ); if ( $fix ) { $this->lockTables( $dbw ); } - $this->output( "Checking for orphan revision table entries... (this may take a while on a large wiki)\n" ); - $result = $dbw->query( " - SELECT * - FROM $revision LEFT OUTER JOIN $page ON rev_page=page_id - WHERE page_id IS NULL - " ); - $orphans = $dbw->numRows( $result ); + $commentQuery = $commentStore->getJoin(); + + $this->output( "Checking for orphan revision table entries... " + . "(this may take a while on a large wiki)\n" ); + $result = $dbw->select( + [ 'revision', 'page' ] + $commentQuery['tables'], + [ 'rev_id', 'rev_page', 'rev_timestamp', 'rev_user_text' ] + $commentQuery['fields'], + [ 'page_id' => null ], + __METHOD__, + [], + [ 'page' => [ 'LEFT JOIN', [ 'rev_page=page_id' ] ] ] + $commentQuery['joins'] + ); + $orphans = $result->numRows(); if ( $orphans > 0 ) { global $wgContLang; + $this->output( "$orphans orphan revisions...\n" ); - $this->output( sprintf( "%10s %10s %14s %20s %s\n", 'rev_id', 'rev_page', 'rev_timestamp', 'rev_user_text', 'rev_comment' ) ); + $this->output( sprintf( + "%10s %10s %14s %20s %s\n", + 'rev_id', 'rev_page', 'rev_timestamp', 'rev_user_text', 'rev_comment' + ) ); + foreach ( $result as $row ) { - $comment = ( $row->rev_comment == '' ) - ? '' - : '(' . $wgContLang->truncate( $row->rev_comment, 40 ) . ')'; + $comment = $commentStore->getComment( $row )->text; + if ( $comment !== '' ) { + $comment = '(' . $wgContLang->truncate( $comment, 40 ) . ')'; + } $this->output( sprintf( "%10d %10d %14s %20s %s\n", $row->rev_id, $row->rev_page, @@ -95,7 +115,7 @@ class Orphans extends Maintenance { $wgContLang->truncate( $row->rev_user_text, 17 ), $comment ) ); if ( $fix ) { - $dbw->delete( 'revision', array( 'rev_id' => $row->rev_id ) ); + $dbw->delete( 'revision', [ 'rev_id' => $row->rev_id ] ); } } if ( !$fix ) { @@ -111,13 +131,13 @@ class Orphans extends Maintenance { } /** - * @param $fix bool + * @param bool $fix * @todo DON'T USE THIS YET! It will remove entries which have children, * but which aren't properly attached (eg if page_latest is bogus * but valid revisions do exist) */ private function checkWidows( $fix ) { - $dbw = wfGetDB( DB_MASTER ); + $dbw = $this->getDB( DB_MASTER ); $page = $dbw->tableName( 'page' ); $revision = $dbw->tableName( 'revision' ); @@ -125,13 +145,14 @@ class Orphans extends Maintenance { $this->lockTables( $dbw ); } - $this->output( "\nChecking for childless page table entries... (this may take a while on a large wiki)\n" ); + $this->output( "\nChecking for childless page table entries... " + . "(this may take a while on a large wiki)\n" ); $result = $dbw->query( " SELECT * FROM $page LEFT OUTER JOIN $revision ON page_latest=rev_id WHERE rev_id IS NULL " ); - $widows = $dbw->numRows( $result ); + $widows = $result->numRows(); if ( $widows > 0 ) { $this->output( "$widows childless pages...\n" ); $this->output( sprintf( "%10s %11s %2s %s\n", 'page_id', 'page_latest', 'ns', 'page_title' ) ); @@ -142,7 +163,7 @@ class Orphans extends Maintenance { $row->page_namespace, $row->page_title ); if ( $fix ) { - $dbw->delete( 'page', array( 'page_id' => $row->page_id ) ); + $dbw->delete( 'page', [ 'page_id' => $row->page_id ] ); } } if ( !$fix ) { @@ -159,18 +180,19 @@ class Orphans extends Maintenance { /** * Check for pages where page_latest is wrong - * @param $fix bool Whether to fix broken entries + * @param bool $fix Whether to fix broken entries */ private function checkSeparation( $fix ) { - $dbw = wfGetDB( DB_MASTER ); - $page = $dbw->tableName( 'page' ); + $dbw = $this->getDB( DB_MASTER ); + $page = $dbw->tableName( 'page' ); $revision = $dbw->tableName( 'revision' ); if ( $fix ) { - $dbw->lockTables( $dbw, 'text', __METHOD__ ); + $this->lockTables( $dbw, [ 'user', 'text' ] ); } - $this->output( "\nChecking for pages whose page_latest links are incorrect... (this may take a while on a large wiki)\n" ); + $this->output( "\nChecking for pages whose page_latest links are incorrect... " + . "(this may take a while on a large wiki)\n" ); $result = $dbw->query( " SELECT * FROM $page LEFT OUTER JOIN $revision ON page_latest=rev_id @@ -200,13 +222,13 @@ class Orphans extends Maintenance { $maxId = $dbw->selectField( 'revision', 'rev_id', - array( - 'rev_page' => $row->page_id, - 'rev_timestamp' => $row2->max_timestamp ) ); + [ + 'rev_page' => $row->page_id, + 'rev_timestamp' => $row2->max_timestamp ] ); $this->output( "... updating to revision $maxId\n" ); $maxRev = Revision::newFromId( $maxId ); $title = Title::makeTitle( $row->page_namespace, $row->page_title ); - $article = new Article( $title ); + $article = WikiPage::factory( $title ); $article->updateRevisionOn( $dbw, $maxRev ); } } @@ -231,4 +253,4 @@ class Orphans extends Maintenance { } $maintClass = "Orphans"; -require_once( RUN_MAINTENANCE_IF_MAIN ); +require_once RUN_MAINTENANCE_IF_MAIN;