summaryrefslogtreecommitdiff
path: root/program/include
diff options
context:
space:
mode:
authoralecpl <alec@alec.pl>2010-06-02 10:23:06 +0000
committeralecpl <alec@alec.pl>2010-06-02 10:23:06 +0000
commit1126fc6127a0dbeeb053da55412414861109f94a (patch)
tree164ecedcb2e49a6549c6ffae5b9a17a3c27a09f2 /program/include
parent7d43f895325dd6ddd3e1962584206c67b2bd8e6a (diff)
- Performance improvement in add_to_group()
Diffstat (limited to 'program/include')
-rw-r--r--program/include/rcube_contacts.php36
1 files changed, 20 insertions, 16 deletions
diff --git a/program/include/rcube_contacts.php b/program/include/rcube_contacts.php
index 5553a23ad..698378ad7 100644
--- a/program/include/rcube_contacts.php
+++ b/program/include/rcube_contacts.php
@@ -564,28 +564,32 @@ class rcube_contacts extends rcube_addressbook
$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;