X-Git-Url: https://scripts.mit.edu/gitweb/autoinstallsdev/mediawiki.git/blobdiff_plain/709a977dcc28b9560a925e8ba633a3b85da58655..2acc6b86c3191c408dc027d5164c397bea97d37b:/includes/api/ApiQueryAllUsers.php diff --git a/includes/api/ApiQueryAllUsers.php b/includes/api/ApiQueryAllUsers.php index 76d97abd..611fc98c 100644 --- a/includes/api/ApiQueryAllUsers.php +++ b/includes/api/ApiQueryAllUsers.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 ApiQueryAllUsers extends ApiQueryBase { - public function __construct($query, $moduleName) { - parent :: __construct($query, $moduleName, 'au'); + public function __construct( $query, $moduleName ) { + parent :: __construct( $query, $moduleName, 'au' ); } public function execute() { @@ -44,67 +44,74 @@ class ApiQueryAllUsers extends ApiQueryBase { $params = $this->extractRequestParams(); $prop = $params['prop']; - if (!is_null($prop)) { - $prop = array_flip($prop); - $fld_blockinfo = isset($prop['blockinfo']); - $fld_editcount = isset($prop['editcount']); - $fld_groups = isset($prop['groups']); - $fld_registration = isset($prop['registration']); - } else { + if ( !is_null( $prop ) ) { + $prop = array_flip( $prop ); + $fld_blockinfo = isset( $prop['blockinfo'] ); + $fld_editcount = isset( $prop['editcount'] ); + $fld_groups = isset( $prop['groups'] ); + $fld_registration = isset( $prop['registration'] ); + } else { $fld_blockinfo = $fld_editcount = $fld_groups = $fld_registration = false; } $limit = $params['limit']; - $this->addTables('user', 'u1'); + $this->addTables( 'user', 'u1' ); + $useIndex = true; - if (!is_null($params['from'])) - $this->addWhere('u1.user_name >= ' . $db->addQuotes($this->keyToTitle($params['from']))); + if ( !is_null( $params['from'] ) ) + $this->addWhere( 'u1.user_name >= ' . $db->addQuotes( $this->keyToTitle( $params['from'] ) ) ); - if (!is_null($params['prefix'])) - $this->addWhere('u1.user_name LIKE "' . $db->escapeLike($this->keyToTitle( $params['prefix'])) . '%"'); + if ( !is_null( $params['prefix'] ) ) + $this->addWhere( 'u1.user_name' . $db->buildLike( $this->keyToTitle( $params['prefix'] ), $db->anyString() ) ); - if (!is_null($params['group'])) { + if ( !is_null( $params['group'] ) ) { + $useIndex = false; // Filter only users that belong to a given group - $this->addTables('user_groups', 'ug1'); - $this->addWhere('ug1.ug_user=u1.user_id'); - $this->addWhereFld('ug1.ug_group', $params['group']); + $this->addTables( 'user_groups', 'ug1' ); + $ug1 = $this->getAliasedName( 'user_groups', 'ug1' ); + $this->addJoinConds( array( $ug1 => array( 'INNER JOIN', array( 'ug1.ug_user=u1.user_id', + 'ug1.ug_group' => $params['group'] ) ) ) ); } - if ($params['witheditsonly']) - $this->addWhere('u1.user_editcount > 0'); + if ( $params['witheditsonly'] ) + $this->addWhere( 'u1.user_editcount > 0' ); - if ($fld_groups) { + if ( $fld_groups ) { // Show the groups the given users belong to // request more than needed to avoid not getting all rows that belong to one user - $groupCount = count(User::getAllGroups()); - $sqlLimit = $limit+$groupCount+1; + $groupCount = count( User::getAllGroups() ); + $sqlLimit = $limit + $groupCount + 1; - $this->addTables('user_groups', 'ug2'); - $tname = $this->getAliasedName('user_groups', 'ug2'); - $this->addJoinConds(array($tname => array('LEFT JOIN', 'ug2.ug_user=u1.user_id'))); - $this->addFields('ug2.ug_group ug_group2'); + $this->addTables( 'user_groups', 'ug2' ); + $tname = $this->getAliasedName( 'user_groups', 'ug2' ); + $this->addJoinConds( array( $tname => array( 'LEFT JOIN', 'ug2.ug_user=u1.user_id' ) ) ); + $this->addFields( 'ug2.ug_group ug_group2' ); } else { - $sqlLimit = $limit+1; + $sqlLimit = $limit + 1; } - if ($fld_blockinfo) { - $this->addTables('ipblocks'); - $this->addTables('user', 'u2'); - $u2 = $this->getAliasedName('user', 'u2'); - $this->addJoinConds(array( - 'ipblocks' => array('LEFT JOIN', 'ipb_user=u1.user_id'), - $u2 => array('LEFT JOIN', 'ipb_by=u2.user_id'))); - $this->addFields(array('ipb_reason', 'u2.user_name blocker_name')); + if ( $fld_blockinfo ) { + $this->addTables( 'ipblocks' ); + $this->addTables( 'user', 'u2' ); + $u2 = $this->getAliasedName( 'user', 'u2' ); + $this->addJoinConds( array( + 'ipblocks' => array( 'LEFT JOIN', 'ipb_user=u1.user_id' ), + $u2 => array( 'LEFT JOIN', 'ipb_by=u2.user_id' ) ) ); + $this->addFields( array( 'ipb_reason', 'u2.user_name AS blocker_name' ) ); } - $this->addOption('LIMIT', $sqlLimit); + $this->addOption( 'LIMIT', $sqlLimit ); - $this->addFields('u1.user_name'); - $this->addFieldsIf('u1.user_editcount', $fld_editcount); - $this->addFieldsIf('u1.user_registration', $fld_registration); + $this->addFields( 'u1.user_name' ); + $this->addFieldsIf( 'u1.user_editcount', $fld_editcount ); + $this->addFieldsIf( 'u1.user_registration', $fld_registration ); - $this->addOption('ORDER BY', 'u1.user_name'); + $this->addOption( 'ORDER BY', 'u1.user_name' ); + if ( $useIndex ) { + $u1 = $this->getAliasedName( 'user', 'u1' ); + $this->addOption( 'USE INDEX', array( $u1 => 'user_name' ) ); + } - $res = $this->select(__METHOD__); + $res = $this->select( __METHOD__ ); $data = array (); $count = 0; @@ -119,66 +126,78 @@ class ApiQueryAllUsers extends ApiQueryBase { // The setContinue... is more complex because of this, and takes into account the higher sql limit // to make sure all rows that belong to the same user are received. // - while (true) { + while ( true ) { - $row = $db->fetchObject($res); + $row = $db->fetchObject( $res ); $count++; - if (!$row || $lastUser !== $row->user_name) { + if ( !$row || $lastUser !== $row->user_name ) { // Save the last pass's user data - if (is_array($lastUserData)) + if ( is_array( $lastUserData ) ) { - $fit = $result->addValue(array('query', $this->getModuleName()), - null, $lastUserData); - if(!$fit) + $fit = $result->addValue( array( 'query', $this->getModuleName() ), + null, $lastUserData ); + if ( !$fit ) { - $this->setContinueEnumParameter('from', - $this->keyToTitle($lastUserData['name'])); + $this->setContinueEnumParameter( 'from', + $this->keyToTitle( $lastUserData['name'] ) ); break; } } // No more rows left - if (!$row) + if ( !$row ) break; - if ($count > $limit) { + if ( $count > $limit ) { // We've reached the one extra which shows that there are additional pages to be had. Stop here... - $this->setContinueEnumParameter('from', $this->keyToTitle($row->user_name)); + $this->setContinueEnumParameter( 'from', $this->keyToTitle( $row->user_name ) ); break; } // Record new user's data $lastUser = $row->user_name; $lastUserData = array( 'name' => $lastUser ); - if ($fld_blockinfo) { + if ( $fld_blockinfo ) { $lastUserData['blockedby'] = $row->blocker_name; $lastUserData['blockreason'] = $row->ipb_reason; } - if ($fld_editcount) - $lastUserData['editcount'] = intval($row->user_editcount); - if ($fld_registration) - $lastUserData['registration'] = wfTimestamp(TS_ISO_8601, $row->user_registration); + if ( $fld_editcount ) + $lastUserData['editcount'] = intval( $row->user_editcount ); + if ( $fld_registration ) + $lastUserData['registration'] = $row->user_registration ? + wfTimestamp( TS_ISO_8601, $row->user_registration ) : ''; } - if ($sqlLimit == $count) { + if ( $sqlLimit == $count ) { // BUG! database contains group name that User::getAllGroups() does not return // TODO: should handle this more gracefully - ApiBase :: dieDebug(__METHOD__, - 'MediaWiki configuration error: the database contains more user groups than known to User::getAllGroups() function'); + ApiBase :: dieDebug( __METHOD__, + 'MediaWiki configuration error: the database contains more user groups than known to User::getAllGroups() function' ); } // Add user's group info - if ($fld_groups && !is_null($row->ug_group2)) { + if ( $fld_groups && !is_null( $row->ug_group2 ) ) { $lastUserData['groups'][] = $row->ug_group2; - $result->setIndexedTagName($lastUserData['groups'], 'g'); + $result->setIndexedTagName( $lastUserData['groups'], 'g' ); } } - $db->freeResult($res); + if ( is_array( $lastUserData ) ) { + $fit = $result->addValue( array( 'query', $this->getModuleName() ), + null, $lastUserData ); + if ( !$fit ) { + $this->setContinueEnumParameter( 'from', + $this->keyToTitle( $lastUserData['name'] ) ); + } + } + + $result->setIndexedTagName_internal( array( 'query', $this->getModuleName() ), 'u' ); + } - $result->setIndexedTagName_internal(array('query', $this->getModuleName()), 'u'); + public function getCacheMode( $params ) { + return 'public'; } public function getAllowedParams() { @@ -215,7 +234,7 @@ class ApiQueryAllUsers extends ApiQueryBase { 'group' => 'Limit users to a given group name', 'prop' => array( 'What pieces of information to include.', - '`groups` property uses more server resources and may return fewer results than the limit.'), + '`groups` property uses more server resources and may return fewer results than the limit.' ), 'limit' => 'How many total user names to return.', 'witheditsonly' => 'Only list users who have made edits', ); @@ -232,6 +251,6 @@ class ApiQueryAllUsers extends ApiQueryBase { } public function getVersion() { - return __CLASS__ . ': $Id: ApiQueryAllUsers.php 66948 2010-05-27 07:47:39Z tstarling $'; + return __CLASS__ . ': $Id: ApiQueryAllUsers.php 79562 2011-01-04 06:15:54Z tstarling $'; } }