* (bug 13820) Fix updater for rev_parent_id population
authorBrion Vibber <brion@users.mediawiki.org>
Thu, 1 May 2008 22:38:22 +0000 (22:38 +0000)
committerBrion Vibber <brion@users.mediawiki.org>
Thu, 1 May 2008 22:38:22 +0000 (22:38 +0000)
Was running a command-line entry point from the middle of an updater, which is bad bad bad -- will kill the web installer and may fail on command-line updates, depending on circumstances.

RELEASE-NOTES
maintenance/populateParentId.inc [new file with mode: 0644]
maintenance/populateParentId.php
maintenance/updaters.inc

index 6e94c9e..9dc679a 100644 (file)
@@ -236,6 +236,8 @@ it from source control: http://www.mediawiki.org/wiki/Download_from_SVN
 * (bug 13905) Blacklist Mac IE from HttpOnly cookies; it eats them sometimes
 * (bug 13922) Fix bad HTML on empty Special:Prefixindex and Special:Allpages
 * (bug 13924) Fix bad HTML on power search form
+* (bug 13820) Fix updater for rev_parent_id population
+
 
 === API changes in 1.13 ===
 
diff --git a/maintenance/populateParentId.inc b/maintenance/populateParentId.inc
new file mode 100644 (file)
index 0000000..c71d311
--- /dev/null
@@ -0,0 +1,81 @@
+<?php
+
+function populate_rev_parent_id( $db ) {
+       echo "Populating rev_parent_id column\n";
+       $start = $db->selectField( 'revision', 'MIN(rev_id)', false, __FUNCTION__ );
+       $end = $db->selectField( 'revision', 'MAX(rev_id)', false, __FUNCTION__ );
+       if( is_null( $start ) || is_null( $end ) ){
+               echo "...revision table seems to be empty.\n";
+               $db->insert( 'updatelog',
+                       array( 'ul_key' => 'populate rev_parent_id' ),
+                       __FUNCTION__,
+                       'IGNORE' );
+               return;
+       }
+       # Do remaining chunk
+       $end += BATCH_SIZE - 1;
+       $blockStart = $start;
+       $blockEnd = $start + BATCH_SIZE - 1;
+       $count = 0;
+       $changed = 0;
+       while( $blockEnd <= $end ) {
+               echo "...doing rev_id from $blockStart to $blockEnd\n";
+               $cond = "rev_id BETWEEN $blockStart AND $blockEnd";
+               $res = $db->select( 'revision', 
+                       array('rev_id','rev_page','rev_timestamp','rev_parent_id'), 
+                       $cond, __FUNCTION__ );
+               # Go through and update rev_parent_id from these rows.
+               # Assume that the previous revision of the title was
+               # the original previous revision of the title when the
+               # edit was made...
+               foreach( $res as $row ) {
+                       # First, check rows with the same timestamp other than this one
+                       # with a smaller rev ID. The highest ID "wins". This avoids loops
+                       # as timestamp can only decrease and never loops with IDs (from parent to parent)
+                       $previousID = $db->selectField( 'revision', 'rev_id', 
+                               array( 'rev_page' => $row->rev_page, 'rev_timestamp' => $row->rev_timestamp,
+                                       "rev_id < {$row->rev_id}" ), 
+                               __FUNCTION__,
+                               array( 'ORDER BY' => 'rev_id DESC' ) );
+                       # If there are none, check the the highest ID with a lower timestamp
+                       if( !$previousID ) {
+                               # Get the highest older timestamp
+                               $lastTimestamp = $db->selectField( 'revision', 'rev_timestamp', 
+                                       array( 'rev_page' => $row->rev_page, "rev_timestamp < '{$row->rev_timestamp}'" ), 
+                                       __FUNCTION__,
+                                       array( 'ORDER BY' => 'rev_timestamp DESC' ) );
+                               # If there is one, let the highest rev ID win
+                               if( $lastTimestamp ) {
+                                       $previousID = $db->selectField( 'revision', 'rev_id', 
+                                               array( 'rev_page' => $row->rev_page, 'rev_timestamp' => $lastTimestamp ), 
+                                               __FUNCTION__,
+                                               array( 'ORDER BY' => 'rev_id DESC' ) );
+                               }
+                       }
+                       $previousID = intval($previousID);
+                       if( $previousID != $row->rev_parent_id )
+                               $changed++;
+                       # Update the row...
+                       $db->update( 'revision',
+                               array( 'rev_parent_id' => $previousID ),
+                               array( 'rev_id' => $row->rev_id ),
+                               __FUNCTION__ );
+                       $count++;
+               }
+               $blockStart += BATCH_SIZE - 1;
+               $blockEnd += BATCH_SIZE - 1;
+               wfWaitForSlaves( 5 );
+       }
+       $logged = $db->insert( 'updatelog',
+               array( 'ul_key' => 'populate rev_parent_id' ),
+               __FUNCTION__,
+               'IGNORE' );
+       if( $logged ) {
+               echo "rev_parent_id population complete ... {$count} rows [{$changed} changed]\n";
+               return true;
+       } else {
+               echo "Could not insert rev_parent_id population row.\n";
+               return false;
+       }
+}
+
index 366c457..b9d8475 100644 (file)
@@ -9,6 +9,7 @@
 define( 'BATCH_SIZE', 200 );
 
 require_once 'commandLine.inc';
+require_once 'populateParentId.inc';
        
 $db =& wfGetDB( DB_MASTER );
 if ( !$db->tableExists( 'revision' ) ) {
@@ -17,84 +18,3 @@ if ( !$db->tableExists( 'revision' ) ) {
 }
 
 populate_rev_parent_id( $db );
-
-function populate_rev_parent_id( $db ) {
-       echo "Populating rev_parent_id column\n";
-       $start = $db->selectField( 'revision', 'MIN(rev_id)', false, __FUNCTION__ );
-       $end = $db->selectField( 'revision', 'MAX(rev_id)', false, __FUNCTION__ );
-       if( is_null( $start ) || is_null( $end ) ){
-               echo "...revision table seems to be empty.\n";
-               $db->insert( 'updatelog',
-                       array( 'ul_key' => 'populate rev_parent_id' ),
-                       __FUNCTION__,
-                       'IGNORE' );
-               return;
-       }
-       # Do remaining chunk
-       $end += BATCH_SIZE - 1;
-       $blockStart = $start;
-       $blockEnd = $start + BATCH_SIZE - 1;
-       $count = 0;
-       $changed = 0;
-       while( $blockEnd <= $end ) {
-               echo "...doing rev_id from $blockStart to $blockEnd\n";
-               $cond = "rev_id BETWEEN $blockStart AND $blockEnd";
-               $res = $db->select( 'revision', 
-                       array('rev_id','rev_page','rev_timestamp','rev_parent_id'), 
-                       $cond, __FUNCTION__ );
-               # Go through and update rev_parent_id from these rows.
-               # Assume that the previous revision of the title was
-               # the original previous revision of the title when the
-               # edit was made...
-               foreach( $res as $row ) {
-                       # First, check rows with the same timestamp other than this one
-                       # with a smaller rev ID. The highest ID "wins". This avoids loops
-                       # as timestamp can only decrease and never loops with IDs (from parent to parent)
-                       $previousID = $db->selectField( 'revision', 'rev_id', 
-                               array( 'rev_page' => $row->rev_page, 'rev_timestamp' => $row->rev_timestamp,
-                                       "rev_id < {$row->rev_id}" ), 
-                               __FUNCTION__,
-                               array( 'ORDER BY' => 'rev_id DESC' ) );
-                       # If there are none, check the the highest ID with a lower timestamp
-                       if( !$previousID ) {
-                               # Get the highest older timestamp
-                               $lastTimestamp = $db->selectField( 'revision', 'rev_timestamp', 
-                                       array( 'rev_page' => $row->rev_page, "rev_timestamp < '{$row->rev_timestamp}'" ), 
-                                       __FUNCTION__,
-                                       array( 'ORDER BY' => 'rev_timestamp DESC' ) );
-                               # If there is one, let the highest rev ID win
-                               if( $lastTimestamp ) {
-                                       $previousID = $db->selectField( 'revision', 'rev_id', 
-                                               array( 'rev_page' => $row->rev_page, 'rev_timestamp' => $lastTimestamp ), 
-                                               __FUNCTION__,
-                                               array( 'ORDER BY' => 'rev_id DESC' ) );
-                               }
-                       }
-                       $previousID = intval($previousID);
-                       if( $previousID != $row->rev_parent_id )
-                               $changed++;
-                       # Update the row...
-                       $db->update( 'revision',
-                               array( 'rev_parent_id' => $previousID ),
-                               array( 'rev_id' => $row->rev_id ),
-                               __FUNCTION__ );
-                       $count++;
-               }
-               $blockStart += BATCH_SIZE - 1;
-               $blockEnd += BATCH_SIZE - 1;
-               wfWaitForSlaves( 5 );
-       }
-       $logged = $db->insert( 'updatelog',
-               array( 'ul_key' => 'populate rev_parent_id' ),
-               __FUNCTION__,
-               'IGNORE' );
-       if( $logged ) {
-               echo "rev_parent_id population complete ... {$count} rows [{$changed} changed]\n";
-               return true;
-       } else {
-               echo "Could not insert rev_parent_id population row.\n";
-               return false;
-       }
-}
-
-
index d284663..86db76f 100644 (file)
@@ -1177,6 +1177,9 @@ function do_populate_parent_id() {
                return;
        }
        require_once( 'populateParentId.php' );
+       
+       global $wgDatabase;
+       populate_rev_parent_id( $wgDatabase );
 }
 
 function