Topic on User talk:Werdna

SocialProfile, RenameUser and RenameUserSQL hook

3
Jack Phoenix (talkcontribs)

Hi Werdna,

I've been trying to make my SocialProfile extension support user renaming, which it does not currently. I decided to ask for your help because you added the useful RenameUserSQL hook to SpecialRenameuser_body.php in r55189.

Here's the patch I came up with:

Index: SocialProfile.php
===================================================================
--- SocialProfile.php	(revision 59581)
+++ SocialProfile.php	(working copy)
@@ -216,4 +216,47 @@
 		$wgExtNewTables[] = array( 'user_system_messages', "$dir/UserSystemMessages/user_system_messages.sql" );
 	}
 	return true;
+}
+
+// For Renameuser extension
+$wgHooks['RenameUserSQL'][] = 'efSystemGiftsOnUserRename';
+$wgHooks['RenameUserSQL'][] = 'efUserBoardOnUserRename';
+$wgHooks['RenameUserSQL'][] = 'efUserGiftsOnUserRename';
+$wgHooks['RenameUserSQL'][] = 'efUserRelationshipOnUserRename';
+$wgHooks['RenameUserSQL'][] = 'efUserStatsOnUserRename';
+$wgHooks['RenameUserSQL'][] = 'efUserSystemMessagesOnUserRename';
+
+function efSystemGiftsOnUserRename( $renameUserSQL ) {
+	$renameUserSQL->tables['user_system_gift'] = array( 'sg_user_name', 'sg_user_id' );
+	return true;
+}
+
+function efUserBoardOnUserRename( $renameUserSQL ) {
+	$renameUserSQL->tables['user_board'] = array( 'ub_user_name_from', 'ub_user_id_from' );
+	return true;
+}
+
+function efUserGiftsOnUserRename( $renameUserSQL ) {
+	$renameUserSQL->tables['user_gift'] = array( 'ug_user_name_to', 'ug_user_id_to' );
+	$renameUserSQL->tables['gift'] = array( 'gift_creator_user_name', 'gift_creator_user_id' );
+	return true;
+}
+
+function efUserRelationshipOnUserRename( $renameUserSQL ) {
+	// <fixme> This sucks and only updates half of the rows...wtf?
+	$renameUserSQL->tables['user_relationship'] = array( 'r_user_name_relation', 'r_user_id_relation' );
+	$renameUserSQL->tables['user_relationship'] = array( 'r_user_name', 'r_user_id' );
+	// </fixme>
+	$renameUserSQL->tables['user_relationship_request'] = array( 'ur_user_name_from', 'ur_user_id_from' );
+	return true;
+}
+
+function efUserStatsOnUserRename( $renameUserSQL ) {
+	$renameUserSQL->tables['user_stats'] = array( 'stats_user_name', 'stats_user_id' );
+	return true;
+}
+
+function efUserSystemMessagesOnUserRename( $renameUserSQL ) {
+	$renameUserSQL->tables['user_system_messages'] = array( 'um_user_name', 'um_user_id' );
+	return true;
 }
\ No newline at end of file

As noted in function efUserRelationshipOnUserRename it doesn't work like I'd want it to. All other functions do work as they should, however. Here's some example data (and the table structure of user_relationship table) from my local testing wiki:

CREATE TABLE IF NOT EXISTS `user_relationship` (
  `r_id` int(11) NOT NULL AUTO_INCREMENT,
  `r_user_id` int(5) unsigned NOT NULL DEFAULT '0',
  `r_user_name` varchar(255) NOT NULL DEFAULT '',
  `r_user_id_relation` int(5) unsigned NOT NULL DEFAULT '0',
  `r_user_name_relation` varchar(255) NOT NULL DEFAULT '',
  `r_type` int(2) DEFAULT NULL,
  `r_date` datetime DEFAULT NULL,
  PRIMARY KEY (`r_id`),
  KEY `r_user_id` (`r_user_id`),
  KEY `r_user_id_relation` (`r_user_id_relation`)
) ENGINE=MyISAM  DEFAULT CHARSET=utf8;
 
-- This signifies that User:Bar (user ID #2) is a friend of User:Foo (user id #1)
-- and the other way around
INSERT INTO `user_relationship` (`r_id`, `r_user_id`, `r_user_name`, `r_user_id_relation`, `r_user_name_relation`, `r_type`, `r_date`) VALUES
(1, 2, 'Bar', 1, 'Foo', 1, '2009-12-03 22:28:33'),
(2, 1, 'Foo', 2, 'Bar', 1, '2009-12-03 22:28:33');

When User:Bar is renamed to User:Baz, only one of the above entries is changed from 'Bar' to 'Baz' (can't remember which one) instead of both entries being changed. Is there a way to fix this and if so, how would I fix it?

Thanks in advance for your help!

Werdna (talkcontribs)

Hi, I'm sorry for the late reply — I've been on vacation since December 20 last year.

I've just taken a peek at my own code, and it looks like the format for the array is $sql->tables['tablename'] = array( name_field, id_field, index_field ).

name_field is the field to update, id_field is a field with a user_id, and index_field is some sort of index for splitting up the job into manageable chunks (this may be only for tablesJob, I don't know).

I'm not quite clear on where you're going wrong, though. Any chance you could intercept the queries being used to update the rows? This might help us get a better idea of what's really going on in that crazy old class.

Jack Phoenix (talkcontribs)

I renamed User:Bar to User:Baz under my "Foo" account. My user profile still shows "Bar" as my friend instead of "Baz". Here are the related queries from MySQL's query log:


		  123 Connect	root@localhost on 
		  123 Init DB	phasethree
		  123 Query	SET /* DatabaseMysql::open Foo */ NAMES utf8
		  123 Query	SET /* DatabaseMysql::open Foo */ sql_mode = ''
		  123 Query	SELECT /* SqlBagOStuff::get Foo */  value,exptime  FROM `objectcache`  WHERE keyname = 'phasethree:messages:en'  LIMIT 1
		  122 Query	SELECT /* LCStore_DB::get Foo */  lc_value  FROM `l10n_cache`  WHERE lc_lang = 'en' AND lc_key = 'messages:renameuser'  LIMIT 1
		  122 Query	SELECT /* LCStore_DB::get Foo */  lc_value  FROM `l10n_cache`  WHERE lc_lang = 'en' AND lc_key = 'magicWords'  LIMIT 1
		  122 Query	SELECT /* LCStore_DB::get Foo */  lc_value  FROM `l10n_cache`  WHERE lc_lang = 'en' AND lc_key = 'messages:renameuser-summary'  LIMIT 1
		  122 Query	SELECT /* LCStore_DB::get Foo */  lc_value  FROM `l10n_cache`  WHERE lc_lang = 'en' AND lc_key = 'linkPrefixExtension'  LIMIT 1
		  122 Query	SELECT /* LCStore_DB::get Foo */  lc_value  FROM `l10n_cache`  WHERE lc_lang = 'en' AND lc_key = 'messages:renameuserold'  LIMIT 1
		  122 Query	SELECT /* LCStore_DB::get Foo */  lc_value  FROM `l10n_cache`  WHERE lc_lang = 'en' AND lc_key = 'messages:renameusernew'  LIMIT 1
		  122 Query	SELECT /* LCStore_DB::get Foo */  lc_value  FROM `l10n_cache`  WHERE lc_lang = 'en' AND lc_key = 'messages:renameuserreason'  LIMIT 1
		  122 Query	SELECT /* LCStore_DB::get Foo */  lc_value  FROM `l10n_cache`  WHERE lc_lang = 'en' AND lc_key = 'messages:renameusermove'  LIMIT 1
		  122 Query	SELECT /* LCStore_DB::get Foo */  lc_value  FROM `l10n_cache`  WHERE lc_lang = 'en' AND lc_key = 'messages:renameusersubmit'  LIMIT 1
		  122 Query	SELECT /* LCStore_DB::get Foo */  lc_value  FROM `l10n_cache`  WHERE lc_lang = 'en' AND lc_key = 'messages:blocklogpage'  LIMIT 1
		  122 Query	SELECT /* LCStore_DB::get Foo */  lc_value  FROM `l10n_cache`  WHERE lc_lang = 'en' AND lc_key = 'messages:double-redirect-fixer'  LIMIT 1
		  122 Query	SELECT /* User::idForName Foo */  user_id  FROM `user`  WHERE user_name = 'Bar'  LIMIT 1
		  122 Query	SELECT /* User::idForName Foo */  user_id  FROM `user`  WHERE user_name = 'Baz'  LIMIT 1
		  122 Query	SELECT /* User::edits Foo */  user_editcount  FROM `user`  WHERE user_id = '5'  LIMIT 1
		  122 Query	SELECT /* User::edits Foo */  user_editcount  FROM `user`  WHERE user_id = '5'  LIMIT 1
		  122 Query	SELECT /* SiteStats::doLoad Foo */  *  FROM `site_stats`   LIMIT 1
		  122 Query	UPDATE /* RenameuserSQL::rename Foo */  `user` SET user_name = 'Baz',user_touched = '20100207170600' WHERE user_name = 'Bar'
		  122 Query	UPDATE /* RenameuserSQL::rename Foo */  `ipblocks` SET ipb_address = 'Baz' WHERE ipb_user = '5' AND ipb_address = 'Bar'
		  122 Query	UPDATE /* RenameuserSQL::rename Foo */  `logging` SET log_title = 'Baz' WHERE log_type IN ('block','rights')  AND log_namespace = '2' AND log_title = 'Bar'
		  122 Query	UPDATE /* RenameuserSQL::rename Foo */  `image` SET img_user_text = 'Baz' WHERE img_user_text = 'Bar' AND img_user = '5'
		  122 Query	UPDATE /* RenameuserSQL::rename Foo */  `oldimage` SET oi_user_text = 'Baz' WHERE oi_user_text = 'Bar' AND oi_user = '5'
		  122 Query	UPDATE /* RenameuserSQL::rename Foo */  `revision` SET rev_user_text = 'Baz' WHERE rev_user_text = 'Bar' AND rev_user = '5'
		  122 Query	UPDATE /* RenameuserSQL::rename Foo */  `archive` SET ar_user_text = 'Baz' WHERE ar_user_text = 'Bar' AND ar_user = '5'
		  122 Query	UPDATE /* RenameuserSQL::rename Foo */  `logging` SET log_user_text = 'Baz' WHERE log_user_text = 'Bar' AND log_user = '5'
		  122 Query	UPDATE /* RenameuserSQL::rename Foo */  `recentchanges` SET rc_user_text = 'Baz' WHERE rc_user_text = 'Bar' AND rc_user = '5'
		  122 Query	UPDATE /* RenameuserSQL::rename Foo */  `user_system_gift` SET sg_user_name = 'Baz' WHERE sg_user_name = 'Bar' AND sg_user_id = '5'
		  122 Query	UPDATE /* RenameuserSQL::rename Foo */  `user_board` SET ub_user_name_from = 'Baz' WHERE ub_user_name_from = 'Bar' AND ub_user_id_from = '5'
		  122 Query	UPDATE /* RenameuserSQL::rename Foo */  `user_gift` SET ug_user_name_to = 'Baz' WHERE ug_user_name_to = 'Bar' AND ug_user_id_to = '5'
		  122 Query	UPDATE /* RenameuserSQL::rename Foo */  `gift` SET gift_creator_user_name = 'Baz' WHERE gift_creator_user_name = 'Bar' AND gift_creator_user_id = '5'
		  122 Query	UPDATE /* RenameuserSQL::rename Foo */  `user_relationship` SET r_user_name = 'Baz' WHERE r_user_name = 'Bar' AND r_user_id = '5'
		  122 Query	UPDATE /* RenameuserSQL::rename Foo */  `user_relationship_request` SET ur_user_name_from = 'Baz' WHERE ur_user_name_from = 'Bar' AND ur_user_id_from = '5'
		  122 Query	UPDATE /* RenameuserSQL::rename Foo */  `user_stats` SET stats_user_name = 'Baz' WHERE stats_user_name = 'Bar' AND stats_user_id = '5'
		  122 Query	UPDATE /* RenameuserSQL::rename Foo */  `user_system_messages` SET um_user_name = 'Baz' WHERE um_user_name = 'Bar' AND um_user_id = '5'
		  122 Query	COMMIT
Reply to "SocialProfile, RenameUser and RenameUserSQL hook"