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

Reply via email to