X-Git-Url: http://git.heureux-cyclage.org/?a=blobdiff_plain;f=maintenance%2FconvertUserOptions.php;h=14557f42f9a0b73387307a89affd27fa10adf3e3;hb=5f1a4a3dfc049a742184d5690d211fb0321c9b9d;hp=34c643bbaa72810ff5c18ed7bc552d7e303de1e8;hpb=f0a00a49b1be46b51aeef712f363305bce4448fa;p=lhc%2Fweb%2Fwiklou.git diff --git a/maintenance/convertUserOptions.php b/maintenance/convertUserOptions.php index 34c643bbaa..14557f42f9 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 { @@ -36,27 +34,34 @@ class ConvertUserOptions extends Maintenance { public function __construct() { parent::__construct(); - $this->mDescription = "Convert user options from old to new system"; + $this->addDescription( 'Convert user options from old to new system' ); + $this->setBatchSize( 50 ); } public function execute() { $this->output( "...batch conversion of user_options: " ); $id = 0; - $dbw = wfGetDB( DB_MASTER ); + $dbw = $this->getDB( DB_MASTER ); if ( !$dbw->fieldExists( 'user', 'user_options', __METHOD__ ) ) { $this->output( "nothing to migrate. " ); + 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', + [ 'user_id', 'user_options' ], + [ + 'user_id > ' . $dbw->addQuotes( $id ), + "user_options != " . $dbw->addQuotes( '' ), + ], + __METHOD__, + [ + 'ORDER BY' => 'user_id', + 'LIMIT' => $this->mBatchSize, + ] ); $id = $this->convertOptionBatch( $res, $dbw ); - $dbw->commit( __METHOD__ ); wfWaitForSlaves(); @@ -68,24 +73,41 @@ class ConvertUserOptions extends Maintenance { } /** - * @param $res - * @param $dbw DatabaseBase + * @param ResultWrapper $res + * @param DatabaseBase $dbw * @return null|int */ function convertOptionBatch( $res, $dbw ) { $id = null; foreach ( $res as $row ) { $this->mConversionCount++; + $insertRows = []; + foreach ( explode( "\n", $row->user_options ) as $s ) { + $m = []; + 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[] = [ + 'up_user' => $row->user_id, + 'up_property' => $m[1], + 'up_value' => $m[2], + ]; + } + } - $u->saveSettings(); + if ( count( $insertRows ) ) { + $dbw->insert( 'user_properties', $insertRows, __METHOD__, [ 'IGNORE' ] ); + } - // Do this here as saveSettings() doesn't set user_options to '' anymore! $dbw->update( 'user', - array( 'user_options' => '' ), - array( 'user_id' => $row->user_id ), + [ 'user_options' => '' ], + [ 'user_id' => $row->user_id ], __METHOD__ ); $id = $row->user_id;