diff options
Diffstat (limited to 'includes/cache/GenderCache.php')
-rw-r--r-- | includes/cache/GenderCache.php | 93 |
1 files changed, 74 insertions, 19 deletions
diff --git a/includes/cache/GenderCache.php b/includes/cache/GenderCache.php index 342f8dba..2a169bb3 100644 --- a/includes/cache/GenderCache.php +++ b/includes/cache/GenderCache.php @@ -1,8 +1,30 @@ <?php - /** * Caches user genders when needed to use correct namespace aliases. + * + * 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 + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * 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., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * http://www.gnu.org/copyleft/gpl.html + * + * @file * @author Niklas Laxström + * @ingroup Cache + */ + +/** + * Caches user genders when needed to use correct namespace aliases. + * * @since 1.18 */ class GenderCache { @@ -37,14 +59,18 @@ class GenderCache { /** * Returns the gender for given username. - * @param $username String: username + * @param $username String or User: username * @param $caller String: the calling method * @return String */ public function getGenderOf( $username, $caller = '' ) { global $wgUser; - $username = strtr( $username, '_', ' ' ); + if( $username instanceof User ) { + $username = $username->getName(); + } + + $username = self::normalizeUsername( $username ); if ( !isset( $this->cache[$username] ) ) { if ( $this->misses >= $this->missLimit && $wgUser->getName() !== $username ) { @@ -56,11 +82,7 @@ class GenderCache { } else { $this->misses++; - if ( !User::isValidUserName( $username ) ) { - $this->cache[$username] = $this->getDefault(); - } else { - $this->doQuery( $username, $caller ); - } + $this->doQuery( $username, $caller ); } } @@ -82,7 +104,6 @@ class GenderCache { foreach ( $data as $ns => $pagenames ) { if ( !MWNamespace::hasGenderDistinction( $ns ) ) continue; foreach ( array_keys( $pagenames ) as $username ) { - if ( isset( $this->cache[$username] ) ) continue; $users[$username] = true; } } @@ -91,6 +112,29 @@ class GenderCache { } /** + * Wrapper for doQuery that processes a title or string array. + * + * @since 1.20 + * @param $titles List: array of Title objects or strings + * @param $caller String: the calling method + */ + public function doTitlesArray( $titles, $caller = '' ) { + $users = array(); + foreach ( $titles as $title ) { + $titleObj = is_string( $title ) ? Title::newFromText( $title ) : $title; + if ( !$titleObj ) { + continue; + } + if ( !MWNamespace::hasGenderDistinction( $titleObj->getNamespace() ) ) { + continue; + } + $users[] = $titleObj->getText(); + } + + $this->doQuery( $users, $caller ); + } + + /** * Preloads genders for given list of users. * @param $users List|String: usernames * @param $caller String: the calling method @@ -98,26 +142,28 @@ class GenderCache { public function doQuery( $users, $caller = '' ) { $default = $this->getDefault(); - foreach ( (array) $users as $index => $value ) { - $name = strtr( $value, '_', ' ' ); - if ( isset( $this->cache[$name] ) ) { - // Skip users whose gender setting we already know - unset( $users[$index] ); - } else { - $users[$index] = $name; + $usersToCheck = array(); + foreach ( (array) $users as $value ) { + $name = self::normalizeUsername( $value ); + // Skip users whose gender setting we already know + if ( !isset( $this->cache[$name] ) ) { // For existing users, this value will be overwritten by the correct value $this->cache[$name] = $default; + // query only for valid names, which can be in the database + if( User::isValidUserName( $name ) ) { + $usersToCheck[] = $name; + } } } - if ( count( $users ) === 0 ) { + if ( count( $usersToCheck ) === 0 ) { return; } $dbr = wfGetDB( DB_SLAVE ); $table = array( 'user', 'user_properties' ); $fields = array( 'user_name', 'up_value' ); - $conds = array( 'user_name' => $users ); + $conds = array( 'user_name' => $usersToCheck ); $joins = array( 'user_properties' => array( 'LEFT JOIN', array( 'user_id = up_user', 'up_property' => 'gender' ) ) ); @@ -125,11 +171,20 @@ class GenderCache { if ( strval( $caller ) !== '' ) { $comment .= "/$caller"; } - $res = $dbr->select( $table, $fields, $conds, $comment, $joins, $joins ); + $res = $dbr->select( $table, $fields, $conds, $comment, array(), $joins ); foreach ( $res as $row ) { $this->cache[$row->user_name] = $row->up_value ? $row->up_value : $default; } } + private static function normalizeUsername( $username ) { + // Strip off subpages + $indexSlash = strpos( $username, '/' ); + if ( $indexSlash !== false ) { + $username = substr( $username, 0, $indexSlash ); + } + // normalize underscore/spaces + return strtr( $username, '_', ' ' ); + } } |