[ Index ] |
PHP Cross Reference of MediaWiki-1.24.0 |
[Summary view] [Print] [Text view]
1 <?php 2 /** 3 * Re-assign users from an old group to a new one 4 * 5 * This program is free software; you can redistribute it and/or modify 6 * it under the terms of the GNU General Public License as published by 7 * the Free Software Foundation; either version 2 of the License, or 8 * (at your option) any later version. 9 * 10 * This program is distributed in the hope that it will be useful, 11 * but WITHOUT ANY WARRANTY; without even the implied warranty of 12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 13 * GNU General Public License for more details. 14 * 15 * You should have received a copy of the GNU General Public License along 16 * with this program; if not, write to the Free Software Foundation, Inc., 17 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. 18 * http://www.gnu.org/copyleft/gpl.html 19 * 20 * @file 21 * @ingroup Maintenance 22 */ 23 24 require_once __DIR__ . '/Maintenance.php'; 25 26 /** 27 * Maintenance script that re-assigns users from an old group to a new one. 28 * 29 * @ingroup Maintenance 30 */ 31 class MigrateUserGroup extends Maintenance { 32 public function __construct() { 33 parent::__construct(); 34 $this->mDescription = "Re-assign users from an old group to a new one"; 35 $this->addArg( 'oldgroup', 'Old user group key', true ); 36 $this->addArg( 'newgroup', 'New user group key', true ); 37 $this->setBatchSize( 200 ); 38 } 39 40 public function execute() { 41 $count = 0; 42 $oldGroup = $this->getArg( 0 ); 43 $newGroup = $this->getArg( 1 ); 44 $dbw = wfGetDB( DB_MASTER ); 45 $start = $dbw->selectField( 'user_groups', 'MIN(ug_user)', 46 array( 'ug_group' => $oldGroup ), __FUNCTION__ ); 47 $end = $dbw->selectField( 'user_groups', 'MAX(ug_user)', 48 array( 'ug_group' => $oldGroup ), __FUNCTION__ ); 49 if ( $start === null ) { 50 $this->error( "Nothing to do - no users in the '$oldGroup' group", true ); 51 } 52 # Do remaining chunk 53 $end += $this->mBatchSize - 1; 54 $blockStart = $start; 55 $blockEnd = $start + $this->mBatchSize - 1; 56 // Migrate users over in batches... 57 while ( $blockEnd <= $end ) { 58 $affected = 0; 59 $this->output( "Doing users $blockStart to $blockEnd\n" ); 60 61 $dbw->begin( __METHOD__ ); 62 $dbw->update( 'user_groups', 63 array( 'ug_group' => $newGroup ), 64 array( 'ug_group' => $oldGroup, 65 "ug_user BETWEEN $blockStart AND $blockEnd" ), 66 __METHOD__, 67 array( 'IGNORE' ) 68 ); 69 $affected += $dbw->affectedRows(); 70 // Delete rows that the UPDATE operation above had to ignore. 71 // This happens when a user is in both the old and new group. 72 // Updating the row for the old group membership failed since 73 // user/group is UNIQUE. 74 $dbw->delete( 'user_groups', 75 array( 'ug_group' => $oldGroup, 76 "ug_user BETWEEN $blockStart AND $blockEnd" ), 77 __METHOD__ 78 ); 79 $affected += $dbw->affectedRows(); 80 $dbw->commit( __METHOD__ ); 81 82 // Clear cache for the affected users (bug 40340) 83 if ( $affected > 0 ) { 84 // XXX: This also invalidates cache of unaffected users that 85 // were in the new group and not in the group. 86 $res = $dbw->select( 'user_groups', 'ug_user', 87 array( 'ug_group' => $newGroup, 88 "ug_user BETWEEN $blockStart AND $blockEnd" ), 89 __METHOD__ 90 ); 91 if ( $res !== false ) { 92 foreach ( $res as $row ) { 93 $user = User::newFromId( $row->ug_user ); 94 $user->invalidateCache(); 95 } 96 } 97 } 98 99 $count += $affected; 100 $blockStart += $this->mBatchSize; 101 $blockEnd += $this->mBatchSize; 102 wfWaitForSlaves(); 103 } 104 $this->output( "Done! $count users in group '$oldGroup' are now in '$newGroup' instead.\n" ); 105 } 106 } 107 108 $maintClass = "MigrateUserGroup"; 109 require_once RUN_MAINTENANCE_IF_MAIN;
title
Description
Body
title
Description
Body
title
Description
Body
title
Body
Generated: Fri Nov 28 14:03:12 2014 | Cross-referenced by PHPXref 0.7.1 |