function _formatVar(&$value)
 {
     if (is_null($value)) {
         return LogFormatter::_formatNull($value);
     }
     if (is_bool($value)) {
         return LogFormatter::_formatBool($value);
     }
     if (is_int($value) || is_float($value)) {
         return $value;
     }
     if (is_object($value)) {
         return LogFormatter::_formatObject($value);
     }
     // is_callable should be placed before is_string and is_array:
     if (is_callable($value)) {
         return LogFormatter::_formatCallback($value);
     }
     if (is_string($value)) {
         return LogFormatter::_formatString($value);
     }
     if (is_array($value)) {
         return LogFormatter::_formatArray($value);
     }
     return gettype($value) . ' { ... }';
 }
 public function getMessageParameters()
 {
     $params = parent::getMessageParameters();
     $type = $this->entry->getSubtype();
     $entry_params = $this->entry->getParameters();
     if ($type === 'approve') {
         $revid = $entry_params['revid'];
         $link = Linker::linkKnown($this->entry->getTarget(), wfMessage('moderation-log-diff', $revid)->text(), array('title' => wfMessage('tooltip-moderation-approved-diff')), array('diff' => $revid));
         $params[4] = Message::rawParam($link);
     } elseif ($type === 'reject') {
         $modid = $entry_params['modid'];
         $link = Linker::linkKnown(Title::makeTitle(NS_SPECIAL, "Moderation"), wfMessage('moderation-log-change', $modid)->text(), array('title' => wfMessage('tooltip-moderation-rejected-change')), array('modaction' => 'show', 'modid' => $modid));
         $params[4] = Message::rawParam($link);
         $userlink = Linker::userLink($entry_params['user'], $entry_params['user_text']);
         $params[5] = Message::rawParam($userlink);
     } elseif ($type === 'merge') {
         $revid = $entry_params['revid'];
         $modid = $entry_params['modid'];
         $link = Linker::linkKnown(Title::makeTitle(NS_SPECIAL, "Moderation"), wfMessage('moderation-log-change', $modid)->text(), array('title' => wfMessage('tooltip-moderation-rejected-change')), array('modaction' => 'show', 'modid' => $modid));
         $params[4] = Message::rawParam($link);
         $link = Linker::linkKnown($this->entry->getTarget(), wfMessage('moderation-log-diff', $revid)->text(), array('title' => wfMessage('tooltip-moderation-approved-diff')), array('diff' => $revid));
         $params[5] = Message::rawParam($link);
     } elseif ($type === 'approveall' || $type === 'rejectall' || $type === 'block' || $type === 'unblock') {
         $title = $this->entry->getTarget();
         $user_id = User::idFromName($title->getText());
         $link = Linker::userLink($user_id, $title->getText());
         $params[2] = Message::rawParam($link);
     }
     return $params;
 }
 public function getMessageParameters()
 {
     $params = parent::getMessageParameters();
     $type = $this->entry->getFullType();
     if ($type === 'translationreview/message') {
         $targetPage = $this->makePageLink($this->entry->getTarget(), array('oldid' => $params[3]));
         $params[2] = Message::rawParam($targetPage);
     } elseif ($type === 'translationreview/group') {
         /*
          * - 3: language code
          * - 4: label of the message group
          * - 5: old state
          * - 6: new state
          */
         $uiLanguage = $this->context->getLanguage();
         $language = $params[3];
         $targetPage = $this->makePageLinkWithText($this->entry->getTarget(), $params[4], array('language' => $language));
         $params[2] = Message::rawParam($targetPage);
         $params[3] = TranslateUtils::getLanguageName($language, $uiLanguage->getCode());
         $params[5] = $this->formatStateMessage($params[5]);
         $params[6] = $this->formatStateMessage($params[6]);
     } elseif ($type === 'translatorsandbox/rejected') {
         // No point linking to the user page which cannot have existed
         $params[2] = $this->entry->getTarget()->getText();
     } elseif ($type === 'translatorsandbox/promoted') {
         // Gender for the target
         $params[3] = User::newFromId($params[3])->getName();
     }
     return $params;
 }
 /**
  * Main execution point
  *
  * @param string $subpage
  */
 public function execute($subpage)
 {
     $this->rcSubpage = $subpage;
     $this->setHeaders();
     $this->outputHeader();
     $this->addModules();
     $rows = $this->getRows();
     $opts = $this->getOptions();
     if ($rows === false) {
         if (!$this->including()) {
             $this->doHeader($opts, 0);
             $this->getOutput()->setStatusCode(404);
         }
         return;
     }
     $batch = new LinkBatch();
     foreach ($rows as $row) {
         $batch->add(NS_USER, $row->rc_user_text);
         $batch->add(NS_USER_TALK, $row->rc_user_text);
         $batch->add($row->rc_namespace, $row->rc_title);
         if ($row->rc_source === RecentChange::SRC_LOG) {
             $formatter = LogFormatter::newFromRow($row);
             foreach ($formatter->getPreloadTitles() as $title) {
                 $batch->addObj($title);
             }
         }
     }
     $batch->execute();
     $this->webOutput($rows, $opts);
     $rows->free();
 }
Example #5
0
 /**
  * @return string A HTML <li> element representing this revision, showing
  * change tags and everything
  */
 public function getHTML()
 {
     $date = htmlspecialchars($this->list->getLanguage()->userTimeAndDate($this->row->log_timestamp, $this->list->getUser()));
     $title = Title::makeTitle($this->row->log_namespace, $this->row->log_title);
     $formatter = LogFormatter::newFromRow($this->row);
     $formatter->setContext($this->list->getContext());
     $formatter->setAudience(LogFormatter::FOR_THIS_USER);
     // Log link for this page
     $loglink = Linker::link(SpecialPage::getTitleFor('Log'), $this->list->msg('log')->escaped(), array(), array('page' => $title->getPrefixedText()));
     $loglink = $this->list->msg('parentheses')->rawParams($loglink)->escaped();
     // User links and action text
     $action = $formatter->getActionText();
     // Comment
     $comment = $this->list->getLanguage()->getDirMark() . $formatter->getComment();
     if (LogEventsList::isDeleted($this->row, LogPage::DELETED_COMMENT)) {
         $comment = '<span class="history-deleted">' . $comment . '</span>';
     }
     $content = "{$loglink} {$date} {$action} {$comment}";
     $attribs = array();
     $tags = $this->getTags();
     if ($tags) {
         list($tagSummary, $classes) = ChangeTags::formatSummaryRow($tags, 'edittags', $this->list->getContext());
         $content .= " {$tagSummary}";
         $attribs['class'] = implode(' ', $classes);
     }
     return Xml::tags('li', $attribs, $content);
 }
 /**
  * @return array
  */
 protected function getMessageParameters()
 {
     $entry = $this->entry->getParameters();
     $params = parent::getMessageParameters();
     $filter_title = SpecialPage::getTitleFor('AbuseFilter', $entry['filter']);
     $filter_caption = $this->msg('abusefilter-log-detailedentry-local')->params($entry['filter']);
     $log_title = SpecialPage::getTitleFor('AbuseLog', $entry['log']);
     $log_caption = $this->msg('abusefilter-log-detailslink');
     $params[4] = $entry['action'];
     if ($this->plaintext) {
         $params[3] = '[[' . $filter_title->getPrefixedText() . '|' . $filter_caption . ']]';
         $params[8] = '[[' . $log_title->getPrefixedText() . '|' . $log_caption . ']]';
     } else {
         $params[3] = Message::rawParam(Linker::link($filter_title, htmlspecialchars($filter_caption)));
         $params[8] = Message::rawParam(Linker::link($log_title, htmlspecialchars($log_caption)));
     }
     $actions_taken = $entry['actions'];
     if (!strlen(trim($actions_taken))) {
         $actions_taken = $this->msg('abusefilter-log-noactions');
     } else {
         $actions = explode(',', $actions_taken);
         $displayActions = array();
         foreach ($actions as $action) {
             $displayActions[] = AbuseFilter::getActionDisplay($action);
         }
         $actions_taken = $this->context->getLanguage()->commaList($displayActions);
     }
     $params[5] = $actions_taken;
     // Bad things happen if the numbers are not in correct order
     ksort($params);
     return $params;
 }
Example #7
0
 /**
  * Hook function for RecentChange_save
  * Saves user data into the cu_changes table
  */
 public static function updateCheckUserData(RecentChange $rc)
 {
     global $wgRequest;
     // Extract params
     extract($rc->mAttribs);
     // Get IP
     $ip = wfGetIP();
     // Get XFF header
     $xff = $wgRequest->getHeader('X-Forwarded-For');
     list($xff_ip, $isSquidOnly) = IP::getClientIPfromXFF($xff);
     // Get agent
     $agent = $wgRequest->getHeader('User-Agent');
     // Store the log action text for log events
     // $rc_comment should just be the log_comment
     // BC: check if log_type and log_action exists
     // If not, then $rc_comment is the actiontext and comment
     if (isset($rc_log_type) && $rc_type == RC_LOG) {
         $target = Title::makeTitle($rc_namespace, $rc_title);
         $context = RequestContext::newExtraneousContext($target);
         $formatter = LogFormatter::newFromRow($rc->mAttribs);
         $formatter->setContext($context);
         $actionText = $formatter->getPlainActionText();
     } else {
         $actionText = '';
     }
     $dbw = wfGetDB(DB_MASTER);
     $cuc_id = $dbw->nextSequenceValue('cu_changes_cu_id_seq');
     $rcRow = array('cuc_id' => $cuc_id, 'cuc_namespace' => $rc_namespace, 'cuc_title' => $rc_title, 'cuc_minor' => $rc_minor, 'cuc_user' => $rc_user, 'cuc_user_text' => $rc_user_text, 'cuc_actiontext' => $actionText, 'cuc_comment' => $rc_comment, 'cuc_this_oldid' => $rc_this_oldid, 'cuc_last_oldid' => $rc_last_oldid, 'cuc_type' => $rc_type, 'cuc_timestamp' => $rc_timestamp, 'cuc_ip' => IP::sanitizeIP($ip), 'cuc_ip_hex' => $ip ? IP::toHex($ip) : null, 'cuc_xff' => !$isSquidOnly ? $xff : '', 'cuc_xff_hex' => $xff_ip && !$isSquidOnly ? IP::toHex($xff_ip) : null, 'cuc_agent' => $agent);
     # On PG, MW unsets cur_id due to schema incompatibilites. So it may not be set!
     if (isset($rc_cur_id)) {
         $rcRow['cuc_page_id'] = $rc_cur_id;
     }
     $dbw->insert('cu_changes', $rcRow, __METHOD__);
     return true;
 }
Example #8
0
	protected function getMessageParameters() {
		$params = parent::getMessageParameters();
		$oldname = $this->makePageLink( $this->entry->getTarget(), array( 'redirect' => 'no' ) );
		$newname = $this->makePageLink( Title::newFromText( $params[3] ) );
		$params[2] = Message::rawParam( $oldname );
		$params[3] = Message::rawParam( $newname );
		return $params;
	}
 public function doTestLogFormatter($row, $extra)
 {
     RequestContext::resetMain();
     $row = $this->expandDatabaseRow($row, $this->isLegacy($extra));
     $formatter = LogFormatter::newFromRow($row);
     $this->assertEquals($extra['text'], self::removeSomeHtml($formatter->getActionText()), 'Action text is equal to expected text');
     $this->assertSame($extra['api'], self::removeApiMetaData($formatter->formatParametersForApi()), 'Api log params is equal to expected array');
 }
 protected function getMessageParameters()
 {
     $lang = $this->context->getLanguage();
     $params = parent::getMessageParameters();
     $params[3] = ContentHandler::getLocalizedName($params[3], $lang);
     $params[4] = ContentHandler::getLocalizedName($params[4], $lang);
     return $params;
 }
	public function getComment() {
		$timestamp = wfTimestamp( TS_MW, $this->entry->getTimestamp() );
		if ( $timestamp < '20080129000000' ) {
			# Suppress $comment from old entries (before 2008-01-29),
			# not needed and can contain incorrect links
			return '';
		}
		return parent::getComment();
	}
 protected function getMessageParameters()
 {
     parent::getMessageParameters();
     $params = $this->extractParameters();
     $lang = $this->context->getLanguage();
     $this->parsedParameters[3] = Message::rawParam($lang->commaList(array_map(array($this, 'getCentralAuthLink'), explode('|', $params[3]))));
     $this->parsedParameters[4] = Message::rawParam($this->getCentralAuthLink($params[4]));
     ksort($this->parsedParameters);
     return $this->parsedParameters;
 }
 protected function getMessageParameters()
 {
     $params = parent::getMessageParameters();
     $oldname = $this->makePageLink($this->entry->getTarget(), array('redirect' => 'no'));
     $newname = $this->makePageLink(Title::newFromText($params[3]));
     $params[2] = Message::rawParam($oldname);
     $params[3] = Message::rawParam($newname);
     $params[4] = $this->context->getLanguage()->userTimeAndDate($params[4], $this->context->getUser());
     return $params;
 }
 protected function getMessageParameters()
 {
     $params = parent::getMessageParameters();
     $subtype = $this->entry->getSubtype();
     if ($subtype === 'requestwiki') {
         $params[6] = str_replace('#', '', $params[6]);
         $params[6] = Message::rawParam(Linker::linkKnown(Title::newFromText(SpecialPage::getTitleFor('RequestWikiQueue') . '/' . $params[6]), '#' . $params[6]));
         return $params;
     }
 }
 protected function getMessageParameters()
 {
     $params = parent::getMessageParameters();
     $subtype = $this->entry->getSubtype();
     if ($subtype === 'move_prot') {
         $oldname = $this->makePageLink(Title::newFromText($params[3]), array('redirect' => 'no'));
         $params[3] = Message::rawParam($oldname);
     }
     return $params;
 }
Example #16
0
 protected function getMessageKey()
 {
     $key = parent::getMessageKey();
     $params = $this->extractParameters();
     if (isset($params[3])) {
         // New log items with more details
         // Messages: logentry-import-upload-details, logentry-import-interwiki-details
         $key .= '-details';
     }
     return $key;
 }
 /**
  * @param \LogEntry $entry
  */
 public function __construct(\LogEntry $entry)
 {
     parent::__construct($entry);
     $params = $this->entry->getParameters();
     // serialized topicId or postId can be stored
     foreach ($params as $key => $value) {
         if ($value instanceof UUID) {
             static::$uuids[$value->getAlphadecimal()] = $value;
         }
     }
 }
Example #18
0
 /**
  * Format a diff for the newsfeed
  *
  * @param $row Object: row from the recentchanges table
  * @return String
  */
 public static function formatDiff($row)
 {
     $titleObj = Title::makeTitle($row->rc_namespace, $row->rc_title);
     $timestamp = wfTimestamp(TS_MW, $row->rc_timestamp);
     $actiontext = '';
     if ($row->rc_type == RC_LOG) {
         $rcRow = (array) $row;
         // newFromRow() only accepts arrays for RC rows
         $actiontext = LogFormatter::newFromRow($rcRow)->getActionText();
     }
     return self::formatDiffRow($titleObj, $row->rc_last_oldid, $row->rc_this_oldid, $timestamp, $row->rc_deleted & Revision::DELETED_COMMENT ? wfMessage('rev-deleted-comment')->escaped() : $row->rc_comment, $actiontext);
 }
 public function getMessageKey()
 {
     $key = parent::getMessageKey();
     $params = $this->extractParameters();
     // Very old log format, everything in comment
     if (!isset($params[3])) {
         return "{$key}-legaciest";
     } elseif (!isset($params[5])) {
         return "{$key}-legacier";
     }
     return $key;
 }
	protected function getMessageParameters() {
		$params = parent::getMessageParameters();

		// Really old entries
		if ( !isset( $params[3] ) && !isset( $params[4] ) ) {
			return $params;
		}

		$oldGroups = $params[3];
		$newGroups = $params[4];

		// Less old entries
		if ( $oldGroups === '' ) {
			$oldGroups = array();
		} elseif ( is_string( $oldGroups ) ) {
			$oldGroups = array_map( 'trim', explode( ',', $oldGroups ) );
		}
		if ( $newGroups === '' ) {
			$newGroups = array();
		} elseif ( is_string( $newGroups ) ) {
			$newGroups = array_map( 'trim', explode( ',', $newGroups ) );
		}

		$userName = $this->entry->getTarget()->getText();
		if ( !$this->plaintext && count( $oldGroups ) ) {
			foreach ( $oldGroups as &$group ) {
				$group = User::getGroupMember( $group, $userName );
			}
		}
		if ( !$this->plaintext && count( $newGroups ) ) {
			foreach ( $newGroups as &$group ) {
				$group = User::getGroupMember( $group, $userName );
			}
		}

		$lang = $this->context->getLanguage();
		if ( count( $oldGroups ) ) {
			$params[3] = $lang->listToText( $oldGroups );
		} else {
			$params[3] = $this->msg( 'rightsnone' )->text();
		}
		if ( count( $newGroups ) ) {
			// Array_values is used here because of bug 42211
			// see use of array_unique in UserrightsPage::doSaveUserGroups on $newGroups.
			$params[4] = $lang->listToText( array_values( $newGroups ) );
		} else {
			$params[4] = $this->msg( 'rightsnone' )->text();
		}

		return $params;
	}
Example #21
0
 protected function getMessageKey()
 {
     $key = parent::getMessageKey();
     $params = $this->getMessageParameters();
     $add = isset($params[6]) && isset($params[6]['num']) && $params[6]['num'];
     $remove = isset($params[8]) && isset($params[8]['num']) && $params[8]['num'];
     $key .= $remove ? $add ? '' : '-remove' : '-add';
     if (isset($params[3]) && $params[3]) {
         $key .= '-revision';
     } else {
         $key .= '-logentry';
     }
     return $key;
 }
 protected function getMessageKey()
 {
     $key = parent::getMessageKey();
     $type = $this->entry->getFullType();
     if ($type === 'pagetranslation/prioritylanguages') {
         $params = $this->getMessageParameters();
         if (!isset($params[4])) {
             $key .= '-unset';
         } elseif ($params['3'] === 'on') {
             $key .= '-force';
         }
     }
     return $key;
 }
 protected function getMessageParameters()
 {
     parent::getMessageParameters();
     $params = $this->extractParameters();
     if ($this->entry->getSubtype() === 'promote') {
         $this->parsedParameters[3] = $this->getLocalWikiLink($params[3], $params[5]);
     } else {
         // rename
         $this->parsedParameters[3] = $this->getCentralAuthLink($params[3]);
     }
     $this->parsedParameters[4] = $this->getCentralAuthLink($params[4]);
     ksort($this->parsedParameters);
     return $this->parsedParameters;
 }
 protected function getMessageParameters()
 {
     $params = parent::getMessageParameters();
     $target = $this->entry->getTarget();
     $oldid = $params[3];
     $revision = $this->context->getLanguage()->formatNum($oldid, true);
     if ($this->plaintext) {
         $revlink = $revision;
     } elseif ($target->exists()) {
         $query = array('oldid' => $oldid, 'diff' => 'prev');
         $revlink = Linker::link($target, htmlspecialchars($revision), array(), $query);
     } else {
         $revlink = htmlspecialchars($revision);
     }
     $params[3] = Message::rawParam($revlink);
     return $params;
 }
 protected function getMessageParameters()
 {
     if (isset($this->parsedParametersDeleteLog)) {
         return $this->parsedParametersDeleteLog;
     }
     $params = parent::getMessageParameters();
     $subtype = $this->entry->getSubtype();
     if (in_array($subtype, array('event', 'revision'))) {
         // $params[3] here is 'revision' or 'archive' for page revisions, 'oldimage' or
         // 'filearchive' for file versions, or a comma-separated list of log_ids for log
         // entries. $subtype here is 'revision' for page revisions and file
         // versions, or 'event' for log entries.
         if ($subtype === 'event' && count($params) === 6 || $subtype === 'revision' && isset($params[3]) && ($params[3] === 'revision' || $params[3] === 'oldimage' || $params[3] === 'archive' || $params[3] === 'filearchive')) {
             $paramStart = $subtype === 'revision' ? 4 : 3;
             $old = $this->parseBitField($params[$paramStart + 1]);
             $new = $this->parseBitField($params[$paramStart + 2]);
             list($hid, $unhid, $extra) = RevisionDeleter::getChanges($new, $old);
             $changes = array();
             // messages used: revdelete-content-hid, revdelete-summary-hid, revdelete-uname-hid
             foreach ($hid as $v) {
                 $changes[] = $this->msg("{$v}-hid")->plain();
             }
             // messages used: revdelete-content-unhid, revdelete-summary-unhid, revdelete-uname-unhid
             foreach ($unhid as $v) {
                 $changes[] = $this->msg("{$v}-unhid")->plain();
             }
             foreach ($extra as $v) {
                 $changes[] = $this->msg($v)->plain();
             }
             $changeText = $this->context->getLanguage()->listToText($changes);
             $newParams = array_slice($params, 0, 3);
             $newParams[3] = $changeText;
             $count = count(explode(',', $params[$paramStart]));
             $newParams[4] = $this->context->getLanguage()->formatNum($count);
             $this->parsedParametersDeleteLog = $newParams;
             return $this->parsedParametersDeleteLog;
         } else {
             $this->parsedParametersDeleteLog = array_slice($params, 0, 3);
             return $this->parsedParametersDeleteLog;
         }
     }
     $this->parsedParametersDeleteLog = $params;
     return $this->parsedParametersDeleteLog;
 }
Example #26
0
 public function getHTML()
 {
     $date = htmlspecialchars($this->list->getLanguage()->userTimeAndDate($this->row->log_timestamp, $this->list->getUser()));
     $title = Title::makeTitle($this->row->log_namespace, $this->row->log_title);
     $formatter = LogFormatter::newFromRow($this->row);
     $formatter->setContext($this->list->getContext());
     $formatter->setAudience(LogFormatter::FOR_THIS_USER);
     // Log link for this page
     $loglink = Linker::link(SpecialPage::getTitleFor('Log'), $this->list->msg('log')->escaped(), array(), array('page' => $title->getPrefixedText()));
     $loglink = $this->list->msg('parentheses')->rawParams($loglink)->escaped();
     // User links and action text
     $action = $formatter->getActionText();
     // Comment
     $comment = $this->list->getLanguage()->getDirMark() . Linker::commentBlock($this->row->log_comment);
     if (LogEventsList::isDeleted($this->row, LogPage::DELETED_COMMENT)) {
         $comment = '<span class="history-deleted">' . $comment . '</span>';
     }
     return "<li>{$loglink} {$date} {$action} {$comment}</li>";
 }
 protected function getMessageParameters()
 {
     // First call the main function to load the other values
     parent::getMessageParameters();
     $params = $this->extractParameters();
     // Backwards compat for older log entries
     if (!isset($params[3])) {
         return $this->parsedParameters;
     }
     // This will be localized with Linker::link
     // @todo Somehow localize for plaintext messages
     $title = Title::newFromText('Special:Permalink/' . $params[3]);
     // Our simple version of LogFormatter::makeLink
     if ($this->plaintext) {
         $this->parsedParameters[2] = '[[' . $title->getPrefixedText() . ']]';
     } else {
         $this->parsedParameters[2] = Message::rawParam(Linker::link($title, htmlspecialchars($this->entry->getTarget())));
     }
     ksort($this->parsedParameters);
     return $this->parsedParameters;
 }
 protected function getMessageParameters()
 {
     // Get the user language for displaying language names
     $userLang = $this->context->getLanguage()->getCode();
     $params = parent::getMessageParameters();
     // Get the language codes from log
     $oldLang = $params[3];
     $kOld = strrpos($oldLang, '[');
     if ($kOld) {
         $oldLang = substr($oldLang, 0, $kOld);
     }
     $newLang = $params[4];
     $kNew = strrpos($newLang, '[');
     if ($kNew) {
         $newLang = substr($newLang, 0, $kNew);
     }
     // Convert language codes to names in user language
     $logOld = Language::fetchLanguageName($oldLang, $userLang) . ' (' . $oldLang . ')';
     $logNew = Language::fetchLanguageName($newLang, $userLang) . ' (' . $newLang . ')';
     // Add the default message to languages if required
     $params[3] = !$kOld ? $logOld : $logOld . ' [' . $this->msg('default') . ']';
     $params[4] = !$kNew ? $logNew : $logNew . ' [' . $this->msg('default') . ']';
     return $params;
 }
 public function getStartBody()
 {
     # Do a link batch query
     if ($this->getNumRows() > 0) {
         $lb = new LinkBatch();
         foreach ($this->mResult as $row) {
             $lb->add($row->log_namespace, $row->log_title);
             $lb->addObj(Title::makeTitleSafe(NS_USER, $row->user_name));
             $lb->addObj(Title::makeTitleSafe(NS_USER_TALK, $row->user_name));
             $formatter = LogFormatter::newFromRow($row);
             foreach ($formatter->getPreloadTitles() as $title) {
                 $lb->addObj($title);
             }
         }
         $lb->execute();
         $this->mResult->seek(0);
     }
     return '';
 }
 /**
  * Extracts from a single sql row the data needed to describe one recent change.
  *
  * @param stdClass $row The row from which to extract the data.
  * @return array An array mapping strings (descriptors) to their respective string values.
  * @access public
  */
 public function extractRowInfo($row)
 {
     /* Determine the title of the page that has been changed. */
     $title = Title::makeTitle($row->rc_namespace, $row->rc_title);
     $user = $this->getUser();
     /* Our output data. */
     $vals = array();
     $type = intval($row->rc_type);
     $vals['type'] = RecentChange::parseFromRCType($type);
     $anyHidden = false;
     /* Create a new entry in the result for the title. */
     if ($this->fld_title || $this->fld_ids) {
         if ($type === RC_LOG && $row->rc_deleted & LogPage::DELETED_ACTION) {
             $vals['actionhidden'] = true;
             $anyHidden = true;
         }
         if ($type !== RC_LOG || LogEventsList::userCanBitfield($row->rc_deleted, LogPage::DELETED_ACTION, $user)) {
             if ($this->fld_title) {
                 ApiQueryBase::addTitleInfo($vals, $title);
             }
             if ($this->fld_ids) {
                 $vals['pageid'] = intval($row->rc_cur_id);
                 $vals['revid'] = intval($row->rc_this_oldid);
                 $vals['old_revid'] = intval($row->rc_last_oldid);
             }
         }
     }
     if ($this->fld_ids) {
         $vals['rcid'] = intval($row->rc_id);
     }
     /* Add user data and 'anon' flag, if user is anonymous. */
     if ($this->fld_user || $this->fld_userid) {
         if ($row->rc_deleted & Revision::DELETED_USER) {
             $vals['userhidden'] = true;
             $anyHidden = true;
         }
         if (Revision::userCanBitfield($row->rc_deleted, Revision::DELETED_USER, $user)) {
             if ($this->fld_user) {
                 $vals['user'] = $row->rc_user_text;
             }
             if ($this->fld_userid) {
                 $vals['userid'] = $row->rc_user;
             }
             if (!$row->rc_user) {
                 $vals['anon'] = true;
             }
         }
     }
     /* Add flags, such as new, minor, bot. */
     if ($this->fld_flags) {
         $vals['bot'] = (bool) $row->rc_bot;
         $vals['new'] = $row->rc_type == RC_NEW;
         $vals['minor'] = (bool) $row->rc_minor;
     }
     /* Add sizes of each revision. (Only available on 1.10+) */
     if ($this->fld_sizes) {
         $vals['oldlen'] = intval($row->rc_old_len);
         $vals['newlen'] = intval($row->rc_new_len);
     }
     /* Add the timestamp. */
     if ($this->fld_timestamp) {
         $vals['timestamp'] = wfTimestamp(TS_ISO_8601, $row->rc_timestamp);
     }
     /* Add edit summary / log summary. */
     if ($this->fld_comment || $this->fld_parsedcomment) {
         if ($row->rc_deleted & Revision::DELETED_COMMENT) {
             $vals['commenthidden'] = true;
             $anyHidden = true;
         }
         if (Revision::userCanBitfield($row->rc_deleted, Revision::DELETED_COMMENT, $user)) {
             if ($this->fld_comment && isset($row->rc_comment)) {
                 $vals['comment'] = $row->rc_comment;
             }
             if ($this->fld_parsedcomment && isset($row->rc_comment)) {
                 $vals['parsedcomment'] = Linker::formatComment($row->rc_comment, $title);
             }
         }
     }
     if ($this->fld_redirect) {
         $vals['redirect'] = (bool) $row->page_is_redirect;
     }
     /* Add the patrolled flag */
     if ($this->fld_patrolled) {
         $vals['patrolled'] = $row->rc_patrolled == 1;
         $vals['unpatrolled'] = ChangesList::isUnpatrolled($row, $user);
     }
     if ($this->fld_loginfo && $row->rc_type == RC_LOG) {
         if ($row->rc_deleted & LogPage::DELETED_ACTION) {
             $vals['actionhidden'] = true;
             $anyHidden = true;
         }
         if (LogEventsList::userCanBitfield($row->rc_deleted, LogPage::DELETED_ACTION, $user)) {
             $vals['logid'] = intval($row->rc_logid);
             $vals['logtype'] = $row->rc_log_type;
             $vals['logaction'] = $row->rc_log_action;
             $vals['logparams'] = LogFormatter::newFromRow($row)->formatParametersForApi();
         }
     }
     if ($this->fld_tags) {
         if ($row->ts_tags) {
             $tags = explode(',', $row->ts_tags);
             ApiResult::setIndexedTagName($tags, 'tag');
             $vals['tags'] = $tags;
         } else {
             $vals['tags'] = array();
         }
     }
     if ($this->fld_sha1 && $row->rev_sha1 !== null) {
         if ($row->rev_deleted & Revision::DELETED_TEXT) {
             $vals['sha1hidden'] = true;
             $anyHidden = true;
         }
         if (Revision::userCanBitfield($row->rev_deleted, Revision::DELETED_TEXT, $user)) {
             if ($row->rev_sha1 !== '') {
                 $vals['sha1'] = wfBaseConvert($row->rev_sha1, 36, 16, 40);
             } else {
                 $vals['sha1'] = '';
             }
         }
     }
     if (!is_null($this->token)) {
         $tokenFunctions = $this->getTokenFunctions();
         foreach ($this->token as $t) {
             $val = call_user_func($tokenFunctions[$t], $row->rc_cur_id, $title, RecentChange::newFromRow($row));
             if ($val === false) {
                 $this->setWarning("Action '{$t}' is not allowed for the current user");
             } else {
                 $vals[$t . 'token'] = $val;
             }
         }
     }
     if ($anyHidden && $row->rc_deleted & Revision::DELETED_RESTRICTED) {
         $vals['suppressed'] = true;
     }
     return $vals;
 }