Index: trunk/phase3/includes/User.php |
— | — | @@ -157,13 +157,10 @@ |
158 | 158 | /** |
159 | 159 | * Bool Whether the cache variables have been loaded. |
160 | 160 | */ |
161 | | - //@{ |
162 | | - var $mOptionsLoaded; |
163 | | - private $mLoadedItems = array(); |
164 | | - //@} |
| 161 | + var $mDataLoaded, $mAuthLoaded, $mOptionsLoaded; |
165 | 162 | |
166 | 163 | /** |
167 | | - * String Initialization data source if mLoadedItems!==true. May be one of: |
| 164 | + * String Initialization data source if mDataLoaded==false. May be one of: |
168 | 165 | * - 'defaults' anonymous user initialised from class defaults |
169 | 166 | * - 'name' initialise from mName |
170 | 167 | * - 'id' initialise from mId |
— | — | @@ -214,13 +211,13 @@ |
215 | 212 | * Load the user table data for this object from the source given by mFrom. |
216 | 213 | */ |
217 | 214 | function load() { |
218 | | - if ( $this->mLoadedItems === true ) { |
| 215 | + if ( $this->mDataLoaded ) { |
219 | 216 | return; |
220 | 217 | } |
221 | 218 | wfProfileIn( __METHOD__ ); |
222 | 219 | |
223 | 220 | # Set it now to avoid infinite recursion in accessors |
224 | | - $this->mLoadedItems = true; |
| 221 | + $this->mDataLoaded = true; |
225 | 222 | |
226 | 223 | switch ( $this->mFrom ) { |
227 | 224 | case 'defaults': |
— | — | @@ -339,7 +336,6 @@ |
340 | 337 | $u = new User; |
341 | 338 | $u->mName = $name; |
342 | 339 | $u->mFrom = 'name'; |
343 | | - $u->setItemLoaded( 'name' ); |
344 | 340 | return $u; |
345 | 341 | } |
346 | 342 | } |
— | — | @@ -354,7 +350,6 @@ |
355 | 351 | $u = new User; |
356 | 352 | $u->mId = $id; |
357 | 353 | $u->mFrom = 'id'; |
358 | | - $u->setItemLoaded( 'id' ); |
359 | 354 | return $u; |
360 | 355 | } |
361 | 356 | |
— | — | @@ -395,14 +390,7 @@ |
396 | 391 | |
397 | 392 | /** |
398 | 393 | * Create a new user object from a user row. |
399 | | - * The row should have the following fields from the user table in it: |
400 | | - * - either user_name or user_id to load further data if needed (or both) |
401 | | - * - user_real_name |
402 | | - * - all other fields (email, password, etc.) |
403 | | - * It is useless to provide the remaining fields if either user_id, |
404 | | - * user_name and user_real_name are not provided because the whole row |
405 | | - * will be loaded once more from the database when accessing them. |
406 | | - * |
| 394 | + * The row should have all fields from the user table in it. |
407 | 395 | * @param $row Array A row from the user table |
408 | 396 | * @return User |
409 | 397 | */ |
— | — | @@ -859,31 +847,6 @@ |
860 | 848 | } |
861 | 849 | |
862 | 850 | /** |
863 | | - * Return whether an item has been loaded. |
864 | | - * |
865 | | - * @param $item String: item to check. Current possibilities: |
866 | | - * - 'id' |
867 | | - * - name |
868 | | - * - realname |
869 | | - * @return Boolean |
870 | | - */ |
871 | | - public function isItemLoaded( $item ) { |
872 | | - return $this->mLoadedItems === true || ( isset( $this->mLoadedItems[$item] ) |
873 | | - && $this->mLoadedItems[$item] === true ); |
874 | | - } |
875 | | - |
876 | | - /** |
877 | | - * Set that an item has been loaded |
878 | | - * |
879 | | - * @param $item String |
880 | | - */ |
881 | | - private function setItemLoaded( $item ) { |
882 | | - if ( is_array( $this->mLoadedItems ) ) { |
883 | | - $this->mLoadedItems[$item] = true; |
884 | | - } |
885 | | - } |
886 | | - |
887 | | - /** |
888 | 851 | * Load user data from the session or login cookie. If there are no valid |
889 | 852 | * credentials, initialises the user as an anonymous user. |
890 | 853 | * @return Bool True if the user is logged in, false otherwise. |
— | — | @@ -973,7 +936,7 @@ |
974 | 937 | |
975 | 938 | /** |
976 | 939 | * Load user and user_group data from the database. |
977 | | - * $this->mId must be set, this is how the user is identified. |
| 940 | + * $this::mId must be set, this is how the user is identified. |
978 | 941 | * |
979 | 942 | * @return Bool True if the user exists, false if the user is anonymous |
980 | 943 | * @private |
— | — | @@ -1013,51 +976,25 @@ |
1014 | 977 | * @param $row Array Row from the user table to load. |
1015 | 978 | */ |
1016 | 979 | function loadFromRow( $row ) { |
1017 | | - $all = true; |
| 980 | + $this->mDataLoaded = true; |
1018 | 981 | |
1019 | | - if ( isset( $row->user_name ) ) { |
1020 | | - $this->mName = $row->user_name; |
1021 | | - $this->mFrom = 'name'; |
1022 | | - $this->setItemLoaded( 'name' ); |
1023 | | - } else { |
1024 | | - $all = false; |
1025 | | - } |
1026 | | - |
1027 | | - if ( isset( $row->user_name ) ) { |
1028 | | - $this->mRealName = $row->user_real_name; |
1029 | | - $this->setItemLoaded( 'realname' ); |
1030 | | - } else { |
1031 | | - $all = false; |
1032 | | - } |
1033 | | - |
1034 | 982 | if ( isset( $row->user_id ) ) { |
1035 | 983 | $this->mId = intval( $row->user_id ); |
1036 | | - $this->mFrom = 'id'; |
1037 | | - $this->setItemLoaded( 'id' ); |
1038 | | - } else { |
1039 | | - $all = false; |
1040 | 984 | } |
1041 | | - |
1042 | | - if ( isset( $row->user_password ) ) { |
1043 | | - $this->mPassword = $row->user_password; |
1044 | | - $this->mNewpassword = $row->user_newpassword; |
1045 | | - $this->mNewpassTime = wfTimestampOrNull( TS_MW, $row->user_newpass_time ); |
1046 | | - $this->mEmail = $row->user_email; |
1047 | | - $this->decodeOptions( $row->user_options ); |
1048 | | - $this->mTouched = wfTimestamp(TS_MW,$row->user_touched); |
1049 | | - $this->mToken = $row->user_token; |
1050 | | - $this->mEmailAuthenticated = wfTimestampOrNull( TS_MW, $row->user_email_authenticated ); |
1051 | | - $this->mEmailToken = $row->user_email_token; |
1052 | | - $this->mEmailTokenExpires = wfTimestampOrNull( TS_MW, $row->user_email_token_expires ); |
1053 | | - $this->mRegistration = wfTimestampOrNull( TS_MW, $row->user_registration ); |
1054 | | - $this->mEditCount = $row->user_editcount; |
1055 | | - } else { |
1056 | | - $all = false; |
1057 | | - } |
1058 | | - |
1059 | | - if ( $all ) { |
1060 | | - $this->mLoadedItems = true; |
1061 | | - } |
| 985 | + $this->mName = $row->user_name; |
| 986 | + $this->mRealName = $row->user_real_name; |
| 987 | + $this->mPassword = $row->user_password; |
| 988 | + $this->mNewpassword = $row->user_newpassword; |
| 989 | + $this->mNewpassTime = wfTimestampOrNull( TS_MW, $row->user_newpass_time ); |
| 990 | + $this->mEmail = $row->user_email; |
| 991 | + $this->decodeOptions( $row->user_options ); |
| 992 | + $this->mTouched = wfTimestamp(TS_MW,$row->user_touched); |
| 993 | + $this->mToken = $row->user_token; |
| 994 | + $this->mEmailAuthenticated = wfTimestampOrNull( TS_MW, $row->user_email_authenticated ); |
| 995 | + $this->mEmailToken = $row->user_email_token; |
| 996 | + $this->mEmailTokenExpires = wfTimestampOrNull( TS_MW, $row->user_email_token_expires ); |
| 997 | + $this->mRegistration = wfTimestampOrNull( TS_MW, $row->user_registration ); |
| 998 | + $this->mEditCount = $row->user_editcount; |
1062 | 999 | } |
1063 | 1000 | |
1064 | 1001 | /** |
— | — | @@ -1095,7 +1032,7 @@ |
1096 | 1033 | $this->mOptions = null; |
1097 | 1034 | |
1098 | 1035 | if ( $reloadFrom ) { |
1099 | | - $this->mLoadedItems = array(); |
| 1036 | + $this->mDataLoaded = false; |
1100 | 1037 | $this->mFrom = $reloadFrom; |
1101 | 1038 | } |
1102 | 1039 | } |
— | — | @@ -1524,7 +1461,7 @@ |
1525 | 1462 | && User::isIP( $this->mName ) ) { |
1526 | 1463 | // Special case, we know the user is anonymous |
1527 | 1464 | return 0; |
1528 | | - } elseif( !$this->isItemLoaded( 'id' ) ) { |
| 1465 | + } elseif( $this->mId === null ) { |
1529 | 1466 | // Don't load if this was initialized from an ID |
1530 | 1467 | $this->load(); |
1531 | 1468 | } |
— | — | @@ -1545,7 +1482,7 @@ |
1546 | 1483 | * @return String User's name or IP address |
1547 | 1484 | */ |
1548 | 1485 | function getName() { |
1549 | | - if ( $this->isItemLoaded( 'name' ) ) { |
| 1486 | + if ( !$this->mDataLoaded && $this->mFrom == 'name' ) { |
1550 | 1487 | # Special case optimisation |
1551 | 1488 | return $this->mName; |
1552 | 1489 | } else { |
— | — | @@ -1973,10 +1910,7 @@ |
1974 | 1911 | * @return String User's real name |
1975 | 1912 | */ |
1976 | 1913 | function getRealName() { |
1977 | | - if ( !$this->isItemLoaded( 'realname' ) ) { |
1978 | | - $this->load(); |
1979 | | - } |
1980 | | - |
| 1914 | + $this->load(); |
1981 | 1915 | return $this->mRealName; |
1982 | 1916 | } |
1983 | 1917 | |
— | — | @@ -2925,8 +2859,6 @@ |
2926 | 2860 | */ |
2927 | 2861 | function checkTemporaryPassword( $plaintext ) { |
2928 | 2862 | global $wgNewPasswordExpiry; |
2929 | | - |
2930 | | - $this->load(); |
2931 | 2863 | if( self::comparePasswords( $this->mNewpassword, $plaintext, $this->getId() ) ) { |
2932 | 2864 | if ( is_null( $this->mNewpassTime ) ) { |
2933 | 2865 | return true; |
— | — | @@ -3242,11 +3174,9 @@ |
3243 | 3175 | * non-existent/anonymous user accounts. |
3244 | 3176 | */ |
3245 | 3177 | public function getRegistration() { |
3246 | | - if ( $this->isAnon() ) { |
3247 | | - return false; |
3248 | | - } |
3249 | | - $this->load(); |
3250 | | - return $this->mRegistration; |
| 3178 | + return $this->getId() > 0 |
| 3179 | + ? $this->mRegistration |
| 3180 | + : false; |
3251 | 3181 | } |
3252 | 3182 | |
3253 | 3183 | /** |
Index: trunk/phase3/includes/Article.php |
— | — | @@ -836,18 +836,11 @@ |
837 | 837 | $dbr = wfGetDB( DB_SLAVE ); |
838 | 838 | $userTable = $dbr->tableName( 'user' ); |
839 | 839 | |
840 | | - if ( $dbr->implicitGroupby() ) { |
841 | | - $realNameField = 'user_real_name'; |
842 | | - } else { |
843 | | - $realNameField = 'FIRST(user_real_name) AS user_real_name'; |
844 | | - } |
845 | | - |
846 | 840 | $tables = array( 'revision', 'user' ); |
847 | 841 | |
848 | 842 | $fields = array( |
849 | | - 'rev_user as user_id', |
| 843 | + "$userTable.*", |
850 | 844 | 'rev_user_text AS user_name', |
851 | | - $realNameField, |
852 | 845 | 'MAX(rev_timestamp) AS timestamp', |
853 | 846 | ); |
854 | 847 | |
Index: trunk/phase3/includes/GlobalFunctions.php |
— | — | @@ -389,9 +389,9 @@ |
390 | 390 | if ( $forward ) { |
391 | 391 | $forward = "\t(proxied via {$_SERVER['REMOTE_ADDR']}{$forward})"; |
392 | 392 | } |
393 | | - // Don't load $wgUser at this late stage just for statistics purposes |
| 393 | + // Don't unstub $wgUser at this late stage just for statistics purposes |
394 | 394 | // FIXME: We can detect some anons even if it is not loaded. See User::getId() |
395 | | - if ( $wgUser->isItemLoaded( 'id' ) && $wgUser->isAnon() ) { |
| 395 | + if ( $wgUser->mDataLoaded && $wgUser->isAnon() ) { |
396 | 396 | $forward .= ' anon'; |
397 | 397 | } |
398 | 398 | $log = sprintf( "%s\t%04.3f\t%s\n", |
Index: trunk/phase3/includes/db/Database.php |
— | — | @@ -668,7 +668,7 @@ |
669 | 669 | # Add a comment for easy SHOW PROCESSLIST interpretation |
670 | 670 | # if ( $fname ) { |
671 | 671 | global $wgUser; |
672 | | - if ( is_object( $wgUser ) && $wgUser->isItemLoaded( 'name' ) ) { |
| 672 | + if ( is_object( $wgUser ) && $wgUser->mDataLoaded ) { |
673 | 673 | $userName = $wgUser->getName(); |
674 | 674 | if ( mb_strlen( $userName ) > 15 ) { |
675 | 675 | $userName = mb_substr( $userName, 0, 15 ) . '...'; |
Index: trunk/phase3/RELEASE-NOTES |
— | — | @@ -254,7 +254,6 @@ |
255 | 255 | * (bug 27249) "Installed software" table in Special:Version should always be |
256 | 256 | left-to-right. |
257 | 257 | * (bug 28719) Do not call mLinkHolders __destruct explicitly |
258 | | -* (bug 21196) Article::getContributors() no longer fail on PostgreSQL. |
259 | 258 | * (bug 28752) XCache doesn't work in CLI mode. |
260 | 259 | |
261 | 260 | === API changes in 1.18 === |