From aa12df20e46ae72467f8d4dc01784a500eb83f0c Mon Sep 17 00:00:00 2001
From: thomascube <thomas@roundcube.net>
Date: Thu, 01 Apr 2010 02:39:06 -0400
Subject: [PATCH] Add server-side plugin hooks to address group functions + better action names
---
program/include/rcube_mdb2.php | 53 ++++++++++++++++++++++++++++++++++++++++++++---------
1 files changed, 44 insertions(+), 9 deletions(-)
diff --git a/program/include/rcube_mdb2.php b/program/include/rcube_mdb2.php
index 12f3c16..876659c 100644
--- a/program/include/rcube_mdb2.php
+++ b/program/include/rcube_mdb2.php
@@ -46,6 +46,8 @@
var $a_query_results = array('dummy');
var $last_res_id = 0;
+
+ private $tables;
/**
@@ -106,7 +108,7 @@
if (!filesize($dsn_array['database']) && !empty($this->sqlite_initials))
$this->_sqlite_create_database($dbh, $this->sqlite_initials);
}
- else if ($this->db_provider!='mssql')
+ else if ($this->db_provider!='mssql' && $this->db_provider!='sqlsrv')
$dbh->setCharset('utf8');
return $dbh;
@@ -256,18 +258,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 +324,25 @@
* 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;
- $id = $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;
}
@@ -381,6 +393,26 @@
return $result->fetchRow($mode);
}
+
+
+ /**
+ * Wrapper for the SHOW TABLES command
+ *
+ * @return array List of all tables of the current database
+ */
+ function list_tables()
+ {
+ // get tables if not cached
+ if (!$this->tables) {
+ $this->db_handle->loadModule('Manager');
+ if (!PEAR::isError($result = $this->db_handle->listTables()))
+ $this->tables = $result;
+ else
+ $this->tables = array();
+ }
+
+ return $this->tables;
+ }
/**
@@ -463,6 +495,7 @@
switch($this->db_provider)
{
case 'mssql':
+ case 'sqlsrv':
return "getdate()";
default:
@@ -507,6 +540,7 @@
break;
case 'mssql':
+ case 'sqlsrv':
return "DATEDIFF(second, '19700101', $field) + DATEDIFF(second, GETDATE(), GETUTCDATE())";
default:
@@ -620,7 +654,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);
--
Gitblit v1.9.1