From f45ec7e91895c9de8c9c244a174f34220de0d9ab Mon Sep 17 00:00:00 2001 From: svncommit Date: Thu, 20 Oct 2005 15:51:59 +0000 Subject: MDB2 integration --- program/include/main.inc | 2 + program/include/rcube_mdb2.inc | 250 +++++++++++++++++++++++++++++++++++++++++ 2 files changed, 252 insertions(+) create mode 100755 program/include/rcube_mdb2.inc (limited to 'program/include') diff --git a/program/include/main.inc b/program/include/main.inc index ae5899b43..8cad7778a 100644 --- a/program/include/main.inc +++ b/program/include/main.inc @@ -54,6 +54,8 @@ function rcmail_startup($task='mail') // prepare DB connection + require_once('include/rcube_'.(empty($CONFIG['db_backend']) ? 'db' : $CONFIG['db_backend']).'.inc'); + $DB = new rcube_db($CONFIG['db_dsnw'], $CONFIG['db_dsnr']); $DB->sqlite_initials = $INSTALL_PATH.'SQL/sqlite.initial.sql'; diff --git a/program/include/rcube_mdb2.inc b/program/include/rcube_mdb2.inc new file mode 100755 index 000000000..7473fa348 --- /dev/null +++ b/program/include/rcube_mdb2.inc @@ -0,0 +1,250 @@ + | + +-----------------------------------------------------------------------+ + + $Id$ + +*/ + +require_once('MDB2.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; + + $dsn_array = MDB2::parseDSN($db_dsnw); + $this->db_provider = $dsn_array['phptype']; + } + + // PHP 4 compatibility + function rcube_db($db_dsnw,$db_dsnr='') + { + $this->__construct($db_dsnw,$db_dsnr); + } + + // Connect to specific database + function dsn_connect($dsn) + { + // Use persistent connections if available + $dbh = MDB2::factory($dsn, array('persistent' => $true)); + + if (PEAR::isError($dbh)) + raise_error(array('code' => 500, + 'type' => 'db', + 'line' => __LINE__, + 'file' => __FILE__, + 'message' => $dbh->getMessage()), TRUE, FALSE); + + else if ($this->db_provider=='sqlite') + { + $dsn_array = MDB2::parseDSN($dsn); + if (!filesize($dsn_array['database']) && !empty($this->sqlite_initials)) + $this->_sqlite_create_database($dbh, $this->sqlite_initials); + } + + return $dbh; + } + + // Connect to appropiate databse + function db_connect ($mode) + { + $this->db_mode = $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; + } + + // 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); + + if ($this->db_provider == 'sqlite') + $query = $this->_sqlite_prepare_query($query); + + $result = $this->db_handle->query($query); + + if (PEAR::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) + { + $this->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) + { + 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->db_handle->affectedRows(); + } + + function insert_id($sequence = '') + { + if (!$this->db_handle || $this->db_mode=='r') + return FALSE; + + return $this->db_handle->lastInsertID(); + } + + + function fetch_assoc($res_id=NULL) + { + $result = $this->_get_result($res_id); + + if (PEAR::isError($result)) + { + raise_error( array('code' => 500, 'type' => 'db', 'line' => __LINE__, 'file' => __FILE__, + 'message' => $this->db_link->getMessage()), TRUE, FALSE); + return FALSE; + } + + return $result->fetchRow(MDB2_FETCHMODE_ASSOC); + } + + function _add_result($res, $query) + { + // sql error occured + if (PEAR::isError($res)) + { + 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 + { + $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; + } + + + // 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\(\)/', + '/`/'); + $replace = array("datetime('now')", + '"'); + $query = preg_replace($search, $replace, $query); + + return ($query); + } + +} + +?> \ No newline at end of file -- cgit v1.2.3