Index: troll.install =================================================================== RCS file: /cvs/drupal-contrib/contributions/modules/troll/troll.install,v retrieving revision 1.2.2.1.2.1 diff -u -p -r1.2.2.1.2.1 troll.install --- troll.install 1 Mar 2009 03:24:10 -0000 1.2.2.1.2.1 +++ troll.install 1 Jun 2009 12:32:42 -0000 @@ -32,7 +32,7 @@ function troll_install() { accessed int(11) unsigned NOT NULL default '0', ip_address varchar(39) NOT NULL default '', created int(11) NOT NULL default '0', - KEY uid (uid) + PRIMARY KEY (uid, ip_address) ) TYPE=MyISAM /*!40100 DEFAULT CHARACTER SET utf8 */" ); @@ -71,7 +71,7 @@ function troll_install() { accessed integer NOT NULL default '0', ip_address varchar(39) NOT NULL default '', created integer NOT NULL default '0', - PRIMARY KEY (uid) + PRIMARY KEY (uid, ip_address) )" ); @@ -153,6 +153,38 @@ function troll_update_5000() { } /** + * Better indexes. + * + * @return array + */ +function troll_update_5201() { + $ret = array(); + // Remove duplicates from {troll_ip_track} + $res = db_query('SELECT COUNT(*) AS rows, uid, ip_address + FROM {troll_ip_track} + GROUP BY uid, ip_address + HAVING rows > 1'); + while ($dupe = db_fetch_object($res)) { + $ret[] = update_sql("DELETE FROM {troll_ip_track} WHERE uid = {$dupe->uid} AND ip_address = '{$dupe->ip_address}'"); + } + + switch ($GLOBALS['db_type']) { + case 'mysql': + case 'mysqli': + $ret[] = update_sql('ALTER TABLE {troll_ip_track} + DROP INDEX uid, + ADD PRIMARY KEY (uid, ip_address)'); + break; + case 'pgsql': + $ret[] = update_sql('ALTER TABLE {troll_ip_track} + DROP CONSTRAINT {troll_ip_track}_pkey , + ADD PRIMARY KEY (uid, ip_address)'); + break; + } + return $ret; +} + +/** * Implmentation of hook_uninstall(). */ function troll_uninstall() { Index: troll.module =================================================================== RCS file: /cvs/drupal-contrib/contributions/modules/troll/troll.module,v retrieving revision 1.26.2.11.2.5 diff -u -p -r1.26.2.11.2.5 troll.module --- troll.module 4 Mar 2009 01:50:24 -0000 1.26.2.11.2.5 +++ troll.module 1 Jun 2009 12:32:43 -0000 @@ -61,7 +61,7 @@ function troll_init() { } else { // insert new IP record for user - db_query("INSERT INTO {troll_ip_track} (uid, ip_address, created, accessed) VALUES (%d, '%s', %d, %d)", $user->uid, troll_ip_address(), time(), time()); + db_query("INSERT IGNORE INTO {troll_ip_track} (uid, ip_address, created, accessed) VALUES (%d, '%s', %d, %d)", $user->uid, troll_ip_address(), time(), time()); } } @@ -1333,7 +1333,7 @@ function troll_check_ip() { $chk = db_query($sql, troll_ip_address, $user->uid); $check = db_fetch_array($chk); if (!isset($check['uid'])) { - $isql = "INSERT INTO {troll_ip_track} (uid, ip_address, created) VALUES (%d, '%s', %d)"; + $isql = "INSERT IGNORE INTO {troll_ip_track} (uid, ip_address, created) VALUES (%d, '%s', %d)"; db_query($isql, $user->uid, troll_ip_address, time()); } } @@ -1373,8 +1373,12 @@ function troll_is_blacklisted() { return FALSE; } else { - $blacklisted = db_result(db_query('SELECT COUNT(b.net) FROM {troll_blacklist} b WHERE b.net <= %d AND b.bcast >= %d', $longip, $longip)); - $whitelisted = db_result(db_query('SELECT COUNT(w.net) FROM {troll_whitelist} w WHERE w.net <= %d AND w.bcast >= %d', $longip, $longip)); + $any_blacklisted = (bool)db_result(db_query_range('SELECT 1 FROM {troll_blacklist}', 0, 1)); + if (!$any_blacklisted) { + return FALSE; + } + $whitelisted = (bool)db_result(db_query_range('SELECT 1 FROM {troll_whitelist} w WHERE w.net <= %d AND w.bcast >= %d LIMIT 1', 0, 1, $longip, $longip)); + $blacklisted = (bool)db_result(db_query_range('SELECT 1 FROM {troll_blacklist} b WHERE b.net <= %d AND b.bcast >= %d LIMIT 1', 0, 1, $longip, $longip)); return $whitelisted ? FALSE : $blacklisted; } }