From: Kevin Israel Date: Sun, 25 May 2014 11:00:13 +0000 (-0400) Subject: Make convertUserOptions.php more self-contained X-Git-Tag: 1.31.0-rc.0~15501^2 X-Git-Url: https://git.cyclocoop.org/%28%28?a=commitdiff_plain;h=3385d6d157638de6275a48725798d0806025a705;p=lhc%2Fweb%2Fwiklou.git Make convertUserOptions.php more self-contained * Moved the code from User::decodeOptions() to the maintenance script, the only place it is (indirectly) used. * Changed the script to insert new rows itself rather than calling User::saveSettings(), avoiding bug 63677. * Removed FOR UPDATE and COMMIT lacking a matching BEGIN. * Made ORDER BY explicit. * Removed pointless "Do each user sequentially [...]" comment dating back to r48732, in which the script would increment a user's ID to get the next one. Bug: 63677 Change-Id: I86365a7363af3376cc4f55fa528b050b44378656 --- diff --git a/includes/User.php b/includes/User.php index 7b35a297c0..3e176aed1f 100644 --- a/includes/User.php +++ b/includes/User.php @@ -1253,9 +1253,6 @@ class User { $this->mNewpassword = $row->user_newpassword; $this->mNewpassTime = wfTimestampOrNull( TS_MW, $row->user_newpass_time ); $this->mEmail = $row->user_email; - if ( isset( $row->user_options ) ) { - $this->decodeOptions( $row->user_options ); - } $this->mTouched = wfTimestamp( TS_MW, $row->user_touched ); $this->mToken = $row->user_token; if ( $this->mToken == '' ) { @@ -3302,34 +3299,6 @@ class User { } } - /** - * Set this user's options from an encoded string - * @param string $str Encoded options to import - * - * @deprecated since 1.19 due to removal of user_options from the user table - */ - private function decodeOptions( $str ) { - wfDeprecated( __METHOD__, '1.19' ); - if ( !$str ) { - return; - } - - $this->mOptionsLoaded = true; - $this->mOptionOverrides = array(); - - // If an option is not set in $str, use the default value - $this->mOptions = self::getDefaultOptions(); - - $a = explode( "\n", $str ); - foreach ( $a as $s ) { - $m = array(); - if ( preg_match( "/^(.[^=]*)=(.*)$/", $s, $m ) ) { - $this->mOptions[$m[1]] = $m[2]; - $this->mOptionOverrides[$m[1]] = $m[2]; - } - } - } - /** * Set a cookie on the user's client. Wrapper for * WebResponse::setCookie diff --git a/maintenance/convertUserOptions.php b/maintenance/convertUserOptions.php index bf572448fe..1542a8c37e 100644 --- a/maintenance/convertUserOptions.php +++ b/maintenance/convertUserOptions.php @@ -26,8 +26,6 @@ require_once __DIR__ . '/Maintenance.php'; /** * Maintenance script to convert user options to the new `user_properties` table. * - * Do each user sequentially, since accounts can't be deleted - * * @ingroup Maintenance */ class ConvertUserOptions extends Maintenance { @@ -37,6 +35,7 @@ class ConvertUserOptions extends Maintenance { public function __construct() { parent::__construct(); $this->mDescription = "Convert user options from old to new system"; + $this->setBatchSize( 50 ); } public function execute() { @@ -50,14 +49,19 @@ class ConvertUserOptions extends Maintenance { return; } while ( $id !== null ) { - $idCond = 'user_id > ' . $dbw->addQuotes( $id ); - $optCond = "user_options != " . $dbw->addQuotes( '' ); // For compatibility - $res = $dbw->select( 'user', '*', - array( $optCond, $idCond ), __METHOD__, - array( 'LIMIT' => 50, 'FOR UPDATE' ) + $res = $dbw->select( 'user', + array( 'user_id', 'user_options' ), + array( + 'user_id > ' . $dbw->addQuotes( $id ), + "user_options != " . $dbw->addQuotes( '' ), + ), + __METHOD__, + array( + 'ORDER BY' => 'user_id', + 'LIMIT' => $this->mBatchSize, + ) ); $id = $this->convertOptionBatch( $res, $dbw ); - $dbw->commit( __METHOD__ ); wfWaitForSlaves(); @@ -77,12 +81,29 @@ class ConvertUserOptions extends Maintenance { $id = null; foreach ( $res as $row ) { $this->mConversionCount++; + $insertRows = array(); + foreach ( explode( "\n", $row->user_options ) as $s ) { + $m = array(); + if ( !preg_match( "/^(.[^=]*)=(.*)$/", $s, $m ) ) { + continue; + } - $u = User::newFromRow( $row ); + // MW < 1.16 would save even default values. Filter them out + // here (as in User) to avoid adding many unnecessary rows. + $defaultOption = User::getDefaultOption( $m[1] ); + if ( is_null( $defaultOption ) || $m[2] != $defaultOption ) { + $insertRows[] = array( + 'up_user' => $row->user_id, + 'up_property' => $m[1], + 'up_value' => $m[2], + ); + } + } - $u->saveSettings(); + if ( count( $insertRows ) ) { + $dbw->insert( 'user_properties', $insertRows, __METHOD__, array( 'IGNORE' ) ); + } - // Do this here as saveSettings() doesn't set user_options to '' anymore! $dbw->update( 'user', array( 'user_options' => '' ),