From 6cd24195b36b00181e131ba35518d680aada3eee Mon Sep 17 00:00:00 2001 From: Chad Horohoe Date: Mon, 3 Aug 2009 02:44:18 +0000 Subject: [PATCH] Re-add some files that are still used by updaters.inc. --- maintenance/populateLogSearch.inc | 78 +++++++++++++++++++++++++++++ maintenance/populateParentId.inc | 83 +++++++++++++++++++++++++++++++ 2 files changed, 161 insertions(+) create mode 100644 maintenance/populateLogSearch.inc create mode 100644 maintenance/populateParentId.inc diff --git a/maintenance/populateLogSearch.inc b/maintenance/populateLogSearch.inc new file mode 100644 index 0000000000..d678191d42 --- /dev/null +++ b/maintenance/populateLogSearch.inc @@ -0,0 +1,78 @@ +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: [ ] + 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: [ ] + 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 index 0000000000..7b1ae3e8fe --- /dev/null +++ b/maintenance/populateParentId.inc @@ -0,0 +1,83 @@ +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; + } +} + -- 2.20.1