From 30b30226e6569f13e444cdcb513cd2bfc24318d7 Mon Sep 17 00:00:00 2001
From: alecpl <alec@alec.pl>
Date: Thu, 04 Nov 2010 10:03:26 -0400
Subject: [PATCH] - Add possibility to force mailbox selection. There're situations where we're invoking   STATUS (for all messages count) and SELECT later for other operations. If we   call SELECT first, the STATUS will be not needed.

---
 program/include/rcube_contacts.php |  127 +++++++++++++++++++++++++++---------------
 1 files changed, 82 insertions(+), 45 deletions(-)

diff --git a/program/include/rcube_contacts.php b/program/include/rcube_contacts.php
index 0660066..d017793 100644
--- a/program/include/rcube_contacts.php
+++ b/program/include/rcube_contacts.php
@@ -4,8 +4,8 @@
  +-----------------------------------------------------------------------+
  | program/include/rcube_contacts.php                                    |
  |                                                                       |
- | This file is part of the RoundCube Webmail client                     |
- | Copyright (C) 2006-2010, RoundCube Dev. - Switzerland                 |
+ | This file is part of the Roundcube Webmail client                     |
+ | Copyright (C) 2006-2010, Roundcube Dev. - Switzerland                 |
  | Licensed under the GNU GPL                                            |
  |                                                                       |
  | PURPOSE:                                                              |
@@ -28,8 +28,15 @@
 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';
+
+    /**
+     * Store database connection.
+     *
+     * @var rcube_mdb2
+     */
     private $db = null;
     private $user_id = 0;
     private $filter = null;
@@ -39,7 +46,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 +65,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 +133,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 +171,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 +288,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=?".
@@ -309,7 +315,7 @@
     /**
      * Return the last result set
      *
-     * @return Result array or NULL if nothing selected yet
+     * @return mixed Result array or NULL if nothing selected yet
      */
     function get_result()
     {
@@ -321,7 +327,7 @@
      * Get a specific contact record
      *
      * @param mixed record identifier(s)
-     * @return Result object with all record fields or False if not found
+     * @return mixed Result object with all record fields or False if not found
      */
     function get_record($id, $assoc=false)
     {
@@ -330,7 +336,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",
@@ -349,10 +355,37 @@
 
 
     /**
+     * Get group assignments of a specific contact record
+     *
+     * @param mixed Record identifier
+     * @return array List of assigned groups as ID=>Name pairs
+     */
+    function get_record_groups($id)
+    {
+      $results = array();
+
+      if (!$this->groups)
+          return $results;
+
+      $sql_result = $this->db->query(
+        "SELECT cgm.contactgroup_id, cg.name FROM " . get_table_name($this->db_groupmembers) . " AS cgm" .
+        " LEFT JOIN " . get_table_name($this->db_groups) . " AS cg ON (cgm.contactgroup_id = cg.contactgroup_id AND cg.del<>1)" .
+        " WHERE cgm.contact_id=?",
+        $id
+      );
+      while ($sql_result && ($sql_arr = $this->db->fetch_assoc($sql_result))) {
+        $results[$sql_arr['contactgroup_id']] = $sql_arr['name'];
+      }
+
+      return $results;
+    }
+
+
+    /**
      * Create a new contact record
      *
-     * @param array Assoziative array with save data
-     * @return The created record ID on success, False on error
+     * @param array Associative array with save data
+     * @return integer|boolean The created record ID on success, False on error
      */
     function insert($save_data, $check=false)
     {
@@ -374,12 +407,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
@@ -411,7 +444,7 @@
      *
      * @param mixed Record identifier
      * @param array Assoziative array with save data
-     * @return True on success, False on error
+     * @return boolean True on success, False on error
      */
     function update($id, $save_cols)
     {
@@ -425,7 +458,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 +488,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 +506,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();
     }
@@ -483,7 +516,7 @@
      * Create a contact group with the given name
      *
      * @param string The group name
-     * @return False on error, array with record props in success
+     * @return mixed False on error, array with record props in success
      */
     function create_group($name)
     {
@@ -493,12 +526,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 +548,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 +573,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 +596,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 +643,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 +666,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