Re-add some files that are still used by updaters.inc.
authorChad Horohoe <demon@users.mediawiki.org>
Mon, 3 Aug 2009 02:44:18 +0000 (02:44 +0000)
committerChad Horohoe <demon@users.mediawiki.org>
Mon, 3 Aug 2009 02:44:18 +0000 (02:44 +0000)
maintenance/populateLogSearch.inc [new file with mode: 0644]
maintenance/populateParentId.inc [new file with mode: 0644]

diff --git a/maintenance/populateLogSearch.inc b/maintenance/populateLogSearch.inc
new file mode 100644 (file)
index 0000000..d678191
--- /dev/null
@@ -0,0 +1,78 @@
+<?php
+/**
+ * Makes the required database updates for log display in Special:RevisionDelete
+ *
+ * Run via update.php or directly through populateLogSearch.php
+ *
+ * @file
+ * @ingroup Maintenance
+ */
+
+define( 'LOG_SEARCH_BATCH_SIZE', 100 );
+
+function migrate_log_params( $db ) {
+       $start = $db->selectField( 'logging', 'MIN(log_id)', false, __FUNCTION__ );
+       if( !$start ) {
+               echo "Nothing to do.\n";
+               return true;
+       }
+       $end = $db->selectField( 'logging', 'MAX(log_id)', false, __FUNCTION__ );
+       
+       # Do remaining chunk
+       $end += LOG_SEARCH_BATCH_SIZE - 1;
+       $blockStart = $start;
+       $blockEnd = $start + LOG_SEARCH_BATCH_SIZE - 1;
+       while( $blockEnd <= $end ) {
+               echo "...doing log_id from $blockStart to $blockEnd\n";
+               $cond = "log_id BETWEEN $blockStart AND $blockEnd";
+               $res = $db->select( 'logging', '*', $cond, __FUNCTION__ );
+               $batch = array();
+               while( $row = $db->fetchObject( $res ) ) {
+                       // RevisionDelete logs - revisions
+                       if( LogEventsList::typeAction( $row, array('delete','suppress'), 'revision' ) ) {
+                               $params = LogPage::extractParams( $row->log_params );
+                               // Param format: <urlparam> <item CSV> [<ofield> <nfield>]
+                               if( count($params) >= 2 ) {
+                                       $field = RevisionDeleter::getRelationType($params[0]);
+                                       // B/C, the params may start with a title key
+                                       if( $field == null ) {
+                                               array_shift($params);
+                                               $field = RevisionDeleter::getRelationType($params[0]);
+                                       }
+                                       if( $field == null ) {
+                                               echo "Invalid param type for $row->log_id\n";
+                                               continue; // skip this row
+                                       }
+                                       $items = explode(',',$params[1]);
+                                       $log = new LogPage( $row->log_type );
+                                       $log->addRelations( $field, $items, $row->log_id );
+                               }
+                       // RevisionDelete logs - log events
+                       } else if( LogEventsList::typeAction( $row, array('delete','suppress'), 'event' ) ) {
+                               $params = LogPage::extractParams( $row->log_params );
+                               // Param format: <item CSV> [<ofield> <nfield>]
+                               if( count($params) >= 1 ) {
+                                       $items = explode(',',$params[0]);
+                                       $log = new LogPage( $row->log_type );
+                                       $log->addRelations( 'log_id', $items, $row->log_id );
+                               }
+                       }
+               }
+               $blockStart += LOG_SEARCH_BATCH_SIZE;
+               $blockEnd += LOG_SEARCH_BATCH_SIZE;
+               wfWaitForSlaves( 5 );
+       }
+       if( $db->insert(
+                       'updatelog',
+                       array( 'ul_key' => 'populate log_search' ),
+                       __FUNCTION__,
+                       'IGNORE'
+               )
+       ) {
+               wfOut( "log_search population complete.\n" );
+               return true;
+       } else {
+               wfOut( "Could not insert log_search population row.\n" );
+               return false;
+       }
+}
diff --git a/maintenance/populateParentId.inc b/maintenance/populateParentId.inc
new file mode 100644 (file)
index 0000000..7b1ae3e
--- /dev/null
@@ -0,0 +1,83 @@
+<?php
+
+define( 'BATCH_SIZE', 200 );
+
+function populate_rev_parent_id( $db ) {
+       wfOut( "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 ) ){
+               wfOut( "...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 = intval( $start );
+       $blockEnd = intval( $start ) + BATCH_SIZE - 1;
+       $count = 0;
+       $changed = 0;
+       while( $blockEnd <= $end ) {
+               wfOut( "...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 < " . intval( $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 < " . $db->addQuotes( $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 ) {
+               wfOut( "rev_parent_id population complete ... {$count} rows [{$changed} changed]\n" );
+               return true;
+       } else {
+               wfOut( "Could not insert rev_parent_id population row.\n" );
+               return false;
+       }
+}
+