* (bug 19857) maintenance/deleteRevision.php on last revision no longer breaks target...
[lhc/web/wiklou.git] / maintenance / deleteRevision.php
1 <?php
2 /**
3 * Delete one or more revisions by moving them to the archive table.
4 *
5 * @file
6 * @ingroup Maintenance
7 */
8
9 require_once( 'commandLine.inc' );
10
11 $dbw = wfGetDB( DB_MASTER );
12
13 if ( count( $args ) == 0 ) {
14 echo "Usage: php deleteRevision.php <revid> [<revid> ...]\n";
15 exit(1);
16 }
17
18 echo "Deleting revision(s) " . implode( ',', $args ) . " from ".wfWikiID()."...\n";
19
20 $affected = 0;
21 foreach ( $args as $revID ) {
22 $dbw->insertSelect( 'archive', array( 'page', 'revision' ),
23 array(
24 'ar_namespace' => 'page_namespace',
25 'ar_title' => 'page_title',
26 'ar_page_id' => 'page_id',
27 'ar_comment' => 'rev_comment',
28 'ar_user' => 'rev_user',
29 'ar_user_text' => 'rev_user_text',
30 'ar_timestamp' => 'rev_timestamp',
31 'ar_minor_edit' => 'rev_minor_edit',
32 'ar_rev_id' => 'rev_id',
33 'ar_text_id' => 'rev_text_id',
34 'ar_deleted' => 'rev_deleted',
35 'ar_len' => 'rev_len',
36 ), array(
37 'rev_id' => $revID,
38 'page_id = rev_page'
39 ), $fname
40 );
41 if ( !$dbw->affectedRows() ) {
42 echo "Revision $revID not found\n";
43 } else {
44 $affected += $dbw->affectedRows();
45 $dbw->delete( 'revision', array( 'rev_id' => $revID ) );
46
47 // Database integrity
48 $pageID = $dbw->selectField( 'page', 'page_id', array( 'page_latest' => $revID ), __METHOD__ );
49 if ( $pageID ) {
50 $newLatest = $dbw->selectField( 'revision', 'rev_id', array( 'rev_page' => $pageID ), __METHOD__, array( 'ORDER BY' => 'rev_timestamp DESC' ) );
51 $dbw->update( 'page', array( 'page_latest' => $newLatest ), array( 'page_id' => $pageID ), __METHOD__ );
52 }
53 }
54 }
55
56 print "Deleted $affected revisions\n";
57