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; }
/** * Get the condition used for fetching log snippets * @return array */ protected function getLogQueryCond() { $conds = array(); // Revision delete logs for these item $conds['log_type'] = array('delete', 'suppress'); $conds['log_action'] = $this->getList()->getLogAction(); $conds['ls_field'] = RevisionDeleter::getRelationType($this->typeName); $conds['ls_value'] = $this->ids; return $conds; }
/** * Record a log entry on the action * @param array $params Associative array of parameters: * newBits: The new value of the *_deleted bitfield * oldBits: The old value of the *_deleted bitfield. * title: The target title * ids: The ID list * comment: The log comment * authorsIds: The array of the user IDs of the offenders * authorsIPs: The array of the IP/anon user offenders * @throws MWException */ protected function updateLog($params) { // Get the URL param's corresponding DB field $field = RevisionDeleter::getRelationType($this->getType()); if (!$field) { throw new MWException("Bad log URL param type!"); } // Put things hidden from sysops in the suppression log if (($params['newBits'] | $params['oldBits']) & $this->getSuppressBit()) { $logType = 'suppress'; } else { $logType = 'delete'; } // Add params for affected page and ids $logParams = $this->getLogParams($params); // Actually add the deletion log entry $logEntry = new ManualLogEntry($logType, $this->getLogAction()); $logEntry->setTarget($params['title']); $logEntry->setComment($params['comment']); $logEntry->setParameters($logParams); $logEntry->setPerformer($this->getUser()); // Allow for easy searching of deletion log items for revision/log items $logEntry->setRelations(array($field => $params['ids'], 'target_author_id' => $params['authorIds'], 'target_author_ip' => $params['authorIPs'])); $logId = $logEntry->insert(); $logEntry->publish($logId); }
/** * Record a log entry on the action * @param $params array Associative array of parameters: * newBits: The new value of the *_deleted bitfield * oldBits: The old value of the *_deleted bitfield. * title: The target title * ids: The ID list * comment: The log comment * authorsIds: The array of the user IDs of the offenders * authorsIPs: The array of the IP/anon user offenders */ protected function updateLog($params) { // Get the URL param's corresponding DB field $field = RevisionDeleter::getRelationType($this->getType()); if (!$field) { throw new MWException("Bad log URL param type!"); } // Put things hidden from sysops in the oversight log if (($params['newBits'] | $params['oldBits']) & $this->getSuppressBit()) { $logType = 'suppress'; } else { $logType = 'delete'; } // Add params for effected page and ids $logParams = $this->getLogParams($params); // Actually add the deletion log entry $log = new LogPage($logType); $logid = $log->addEntry($this->getLogAction(), $params['title'], $params['comment'], $logParams); // Allow for easy searching of deletion log items for revision/log items $log->addRelations($field, $params['ids'], $logid); $log->addRelations('target_author_id', $params['authorIds'], $logid); $log->addRelations('target_author_ip', $params['authorIPs'], $logid); }
/** * Record a log entry on the action * @param string $logType One of (delete,suppress) * @param array $params Associative array of parameters: * newBits: The new value of the *_deleted bitfield * oldBits: The old value of the *_deleted bitfield. * title: The target title * ids: The ID list * comment: The log comment * authorsIds: The array of the user IDs of the offenders * authorsIPs: The array of the IP/anon user offenders * @throws MWException */ private function updateLog($logType, $params) { // Get the URL param's corresponding DB field $field = RevisionDeleter::getRelationType($this->getType()); if (!$field) { throw new MWException("Bad log URL param type!"); } // Add params for affected page and ids $logParams = $this->getLogParams($params); // Actually add the deletion log entry $logEntry = new ManualLogEntry($logType, $this->getLogAction()); $logEntry->setTarget($params['title']); $logEntry->setComment($params['comment']); $logEntry->setParameters($logParams); $logEntry->setPerformer($this->getUser()); // Allow for easy searching of deletion log items for revision/log items $logEntry->setRelations([$field => $params['ids'], 'target_author_id' => $params['authorIds'], 'target_author_ip' => $params['authorIPs']]); $logId = $logEntry->insert(); $logEntry->publish($logId); }