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 | 269 +++++++++++++++++++++++++++++++++++++---------------- 1 files changed, 188 insertions(+), 81 deletions(-) diff --git a/program/include/rcube_db.inc b/program/include/rcube_db.inc index 96f120f..f13ab55 100755 --- a/program/include/rcube_db.inc +++ b/program/include/rcube_db.inc @@ -13,7 +13,7 @@ | See http://pear.php.net/package/DB | | | +-----------------------------------------------------------------------+ - | Author: Thomas Bruederli <roundcube@gmail.com> | + | Author: David Saez Padros <david@ols.es> | +-----------------------------------------------------------------------+ $Id$ @@ -24,11 +24,11 @@ class rcube_db { - var $db_dsnw; // DSN for write operations - var $db_dsnr; // DSN for read operations - var $db_connected=false; // Already connected ? - var $db_mode=''; // Connection mode - var $db_handle=0; // Connection handle + var $db_dsnw; // DSN for write operations + var $db_dsnr; // DSN for read operations + var $db_connected=false; // Already connected ? + var $db_mode=''; // Connection mode + var $db_handle=0; // Connection handle var $a_query_results = array('dummy'); var $last_res_id = 0; @@ -36,10 +36,13 @@ // PHP 5 constructor function __construct($db_dsnw,$db_dsnr='') { - if ($db_dsnr=='') $db_dsnr=$db_dsnw; - + if ($db_dsnr=='') $db_dsnr=$db_dsnw; + $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 @@ -48,83 +51,110 @@ $this->__construct($db_dsnw,$db_dsnr); } - // Connect to specific database - function dsn_connect($dsn) - { - // Use persistent connections if available - - $dbh = DB::connect($dsn, array('persistent' => $true)); - - if (DB::isError($dbh)) - raise_error(array('code' => 500, + // Connect to specific database + function dsn_connect($dsn) + { + // 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); - return $dbh; - } - // Connect to appropiate databse - function db_connect ($mode) - { - // Already connected - - if ($this->db_connected) - { - // no replication, current connection is ok - if ($this->db_dsnw==$this->db_dsnr) return; - - // connected to master, current connection is ok - if ($this->db_mode=='w') return; - - // Same mode, current connection is ok - if ($this->db_mode==$mode) return; - } - - if ($mode=='r') - $dsn=$this->db_dsnr; - else - $dsn=$this->db_dsnw; - - $this->db_handle = $this->dsn_connect($dsn); - $this->db_connected = true; - $this->db_mode = $mode; - } - - // Query database (read operations) - - function query($query) - { - // Read or write ? - - if (strtolower(trim(substr($query,0,6)))=='select') - $mode='r'; - else - { - $mode='w'; - } - - $this->db_connect($mode); - - $result = $this->db_handle->query($query); + else if ($this->db_provider=='sqlite') + { + $dsn_array = DB::parseDSN($dsn); + if (!filesize($dsn_array['database']) && !empty($this->sqlite_initials)) + $this->_sqlite_create_database($dbh, $this->sqlite_initials); + } - if (DB::isError($result)) - raise_error( array('code' => 500, 'type' => 'db', 'line' => __LINE__, - 'file' => __FILE__, - 'message' => $result->getMessage()), TRUE, FALSE); - - return $this->_add_result($result, $query); + return $dbh; } - function db_execute ($query) - { - db_connect('w'); + // Connect to appropiate databse + function db_connect ($mode) + { + $this->db_mode = $mode; - $result = $this->db_handle->query($query); + // Already connected + if ($this->db_connected) + { + // no replication, current connection is ok + if ($this->db_dsnw==$this->db_dsnr) return; + + // connected to master, current connection is ok + if ($this->db_mode=='w') return; - } - - function num_rows($res_id=NULL) + // Same mode, current connection is ok + if ($this->db_mode==$mode) return; + } + + if ($mode=='r') + $dsn=$this->db_dsnr; + else + $dsn=$this->db_dsnw; + + $this->db_handle = $this->dsn_connect($dsn); + $this->db_connected = true; + } + + // Query database + + 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') + $mode='r'; + else + $mode='w'; + + $this->db_connect($mode); + + if ($this->db_provider == 'sqlite') + $query = $this->_sqlite_prepare_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', + 'line' => __LINE__, + 'file' => __FILE__, + 'message' => $result->getMessage().'; QUERY: '.$query), TRUE, FALSE); + return false; + } + + return $this->_add_result($result, $query); + } + + function num_rows($res_id=NULL) { if (!$this->db_handle) return FALSE; @@ -147,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) @@ -155,14 +185,21 @@ 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); + default: die("portability issue with this database, please have the developer fix"); } @@ -174,18 +211,57 @@ $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 if (DB::isError($res)) { - raise_error(array('code' => 500, 'type' => 'db', 'line' => __LINE__, 'file' => __FILE__, 'message' => $res->getMessage() . " Query: " . preg_replace('/[\r\n]+\s*/', ' ', $query)), TRUE, FALSE); + raise_error(array('code' => 500, 'type' => 'db', 'line' => __LINE__, 'file' => __FILE__, 'message' => $res->getMessage() . " Query: " . substr(preg_replace('/[\r\n]+\s*/', ' ', $query), 0, 1024)), TRUE, FALSE); return FALSE; } else @@ -209,6 +285,37 @@ return FALSE; } + + // create a sqlite database from a file + function _sqlite_create_database($dbh, $fileName) + { + if (empty($fileName) || !is_string($fileName)) + return ; + + $data = ''; + if ($fd = fopen($fileName, 'r')) + { + $data = fread($fd, filesize($fileName)); + fclose($fd); + } + + if (strlen($data)) + sqlite_exec($dbh->connection, $data); + } + + // transform a query so that it is sqlite2 compliant + function _sqlite_prepare_query($query) + { + if (!is_string($query)) + return ($query); + + $search = array('/NOW\(\)/i', '/`/'); + $replace = array("datetime('now')", '"'); + $query = preg_replace($search, $replace, $query); + + return ($query); + } + } ?> \ No newline at end of file -- Gitblit v1.9.1