From 222b01f5169f1c7e69762e0e8904c24f78f71882 Mon Sep 17 00:00:00 2001 From: Pierre Schmitz Date: Wed, 28 Jul 2010 11:52:48 +0200 Subject: update to MediaWiki 1.16.0 --- includes/api/ApiQueryAllpages.php | 162 +++++++++++++++++++++----------------- 1 file changed, 88 insertions(+), 74 deletions(-) (limited to 'includes/api/ApiQueryAllpages.php') diff --git a/includes/api/ApiQueryAllpages.php b/includes/api/ApiQueryAllpages.php index e123e8fe..37f22ee2 100644 --- a/includes/api/ApiQueryAllpages.php +++ b/includes/api/ApiQueryAllpages.php @@ -23,9 +23,9 @@ * http://www.gnu.org/copyleft/gpl.html */ -if (!defined('MEDIAWIKI')) { +if ( !defined( 'MEDIAWIKI' ) ) { // Eclipse helper - will be ignored in production - require_once ('ApiQueryBase.php'); + require_once ( 'ApiQueryBase.php' ); } /** @@ -35,8 +35,8 @@ if (!defined('MEDIAWIKI')) { */ class ApiQueryAllpages extends ApiQueryGeneratorBase { - public function __construct($query, $moduleName) { - parent :: __construct($query, $moduleName, 'ap'); + public function __construct( $query, $moduleName ) { + parent :: __construct( $query, $moduleName, 'ap' ); } public function execute() { @@ -47,31 +47,35 @@ class ApiQueryAllpages extends ApiQueryGeneratorBase { return 'public'; } - public function executeGenerator($resultPageSet) { - if ($resultPageSet->isResolvingRedirects()) - $this->dieUsage('Use "gapfilterredir=nonredirects" option instead of "redirects" when using allpages as a generator', 'params'); + public function executeGenerator( $resultPageSet ) { + if ( $resultPageSet->isResolvingRedirects() ) + $this->dieUsage( 'Use "gapfilterredir=nonredirects" option instead of "redirects" when using allpages as a generator', 'params' ); - $this->run($resultPageSet); + $this->run( $resultPageSet ); } - private function run($resultPageSet = null) { - + private function run( $resultPageSet = null ) { $db = $this->getDB(); $params = $this->extractRequestParams(); // Page filters - $this->addTables('page'); - if (!$this->addWhereIf('page_is_redirect = 1', $params['filterredir'] === 'redirects')) - $this->addWhereIf('page_is_redirect = 0', $params['filterredir'] === 'nonredirects'); - $this->addWhereFld('page_namespace', $params['namespace']); - $dir = ($params['dir'] == 'descending' ? 'older' : 'newer'); - $from = (is_null($params['from']) ? null : $this->titlePartToKey($params['from'])); - $this->addWhereRange('page_title', $dir, $from, null); - if (isset ($params['prefix'])) - $this->addWhere("page_title LIKE '" . $db->escapeLike($this->titlePartToKey($params['prefix'])) . "%'"); - - if (is_null($resultPageSet)) { + $this->addTables( 'page' ); + + if ( $params['filterredir'] == 'redirects' ) + $this->addWhereFld( 'page_is_redirect', 1 ); + else if ( $params['filterredir'] == 'nonredirects' ) + $this->addWhereFld( 'page_is_redirect', 0 ); + + $this->addWhereFld( 'page_namespace', $params['namespace'] ); + $dir = ( $params['dir'] == 'descending' ? 'older' : 'newer' ); + $from = ( is_null( $params['from'] ) ? null : $this->titlePartToKey( $params['from'] ) ); + $this->addWhereRange( 'page_title', $dir, $from, null ); + + if ( isset ( $params['prefix'] ) ) + $this->addWhere( 'page_title' . $db->buildLike( $this->titlePartToKey( $params['prefix'] ), $db->anyString() ) ); + + if ( is_null( $resultPageSet ) ) { $selectFields = array ( 'page_namespace', 'page_title', @@ -80,95 +84,98 @@ class ApiQueryAllpages extends ApiQueryGeneratorBase { } else { $selectFields = $resultPageSet->getPageTableFields(); } - $this->addFields($selectFields); + + $this->addFields( $selectFields ); $forceNameTitleIndex = true; - if (isset ($params['minsize'])) { - $this->addWhere('page_len>=' . intval($params['minsize'])); + if ( isset ( $params['minsize'] ) ) { + $this->addWhere( 'page_len>=' . intval( $params['minsize'] ) ); $forceNameTitleIndex = false; } - if (isset ($params['maxsize'])) { - $this->addWhere('page_len<=' . intval($params['maxsize'])); + if ( isset ( $params['maxsize'] ) ) { + $this->addWhere( 'page_len<=' . intval( $params['maxsize'] ) ); $forceNameTitleIndex = false; } // Page protection filtering - if (!empty ($params['prtype'])) { - $this->addTables('page_restrictions'); - $this->addWhere('page_id=pr_page'); - $this->addWhere('pr_expiry>' . $db->addQuotes($db->timestamp())); - $this->addWhereFld('pr_type', $params['prtype']); - - // Remove the empty string and '*' from the prlevel array - $prlevel = array_diff($params['prlevel'], array('', '*')); - if (!empty($prlevel)) - $this->addWhereFld('pr_level', $prlevel); - if ($params['prfiltercascade'] == 'cascading') - $this->addWhereFld('pr_cascade', 1); - if ($params['prfiltercascade'] == 'noncascading') - $this->addWhereFld('pr_cascade', 0); - - $this->addOption('DISTINCT'); + if ( !empty ( $params['prtype'] ) ) { + $this->addTables( 'page_restrictions' ); + $this->addWhere( 'page_id=pr_page' ); + $this->addWhere( 'pr_expiry>' . $db->addQuotes( $db->timestamp() ) ); + $this->addWhereFld( 'pr_type', $params['prtype'] ); + + if ( isset ( $params['prlevel'] ) ) { + // Remove the empty string and '*' from the prlevel array + $prlevel = array_diff( $params['prlevel'], array( '', '*' ) ); + + if ( !empty( $prlevel ) ) + $this->addWhereFld( 'pr_level', $prlevel ); + } + if ( $params['prfiltercascade'] == 'cascading' ) + $this->addWhereFld( 'pr_cascade', 1 ); + else if ( $params['prfiltercascade'] == 'noncascading' ) + $this->addWhereFld( 'pr_cascade', 0 ); + + $this->addOption( 'DISTINCT' ); $forceNameTitleIndex = false; - } else if (isset ($params['prlevel'])) { - $this->dieUsage('prlevel may not be used without prtype', 'params'); + } else if ( isset ( $params['prlevel'] ) ) { + $this->dieUsage( 'prlevel may not be used without prtype', 'params' ); } - if($params['filterlanglinks'] == 'withoutlanglinks') { - $this->addTables('langlinks'); - $this->addJoinConds(array('langlinks' => array('LEFT JOIN', 'page_id=ll_from'))); - $this->addWhere('ll_from IS NULL'); + if ( $params['filterlanglinks'] == 'withoutlanglinks' ) { + $this->addTables( 'langlinks' ); + $this->addJoinConds( array( 'langlinks' => array( 'LEFT JOIN', 'page_id=ll_from' ) ) ); + $this->addWhere( 'll_from IS NULL' ); $forceNameTitleIndex = false; - } else if($params['filterlanglinks'] == 'withlanglinks') { - $this->addTables('langlinks'); - $this->addWhere('page_id=ll_from'); - $this->addOption('STRAIGHT_JOIN'); + } else if ( $params['filterlanglinks'] == 'withlanglinks' ) { + $this->addTables( 'langlinks' ); + $this->addWhere( 'page_id=ll_from' ); + $this->addOption( 'STRAIGHT_JOIN' ); // We have to GROUP BY all selected fields to stop // PostgreSQL from whining - $this->addOption('GROUP BY', implode(', ', $selectFields)); + $this->addOption( 'GROUP BY', implode( ', ', $selectFields ) ); $forceNameTitleIndex = false; } - if ($forceNameTitleIndex) - $this->addOption('USE INDEX', 'name_title'); - + if ( $forceNameTitleIndex ) + $this->addOption( 'USE INDEX', 'name_title' ); $limit = $params['limit']; - $this->addOption('LIMIT', $limit+1); - $res = $this->select(__METHOD__); + $this->addOption( 'LIMIT', $limit + 1 ); + $res = $this->select( __METHOD__ ); $count = 0; $result = $this->getResult(); - while ($row = $db->fetchObject($res)) { - if (++ $count > $limit) { + while ( $row = $db->fetchObject( $res ) ) { + if ( ++ $count > $limit ) { // We've reached the one extra which shows that there are additional pages to be had. Stop here... // TODO: Security issue - if the user has no right to view next title, it will still be shown - $this->setContinueEnumParameter('from', $this->keyToTitle($row->page_title)); + $this->setContinueEnumParameter( 'from', $this->keyToTitle( $row->page_title ) ); break; } - if (is_null($resultPageSet)) { - $title = Title :: makeTitle($row->page_namespace, $row->page_title); + if ( is_null( $resultPageSet ) ) { + $title = Title :: makeTitle( $row->page_namespace, $row->page_title ); $vals = array( - 'pageid' => intval($row->page_id), - 'ns' => intval($title->getNamespace()), - 'title' => $title->getPrefixedText()); - $fit = $result->addValue(array('query', $this->getModuleName()), null, $vals); - if(!$fit) + 'pageid' => intval( $row->page_id ), + 'ns' => intval( $title->getNamespace() ), + 'title' => $title->getPrefixedText() ); + $fit = $result->addValue( array( 'query', $this->getModuleName() ), null, $vals ); + if ( !$fit ) { - $this->setContinueEnumParameter('from', $this->keyToTitle($row->page_title)); + $this->setContinueEnumParameter( 'from', $this->keyToTitle( $row->page_title ) ); break; } } else { - $resultPageSet->processDbRow($row); + $resultPageSet->processDbRow( $row ); } } - $db->freeResult($res); + $db->freeResult( $res ); - if (is_null($resultPageSet)) { - $result->setIndexedTagName_internal(array('query', $this->getModuleName()), 'p'); + if ( is_null( $resultPageSet ) ) { + $result->setIndexedTagName_internal( array( 'query', $this->getModuleName() ), 'p' ); } } @@ -257,6 +264,13 @@ class ApiQueryAllpages extends ApiQueryGeneratorBase { public function getDescription() { return 'Enumerate all pages sequentially in a given namespace'; } + + public function getPossibleErrors() { + return array_merge( parent::getPossibleErrors(), array( + array( 'code' => 'params', 'info' => 'Use "gapfilterredir=nonredirects" option instead of "redirects" when using allpages as a generator' ), + array( 'code' => 'params', 'info' => 'prlevel may not be used without prtype' ), + ) ); + } protected function getExamples() { return array ( @@ -272,6 +286,6 @@ class ApiQueryAllpages extends ApiQueryGeneratorBase { } public function getVersion() { - return __CLASS__ . ': $Id: ApiQueryAllpages.php 69986 2010-07-27 03:57:39Z tstarling $'; + return __CLASS__ . ': $Id: ApiQueryAllpages.php 69932 2010-07-26 08:03:21Z tstarling $'; } } -- cgit v1.2.2