From 2aa2b332f6e216ceeabc36ef6b942c40d91bda5a Mon Sep 17 00:00:00 2001 From: alecpl <alec@alec.pl> Date: Wed, 08 Sep 2010 05:40:39 -0400 Subject: [PATCH] - Small performance improvements --- program/include/rcube_contacts.php | 79 +++++++++++++++++++++------------------ 1 files changed, 42 insertions(+), 37 deletions(-) diff --git a/program/include/rcube_contacts.php b/program/include/rcube_contacts.php index 0660066..698378a 100644 --- a/program/include/rcube_contacts.php +++ b/program/include/rcube_contacts.php @@ -28,8 +28,10 @@ class rcube_contacts extends rcube_addressbook { // protected for backward compat. with some plugins - // maybe changed in the future - protected $db_name = ''; + protected $db_name = 'contacts'; + protected $db_groups = 'contactgroups'; + protected $db_groupmembers = 'contactgroupmembers'; + private $db = null; private $user_id = 0; private $filter = null; @@ -39,7 +41,7 @@ private $cache; private $table_cols = array('name', 'email', 'firstname', 'surname', 'vcard'); - /** public properties */ + // public properties var $primary_key = 'contact_id'; var $readonly = false; var $groups = true; @@ -58,7 +60,6 @@ function __construct($dbconn, $user) { $this->db = $dbconn; - $this->db_name = get_table_name('contacts'); $this->user_id = $user; $this->ready = $this->db && !$this->db->is_error(); } @@ -127,7 +128,7 @@ $sql_filter = $search ? " AND " . $this->db->ilike('name', '%'.$search.'%') : ''; $sql_result = $this->db->query( - "SELECT * FROM ".get_table_name('contactgroups'). + "SELECT * FROM ".get_table_name($this->db_groups). " WHERE del<>1". " AND user_id=?". $sql_filter. @@ -165,11 +166,11 @@ $length = $subset != 0 ? abs($subset) : $this->page_size; if ($this->group_id) - $join = " LEFT JOIN ".get_table_name('contactgroupmembers')." AS m". + $join = " LEFT JOIN ".get_table_name($this->db_groupmembers)." AS m". " ON (m.contact_id = c.".$this->primary_key.")"; $sql_result = $this->db->limitquery( - "SELECT * FROM ".$this->db_name." AS c" . + "SELECT * FROM ".get_table_name($this->db_name)." AS c" . $join . " WHERE c.del<>1" . " AND c.user_id=?" . @@ -282,13 +283,13 @@ private function _count() { if ($this->group_id) - $join = " LEFT JOIN ".get_table_name('contactgroupmembers')." AS m". + $join = " LEFT JOIN ".get_table_name($this->db_groupmembers)." AS m". " ON (m.contact_id=c.".$this->primary_key.")"; // count contacts for this user $sql_result = $this->db->query( "SELECT COUNT(c.contact_id) AS rows". - " FROM ".$this->db_name." AS c". + " FROM ".get_table_name($this->db_name)." AS c". $join. " WHERE c.del<>1". " AND c.user_id=?". @@ -330,7 +331,7 @@ return $assoc ? $first : $this->result; $this->db->query( - "SELECT * FROM ".$this->db_name. + "SELECT * FROM ".get_table_name($this->db_name). " WHERE contact_id=?". " AND user_id=?". " AND del<>1", @@ -374,12 +375,12 @@ if (!$existing->count && !empty($a_insert_cols)) { $this->db->query( - "INSERT INTO ".$this->db_name. + "INSERT INTO ".get_table_name($this->db_name). " (user_id, changed, del, ".join(', ', $a_insert_cols).")". " VALUES (".intval($this->user_id).", ".$this->db->now().", 0, ".join(', ', $a_insert_values).")" ); - $insert_id = $this->db->insert_id('contacts'); + $insert_id = $this->db->insert_id($this->db_name); } // also add the newly created contact to the active group @@ -425,7 +426,7 @@ if (!empty($write_sql)) { $this->db->query( - "UPDATE ".$this->db_name. + "UPDATE ".get_table_name($this->db_name). " SET changed=".$this->db->now().", ".join(', ', $write_sql). " WHERE contact_id=?". " AND user_id=?". @@ -455,7 +456,7 @@ // flag record as deleted $this->db->query( - "UPDATE ".$this->db_name. + "UPDATE ".get_table_name($this->db_name). " SET del=1, changed=".$this->db->now(). " WHERE user_id=?". " AND contact_id IN ($ids)", @@ -473,7 +474,7 @@ */ function delete_all() { - $this->db->query("DELETE FROM {$this->db_name} WHERE user_id=?", $this->user_id); + $this->db->query("DELETE FROM ".get_table_name($this->db_name)." WHERE user_id = ?", $this->user_id); $this->cache = null; return $this->db->affected_rows(); } @@ -493,12 +494,12 @@ $name = $this->unique_groupname($name); $this->db->query( - "INSERT INTO ".get_table_name('contactgroups'). + "INSERT INTO ".get_table_name($this->db_groups). " (user_id, changed, name)". " VALUES (".intval($this->user_id).", ".$this->db->now().", ".$this->db->quote($name).")" ); - if ($insert_id = $this->db->insert_id('contactgroups')) + if ($insert_id = $this->db->insert_id($this->db_groups)) $result = array('id' => $insert_id, 'name' => $name); return $result; @@ -515,7 +516,7 @@ { // flag group record as deleted $sql_result = $this->db->query( - "UPDATE ".get_table_name('contactgroups'). + "UPDATE ".get_table_name($this->db_groups). " SET del=1, changed=".$this->db->now(). " WHERE contactgroup_id=?", $gid @@ -540,7 +541,7 @@ $name = $this->unique_groupname($newname); $sql_result = $this->db->query( - "UPDATE ".get_table_name('contactgroups'). + "UPDATE ".get_table_name($this->db_groups). " SET name=?, changed=".$this->db->now(). " WHERE contactgroup_id=?", $name, $gid @@ -563,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('contactgroupmembers'). - " 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('contactgroupmembers'). - " (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; @@ -606,7 +611,7 @@ $ids = $this->db->array2list($ids, 'integer'); $sql_result = $this->db->query( - "DELETE FROM ".get_table_name('contactgroupmembers'). + "DELETE FROM ".get_table_name($this->db_groupmembers). " WHERE contactgroup_id=?". " AND contact_id IN ($ids)", $group_id @@ -629,7 +634,7 @@ do { $sql_result = $this->db->query( - "SELECT 1 FROM ".get_table_name('contactgroups'). + "SELECT 1 FROM ".get_table_name($this->db_groups). " WHERE del<>1". " AND user_id=?". " AND name=?", -- Gitblit v1.9.1