From 2273d4117fd50ee44dcdaa28fd6444383dc403a0 Mon Sep 17 00:00:00 2001
From: alecpl <alec@alec.pl>
Date: Tue, 26 Jan 2010 08:45:16 -0500
Subject: [PATCH] - Add support for MDB2's 'sqlsrv' driver (#1486395)

---
 program/include/rcube_mdb2.php |  110 +++++++++++++++++++++++++++++++++++++++++++++++++-----
 1 files changed, 99 insertions(+), 11 deletions(-)

diff --git a/program/include/rcube_mdb2.php b/program/include/rcube_mdb2.php
index 713ff42..137ffb2 100644
--- a/program/include/rcube_mdb2.php
+++ b/program/include/rcube_mdb2.php
@@ -106,7 +106,7 @@
       if (!filesize($dsn_array['database']) && !empty($this->sqlite_initials))
         $this->_sqlite_create_database($dbh, $this->sqlite_initials);
       }
-    else
+    else if ($this->db_provider!='mssql' && $this->db_provider!='sqlsrv')
       $dbh->setCharset('utf8');
 
     return $dbh;
@@ -178,6 +178,17 @@
     
 
   /**
+   * Connection state checker
+   *
+   * @param  boolean  True if in connected state
+   */
+  function is_connected()
+    {
+    return PEAR::isError($this->db_handle) ? false : true;
+    }
+
+
+  /**
    * Execute a SQL query
    *
    * @param  string  SQL query to execute
@@ -187,6 +198,9 @@
    */
   function query()
     {
+    if (!$this->is_connected())
+      return NULL;
+    
     $params = func_get_args();
     $query = array_shift($params);
 
@@ -242,11 +256,11 @@
       $result = $this->db_handle->setLimit($numrows,$offset);
 
     if (empty($params))
-        $result = $this->db_handle->query($query);
+      $result = $mode=='r' ? $this->db_handle->query($query) : $this->db_handle->exec($query);
     else
       {
       $params = (array)$params;
-      $q = $this->db_handle->prepare($query);
+      $q = $this->db_handle->prepare($query, null, $mode=='w' ? MDB2_PREPARE_MANIP : null);
       if ($this->db_handle->isError($q))
         {
         $this->db_error = TRUE;
@@ -307,16 +321,22 @@
    * Get last inserted record ID
    * For Postgres databases, a sequence name is required
    *
-   * @param  string  Sequence name for increment
+   * @param  string  Table name (to find the incremented sequence)
    * @return mixed   ID or FALSE on failure
    * @access public
    */
-  function insert_id($sequence = '')
+  function insert_id($table = '')
     {
     if (!$this->db_handle || $this->db_mode=='r')
       return FALSE;
 
-    return $this->db_handle->lastInsertID($sequence);
+    // find sequence name
+    if ($table && $this->db_provider == 'pgsql')
+      $table = get_sequence_name($table);
+
+    $id = $this->db_handle->lastInsertID($table);
+    
+    return $this->db_handle->isError($id) ? null : $id;
     }
 
 
@@ -360,7 +380,7 @@
    */
   function _fetch_row($result, $mode)
     {
-    if ($result === FALSE || PEAR::isError($result))
+    if ($result === FALSE || PEAR::isError($result) || !$this->is_connected())
       return FALSE;
 
     return $result->fetchRow($mode);
@@ -447,11 +467,32 @@
     switch($this->db_provider)
       {
       case 'mssql':
+      case 'sqlsrv':
         return "getdate()";
 
       default:
         return "now()";
       }
+    }
+
+
+  /**
+   * Return list of elements for use with SQL's IN clause
+   *
+   * @param  string Input array
+   * @return string Elements list string
+   * @access public
+   */
+  function array2list($arr, $type=null)
+    {
+    if (!is_array($arr))
+      return $this->quote($arr, $type);
+    
+    $res = array();
+    foreach ($arr as $item)
+      $res[] = $this->quote($item, $type);
+
+    return implode(',', $res);
     }
 
 
@@ -471,7 +512,8 @@
         break;
 
       case 'mssql':
-        return "datediff(s, '1970-01-01 00:00:00', $field)";
+      case 'sqlsrv':
+	return "DATEDIFF(second, '19700101', $field) + DATEDIFF(second, GETDATE(), GETUTCDATE())";
 
       default:
         return "UNIX_TIMESTAMP($field)";
@@ -519,6 +561,54 @@
       default:
         return $this->quote_identifier($column).' LIKE '.$this->quote($value);
       }
+    }
+
+
+  /**
+   * Encodes non-UTF-8 characters in string/array/object (recursive)
+   *
+   * @param  mixed  Data to fix
+   * @return mixed  Properly UTF-8 encoded data
+   * @access public
+   */
+  function encode($input)
+    {
+    if (is_object($input)) {
+      foreach (get_object_vars($input) as $idx => $value)
+        $input->$idx = $this->encode($value);
+      return $input;
+      }
+    else if (is_array($input)) {
+      foreach ($input as $idx => $value)
+        $input[$idx] = $this->encode($value);
+      return $input;	
+      }
+
+    return utf8_encode($input);
+    }
+
+
+  /**
+   * Decodes encoded UTF-8 string/object/array (recursive)
+   *
+   * @param  mixed  Input data
+   * @return mixed  Decoded data
+   * @access public
+   */
+  function decode($input)
+    {
+    if (is_object($input)) {
+      foreach (get_object_vars($input) as $idx => $value)
+        $input->$idx = $this->decode($value);
+      return $input;
+      }
+    else if (is_array($input)) {
+      foreach ($input as $idx => $value)
+        $input[$idx] = $this->decode($value);
+      return $input;	
+      }
+
+    return utf8_decode($input);
     }
 
 
@@ -619,8 +709,6 @@
   {
     $debug_output = $scope . '('.$db->db_index.'): ';
     $debug_output .= $message . $db->getOption('log_line_break');
-    write_log('sqllog', $debug_output);
+    write_log('sql', $debug_output);
   }
 }
-
-

--
Gitblit v1.9.1