MediaWiki  1.23.12
GenderCache.php
Go to the documentation of this file.
1 <?php
30 class GenderCache {
31  protected $cache = array();
32  protected $default;
33  protected $misses = 0;
34  protected $missLimit = 1000;
35 
39  public static function singleton() {
40  static $that = null;
41  if ( $that === null ) {
42  $that = new self();
43  }
44 
45  return $that;
46  }
47 
48  protected function __construct() {
49  }
50 
55  protected function getDefault() {
56  if ( $this->default === null ) {
57  $this->default = User::getDefaultOption( 'gender' );
58  }
59 
60  return $this->default;
61  }
62 
69  public function getGenderOf( $username, $caller = '' ) {
71 
72  if ( $username instanceof User ) {
73  $username = $username->getName();
74  }
75 
76  $username = self::normalizeUsername( $username );
77  if ( !isset( $this->cache[$username] ) ) {
78  if ( $this->misses >= $this->missLimit && $wgUser->getName() !== $username ) {
79  if ( $this->misses === $this->missLimit ) {
80  $this->misses++;
81  wfDebug( __METHOD__ . ": too many misses, returning default onwards\n" );
82  }
83 
84  return $this->getDefault();
85  } else {
86  $this->misses++;
87  $this->doQuery( $username, $caller );
88  }
89  }
90 
91  /* Undefined if there is a valid username which for some reason doesn't
92  * exist in the database.
93  */
94  return isset( $this->cache[$username] ) ? $this->cache[$username] : $this->getDefault();
95  }
96 
103  public function doLinkBatch( $data, $caller = '' ) {
104  $users = array();
105  foreach ( $data as $ns => $pagenames ) {
106  if ( !MWNamespace::hasGenderDistinction( $ns ) ) {
107  continue;
108  }
109  foreach ( array_keys( $pagenames ) as $username ) {
110  $users[$username] = true;
111  }
112  }
113 
114  $this->doQuery( array_keys( $users ), $caller );
115  }
116 
124  public function doTitlesArray( $titles, $caller = '' ) {
125  $users = array();
126  foreach ( $titles as $title ) {
127  $titleObj = is_string( $title ) ? Title::newFromText( $title ) : $title;
128  if ( !$titleObj ) {
129  continue;
130  }
131  if ( !MWNamespace::hasGenderDistinction( $titleObj->getNamespace() ) ) {
132  continue;
133  }
134  $users[] = $titleObj->getText();
135  }
136 
137  $this->doQuery( $users, $caller );
138  }
139 
145  public function doQuery( $users, $caller = '' ) {
146  $default = $this->getDefault();
147 
148  $usersToCheck = array();
149  foreach ( (array)$users as $value ) {
151  // Skip users whose gender setting we already know
152  if ( !isset( $this->cache[$name] ) ) {
153  // For existing users, this value will be overwritten by the correct value
154  $this->cache[$name] = $default;
155  // query only for valid names, which can be in the database
156  if ( User::isValidUserName( $name ) ) {
157  $usersToCheck[] = $name;
158  }
159  }
160  }
161 
162  if ( count( $usersToCheck ) === 0 ) {
163  return;
164  }
165 
166  $dbr = wfGetDB( DB_SLAVE );
167  $table = array( 'user', 'user_properties' );
168  $fields = array( 'user_name', 'up_value' );
169  $conds = array( 'user_name' => $usersToCheck );
170  $joins = array( 'user_properties' =>
171  array( 'LEFT JOIN', array( 'user_id = up_user', 'up_property' => 'gender' ) ) );
172 
173  $comment = __METHOD__;
174  if ( strval( $caller ) !== '' ) {
175  $comment .= "/$caller";
176  }
177  $res = $dbr->select( $table, $fields, $conds, $comment, array(), $joins );
178 
179  foreach ( $res as $row ) {
180  $this->cache[$row->user_name] = $row->up_value ? $row->up_value : $default;
181  }
182  }
183 
184  private static function normalizeUsername( $username ) {
185  // Strip off subpages
186  $indexSlash = strpos( $username, '/' );
187  if ( $indexSlash !== false ) {
188  $username = substr( $username, 0, $indexSlash );
189  }
190 
191  // normalize underscore/spaces
192  return strtr( $username, '_', ' ' );
193  }
194 }
User\getDefaultOption
static getDefaultOption( $opt)
Get a given default option value.
Definition: User.php:1383
GenderCache\singleton
static singleton()
Definition: GenderCache.php:39
$wgUser
$wgUser
Definition: Setup.php:572
GenderCache\doLinkBatch
doLinkBatch( $data, $caller='')
Wrapper for doQuery that processes raw LinkBatch data.
Definition: GenderCache.php:103
Title\newFromText
static newFromText( $text, $defaultNamespace=NS_MAIN)
Create a new Title from text, such as what one would find in a link.
Definition: Title.php:189
php
skin txt MediaWiki includes four core it has been set as the default in MediaWiki since the replacing Monobook it had been been the default skin since before being replaced by Vector largely rewritten in while keeping its appearance Several legacy skins were removed in the as the burden of supporting them became too heavy to bear Those in etc for skin dependent CSS etc for skin dependent JavaScript These can also be customised on a per user by etc This feature has led to a wide variety of user styles becoming that gallery is a good place to ending in php
Definition: skin.txt:62
MWNamespace\hasGenderDistinction
static hasGenderDistinction( $index)
Does the namespace (potentially) have different aliases for different genders.
Definition: Namespace.php:406
wfGetDB
& wfGetDB( $db, $groups=array(), $wiki=false)
Get a Database object.
Definition: GlobalFunctions.php:3706
GenderCache
Caches user genders when needed to use correct namespace aliases.
Definition: GenderCache.php:30
User\isValidUserName
static isValidUserName( $name)
Is the input a valid username?
Definition: User.php:570
cache
you have access to all of the normal MediaWiki so you can get a DB use the cache
Definition: maintenance.txt:52
GenderCache\getGenderOf
getGenderOf( $username, $caller='')
Returns the gender for given username.
Definition: GenderCache.php:69
GenderCache\doTitlesArray
doTitlesArray( $titles, $caller='')
Wrapper for doQuery that processes a title or string array.
Definition: GenderCache.php:124
$dbr
$dbr
Definition: testCompression.php:48
GenderCache\getDefault
getDefault()
Returns the default gender option in this wiki.
Definition: GenderCache.php:55
GenderCache\$missLimit
$missLimit
Definition: GenderCache.php:34
$titles
linkcache txt The LinkCache class maintains a list of article titles and the information about whether or not the article exists in the database This is used to mark up links when displaying a page If the same link appears more than once on any page then it only has to be looked up once In most cases link lookups are done in batches with the LinkBatch class or the equivalent in so the link cache is mostly useful for short snippets of parsed and for links in the navigation areas of the skin The link cache was formerly used to track links used in a document for the purposes of updating the link tables This application is now deprecated To create a you can use the following $titles
Definition: linkcache.txt:17
array
the array() calling protocol came about after MediaWiki 1.4rc1.
List of Api Query prop modules.
global
when a variable name is used in a it is silently declared as a new masking the global
Definition: design.txt:93
$comment
$comment
Definition: importImages.php:107
GenderCache\normalizeUsername
static normalizeUsername( $username)
Definition: GenderCache.php:184
wfDebug
wfDebug( $text, $dest='all')
Sends a line to the debug log if enabled or, optionally, to a comment in output.
Definition: GlobalFunctions.php:980
$title
presenting them properly to the user as errors is done by the caller $title
Definition: hooks.txt:1324
$name
Allows to change the fields on the form that will be generated $name
Definition: hooks.txt:336
$value
$value
Definition: styleTest.css.php:45
GenderCache\$cache
$cache
Definition: GenderCache.php:31
GenderCache\doQuery
doQuery( $users, $caller='')
Preloads genders for given list of users.
Definition: GenderCache.php:145
GenderCache\$default
$default
Definition: GenderCache.php:32
DB_SLAVE
const DB_SLAVE
Definition: Defines.php:55
as
This document is intended to provide useful advice for parties seeking to redistribute MediaWiki to end users It s targeted particularly at maintainers for Linux since it s been observed that distribution packages of MediaWiki often break We ve consistently had to recommend that users seeking support use official tarballs instead of their distribution s and this often solves whatever problem the user is having It would be nice if this could such as
Definition: distributors.txt:9
GenderCache\__construct
__construct()
Definition: GenderCache.php:48
GenderCache\$misses
$misses
Definition: GenderCache.php:33
User
The User object encapsulates all of the user-specific settings (user_id, name, rights,...
Definition: User.php:59
$res
$res
Definition: database.txt:21