From 1126fc6127a0dbeeb053da55412414861109f94a Mon Sep 17 00:00:00 2001
From: alecpl <alec@alec.pl>
Date: Wed, 02 Jun 2010 06:23:06 -0400
Subject: [PATCH] - Performance improvement in add_to_group()

---
 program/include/rcube_contacts.php |   36 ++++++++++++++++++++----------------
 1 files changed, 20 insertions(+), 16 deletions(-)

diff --git a/program/include/rcube_contacts.php b/program/include/rcube_contacts.php
index 5553a23..698378a 100644
--- a/program/include/rcube_contacts.php
+++ b/program/include/rcube_contacts.php
@@ -564,28 +564,32 @@
             $ids = explode(',', $ids);
 
         $added = 0;
+        $exists = array();
+
+        // get existing assignments ...
+        $sql_result = $this->db->query(
+            "SELECT contact_id FROM ".get_table_name($this->db_groupmembers).
+            " WHERE contactgroup_id=?".
+                " AND contact_id IN (".$this->db->array2list($ids, 'integer').")",
+            $group_id
+        );
+        while ($sql_result && ($sql_arr = $this->db->fetch_assoc($sql_result))) {
+            $exists[] = $sql_arr['contact_id'];
+        }
+        // ... and remove them from the list
+        $ids = array_diff($ids, $exists);
 
         foreach ($ids as $contact_id) {
-            $sql_result = $this->db->query(
-                "SELECT 1 FROM ".get_table_name($this->db_groupmembers).
-                " WHERE contactgroup_id=?".
-                    " AND contact_id=?",
+            $this->db->query(
+                "INSERT INTO ".get_table_name($this->db_groupmembers).
+                " (contactgroup_id, contact_id, created)".
+                " VALUES (?, ?, ".$this->db->now().")",
                 $group_id,
                 $contact_id
             );
 
-            if (!$this->db->num_rows($sql_result)) {
-                $this->db->query(
-                    "INSERT INTO ".get_table_name($this->db_groupmembers).
-                    " (contactgroup_id, contact_id, created)".
-                    " VALUES (?, ?, ".$this->db->now().")",
-                    $group_id,
-                    $contact_id
-                );
-
-                if (!$this->db->db_error)
-                    $added++;
-            }
+            if (!$this->db->db_error)
+                $added++;
         }
 
         return $added;

--
Gitblit v1.9.1