Index: modules/user.module =================================================================== RCS file: /cvs/drupal/drupal/modules/Attic/user.module,v retrieving revision 1.612.2.16 diff -u -r1.612.2.16 user.module --- modules/user.module 2 Aug 2006 18:13:27 -0000 1.612.2.16 +++ modules/user.module 15 Sep 2006 15:18:25 -0000 @@ -56,6 +56,10 @@ $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 @@ $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 @@ // 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 @@ * @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 @@ $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)); } @@ -1367,7 +1388,7 @@ 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'])) { @@ -2125,7 +2146,7 @@ */ 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 -r1.224.2.6 updates.inc --- database/updates.inc 8 Jun 2006 21:25:50 -0000 1.224.2.6 +++ database/updates.inc 15 Sep 2006 15:18:26 -0000 @@ -2013,3 +2013,25 @@ 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)'); + break; + case 'pgsql': + db_add_column($ret, 'users', 'name_lower', 'varchar(60)', array('not null' => TRUE, 'default' => FALSE)); + $ret[] = update_sql("UPDATE {users} SET name_lower = LOWER(name)"); + $ret[] = update_sql('CREATE UNIQUE INDEX {users}_name_lower_idx ON {users} (name_lower)'); + break; + } + return $ret; +}