From 1676e1ebda38922b609c501b3c3c34b881302122 Mon Sep 17 00:00:00 2001 From: svncommit Date: Sun, 2 Oct 2005 11:36:35 +0000 Subject: Added PEAR:DB support plus database replication support --- program/include/main.inc | 17 +--- program/include/rcube_db.inc | 202 ++++++++++++++++++++++++++++++++++++++++ program/include/rcube_mysql.inc | 186 ------------------------------------ 3 files changed, 204 insertions(+), 201 deletions(-) create mode 100755 program/include/rcube_db.inc delete mode 100644 program/include/rcube_mysql.inc (limited to 'program/include') 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 @@ + | + +-----------------------------------------------------------------------+ + + $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 @@ - | - +-----------------------------------------------------------------------+ - - $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 -- cgit v1.2.3