mDescription = "Populates rev_len"; $this->setBatchSize( 200 ); } public function execute() { $db = wfGetDB( DB_MASTER ); if ( !$db->tableExists( 'revision' ) ) { $this->error( "revision table does not exist", true ); } $this->output( "Populating rev_len 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 ) ) { $this->output( "...revision table seems to be empty.\n" ); $db->insert( 'updatelog', array( 'ul_key' => 'populate rev_len' ), __METHOD__, 'IGNORE' ); return; } # Do remaining chunks $blockStart = intval( $start ); $blockEnd = intval( $start ) + $this->mBatchSize - 1; $count = 0; $missing = 0; while ( $blockStart <= $end ) { $this->output( "...doing rev_id from $blockStart to $blockEnd\n" ); $res = $db->select( 'revision', Revision::selectFields(), array( "rev_id >= $blockStart", "rev_id <= $blockEnd", "rev_len IS NULL" ), __METHOD__ ); # Go through and update rev_len from these rows. foreach ( $res as $row ) { $rev = new Revision( $row ); $text = $rev->getRawText(); if ( !is_string( $text ) ) { # This should not happen, but sometimes does (bug 20757) $this->output( "Text of revision {$row->rev_id} unavailable!\n" ); $missing++; } else { # Update the row... $db->update( 'revision', array( 'rev_len' => strlen( $text ) ), array( 'rev_id' => $row->rev_id ), __METHOD__ ); $count++; } } $blockStart += $this->mBatchSize; $blockEnd += $this->mBatchSize; wfWaitForSlaves( 5 ); } $logged = $db->insert( 'updatelog', array( 'ul_key' => 'populate rev_len' ), __METHOD__, 'IGNORE' ); if ( $logged ) { $this->output( "rev_len population complete ... {$count} rows changed ({$missing} missing)\n" ); return true; } else { $this->output( "Could not insert rev_len population row.\n" ); return false; } } } $maintClass = "PopulateRevisionLength"; require_once( RUN_MAINTENANCE_IF_MAIN );