Index: modules/user.module =================================================================== RCS file: /cvs/drupal/drupal/modules/Attic/user.module,v retrieving revision 1.612.2.18 diff -u -F^f -r1.612.2.18 user.module --- modules/user.module 11 Sep 2006 10:57:49 -0000 1.612.2.18 +++ modules/user.module 12 Sep 2006 13:35:17 -0000 @@ -56,6 +56,10 @@ function user_load($array = array()) { $query[] = "pass = '%s'"; $params[] = md5($value); } + else if ($key == 'name' || $key == 'name_lower') { + $query[] = "name_lower = LOWER('%s')"; + $params[] = $value; + } else { $query[]= "LOWER($key) = LOWER('%s')"; $params[] = $value; @@ -109,6 +113,10 @@ function user_save($account, $array = ar $data = unserialize(db_result(db_query('SELECT data FROM {users} WHERE uid = %d', $account->uid))); foreach ($array as $key => $value) { + if ($key == 'name' && !empty($value)) { + $query .= "name_lower = LOWER('%s'), "; + $v[] = $value; + } if ($key == 'pass' && !empty($value)) { $query .= "$key = '%s', "; $v[] = md5($value); @@ -163,6 +171,19 @@ function user_save($account, $array = ar // because we don't have a fully initialized user object yet. foreach ($array as $key => $value) { switch($key) { + // We store the name, as entered, in the name column, and the lowercase version of it in name_lower. + // This facilitates fast user lookups. + case 'name': + $fields[] = $key; + $values[] = $value; + $s[] = "'%s'"; + $fields[] = 'name_lower'; + $values[] = $value; + $s[] = "LOWER('%s')"; + break; + // name_lower should never be tampered with via parameter to this function. + case 'name_lower': + break; case 'pass': $fields[] = $key; $values[] = md5($value); @@ -369,8 +390,8 @@ function user_access($string, $account = * @return boolean true for blocked users, false for active */ function user_is_blocked($name) { - $allow = db_fetch_object(db_query("SELECT * FROM {users} WHERE status = 1 AND name = LOWER('%s')", $name)); - $deny = db_fetch_object(db_query("SELECT * FROM {users} WHERE status = 0 AND name = LOWER('%s')", $name)); + $allow = db_fetch_object(db_query("SELECT * FROM {users} WHERE status = 1 AND name_lower = LOWER('%s')", $name)); + $deny = db_fetch_object(db_query("SELECT * FROM {users} WHERE status = 0 AND name_lower = LOWER('%s')", $name)); return $deny && !$allow; } @@ -481,7 +502,7 @@ function user_search($op = 'search', $ke $find = array(); // Replace wildcards with MySQL/PostgreSQL wildcards. $keys = preg_replace('!\*+!', '%', $keys); - $result = pager_query("SELECT * FROM {users} WHERE LOWER(name) LIKE LOWER('%%%s%%')", 15, 0, NULL, $keys); + $result = pager_query("SELECT * FROM {users} WHERE name_lower LIKE LOWER('%%%s%%')", 15, 0, NULL, $keys); while ($account = db_fetch_object($result)) { $find[] = array('title' => $account->name, 'link' => url('user/'. $account->uid)); } @@ -1357,7 +1378,7 @@ function _user_edit_validate($uid, &$edi if ($error = user_validate_name($edit['name'])) { form_set_error('name', $error); } - else if (db_num_rows(db_query("SELECT uid FROM {users} WHERE uid != %d AND LOWER(name) = LOWER('%s')", $uid, $edit['name'])) > 0) { + else if (db_num_rows(db_query("SELECT uid FROM {users} WHERE uid != %d AND name_lower = LOWER('%s')", $uid, $edit['name'])) > 0) { form_set_error('name', t('The name %name is already taken.', array('%name' => theme('placeholder', $edit['name'])))); } else if (drupal_is_denied('user', $edit['name'])) { @@ -2118,7 +2139,7 @@ function _user_forms(&$edit, $account, $ */ function user_autocomplete($string) { $matches = array(); - $result = db_query_range("SELECT name FROM {users} WHERE LOWER(name) LIKE LOWER('%s%%')", $string, 0, 10); + $result = db_query_range("SELECT name FROM {users} WHERE name_lower LIKE LOWER('%s%%')", $string, 0, 10); while ($user = db_fetch_object($result)) { $matches[$user->name] = check_plain($user->name); } Index: database/updates.inc =================================================================== RCS file: /cvs/drupal/drupal/database/Attic/updates.inc,v retrieving revision 1.224.2.6 diff -u -F^f -r1.224.2.6 updates.inc --- database/updates.inc 8 Jun 2006 21:25:50 -0000 1.224.2.6 +++ database/updates.inc 12 Sep 2006 13:35:19 -0000 @@ -2013,3 +2013,19 @@ function system_update_182() { return $ret; } + +/** + * Add name_lower to users for faster lookups + */ +function system_update_183() { + $ret = array(); + + switch ($GLOBALS['db_type']) { + case 'mysql': + case 'mysqli': + $ret[] = update_sql("ALTER TABLE {users} ADD COLUMN name_lower varchar(60) NOT NULL default '' AFTER name"); + $ret[] = update_sql("UPDATE {users} SET name_lower = LOWER(name)"); + $ret[] = update_sql('ALTER TABLE {users} ADD UNIQUE INDEX (name_lower)'); + } + return $ret; +} \ No newline at end of file