MediaWiki  REL1_19
migrateUserGroup.php
Go to the documentation of this file.
00001 <?php
00023 require_once( dirname( __FILE__ ) . '/Maintenance.php' );
00024 
00025 class MigrateUserGroup extends Maintenance {
00026         public function __construct() {
00027                 parent::__construct();
00028                 $this->mDescription = "Re-assign users from an old group to a new one";
00029                 $this->addArg( 'oldgroup', 'Old user group key', true );
00030                 $this->addArg( 'newgroup', 'New user group key', true );
00031                 $this->setBatchSize( 200 );
00032         }
00033 
00034         public function execute() {
00035                 $count = 0;
00036                 $oldGroup = $this->getArg( 0 );
00037                 $newGroup = $this->getArg( 1 );
00038                 $dbw = wfGetDB( DB_MASTER );
00039                 $start = $dbw->selectField( 'user_groups', 'MIN(ug_user)',
00040                         array( 'ug_group' => $oldGroup ), __FUNCTION__ );
00041                 $end = $dbw->selectField( 'user_groups', 'MAX(ug_user)',
00042                         array( 'ug_group' => $oldGroup ), __FUNCTION__ );
00043                 if ( $start === null ) {
00044                         $this->error( "Nothing to do - no users in the '$oldGroup' group", true );
00045                 }
00046                 # Do remaining chunk
00047                 $end += $this->mBatchSize - 1;
00048                 $blockStart = $start;
00049                 $blockEnd = $start + $this->mBatchSize - 1;
00050                 // Migrate users over in batches...
00051                 while ( $blockEnd <= $end ) {
00052                         $this->output( "Doing users $blockStart to $blockEnd\n" );
00053                         $dbw->begin();
00054                         $dbw->update( 'user_groups',
00055                                 array( 'ug_group' => $newGroup ),
00056                                 array( 'ug_group' => $oldGroup,
00057                                         "ug_user BETWEEN $blockStart AND $blockEnd" )
00058                         );
00059                         $count += $dbw->affectedRows();
00060                         $dbw->commit();
00061                         $blockStart += $this->mBatchSize;
00062                         $blockEnd += $this->mBatchSize;
00063                         wfWaitForSlaves();
00064                 }
00065                 $this->output( "Done! $count user(s) in group '$oldGroup' are now in '$newGroup' instead.\n" );
00066         }
00067 }
00068 
00069 $maintClass = "MigrateUserGroup";
00070 require_once( RUN_MAINTENANCE_IF_MAIN );