public function execute() { global $wgContLang; $pageSet = $this->getPageSet(); $pageids = array_keys($pageSet->getGoodTitles()); if (!$pageids) { return true; } // Construct SQL Query $this->addTables('flaggedpages'); $this->addFields(array('fp_page_id', 'fp_stable', 'fp_quality', 'fp_pending_since')); $this->addWhereFld('fp_page_id', $pageids); $res = $this->select(__METHOD__); $result = $this->getResult(); foreach ($res as $row) { $data = array('stable_revid' => intval($row->fp_stable), 'level' => intval($row->fp_quality), 'level_text' => FlaggedRevs::getQualityLevelText($row->fp_quality)); if ($row->fp_pending_since) { $data['pending_since'] = wfTimestamp(TS_ISO_8601, $row->fp_pending_since); } $result->addValue(array('query', 'pages', $row->fp_page_id), 'flagged', $data); } $this->resetQueryParams(); $this->addTables('flaggedpage_config'); $this->addFields(array('fpc_page_id', 'fpc_level', 'fpc_expiry')); $this->addWhereFld('fpc_page_id', $pageids); foreach ($this->select(__METHOD__) as $row) { $result->addValue(array('query', 'pages', $row->fpc_page_id, 'flagged'), 'protection_level', $row->fpc_level); $result->addValue(array('query', 'pages', $row->fpc_page_id, 'flagged'), 'protection_expiry', $wgContLang->formatExpiry($row->fpc_expiry, TS_ISO_8601)); } return true; }
public static function addApiRevisionData(&$module) { if (!$module instanceof ApiQueryRevisions) { return true; } $params = $module->extractRequestParams(false); if (empty($params['prop']) || !in_array('flagged', $params['prop'])) { return true; } if (!in_array('ids', $params['prop'])) { $module->dieUsage('if rvprop=flagged is set, you must also set rvprop=ids', 'missingparam'); } // Get all requested pageids/revids in a mapping: // pageid => revid => array_index of the revision // we will need this later to add data to the result array $result = $module->getResult(); $data = $result->getData(); if (!isset($data['query']) || !isset($data['query']['pages'])) { return true; } foreach ($data['query']['pages'] as $pageid => $page) { if (array_key_exists('revisions', (array) $page)) { foreach ($page['revisions'] as $index => $rev) { if (array_key_exists('revid', (array) $rev)) { $pageids[$pageid][$rev['revid']] = $index; } } } } if (empty($pageids)) { return true; } // Construct SQL Query $db = $module->getDB(); $module->resetQueryParams(); $module->addTables(array('flaggedrevs', 'user')); $module->addFields(array('fr_page_id', 'fr_rev_id', 'fr_timestamp', 'fr_quality', 'fr_tags', 'user_name')); $module->addWhere('fr_user=user_id'); $where = array(); // Construct WHERE-clause to avoid multiplying the number of scanned rows // as flaggedrevs table has composite primary key (fr_page_id,fr_rev_id) foreach ($pageids as $pageid => $revids) { $where[] = $db->makeList(array('fr_page_id' => $pageid, 'fr_rev_id' => array_keys($revids)), LIST_AND); } $module->addWhere($db->makeList($where, LIST_OR)); //$module->addOption( 'USE INDEX', array( 'flaggedrevs' => 'page_rev' ) ); $res = $module->select(__METHOD__); // Add flagging data to result array foreach ($res as $row) { $index = $pageids[$row->fr_page_id][$row->fr_rev_id]; $data = array('user' => $row->user_name, 'timestamp' => wfTimestamp(TS_ISO_8601, $row->fr_timestamp), 'level' => intval($row->fr_quality), 'level_text' => FlaggedRevs::getQualityLevelText($row->fr_quality), 'tags' => FlaggedRevision::expandRevisionTags($row->fr_tags)); $result->addValue(array('query', 'pages', $row->fr_page_id, 'revisions', $index), 'flagged', $data); } return true; }
private function run($resultPageSet = null) { $params = $this->extractRequestParams(); // Construct SQL Query $this->addTables(array('page', 'flaggedpages')); $this->addWhereFld('page_namespace', $params['namespace']); if ($params['filterredir'] == 'redirects') { $this->addWhereFld('page_is_redirect', 1); } if ($params['filterredir'] == 'nonredirects') { $this->addWhereFld('page_is_redirect', 0); } if ($params['filterlevel'] !== null) { $this->addWhereFld('fp_quality', $params['filterlevel']); } $this->addWhereRange('fp_page_id', $params['dir'], $params['start'], $params['end']); $this->addWhere('page_id=fp_page_id'); $this->addOption('USE INDEX', array('flaggedpages' => 'PRIMARY')); if (is_null($resultPageSet)) { $this->addFields(array('page_id', 'page_namespace', 'page_title', 'page_len', 'page_latest', 'fp_page_id', 'fp_quality', 'fp_stable')); } else { $this->addFields($resultPageSet->getPageTableFields()); $this->addFields('fp_page_id'); } $limit = $params['limit']; $this->addOption('LIMIT', $limit + 1); $res = $this->select(__METHOD__); $data = array(); $count = 0; foreach ($res as $row) { if (++$count > $limit) { // We've reached the one extra which shows that there are // additional pages to be had. Stop here... $this->setContinueEnumParameter('start', $row->fp_page_id); break; } if (is_null($resultPageSet)) { $title = Title::newFromRow($row); $data[] = array('pageid' => intval($row->page_id), 'ns' => intval($title->getNamespace()), 'title' => $title->getPrefixedText(), 'revid' => intval($row->page_latest), 'stable_revid' => intval($row->fp_stable), 'flagged_level' => intval($row->fp_quality), 'flagged_level_text' => FlaggedRevs::getQualityLevelText($row->fp_quality)); } else { $resultPageSet->processDbRow($row); } } if (is_null($resultPageSet)) { $result = $this->getResult(); $result->setIndexedTagName($data, 'p'); $result->addValue('query', $this->getModuleName(), $data); } }
private function run($resultPageSet = null) { global $wgUser, $wgMemc; $params = $this->extractRequestParams(); // Construct SQL Query $this->addTables(array('page', 'flaggedpages', 'revision')); $this->addWhereFld('page_namespace', $params['namespace']); $useIndex = array('flaggedpages' => 'fp_pending_since'); if ($params['filterredir'] == 'redirects') { $this->addWhereFld('page_is_redirect', 1); } if ($params['filterredir'] == 'nonredirects') { $this->addWhereFld('page_is_redirect', 0); } if ($params['maxsize'] !== null) { # Get absolute difference for comparison. ABS(x-y) # is broken due to mysql unsigned int design. $this->addWhere('GREATEST(page_len,rev_len)-LEAST(page_len,rev_len) <= ' . intval($params['maxsize'])); } if ($params['filterwatched'] == 'watched') { if (!($uid = $wgUser->getId())) { $this->dieUsage('You must be logged-in to have a watchlist', 'notloggedin'); } $this->addTables('watchlist'); $this->addWhereFld('wl_user', $uid); $this->addWhere('page_namespace = wl_namespace'); $this->addWhere('page_title = wl_title'); } if ($params['category'] != '') { $this->addTables('categorylinks'); $this->addWhere('cl_from = fp_page_id'); $this->addWhereFld('cl_to', $params['category']); $useIndex['categorylinks'] = 'cl_from'; } $this->addWhereRange('fp_pending_since', $params['dir'], $params['start'], $params['end']); $this->addWhere('page_id=fp_page_id'); $this->addWhere('rev_id=fp_stable'); if (!isset($params['start']) && !isset($params['end'])) { $this->addWhere('fp_pending_since IS NOT NULL'); } $this->addOption('USE INDEX', $useIndex); if (is_null($resultPageSet)) { $this->addFields(array('page_id', 'page_namespace', 'page_title', 'page_latest', 'page_len', 'rev_len', 'fp_stable', 'fp_pending_since', 'fp_quality')); } else { $this->addFields($resultPageSet->getPageTableFields()); $this->addFields('fp_pending_since'); } $limit = $params['limit']; $this->addOption('LIMIT', $limit + 1); $res = $this->select(__METHOD__); $data = array(); $count = 0; foreach ($res as $row) { if (++$count > $limit) { // We've reached the one extra which shows that there are // additional pages to be had. Stop here... $this->setContinueEnumParameter('start', wfTimestamp(TS_ISO_8601, $row->fp_pending_since)); break; } if (is_null($resultPageSet)) { $title = Title::newFromRow($row); $underReview = FRUserActivity::diffIsUnderReview($row->fp_stable, $row->page_latest); $data[] = array('pageid' => intval($row->page_id), 'ns' => intval($row->page_namespace), 'title' => $title->getPrefixedText(), 'revid' => intval($row->page_latest), 'stable_revid' => intval($row->fp_stable), 'pending_since' => wfTimestamp(TS_ISO_8601, $row->fp_pending_since), 'flagged_level' => intval($row->fp_quality), 'flagged_level_text' => FlaggedRevs::getQualityLevelText($row->fp_quality), 'diff_size' => (int) $row->page_len - (int) $row->rev_len, 'under_review' => $underReview); } else { $resultPageSet->processDbRow($row); } } if (is_null($resultPageSet)) { $result = $this->getResult(); $result->setIndexedTagName($data, 'p'); $result->addValue('query', $this->getModuleName(), $data); } }