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);
     }
 }