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;
   }
 }
