summaryrefslogtreecommitdiff
path: root/maintenance/migrateUserGroup.php
diff options
context:
space:
mode:
Diffstat (limited to 'maintenance/migrateUserGroup.php')
-rw-r--r--maintenance/migrateUserGroup.php31
1 files changed, 28 insertions, 3 deletions
diff --git a/maintenance/migrateUserGroup.php b/maintenance/migrateUserGroup.php
index 496af723..f3e5957c 100644
--- a/maintenance/migrateUserGroup.php
+++ b/maintenance/migrateUserGroup.php
@@ -55,7 +55,9 @@ 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 ),
@@ -64,19 +66,42 @@ class MigrateUserGroup extends Maintenance {
__METHOD__,
array( 'IGNORE' )
);
- $count += $dbw->affectedRows();
+ $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" );
}
}