From d8d41658d3fb87c71c3e30825003f827f4ffbdae Mon Sep 17 00:00:00 2001
From: alecpl <alec@alec.pl>
Date: Sat, 09 Aug 2008 16:20:59 -0400
Subject: [PATCH] - Case insensitive contacts searching using PostgreSQL (#1485259)

---
 CHANGELOG                          |    4 ++++
 program/include/rcube_mdb2.php     |   21 +++++++++++++++++++++
 program/include/rcube_db.php       |   20 ++++++++++++++++++++
 program/include/rcube_contacts.php |    6 +++---
 4 files changed, 48 insertions(+), 3 deletions(-)

diff --git a/CHANGELOG b/CHANGELOG
index 042e38f..fad40f2 100644
--- a/CHANGELOG
+++ b/CHANGELOG
@@ -1,6 +1,10 @@
 CHANGELOG RoundCube Webmail
 ---------------------------
 
+2008/08/09 (alec)
+----------
+- Case insensitive contacts searching using PostgreSQL (#1485259)
+
 2008/07/31 (thomasb)
 ----------
 - Make default imap folders configurable for each user (#1485075)
diff --git a/program/include/rcube_contacts.php b/program/include/rcube_contacts.php
index 913f04f..0c0f932 100644
--- a/program/include/rcube_contacts.php
+++ b/program/include/rcube_contacts.php
@@ -196,12 +196,12 @@
       if ($col == 'ID' || $col == $this->primary_key)
       {
         $ids = !is_array($value) ? split(',', $value) : $value;
-        $add_where[] = $this->primary_key." IN (".join(',', $ids).")";
+        $add_where[] = $this->primary_key.' IN ('.join(',', $ids).')';
       }
       else if ($strict)
-        $add_where[] = $this->db->quoteIdentifier($col)."=".$this->db->quote($value);
+        $add_where[] = $this->db->quoteIdentifier($col).'='.$this->db->quote($value);
       else
-        $add_where[] = $this->db->quoteIdentifier($col)." LIKE ".$this->db->quote(strlen($value)>2 ? "%$value%" : "$value%");
+        $add_where[] = $this->db->ilike($col, '%'.$value.'%');
     }
     
     if (!empty($add_where))
diff --git a/program/include/rcube_db.php b/program/include/rcube_db.php
index 8fa34e6..716e0d9 100644
--- a/program/include/rcube_db.php
+++ b/program/include/rcube_db.php
@@ -511,6 +511,26 @@
 
 
   /**
+   * Return SQL statement for case insensitive LIKE
+   *
+   * @param  string  Field name
+   * @param  string  Search value
+   * @return string  SQL statement to use in query
+   * @access public
+   */
+  function ilike($column, $value)
+    {
+    switch($this->db_provider)
+      {
+      case 'pgsql':
+        return $this->quote_identifier($column).' ILIKE '.$this->quote($value);
+      default:
+        return $this->quote_identifier($column).' LIKE '.$this->quote($value);
+      }
+    }
+
+
+  /**
    * Adds a query result and returns a handle ID
    *
    * @param  object  Query handle
diff --git a/program/include/rcube_mdb2.php b/program/include/rcube_mdb2.php
index 9f2f30c..0adb6e2 100644
--- a/program/include/rcube_mdb2.php
+++ b/program/include/rcube_mdb2.php
@@ -509,6 +509,27 @@
 
 
   /**
+   * Return SQL statement for case insensitive LIKE
+   *
+   * @param  string  Field name
+   * @param  string  Search value
+   * @return string  SQL statement to use in query
+   * @access public
+   */
+  function ilike($column, $value)
+    {
+    // TODO: use MDB2's matchPattern() function
+    switch($this->db_provider)
+      {
+      case 'pgsql':
+        return $this->quote_identifier($column).' ILIKE '.$this->quote($value);
+      default:
+        return $this->quote_identifier($column).' LIKE '.$this->quote($value);
+      }
+    }
+
+
+  /**
    * Adds a query result and returns a handle ID
    *
    * @param  object  Query handle

--
Gitblit v1.9.1