From e1ac217397bfc23a5c059aaa12bba8c1fc018cbb Mon Sep 17 00:00:00 2001 From: alecpl <alec@alec.pl> Date: Wed, 03 Feb 2010 06:16:18 -0500 Subject: [PATCH] - Fix inconsistency when not using default table names (#1486467) --- program/include/rcube_mdb2.php | 87 +++++++++++++++++++++++++++++++++++++------ 1 files changed, 74 insertions(+), 13 deletions(-) diff --git a/program/include/rcube_mdb2.php b/program/include/rcube_mdb2.php index 2665501..aca44c9 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; @@ -256,18 +256,19 @@ $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; $this->db_error_msg = $q->userinfo; - raise_error(array('code' => 500, 'type' => 'db', 'line' => __LINE__, 'file' => __FILE__, - 'message' => $this->db_error_msg), TRUE, TRUE); + raise_error(array('code' => 500, 'type' => 'db', + 'line' => __LINE__, 'file' => __FILE__, + 'message' => $this->db_error_msg), TRUE, TRUE); } else { @@ -321,16 +322,27 @@ * 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); + if ($table) { + if ($this->db_provider == 'pgsql') + // find sequence name + $table = get_sequence_name($table); + else + // resolve table name + $table = get_table_name($table); + } + + $id = $this->db_handle->lastInsertID($table); + + return $this->db_handle->isError($id) ? null : $id; } @@ -461,6 +473,7 @@ switch($this->db_provider) { case 'mssql': + case 'sqlsrv': return "getdate()"; default: @@ -505,7 +518,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)"; @@ -557,6 +571,54 @@ /** + * 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); + } + + + /** * Adds a query result and returns a handle ID * * @param object Query handle @@ -570,7 +632,8 @@ { $this->db_error = TRUE; $this->db_error_msg = $res->getMessage(); - raise_error(array('code' => 500, 'type' => 'db', 'line' => __LINE__, 'file' => __FILE__, + raise_error(array('code' => 500, 'type' => 'db', + 'line' => __LINE__, 'file' => __FILE__, 'message' => $res->getMessage() . " Query: " . substr(preg_replace('/[\r\n]+\s*/', ' ', $res->userinfo), 0, 512)), TRUE, FALSE); @@ -653,8 +716,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