31require_once __DIR__ .
'/Maintenance.php';
43 parent::__construct();
44 $this->
addDescription(
"Look for 'orphan' revisions hooked to pages which don't exist\n" .
45 "and 'childless' pages with no revisions\n" .
46 "Then, kill the poor widows and orphans\n" .
47 "Man this is depressing"
49 $this->
addOption(
'fix',
'Actually fix broken entries' );
55 # Does not work yet, do not use
56 # $this->checkWidows( $this->hasOption( 'fix' ) );
65 $tbls = [
'page',
'revision',
'redirect' ];
67 $tbls = array_merge( $tbls, $extraTable );
69 $db->lockTables( [], $tbls, __METHOD__,
false );
84 $commentQuery = $commentStore->getJoin();
86 $this->
output(
"Checking for orphan revision table entries... "
87 .
"(this may take a while on a large wiki)\n" );
88 $result = $dbw->select(
89 [
'revision',
'page' ] + $commentQuery[
'tables'],
90 [
'rev_id',
'rev_page',
'rev_timestamp',
'rev_user_text' ] + $commentQuery[
'fields'],
91 [
'page_id' =>
null ],
94 [
'page' => [
'LEFT JOIN', [
'rev_page=page_id' ] ] ] + $commentQuery[
'joins']
96 $orphans = $result->numRows();
100 $this->
output(
"$orphans orphan revisions...\n" );
102 "%10s %10s %14s %20s %s\n",
103 'rev_id',
'rev_page',
'rev_timestamp',
'rev_user_text',
'rev_comment'
106 foreach ( $result as $row ) {
107 $comment = $commentStore->getComment( $row )->text;
108 if ( $comment !==
'' ) {
109 $comment =
'(' .
$wgContLang->truncate( $comment, 40 ) .
')';
111 $this->
output( sprintf(
"%10d %10d %14s %20s %s\n",
118 $dbw->delete(
'revision', [
'rev_id' => $row->rev_id ] );
122 $this->
output(
"Run again with --fix to remove these entries automatically.\n" );
125 $this->
output(
"No orphans! Yay!\n" );
129 $dbw->unlockTables( __METHOD__ );
141 $page = $dbw->tableName(
'page' );
142 $revision = $dbw->tableName(
'revision' );
148 $this->
output(
"\nChecking for childless page table entries... "
149 .
"(this may take a while on a large wiki)\n" );
150 $result = $dbw->query(
"
152 FROM $page LEFT OUTER JOIN $revision ON page_latest=rev_id
155 $widows = $result->numRows();
157 $this->
output(
"$widows childless pages...\n" );
158 $this->
output( sprintf(
"%10s %11s %2s %s\n",
'page_id',
'page_latest',
'ns',
'page_title' ) );
159 foreach ( $result as $row ) {
160 printf(
"%10d %11d %2d %s\n",
163 $row->page_namespace,
166 $dbw->delete(
'page', [
'page_id' => $row->page_id ] );
170 $this->
output(
"Run again with --fix to remove these entries automatically.\n" );
173 $this->
output(
"No childless pages! Yay!\n" );
177 $dbw->unlockTables( __METHOD__ );
187 $page = $dbw->tableName(
'page' );
188 $revision = $dbw->tableName(
'revision' );
191 $this->
lockTables( $dbw, [
'user',
'text' ] );
194 $this->
output(
"\nChecking for pages whose page_latest links are incorrect... "
195 .
"(this may take a while on a large wiki)\n" );
196 $result = $dbw->query(
"
198 FROM $page LEFT OUTER JOIN $revision ON page_latest=rev_id
201 foreach ( $result as $row ) {
202 $result2 = $dbw->query(
"
203 SELECT MAX(rev_timestamp) as max_timestamp
205 WHERE rev_page=$row->page_id
207 $row2 = $dbw->fetchObject( $result2 );
209 if ( $row->rev_timestamp != $row2->max_timestamp ) {
211 $this->
output( sprintf(
"%10s %10s %14s %14s\n",
212 'page_id',
'rev_id',
'timestamp',
'max timestamp' ) );
215 $this->
output( sprintf(
"%10d %10d %14s %14s\n",
219 $row2->max_timestamp ) );
222 $maxId = $dbw->selectField(
226 'rev_page' => $row->page_id,
227 'rev_timestamp' => $row2->max_timestamp ] );
228 $this->
output(
"... updating to revision $maxId\n" );
230 $title = Title::makeTitle( $row->page_namespace, $row->page_title );
232 $article->updateRevisionOn( $dbw, $maxRev );
241 $this->
output(
"Found $found pages with incorrect latest revision.\n" );
243 $this->
output(
"No pages with incorrect latest revision. Yay!\n" );
245 if ( !$fix && $found > 0 ) {
246 $this->
output(
"Run again with --fix to remove these entries automatically.\n" );
250 $dbw->unlockTables( __METHOD__ );
Abstract maintenance class for quickly writing and churning out maintenance scripts with minimal effo...
getDB( $db, $groups=[], $wiki=false)
Returns a database to be used by current maintenance script.
hasOption( $name)
Checks to see if a particular param exists.
addDescription( $text)
Set the description text.
addOption( $name, $description, $required=false, $withArg=false, $shortName=false, $multiOccurrence=false)
Add a parameter to the script.
Maintenance script that looks for 'orphan' revisions hooked to pages which don't exist and 'childless...
lockTables( $db, $extraTable=[])
Lock the appropriate tables for the script.
checkSeparation( $fix)
Check for pages where page_latest is wrong.
execute()
Do the actual work.
__construct()
Default constructor.
checkOrphans( $fix)
Check for orphan revisions.
static newFromId( $id, $flags=0)
Load a page revision from a given revision ID number.
static factory(Title $title)
Create a WikiPage object of the appropriate class for the given title.
this class mediates it Skin Encapsulates a look and feel for the wiki All of the functions that render HTML and make choices about how to render it are here and are called from various other places when and is meant to be subclassed with other skins that may override some of its functions The User object contains a reference to a and so rather than having a global skin object we just rely on the global User and get the skin with $wgUser and also has some character encoding functions and other locale stuff The current user interface language is instantiated as and the local content language as $wgContLang
design txt This is a brief overview of the new design More thorough and up to date information is available on the documentation wiki at etc Handles the details of getting and saving to the user table of the and dealing with sessions and cookies OutputPage Encapsulates the entire HTML page that will be sent in response to any server request It is used by calling its functions to add in any and then calling output() to send it all. It could be easily changed to send incrementally if that becomes useful
Advanced database interface for IDatabase handles that include maintenance methods.
require_once RUN_MAINTENANCE_IF_MAIN