diff options
Diffstat (limited to 'engine/lib/upgrades/2010061501.php')
| -rw-r--r-- | engine/lib/upgrades/2010061501.php | 73 | 
1 files changed, 73 insertions, 0 deletions
| diff --git a/engine/lib/upgrades/2010061501.php b/engine/lib/upgrades/2010061501.php new file mode 100644 index 000000000..9ff7d3102 --- /dev/null +++ b/engine/lib/upgrades/2010061501.php @@ -0,0 +1,73 @@ +<?php +/** + * utf8 database conversion and file merging for usernames with multibyte chars + * + */ + + +// check that we need to do the utf8 conversion +// C&P logic from 2010033101 +$dbversion = (int) datalist_get('version'); + +if ($dbversion < 2009100701) { +	// start a new link to the DB to see what its defaults are. +	$link = mysql_connect($CONFIG->dbhost, $CONFIG->dbuser, $CONFIG->dbpass, TRUE); +	mysql_select_db($CONFIG->dbname, $link); + +	$q = "SHOW VARIABLES LIKE 'character_set_client'"; +	$r = mysql_query($q); +	$client = mysql_fetch_assoc($r); + +	$q = "SHOW VARIABLES LIKE 'character_set_connection'"; +	$r = mysql_query($q); +	$connection = mysql_fetch_assoc($r); + +	// only run upgrade if not already talking utf8 +	if ($client['Value'] != 'utf8' && $connection['Value'] != 'utf8') { +		$qs = array(); +		$qs[] = "SET NAMES utf8"; + +		$qs[] = "ALTER TABLE {$CONFIG->dbprefix}users_entity DISABLE KEYS"; +		$qs[] = "REPLACE INTO {$CONFIG->dbprefix}users_entity +			(guid, name, username, password, salt, email, language, code, +			banned, admin, last_action, prev_last_action, last_login, prev_last_login) + +			SELECT guid, name, unhex(hex(convert(username using latin1))), +				password, salt, email, language, code, +				banned, admin, last_action, prev_last_action, last_login, prev_last_login +			FROM {$CONFIG->dbprefix}users_entity"; + +		$qs[] = "ALTER TABLE {$CONFIG->dbprefix}users_entity ENABLE KEYS"; + +		foreach ($qs as $q) { +			if (!update_data($q)) { +				throw new Exception('Couldn\'t execute upgrade query: ' . $q); +			} +		} + +		global $DB_QUERY_CACHE, $DB_PROFILE, $ENTITY_CACHE; + +		/** +			Upgrade file locations +		 */ +		// new connection to force into utf8 mode to get the old name +		$link = mysql_connect($CONFIG->dbhost, $CONFIG->dbuser, $CONFIG->dbpass, TRUE); +		mysql_select_db($CONFIG->dbname, $link); + +		// must be the first command +		mysql_query("SET NAMES utf8"); + +		$users = mysql_query("SELECT guid, username FROM {$CONFIG->dbprefix}users_entity +			WHERE username != ''", $link); +		while ($user = mysql_fetch_object($users)) { +			$DB_QUERY_CACHE = $DB_PROFILE = $ENTITY_CACHE = array(); + +			$to = $CONFIG->dataroot . user_file_matrix($user->guid); +			foreach (array('1_0', '1_1', '1_6') as $version) { +				$function = "file_matrix_$version"; +				$from = $CONFIG->dataroot . $function($user->username); +				merge_directories($from, $to, $move = TRUE, $preference = 'from'); +			} +		} +	} +} | 
