Legoktm has uploaded a new change for review. https://gerrit.wikimedia.org/r/145543
Change subject: Update larger tables via the job queue ...................................................................... Update larger tables via the job queue Based off of what Renameuser does. Also allow extensions to add to job tables. Change-Id: I66f8216bfec306c1c0ba12c630fea6365f7857f8 --- M SpecialUserMerge.php M UserMerge.php A UserMergeJob.php 3 files changed, 94 insertions(+), 26 deletions(-) git pull ssh://gerrit.wikimedia.org:29418/mediawiki/extensions/UserMerge refs/changes/43/145543/1 diff --git a/SpecialUserMerge.php b/SpecialUserMerge.php index e0ea500..542880f 100644 --- a/SpecialUserMerge.php +++ b/SpecialUserMerge.php @@ -247,6 +247,27 @@ return true; } + /** + * @param User $oldUser + * @param User $newUser + * @param array $fieldInfo + */ + public static function updateTable( $oldUser, $newUser, $fieldInfo ) { + list( $tableName, $idField ) = $fieldInfo; + $textField = isset( $fieldInfo[2] ) ? $fieldInfo[2] : null; + + $fields = array( $idField => $newUser->getId() ); + if ( $textField ) { + $fields += array( $textField => $newUser->getName() ); + } + + wfGetDB( DB_MASTER )->update( + $tableName, + $fields, + array( $idField => $oldUser->getId() ), + __METHOD__ + ); + } /** * Function to merge database references from one user to another user @@ -267,19 +288,24 @@ // Fields to update with the format: // array( tableName, idField, textField ) $updateFields = array( - array( 'archive', 'ar_user', 'ar_user_text' ), - array( 'revision', 'rev_user', 'rev_user_text' ), array( 'filearchive', 'fa_user', 'fa_user_text' ), array( 'image', 'img_user', 'img_user_text' ), array( 'oldimage', 'oi_user', 'oi_user_text' ), - array( 'recentchanges', 'rc_user', 'rc_user_text' ), - array( 'logging', 'log_user' ), array( 'ipblocks', 'ipb_user', 'ipb_address' ), array( 'ipblocks', 'ipb_by', 'ipb_by_text' ), array( 'watchlist', 'wl_user' ), ); - wfRunHooks( 'UserMergeAccountFields', array( &$updateFields ) ); + // Same as above, but these are larger and should be updated + // via the job queue. + $updateJobFields = array( + array( 'archive', 'ar_user', 'ar_user_text' ), + array( 'revision', 'rev_user', 'rev_user_text' ), + array( 'logging', 'log_user', 'log_user_text' ), + array( 'recentchanges', 'rc_user', 'rc_user_text' ), + ); + + wfRunHooks( 'UserMergeAccountFields', array( &$updateFields, &$updateJobFields ) ); $dbw = wfGetDB( DB_MASTER ); $out = $this->getOutput(); @@ -287,37 +313,18 @@ $this->deduplicateWatchlistEntries( $objOldUser, $objNewUser ); foreach ( $updateFields as $fieldInfo ) { - $tableName = array_shift( $fieldInfo ); - $idField = array_shift( $fieldInfo ); - $dbw->update( - $tableName, - array( $idField => $newuserID ) + array_fill_keys( $fieldInfo, $newuser_text ), - array( $idField => $olduserID ), - __METHOD__ - ); + self::updateTable( $objOldUser, $objNewUser, $fieldInfo ); $out->addHTML( $this->msg( 'usermerge-updating', - $tableName, + $fieldInfo[0], $olduserID, $newuserID )->escaped() . Html::element( 'br' ) . "\n" ); - - foreach ( $fieldInfo as $textField ) { - $out->addHTML( - $this->msg( - 'usermerge-updating', - $tableName, - $olduser_text, - $newuser_text - )->escaped() . - Html::element( 'br' ) . "\n" - ); - } } $dbw->delete( 'user_newtalk', array( 'user_id' => $olduserID ) ); @@ -336,6 +343,10 @@ array( $olduser_text, $olduserID, $newuser_text, $newuserID ) ); + // Queue the bigger tables into the job queue + $job = UserMergeJob::newJob( $objOldUser, $objNewUser, $updateJobFields ); + JobQueueGroup::singleton()->push( $job ); + wfRunHooks( 'MergeAccountFromTo', array( &$objOldUser, &$objNewUser ) ); return true; diff --git a/UserMerge.php b/UserMerge.php index 8b76dd4..a8d32d0 100644 --- a/UserMerge.php +++ b/UserMerge.php @@ -58,7 +58,9 @@ $dir = __DIR__ . '/'; $wgAutoloadClasses['SpecialUserMerge'] = $dir . 'SpecialUserMerge.php'; $wgAutoloadClasses['UserMerge'] = $dir . 'SpecialUserMerge.php'; // back-compat +$wgAutoloadClasses['UserMergeJob'] = $dir . 'UserMergeJob.php'; +$wgJobClasses['UserMergeJob'] = 'UserMergeJob'; $wgMessagesDirs['UserMerge'] = __DIR__ . '/i18n'; $wgExtensionMessagesFiles['UserMerge'] = $dir . 'UserMerge.i18n.php'; diff --git a/UserMergeJob.php b/UserMergeJob.php new file mode 100644 index 0000000..cab8198 --- /dev/null +++ b/UserMergeJob.php @@ -0,0 +1,55 @@ +<?php + +class UserMergeJob extends Job { + /** + * @private + */ + public function __construct( Title $title, array $params, $id = 0 ) { + parent::__construct( 'UserMergeJob', $title, $params, $id ); + } + + /** + * Main constructor + * + * @param User $oldUser + * @param User $newUser + * @param array $fields + * @return UserMergeJob + */ + public static function newJob( User $oldUser, User $newUser, array $fields ) { + $params = array( + 'updateJobFields' => $fields, + 'oldname' => $oldUser->getName(), + 'oldid' => $oldUser->getId(), + 'newname' => $newUser->getName(), + 'newid' => $newUser->getId(), + ); + + return new self( Title::newFromText( 'UserMerge job' ), $params ); + } + + public function run() { + $fields = $this->params['updateJobFields']; + $oldUser = $this->getUser( 'old' ); + $newUser = $this->getUser( 'new' ); + foreach ( $fields as $fieldInfo ) { + SpecialUserMerge::updateTable( $oldUser, $newUser, $fieldInfo ); + } + } + + /** + * Create a fake dummy User object that responds to + * getId() and getName() properly + * + * @param string $type either "old" or "new" + * @return User + */ + private function getUser( $type ) { + $user = new User(); + $user->load(); + $user->mName = $this->params[$type . 'name']; + $user->mId = $this->params[$type . 'id']; + return $user; + } + +} \ No newline at end of file -- To view, visit https://gerrit.wikimedia.org/r/145543 To unsubscribe, visit https://gerrit.wikimedia.org/r/settings Gerrit-MessageType: newchange Gerrit-Change-Id: I66f8216bfec306c1c0ba12c630fea6365f7857f8 Gerrit-PatchSet: 1 Gerrit-Project: mediawiki/extensions/UserMerge Gerrit-Branch: master Gerrit-Owner: Legoktm <legoktm.wikipe...@gmail.com> _______________________________________________ MediaWiki-commits mailing list MediaWiki-commits@lists.wikimedia.org https://lists.wikimedia.org/mailman/listinfo/mediawiki-commits