MediaWiki  REL1_24
deleteRevision.php
Go to the documentation of this file.
00001 <?php
00024 require_once __DIR__ . '/Maintenance.php';
00025 
00032 class DeleteRevision extends Maintenance {
00033 
00034     public function __construct() {
00035         parent::__construct();
00036         $this->mDescription = "Delete one or more revisions by moving them to the archive table";
00037     }
00038 
00039     public function execute() {
00040         if ( count( $this->mArgs ) == 0 ) {
00041             $this->error( "No revisions specified", true );
00042         }
00043 
00044         $this->output( "Deleting revision(s) " . implode( ',', $this->mArgs ) .
00045             " from " . wfWikiID() . "...\n" );
00046         $dbw = wfGetDB( DB_MASTER );
00047 
00048         $affected = 0;
00049         foreach ( $this->mArgs as $revID ) {
00050             $dbw->insertSelect( 'archive', array( 'page', 'revision' ),
00051                 array(
00052                     'ar_namespace' => 'page_namespace',
00053                     'ar_title' => 'page_title',
00054                     'ar_page_id' => 'page_id',
00055                     'ar_comment' => 'rev_comment',
00056                     'ar_user' => 'rev_user',
00057                     'ar_user_text' => 'rev_user_text',
00058                     'ar_timestamp' => 'rev_timestamp',
00059                     'ar_minor_edit' => 'rev_minor_edit',
00060                     'ar_rev_id' => 'rev_id',
00061                     'ar_text_id' => 'rev_text_id',
00062                     'ar_deleted' => 'rev_deleted',
00063                     'ar_len' => 'rev_len',
00064                 ),
00065                 array(
00066                     'rev_id' => $revID,
00067                     'page_id = rev_page'
00068                 ),
00069                 __METHOD__
00070             );
00071             if ( !$dbw->affectedRows() ) {
00072                 $this->output( "Revision $revID not found\n" );
00073             } else {
00074                 $affected += $dbw->affectedRows();
00075                 $pageID = $dbw->selectField(
00076                     'revision',
00077                     'rev_page',
00078                     array( 'rev_id' => $revID ),
00079                     __METHOD__
00080                 );
00081                 $pageLatest = $dbw->selectField(
00082                     'page',
00083                     'page_latest',
00084                     array( 'page_id' => $pageID ),
00085                     __METHOD__
00086                 );
00087                 $dbw->delete( 'revision', array( 'rev_id' => $revID ) );
00088                 if ( $pageLatest == $revID ) {
00089                     // Database integrity
00090                     $newLatest = $dbw->selectField(
00091                         'revision',
00092                         'rev_id',
00093                         array( 'rev_page' => $pageID ),
00094                         __METHOD__,
00095                         array( 'ORDER BY' => 'rev_timestamp DESC' )
00096                     );
00097                     $dbw->update(
00098                         'page',
00099                         array( 'page_latest' => $newLatest ),
00100                         array( 'page_id' => $pageID ),
00101                         __METHOD__
00102                     );
00103                 }
00104             }
00105         }
00106         $this->output( "Deleted $affected revisions\n" );
00107     }
00108 }
00109 
00110 $maintClass = "DeleteRevision";
00111 require_once RUN_MAINTENANCE_IF_MAIN;