From 583f1c8d80c42195d0ee41f30a885e13d777b79f Mon Sep 17 00:00:00 2001 From: thomascube <thomas@roundcube.net> Date: Tue, 08 Nov 2005 15:18:56 -0500 Subject: [PATCH] Added reply-to-all function (submitted by Julien Brette) --- program/include/rcube_db.inc | 144 +++++++++++++++++++++++++++++++++-------------- 1 files changed, 101 insertions(+), 43 deletions(-) diff --git a/program/include/rcube_db.inc b/program/include/rcube_db.inc index 9c76cb3..f13ab55 100755 --- a/program/include/rcube_db.inc +++ b/program/include/rcube_db.inc @@ -40,6 +40,9 @@ $this->db_dsnw = $db_dsnw; $this->db_dsnr = $db_dsnr; + + $dsn_array = DB::parseDSN($db_dsnw); + $this->db_provider = $dsn_array['phptype']; } // PHP 4 compatibility @@ -51,22 +54,21 @@ // Connect to specific database function dsn_connect($dsn) { - $dsn_array = DB::parseDSN($dsn); - $this->db_provider = $dsn_array['phptype']; - // Use persistent connections if available $dbh = DB::connect($dsn, array('persistent' => $true)); - + if (DB::isError($dbh)) raise_error(array('code' => 500, 'type' => 'db', 'line' => __LINE__, 'file' => __FILE__, 'message' => $dbh->getMessage()), TRUE, FALSE); + else if ($this->db_provider=='sqlite') { - if (!is_file($dsn_array['database']) || !filesize($dsn_array['database'])) - $this->_sqlite_create_database($dbh, 'SQL/sqlite.initial.sql'); + $dsn_array = DB::parseDSN($dsn); + if (!filesize($dsn_array['database']) && !empty($this->sqlite_initials)) + $this->_sqlite_create_database($dbh, $this->sqlite_initials); } return $dbh; @@ -75,8 +77,9 @@ // Connect to appropiate databse function db_connect ($mode) { + $this->db_mode = $mode; + // Already connected - if ($this->db_connected) { // no replication, current connection is ok @@ -96,12 +99,29 @@ $this->db_handle = $this->dsn_connect($dsn); $this->db_connected = true; - $this->db_mode = $mode; } - // Query database (read operations) + // Query database - function query($query) + function query() + { + $params = func_get_args(); + $query = array_shift($params); + + return $this->_query($query, 0, 0, $params); + } + + function limitquery() + { + $params = func_get_args(); + $query = array_shift($params); + $offset = array_shift($params); + $numrows = array_shift($params); + + return $this->_query($query, $offset, $numrows, $params); + } + + function _query($query, $offset, $numrows, $params) { // Read or write ? if (strtolower(trim(substr($query,0,6)))=='select') @@ -113,27 +133,25 @@ if ($this->db_provider == 'sqlite') $query = $this->_sqlite_prepare_query($query); - - $result = $this->db_handle->query($query); + if ($numrows || $offset) + { + $result = $this->db_handle->limitQuery($query,$offset,$numrows,$params); + } + else + $result = $this->db_handle->query($query, $params); + if (DB::isError($result)) - raise_error(array('code' => 500, 'type' => 'db', + { + raise_error(array('code' => 500, + 'type' => 'db', 'line' => __LINE__, 'file' => __FILE__, - 'message' => $result->getMessage()), TRUE, FALSE); - + 'message' => $result->getMessage().'; QUERY: '.$query), TRUE, FALSE); + return false; + } + return $this->_add_result($result, $query); - } - - function db_execute ($query) - { - db_connect('w'); - - if ($this->db_provider == 'sqlite') - $query = $this->_sqlite_prepare_query($query); - - $result = $this->db_handle->query($query); - } function num_rows($res_id=NULL) @@ -159,7 +177,7 @@ function insert_id($sequence = '') { - if (!$this->db_link || $this->db_mode=='r') + if (!$this->db_handle || $this->db_mode=='r') return FALSE; switch($this->db_provider) @@ -167,14 +185,18 @@ case 'pgsql': // PostgreSQL uses sequences $result =& $this->db_handle->getOne("SELECT CURRVAL('$sequence')"); - if (DB::isError($result)) + if (DB::isError($result)) { raise_error( array('code' => 500, 'type' => 'db', 'line' => __LINE__, 'file' => __FILE__, 'message' => $result->getMessage()), TRUE, TRUE); + } return $result; case 'mysql': // This is unfortuneate - return mysql_insert_id($this->db_handle); + return mysql_insert_id($this->db_handle->connection); + case 'mysqli': + return mysqli_insert_id($this->db_handle->connection); + case 'sqlite': return sqlite_last_insert_rowid($this->db_handle->connection); @@ -189,12 +211,51 @@ $result = $this->_get_result($res_id); if (DB::isError($result)) + { raise_error( array('code' => 500, 'type' => 'db', 'line' => __LINE__, 'file' => __FILE__, - 'message' => $this->db_link->getMessage()), TRUE, TRUE); + 'message' => $this->db_link->getMessage()), TRUE, FALSE); + return FALSE; + } return $result->fetchRow(DB_FETCHMODE_ASSOC); } + + function quote($input, $type=null) + { + if (!$this->db_handle) + $this->db_connect('r'); + + return $this->db_handle->quote($input); + } + + + function quoteIdentifier($str) + { + if (!$this->db_handle) + $this->db_connect('r'); + + return $this->db_handle->quoteIdentifier($str); + } + + function quote_identifier($str) + { + return $this->quoteIdentifier($str); + } + + + function unixtimestamp($field) + { + switch($this->db_provider) + { + case 'pgsql': + return "EXTRACT (EPOCH FROM $field)"; + break; + default: + return "UNIX_TIMESTAMP($field)"; + } + } + function _add_result($res, $query) { // sql error occured @@ -231,16 +292,15 @@ if (empty($fileName) || !is_string($fileName)) return ; - $fd = fopen($fileName, 'r'); - if (!$fd) - return ; - $data = ''; - while ($line = fgets($fd, 4096)) - $data .= $line; + if ($fd = fopen($fileName, 'r')) + { + $data = fread($fd, filesize($fileName)); + fclose($fd); + } - fclose($fd); - sqlite_exec($dbh->connection, $data); + if (strlen($data)) + sqlite_exec($dbh->connection, $data); } // transform a query so that it is sqlite2 compliant @@ -248,11 +308,9 @@ { if (!is_string($query)) return ($query); - - $search = array('/NOW\(\)/', - '/`/'); - $replace = array("datetime('now')", - '"'); + + $search = array('/NOW\(\)/i', '/`/'); + $replace = array("datetime('now')", '"'); $query = preg_replace($search, $replace, $query); return ($query); -- Gitblit v1.9.1