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