From 9db190c7e736ec8d063187d4241b59feaf7dc2d1 Mon Sep 17 00:00:00 2001 From: Pierre Schmitz Date: Wed, 22 Jun 2011 11:28:20 +0200 Subject: update to MediaWiki 1.17.0 --- includes/api/ApiQueryBase.php | 185 ++++++++++++++++++++++++++++-------------- 1 file changed, 123 insertions(+), 62 deletions(-) (limited to 'includes/api/ApiQueryBase.php') diff --git a/includes/api/ApiQueryBase.php b/includes/api/ApiQueryBase.php index 893da566..61a5b4c8 100644 --- a/includes/api/ApiQueryBase.php +++ b/includes/api/ApiQueryBase.php @@ -1,11 +1,10 @@ @gmail.com + * Created on Sep 7, 2006 + * + * Copyright © 2006 Yuri Astrakhan @gmail.com * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -19,13 +18,15 @@ * * You should have received a copy of the GNU General Public License along * with this program; if not, write to the Free Software Foundation, Inc., - * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. * http://www.gnu.org/copyleft/gpl.html + * + * @file */ if ( !defined( 'MEDIAWIKI' ) ) { // Eclipse helper - will be ignored in production - require_once ( 'ApiBase.php' ); + require_once( 'ApiBase.php' ); } /** @@ -39,18 +40,19 @@ abstract class ApiQueryBase extends ApiBase { private $mQueryModule, $mDb, $tables, $where, $fields, $options, $join_conds; - public function __construct( $query, $moduleName, $paramPrefix = '' ) { - parent :: __construct( $query->getMain(), $moduleName, $paramPrefix ); + public function __construct( ApiBase $query, $moduleName, $paramPrefix = '' ) { + parent::__construct( $query->getMain(), $moduleName, $paramPrefix ); $this->mQueryModule = $query; $this->mDb = null; $this->resetQueryParams(); } /** - * Get the cache mode for the data generated by this module. Override this - * in the module subclass. + * Get the cache mode for the data generated by this module. Override + * this in the module subclass. For possible return values and other + * details about cache modes, see ApiMain::setCacheMode() * - * Public caching will only be allowed if *all* the modules that supply + * Public caching will only be allowed if *all* the modules that supply * data for a given request return a cache mode of public. */ public function getCacheMode( $params ) { @@ -61,11 +63,11 @@ abstract class ApiQueryBase extends ApiBase { * Blank the internal arrays with query parameters */ protected function resetQueryParams() { - $this->tables = array (); - $this->where = array (); - $this->fields = array (); - $this->options = array (); - $this->join_conds = array (); + $this->tables = array(); + $this->where = array(); + $this->fields = array(); + $this->options = array(); + $this->join_conds = array(); } /** @@ -76,16 +78,18 @@ abstract class ApiQueryBase extends ApiBase { */ protected function addTables( $tables, $alias = null ) { if ( is_array( $tables ) ) { - if ( !is_null( $alias ) ) - ApiBase :: dieDebug( __METHOD__, 'Multiple table aliases not supported' ); + if ( !is_null( $alias ) ) { + ApiBase::dieDebug( __METHOD__, 'Multiple table aliases not supported' ); + } $this->tables = array_merge( $this->tables, $tables ); } else { - if ( !is_null( $alias ) ) + if ( !is_null( $alias ) ) { $tables = $this->getAliasedName( $tables, $alias ); + } $this->tables[] = $tables; } } - + /** * Get the SQL for a table name with alias * @param $table string Table name @@ -95,7 +99,7 @@ abstract class ApiQueryBase extends ApiBase { protected function getAliasedName( $table, $alias ) { return $this->getDB()->tableName( $table ) . ' ' . $alias; } - + /** * Add a set of JOIN conditions to the internal array * @@ -106,8 +110,9 @@ abstract class ApiQueryBase extends ApiBase { * @param $join_conds array JOIN conditions */ protected function addJoinConds( $join_conds ) { - if ( !is_array( $join_conds ) ) + if ( !is_array( $join_conds ) ) { ApiBase::dieDebug( __METHOD__, 'Join conditions have to be arrays' ); + } $this->join_conds = array_merge( $this->join_conds, $join_conds ); } @@ -116,10 +121,11 @@ abstract class ApiQueryBase extends ApiBase { * @param $value mixed Field name or array of field names */ protected function addFields( $value ) { - if ( is_array( $value ) ) + if ( is_array( $value ) ) { $this->fields = array_merge( $this->fields, $value ); - else + } else { $this->fields[] = $value; + } } /** @@ -151,17 +157,18 @@ abstract class ApiQueryBase extends ApiBase { if ( is_array( $value ) ) { // Sanity check: don't insert empty arrays, // Database::makeList() chokes on them - if ( count( $value ) ) + if ( count( $value ) ) { $this->where = array_merge( $this->where, $value ); - } - else + } + } else { $this->where[] = $value; + } } /** * Same as addWhere(), but add the WHERE clauses only if a condition is met * @param $value mixed See addWhere() - * @param $condition boolIf false, do nothing + * @param $condition bool If false, do nothing * @return bool $condition */ protected function addWhereIf( $value, $condition ) { @@ -178,10 +185,11 @@ abstract class ApiQueryBase extends ApiBase { * @param $value string Value; ignored if null or empty array; */ protected function addWhereFld( $field, $value ) { - // Use count() to its full documented capabilities to simultaneously + // Use count() to its full documented capabilities to simultaneously // test for null, empty array or empty countable object - if ( count( $value ) ) + if ( count( $value ) ) { $this->where[$field] = $value; + } } /** @@ -202,18 +210,21 @@ abstract class ApiQueryBase extends ApiBase { $before = ( $isDirNewer ? '<=' : '>=' ); $db = $this->getDB(); - if ( !is_null( $start ) ) + if ( !is_null( $start ) ) { $this->addWhere( $field . $after . $db->addQuotes( $start ) ); + } - if ( !is_null( $end ) ) + if ( !is_null( $end ) ) { $this->addWhere( $field . $before . $db->addQuotes( $end ) ); + } if ( $sort ) { $order = $field . ( $isDirNewer ? '' : ' DESC' ); - if ( !isset( $this->options['ORDER BY'] ) ) + if ( !isset( $this->options['ORDER BY'] ) ) { $this->addOption( 'ORDER BY', $order ); - else + } else { $this->addOption( 'ORDER BY', $this->options['ORDER BY'] . ', ' . $order ); + } } } @@ -224,24 +235,34 @@ abstract class ApiQueryBase extends ApiBase { * @param $value string Option value */ protected function addOption( $name, $value = null ) { - if ( is_null( $value ) ) + if ( is_null( $value ) ) { $this->options[] = $name; - else + } else { $this->options[$name] = $value; + } } /** * Execute a SELECT query based on the values in the internal arrays * @param $method string Function the query should be attributed to. * You should usually use __METHOD__ here + * @param $extraQuery array Query data to add but not store in the object + * Format is array( 'tables' => ..., 'fields' => ..., 'where' => ..., 'options' => ..., 'join_conds' => ... ) * @return ResultWrapper */ - protected function select( $method ) { + protected function select( $method, $extraQuery = array() ) { + + $tables = array_merge( $this->tables, isset( $extraQuery['tables'] ) ? (array)$extraQuery['tables'] : array() ); + $fields = array_merge( $this->fields, isset( $extraQuery['fields'] ) ? (array)$extraQuery['fields'] : array() ); + $where = array_merge( $this->where, isset( $extraQuery['where'] ) ? (array)$extraQuery['where'] : array() ); + $options = array_merge( $this->options, isset( $extraQuery['options'] ) ? (array)$extraQuery['options'] : array() ); + $join_conds = array_merge( $this->join_conds, isset( $extraQuery['join_conds'] ) ? (array)$extraQuery['join_conds'] : array() ); + // getDB has its own profileDBIn/Out calls $db = $this->getDB(); $this->profileDBIn(); - $res = $db->select( $this->tables, $this->fields, $this->where, $method, $this->options, $this->join_conds ); + $res = $db->select( $tables, $fields, $where, $method, $options, $join_conds ); $this->profileDBOut(); return $res; @@ -259,8 +280,9 @@ abstract class ApiQueryBase extends ApiBase { $this->profileDBOut(); global $wgAPIMaxDBRows; - if ( $rowcount > $wgAPIMaxDBRows ) + if ( $rowcount > $wgAPIMaxDBRows ) { return false; + } return true; } @@ -295,7 +317,7 @@ abstract class ApiQueryBase extends ApiBase { /** * Add a sub-element under the page element with the given page ID * @param $pageId int Page ID - * @param $data array Data array à la ApiResult + * @param $data array Data array à la ApiResult * @return bool Whether the element fit in the result */ protected function addPageSubItems( $pageId, $data ) { @@ -305,23 +327,25 @@ abstract class ApiQueryBase extends ApiBase { $this->getModuleName(), $data ); } - + /** * Same as addPageSubItems(), but one element of $data at a time * @param $pageId int Page ID - * @param $data array Data array à la ApiResult + * @param $item array Data array à la ApiResult * @param $elemname string XML element name. If null, getModuleName() * is used * @return bool Whether the element fit in the result */ protected function addPageSubItem( $pageId, $item, $elemname = null ) { - if ( is_null( $elemname ) ) + if ( is_null( $elemname ) ) { $elemname = $this->getModulePrefix(); + } $result = $this->getResult(); $fit = $result->addValue( array( 'query', 'pages', $pageId, $this->getModuleName() ), null, $item ); - if ( !$fit ) + if ( !$fit ) { return false; + } $result->setIndexedTagName_internal( array( 'query', 'pages', $pageId, $this->getModuleName() ), $elemname ); return true; @@ -345,8 +369,10 @@ abstract class ApiQueryBase extends ApiBase { * @return Database */ protected function getDB() { - if ( is_null( $this->mDb ) ) - $this->mDb = $this->getQuery()->getDB(); + if ( is_null( $this->mDb ) ) { + $apiQuery = $this->getQuery(); + $this->mDb = $apiQuery->getDB(); + } return $this->mDb; } @@ -356,7 +382,7 @@ abstract class ApiQueryBase extends ApiBase { * @param $name string Name to assign to the database connection * @param $db int One of the DB_* constants * @param $groups array Query groups - * @return Database + * @return Database */ public function selectNamedDB( $name, $db, $groups ) { $this->mDb = $this->getQuery()->getNamedDB( $name, $db, $groups ); @@ -377,11 +403,13 @@ abstract class ApiQueryBase extends ApiBase { */ public function titleToKey( $title ) { // Don't throw an error if we got an empty string - if ( trim( $title ) == '' ) + if ( trim( $title ) == '' ) { return ''; + } $t = Title::newFromText( $title ); - if ( !$t ) + if ( !$t ) { $this->dieUsageMsg( array( 'invalidtitle', $title ) ); + } return $t->getPrefixedDbKey(); } @@ -392,15 +420,17 @@ abstract class ApiQueryBase extends ApiBase { */ public function keyToTitle( $key ) { // Don't throw an error if we got an empty string - if ( trim( $key ) == '' ) + if ( trim( $key ) == '' ) { return ''; + } $t = Title::newFromDbKey( $key ); // This really shouldn't happen but we gotta check anyway - if ( !$t ) + if ( !$t ) { $this->dieUsageMsg( array( 'invalidtitle', $key ) ); + } return $t->getPrefixedText(); } - + /** * An alternative to titleToKey() that doesn't trim trailing spaces * @param $titlePart string Title part with spaces @@ -409,7 +439,7 @@ abstract class ApiQueryBase extends ApiBase { public function titlePartToKey( $titlePart ) { return substr( $this->titleToKey( $titlePart . 'x' ), 0, - 1 ); } - + /** * An alternative to keyToTitle() that doesn't trim trailing spaces * @param $keyPart string Key part with spaces @@ -418,7 +448,37 @@ abstract class ApiQueryBase extends ApiBase { public function keyPartToTitle( $keyPart ) { return substr( $this->keyToTitle( $keyPart . 'x' ), 0, - 1 ); } - + + /** + * Filters hidden users (where the user doesn't have the right to view them) + * Also adds relevant block information + * + * @param bool $showBlockInfo + * @return void + */ + public function showHiddenUsersAddBlockInfo( $showBlockInfo ) { + global $wgUser; + $userCanViewHiddenUsers = $wgUser->isAllowed( 'hideuser' ); + + if ( $showBlockInfo || !$userCanViewHiddenUsers ) { + $this->addTables( 'ipblocks' ); + $this->addJoinConds( array( + 'ipblocks' => array( 'LEFT JOIN', 'ipb_user=user_id' ), + ) ); + + $this->addFields( 'ipb_deleted' ); + + if ( $showBlockInfo ) { + $this->addFields( array( 'ipb_reason', 'ipb_by_text', 'ipb_expiry' ) ); + } + + // Don't show hidden names + if ( !$userCanViewHiddenUsers ) { + $this->addWhere( 'ipb_deleted = 0 OR ipb_deleted IS NULL' ); + } + } + } + public function getPossibleErrors() { return array_merge( parent::getPossibleErrors(), array( array( 'invalidtitle', 'title' ), @@ -431,7 +491,7 @@ abstract class ApiQueryBase extends ApiBase { * @return string */ public static function getBaseVersion() { - return __CLASS__ . ': $Id: ApiQueryBase.php 69932 2010-07-26 08:03:21Z tstarling $'; + return __CLASS__ . ': $Id: ApiQueryBase.php 85435 2011-04-05 14:00:08Z demon $'; } } @@ -443,7 +503,7 @@ abstract class ApiQueryGeneratorBase extends ApiQueryBase { private $mIsGenerator; public function __construct( $query, $moduleName, $paramPrefix = '' ) { - parent :: __construct( $query, $moduleName, $paramPrefix ); + parent::__construct( $query, $moduleName, $paramPrefix ); $this->mIsGenerator = false; } @@ -457,14 +517,15 @@ abstract class ApiQueryGeneratorBase extends ApiQueryBase { /** * Overrides base class to prepend 'g' to every generator parameter - * @param $paramNames string Parameter name + * @param $paramName string Parameter name * @return string Prefixed parameter name */ public function encodeParamName( $paramName ) { - if ( $this->mIsGenerator ) - return 'g' . parent :: encodeParamName( $paramName ); - else - return parent :: encodeParamName( $paramName ); + if ( $this->mIsGenerator ) { + return 'g' . parent::encodeParamName( $paramName ); + } else { + return parent::encodeParamName( $paramName ); + } } /** -- cgit v1.2.2