mDescription = "Re-assign users from an old group to a new one"; $this->addArg( 'oldgroup', 'Old user group key', true ); $this->addArg( 'newgroup', 'New user group key', true ); $this->setBatchSize( 200 ); } public function execute() { $count = 0; $oldGroup = $this->getArg( 0 ); $newGroup = $this->getArg( 1 ); $dbw = wfGetDB( DB_MASTER ); $start = $dbw->selectField( 'user_groups', 'MIN(ug_user)', array( 'ug_group' => $oldGroup ), __FUNCTION__ ); $end = $dbw->selectField( 'user_groups', 'MAX(ug_user)', array( 'ug_group' => $oldGroup ), __FUNCTION__ ); if ( $start === null ) { $this->error( "Nothing to do - no users in the '$oldGroup' group", true ); } # Do remaining chunk $end += $this->mBatchSize - 1; $blockStart = $start; $blockEnd = $start + $this->mBatchSize - 1; // Migrate users over in batches... while ( $blockEnd <= $end ) { $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" ), __METHOD__, array( 'IGNORE' ) ); $count += $dbw->affectedRows(); $dbw->delete( 'user_groups', array( 'ug_group' => $oldGroup, "ug_user BETWEEN $blockStart AND $blockEnd" ), __METHOD__ ); $count += $dbw->affectedRows(); $dbw->commit( __METHOD__ ); $blockStart += $this->mBatchSize; $blockEnd += $this->mBatchSize; wfWaitForSlaves(); } $this->output( "Done! $count user(s) in group '$oldGroup' are now in '$newGroup' instead.\n" ); } } $maintClass = "MigrateUserGroup"; require_once( RUN_MAINTENANCE_IF_MAIN );