00001 <?php 00010 require_once( 'purgeOldText.inc' ); 00011 00012 function DeleteOldRevisions( $delete = false, $args = array() ) { 00013 00014 # Data should come off the master, wrapped in a transaction 00015 $dbw = wfGetDB( DB_MASTER ); 00016 $dbw->begin(); 00017 00018 $tbl_pag = $dbw->tableName( 'page' ); 00019 $tbl_rev = $dbw->tableName( 'revision' ); 00020 00021 $pageIdClause = ''; 00022 $revPageClause = ''; 00023 00024 # If a list of page_ids was provided, limit results to that set of page_ids 00025 if ( sizeof( $args ) > 0 ) { 00026 $pageIdList = implode( ',', $args ); 00027 $pageIdClause = " WHERE page_id IN ({$pageIdList})"; 00028 $revPageClause = " AND rev_page IN ({$pageIdList})"; 00029 echo( "Limiting to {$tbl_pag}.page_id IN ({$pageIdList})\n" ); 00030 } 00031 00032 # Get "active" revisions from the page table 00033 echo( "Searching for active revisions..." ); 00034 $res = $dbw->query( "SELECT page_latest FROM $tbl_pag{$pageIdClause}" ); 00035 while( $row = $dbw->fetchObject( $res ) ) { 00036 $cur[] = $row->page_latest; 00037 } 00038 echo( "done.\n" ); 00039 00040 # Get all revisions that aren't in this set 00041 echo( "Searching for inactive revisions..." ); 00042 $set = implode( ', ', $cur ); 00043 $res = $dbw->query( "SELECT rev_id FROM $tbl_rev WHERE rev_id NOT IN ( $set ){$revPageClause}" ); 00044 while( $row = $dbw->fetchObject( $res ) ) { 00045 $old[] = $row->rev_id; 00046 } 00047 echo( "done.\n" ); 00048 00049 # Inform the user of what we're going to do 00050 $count = count( $old ); 00051 echo( "$count old revisions found.\n" ); 00052 00053 # Delete as appropriate 00054 if( $delete && $count ) { 00055 echo( "Deleting..." ); 00056 $set = implode( ', ', $old ); 00057 $dbw->query( "DELETE FROM $tbl_rev WHERE rev_id IN ( $set )" ); 00058 echo( "done.\n" ); 00059 } 00060 00061 # This bit's done 00062 # Purge redundant text records 00063 $dbw->commit(); 00064 if( $delete ) { 00065 PurgeRedundantText( true ); 00066 } 00067 00068 }