00001 <?php
00025 require_once( dirname(__FILE__) . '/Maintenance.php' );
00026
00027 class NukePage extends Maintenance {
00028 public function __construct() {
00029 parent::__construct();
00030 $this->mDescription = "Remove a page record from the database";
00031 $this->addOption( 'delete', "Actually delete the page" );
00032 $this->addArg( 'title', 'Title to delete' );
00033 }
00034
00035 public function execute() {
00036
00037 $name = $this->getArg();
00038 $delete = $this->getOption( 'delete', false );
00039
00040 $dbw = wfGetDB( DB_MASTER );
00041 $dbw->begin();
00042
00043 $tbl_pag = $dbw->tableName( 'page' );
00044 $tbl_rec = $dbw->tableName( 'recentchanges' );
00045 $tbl_rev = $dbw->tableName( 'revision' );
00046
00047 # Get page ID
00048 $this->output( "Searching for \"$name\"..." );
00049 $title = Title::newFromText( $name );
00050 if( $title ) {
00051 $id = $title->getArticleID();
00052 $real = $title->getPrefixedText();
00053 $isGoodArticle = $title->isContentPage();
00054 $this->output( "found \"$real\" with ID $id.\n" );
00055
00056 # Get corresponding revisions
00057 $this->output( "Searching for revisions..." );
00058 $res = $dbw->query( "SELECT rev_id FROM $tbl_rev WHERE rev_page = $id" );
00059 foreach( $res as $row ) {
00060 $revs[] = $row->rev_id;
00061 }
00062 $count = count( $revs );
00063 $this->output( "found $count.\n" );
00064
00065 # Delete the page record and associated recent changes entries
00066 if( $delete ) {
00067 $this->output( "Deleting page record..." );
00068 $dbw->query( "DELETE FROM $tbl_pag WHERE page_id = $id" );
00069 $this->output( "done.\n" );
00070 $this->output( "Cleaning up recent changes..." );
00071 $dbw->query( "DELETE FROM $tbl_rec WHERE rc_cur_id = $id" );
00072 $this->output( "done.\n" );
00073 }
00074
00075 $dbw->commit();
00076
00077 # Delete revisions as appropriate
00078 if( $delete && $count ) {
00079 $this->output( "Deleting revisions..." );
00080 $this->deleteRevisions( $revs );
00081 $this->output( "done.\n" );
00082 $this->purgeRedundantText( true );
00083 }
00084
00085 # Update stats as appropriate
00086 if ( $delete ) {
00087 $this->output( "Updating site stats..." );
00088 $ga = $isGoodArticle ? -1 : 0;
00089 $stats = new SiteStatsUpdate( 0, -$count, $ga, -1 );
00090 $stats->doUpdate();
00091 $this->output( "done.\n" );
00092 }
00093 } else {
00094 $this->output( "not found in database.\n" );
00095 $dbw->commit();
00096 }
00097 }
00098
00099 public function deleteRevisions( $ids ) {
00100 $dbw = wfGetDB( DB_MASTER );
00101 $dbw->begin();
00102
00103 $tbl_rev = $dbw->tableName( 'revision' );
00104
00105 $set = implode( ', ', $ids );
00106 $dbw->query( "DELETE FROM $tbl_rev WHERE rev_id IN ( $set )" );
00107
00108 $dbw->commit();
00109 }
00110 }
00111
00112 $maintClass = "NukePage";
00113 require_once( DO_MAINTENANCE );