protected function doDBUpdates()
 {
     $db = $this->getDB(DB_MASTER);
     if (!$db->tableExists('log_search')) {
         $this->error("log_search does not exist");
         return false;
     }
     $start = $db->selectField('logging', 'MIN(log_id)', false, __FUNCTION__);
     if (!$start) {
         $this->output("Nothing to do.\n");
         return true;
     }
     $end = $db->selectField('logging', 'MAX(log_id)', false, __FUNCTION__);
     # Do remaining chunk
     $end += $this->mBatchSize - 1;
     $blockStart = $start;
     $blockEnd = $start + $this->mBatchSize - 1;
     $delTypes = array('delete', 'suppress');
     // revisiondelete types
     while ($blockEnd <= $end) {
         $this->output("...doing log_id from {$blockStart} to {$blockEnd}\n");
         $cond = "log_id BETWEEN {$blockStart} AND {$blockEnd}";
         $res = $db->select('logging', '*', $cond, __FUNCTION__);
         foreach ($res as $row) {
             // RevisionDelete logs - revisions
             if (LogEventsList::typeAction($row, $delTypes, 'revision')) {
                 $params = LogPage::extractParams($row->log_params);
                 // Param format: <urlparam> <item CSV> [<ofield> <nfield>]
                 if (count($params) < 2) {
                     continue;
                     // bad row?
                 }
                 $field = RevisionDeleter::getRelationType($params[0]);
                 // B/C, the params may start with a title key (<title> <urlparam> <CSV>)
                 if ($field == null) {
                     array_shift($params);
                     // remove title param
                     $field = RevisionDeleter::getRelationType($params[0]);
                     if ($field == null) {
                         $this->output("Invalid param type for {$row->log_id}\n");
                         continue;
                         // skip this row
                     } else {
                         // Clean up the row...
                         $db->update('logging', array('log_params' => implode(',', $params)), array('log_id' => $row->log_id));
                     }
                 }
                 $items = explode(',', $params[1]);
                 $log = new LogPage($row->log_type);
                 // Add item relations...
                 $log->addRelations($field, $items, $row->log_id);
                 // Determine what table to query...
                 $prefix = substr($field, 0, strpos($field, '_'));
                 // db prefix
                 if (!isset(self::$tableMap[$prefix])) {
                     continue;
                     // bad row?
                 }
                 $table = self::$tableMap[$prefix];
                 $userField = $prefix . '_user';
                 $userTextField = $prefix . '_user_text';
                 // Add item author relations...
                 $userIds = $userIPs = array();
                 $sres = $db->select($table, array($userField, $userTextField), array($field => $items));
                 foreach ($sres as $srow) {
                     if ($srow->{$userField} > 0) {
                         $userIds[] = intval($srow->{$userField});
                     } elseif ($srow->{$userTextField} != '') {
                         $userIPs[] = $srow->{$userTextField};
                     }
                 }
                 // Add item author relations...
                 $log->addRelations('target_author_id', $userIds, $row->log_id);
                 $log->addRelations('target_author_ip', $userIPs, $row->log_id);
             } elseif (LogEventsList::typeAction($row, $delTypes, 'event')) {
                 // RevisionDelete logs - log events
                 $params = LogPage::extractParams($row->log_params);
                 // Param format: <item CSV> [<ofield> <nfield>]
                 if (count($params) < 1) {
                     continue;
                     // bad row
                 }
                 $items = explode(',', $params[0]);
                 $log = new LogPage($row->log_type);
                 // Add item relations...
                 $log->addRelations('log_id', $items, $row->log_id);
                 // Add item author relations...
                 $userIds = $userIPs = array();
                 $sres = $db->select('logging', array('log_user', 'log_user_text'), array('log_id' => $items));
                 foreach ($sres as $srow) {
                     if ($srow->log_user > 0) {
                         $userIds[] = intval($srow->log_user);
                     } elseif (IP::isIPAddress($srow->log_user_text)) {
                         $userIPs[] = $srow->log_user_text;
                     }
                 }
                 $log->addRelations('target_author_id', $userIds, $row->log_id);
                 $log->addRelations('target_author_ip', $userIPs, $row->log_id);
             }
         }
         $blockStart += $this->mBatchSize;
         $blockEnd += $this->mBatchSize;
         wfWaitForSlaves();
     }
     $this->output("Done populating log_search table.\n");
     return true;
 }