X-Git-Url: http://git.cyclocoop.org/?a=blobdiff_plain;f=maintenance%2FmigrateUserGroup.php;h=6903365b47e3e8c2b32339e03596315c6905a32b;hb=d966178eadf6f5e30f4049c844fdb6afe827501f;hp=497e1e099532718f6f01512b0c61b2cea02eb803;hpb=1cf83c086d2139619992175442085d5b7cd76bf4;p=lhc%2Fweb%2Fwiklou.git diff --git a/maintenance/migrateUserGroup.php b/maintenance/migrateUserGroup.php index 497e1e0995..6903365b47 100644 --- a/maintenance/migrateUserGroup.php +++ b/maintenance/migrateUserGroup.php @@ -21,7 +21,7 @@ * @ingroup Maintenance */ -require_once( __DIR__ . '/Maintenance.php' ); +require_once __DIR__ . '/Maintenance.php'; /** * Maintenance script that re-assigns users from an old group to a new one. @@ -55,22 +55,55 @@ class MigrateUserGroup extends Maintenance { $blockEnd = $start + $this->mBatchSize - 1; // Migrate users over in batches... while ( $blockEnd <= $end ) { + $affected = 0; $this->output( "Doing users $blockStart to $blockEnd\n" ); + $dbw->begin( __METHOD__ ); $dbw->update( 'user_groups', array( 'ug_group' => $newGroup ), array( 'ug_group' => $oldGroup, - "ug_user BETWEEN $blockStart AND $blockEnd" ) + "ug_user BETWEEN $blockStart AND $blockEnd" ), + __METHOD__, + array( 'IGNORE' ) + ); + $affected += $dbw->affectedRows(); + // Delete rows that the UPDATE operation above had to ignore. + // This happens when a user is in both the old and new group. + // Updating the row for the old group membership failed since + // user/group is UNIQUE. + $dbw->delete( 'user_groups', + array( 'ug_group' => $oldGroup, + "ug_user BETWEEN $blockStart AND $blockEnd" ), + __METHOD__ ); - $count += $dbw->affectedRows(); + $affected += $dbw->affectedRows(); $dbw->commit( __METHOD__ ); + + // Clear cache for the affected users (bug 40340) + if ( $affected > 0 ) { + // XXX: This also invalidates cache of unaffected users that + // were in the new group and not in the group. + $res = $dbw->select( 'user_groups', 'ug_user', + array( 'ug_group' => $newGroup, + "ug_user BETWEEN $blockStart AND $blockEnd" ), + __METHOD__ + ); + if ( $res !== false ) { + foreach ( $res as $row ) { + $user = User::newFromId( $row->ug_user ); + $user->invalidateCache(); + } + } + } + + $count += $affected; $blockStart += $this->mBatchSize; $blockEnd += $this->mBatchSize; wfWaitForSlaves(); } - $this->output( "Done! $count user(s) in group '$oldGroup' are now in '$newGroup' instead.\n" ); + $this->output( "Done! $count users in group '$oldGroup' are now in '$newGroup' instead.\n" ); } } $maintClass = "MigrateUserGroup"; -require_once( RUN_MAINTENANCE_IF_MAIN ); +require_once RUN_MAINTENANCE_IF_MAIN;