summaryrefslogtreecommitdiff
path: root/program/include
diff options
context:
space:
mode:
authorsvncommit <devs@roundcube.net>2005-10-02 11:36:35 +0000
committersvncommit <devs@roundcube.net>2005-10-02 11:36:35 +0000
commit1676e1ebda38922b609c501b3c3c34b881302122 (patch)
treeaf115b449e30bac37d7cf0459ed95d88d32f1282 /program/include
parent968bdc7c90f718560b84eb3b7e8e1d02cf4270f3 (diff)
Added PEAR:DB support plus database replication support
Diffstat (limited to 'program/include')
-rw-r--r--program/include/main.inc17
-rwxr-xr-xprogram/include/rcube_db.inc202
-rw-r--r--program/include/rcube_mysql.inc186
3 files changed, 204 insertions, 201 deletions
diff --git a/program/include/main.inc b/program/include/main.inc
index 83421768a..ebf2f2685 100644
--- a/program/include/main.inc
+++ b/program/include/main.inc
@@ -54,23 +54,10 @@ function rcmail_startup($task='mail')
// prepare DB connection
- if (strtolower($CONFIG['db_type'])=='mysql')
- $DB = new rcube_mysql($CONFIG['db_name'], $CONFIG['db_user'], $CONFIG['db_pass'], $CONFIG['db_host']);
-
- // database not supported
- else
- {
- raise_error(array('code' => 500,
- 'type' => 'php',
- 'line' => __LINE__,
- 'file' => __FILE__,
- 'message' => "Database not supported"), TRUE, TRUE);
- return;
- }
-
+ $DB = new rcube_db($CONFIG['db_dsnw'], $CONFIG['db_dsnr']);
// we can use the database for storing session data
- if (is_object($DB) && $DB->connect())
+ if (is_object($DB))
include_once('include/session.inc');
diff --git a/program/include/rcube_db.inc b/program/include/rcube_db.inc
new file mode 100755
index 000000000..f4dc222a5
--- /dev/null
+++ b/program/include/rcube_db.inc
@@ -0,0 +1,202 @@
+<?php
+
+/*
+ +-----------------------------------------------------------------------+
+ | program/include/rcube_db.inc |
+ | |
+ | This file is part of the RoundCube Webmail client |
+ | Copyright (C) 2005, RoundCube Dev. - Switzerland |
+ | Licensed under the GNU GPL |
+ | |
+ | PURPOSE: |
+ | PEAR:DB wrapper class that implements PEAR DB functions |
+ | See http://pear.php.net/package/DB |
+ | |
+ +-----------------------------------------------------------------------+
+ | Author: Thomas Bruederli <roundcube@gmail.com> |
+ +-----------------------------------------------------------------------+
+
+ $Id$
+
+*/
+
+require_once('DB.php');
+
+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 $a_query_results = array('dummy');
+ var $last_res_id = 0;
+
+ // PHP 5 constructor
+ function __construct($db_dsnw,$db_dsnr='')
+ {
+ if ($db_dsnr=='') $db_dsnr=$db_dsnw;
+
+ $this->db_dsnw = $db_dsnw;
+ $this->db_dsnr = $db_dsnr;
+ }
+
+ // PHP 4 compatibility
+ function rcube_db($db_dsnw,$db_dsnr='')
+ {
+ $this->__construct($db_dsnw,$db_dsnr);
+ }
+
+ // Connect to specific database
+ function dsn_connect($dsn)
+ {
+ $dbh = DB::connect($dsn);
+
+ 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)
+ {
+ if ($this->db_connected && $this->db_mode=='w') return;
+
+ if ($this->db_connected && $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);
+
+ 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);
+ }
+
+ function db_execute ($query)
+ {
+ db_connect('w');
+
+ $result = $this->db_handle->query($query);
+
+ }
+
+ function num_rows($res_id=NULL)
+ {
+ if (!$this->db_handle)
+ return FALSE;
+
+ $result = $this->_get_result($res_id);
+
+ if ($result)
+ return $result->numRows();
+ else
+ return FALSE;
+ }
+
+ function affected_rows($res_id=NULL)
+ {
+ if (!$this->db_handle)
+ return FALSE;
+
+ return $this->last_res_id->affectedRows();
+ }
+
+ function insert_id($sequence = '')
+ {
+ if (!$this->db_link || $this->db_mode=='r')
+ return FALSE;
+
+ switch($this->db_provider)
+ {
+ case 'pgsql':
+ // PostgreSQL uses sequences
+ $result =& $this->db_handle->getOne("SELECT CURRVAL('$sequence')");
+ 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);
+
+ default:
+ die("portability issue with this database, please have the developer fix");
+ }
+ }
+
+
+ function fetch_assoc($res_id=NULL)
+ {
+ $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);
+
+ return $result->fetchRow(DB_FETCHMODE_ASSOC);
+ }
+
+ 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);
+ return FALSE;
+ }
+ else
+ {
+ $res_id = sizeof($this->a_query_results);
+ $this->a_query_results[$res_id] = $res;
+ $this->last_res_id = $res_id;
+ return $res_id;
+ }
+ }
+
+
+ function _get_result($res_id)
+ {
+ if ($res_id==NULL)
+ $res_id = $this->last_res_id;
+
+ if ($res_id && isset($this->a_query_results[$res_id]))
+ return $this->a_query_results[$res_id];
+ else
+ return FALSE;
+ }
+
+}
+
+?> \ No newline at end of file
diff --git a/program/include/rcube_mysql.inc b/program/include/rcube_mysql.inc
deleted file mode 100644
index c5955489a..000000000
--- a/program/include/rcube_mysql.inc
+++ /dev/null
@@ -1,186 +0,0 @@
-<?php
-
-/*
- +-----------------------------------------------------------------------+
- | program/include/rcube_mysql.inc |
- | |
- | This file is part of the RoundCube Webmail client |
- | Copyright (C) 2005, RoundCube Dev. - Switzerland |
- | Licensed under the GNU GPL |
- | |
- | PURPOSE: |
- | MySQL wrapper class that implements PHP MySQL functions |
- | See http://www.php.net/manual/en/ref.mysql.php |
- | |
- +-----------------------------------------------------------------------+
- | Author: Thomas Bruederli <roundcube@gmail.com> |
- +-----------------------------------------------------------------------+
-
- $Id$
-
-*/
-
-
-class rcube_mysql
- {
- var $db_link;
- var $db_host = 'localhost';
- var $db_name = '';
- var $db_user = '';
- var $db_pass = '';
- var $a_query_results = array('dummy');
- var $last_res_id = 0;
-
-
- // PHP 5 constructor
- function __construct($db_name='', $user='', $pass='', $host='localhost')
- {
- $this->db_host = $host;
- $this->db_name = $db_name;
- $this->db_user = $user;
- $this->db_pass = $pass;
- }
-
- // PHP 4 compatibility
- function rcube_mysql($db_name='', $user='', $pass='', $host='localhost')
- {
- $this->__construct($db_name, $user, $pass, $host);
- }
-
-
- function connect()
- {
- $this->db_link = mysql_connect($this->db_host, $this->db_user, $this->db_pass);
-
- if (!$this->db_link)
- {
- raise_error(array('code' => 500,
- 'type' => 'mysql',
- 'line' => __LINE__,
- 'file' => __FILE__,
- 'message' => "Can't connect to database"), TRUE, FALSE);
- return FALSE;
- }
-
- return TRUE;
- }
-
-
- function select_db($name)
- {
- $this->db_name = $name;
-
- if ($this->db_link)
- mysql_select_db($name, $this->db_link);
- }
-
-
- function query($query)
- {
- // establish a connection
- if (!$this->db_link)
- {
- if (!$this->connect())
- return FALSE;
- }
-
- $sql_result = mysql_db_query($this->db_name, $query, $this->db_link);
- return $this->_add_result($sql_result, $query);
- }
-
-
- function num_rows($res_id=NULL)
- {
- if (!$this->db_link)
- return FALSE;
-
- $sql_result = $this->_get_result($res_id);
-
- if ($sql_result)
- return mysql_num_rows($sql_result);
- else
- return FALSE;
- }
-
-
- function affected_rows()
- {
- if (!$this->db_link)
- return FALSE;
-
- return mysql_affected_rows($this->db_link);
- }
-
-
- function insert_id()
- {
- if (!$this->db_link)
- return FALSE;
-
- return mysql_insert_id($this->db_link);
- }
-
-
- function fetch_assoc($res_id=NULL)
- {
- $sql_result = $this->_get_result($res_id);
-
- if ($sql_result)
- return mysql_fetch_assoc($sql_result);
- else
- return FALSE;
- }
-
-
- function seek($res_id=NULL, $row=0)
- {
- $sql_result = $this->_get_result($res_id);
-
- if ($sql_result)
- return mysql_data_seek($sql_result, $row);
- else
- return FALSE;
- }
-
-
-
- function _add_result($res, $query)
- {
- // sql error occured
- if ($res===FALSE)
- {
- $sql_error = mysql_error($this->db_link);
- raise_error(array('code' => 500,
- 'type' => 'mysql',
- 'line' => __LINE__,
- 'file' => __FILE__,
- 'message' => $sql_error."; QUERY: ".preg_replace('/[\r\n]+\s*/', ' ', $query)), TRUE, FALSE);
-
- return FALSE;
- }
- else
- {
- $res_id = sizeof($this->a_query_results);
- $this->a_query_results[$res_id] = $res;
- $this->last_res_id = $res_id;
-
- return $res_id;
- }
- }
-
-
- function _get_result($res_id)
- {
- if ($res_id===NULL)
- $res_id = $this->last_res_id;
-
- if ($res_id && isset($this->a_query_results[$res_id]))
- return $this->a_query_results[$res_id];
- else
- return FALSE;
- }
-
- }
-
-
-?> \ No newline at end of file