- code re-formatting + small improvements

release-0.6
alecpl 15 years ago
parent 3978cbf4cd
commit a004bb8cbe

@ -226,7 +226,7 @@ class rcube_contacts extends rcube_addressbook
foreach ($fields as $col) { foreach ($fields as $col) {
if ($col == 'ID' || $col == $this->primary_key) { if ($col == 'ID' || $col == $this->primary_key) {
$ids = !is_array($value) ? explode(',', $value) : $value; $ids = !is_array($value) ? explode(',', $value) : $value;
$ids = join(',', array_map(array($this->db, 'quote'), $ids)); $ids = $this->db->array2list($ids, 'integer');
$add_where[] = 'c.' . $this->primary_key.' IN ('.$ids.')'; $add_where[] = 'c.' . $this->primary_key.' IN ('.$ids.')';
} }
else if ($strict) else if ($strict)
@ -437,7 +437,7 @@ class rcube_contacts extends rcube_addressbook
if (!is_array($ids)) if (!is_array($ids))
$ids = explode(',', $ids); $ids = explode(',', $ids);
$ids = join(',', array_map(array($this->db, 'quote'), $ids)); $ids = $this->db->array2list($ids, 'integer');
// flag record as deleted // flag record as deleted
$this->db->query( $this->db->query(
@ -589,7 +589,7 @@ class rcube_contacts extends rcube_addressbook
if (!is_array($ids)) if (!is_array($ids))
$ids = explode(',', $ids); $ids = explode(',', $ids);
$ids = join(',', array_map(array($this->db, 'quote'), $ids)); $ids = $this->db->array2list($ids, 'integer');
$sql_result = $this->db->query( $sql_result = $this->db->query(
"DELETE FROM ".get_table_name('contactgroupmembers'). "DELETE FROM ".get_table_name('contactgroupmembers').

@ -42,11 +42,10 @@ class rcube_mdb2
var $db_handle = 0; // Connection handle var $db_handle = 0; // Connection handle
var $db_error = false; var $db_error = false;
var $db_error_msg = ''; var $db_error_msg = '';
var $debug_mode = false;
var $a_query_results = array('dummy');
var $last_res_id = 0;
private $debug_mode = false;
private $a_query_results = array('dummy');
private $last_res_id = 0;
private $tables; private $tables;
@ -77,7 +76,7 @@ class rcube_mdb2
* @return object PEAR database handle * @return object PEAR database handle
* @access private * @access private
*/ */
function dsn_connect($dsn) private function dsn_connect($dsn)
{ {
// Use persistent connections if available // Use persistent connections if available
$db_options = array( $db_options = array(
@ -85,7 +84,7 @@ class rcube_mdb2
'emulate_prepared' => $this->debug_mode, 'emulate_prepared' => $this->debug_mode,
'debug' => $this->debug_mode, 'debug' => $this->debug_mode,
'debug_handler' => 'mdb2_debug_handler', 'debug_handler' => 'mdb2_debug_handler',
'portability' => MDB2_PORTABILITY_ALL ^ MDB2_PORTABILITY_EMPTY_TO_NULL); 'portability' => MDB2_PORTABILITY_ALL ^ MDB2_PORTABILITY_EMPTY_TO_null);
if ($this->db_provider == 'pgsql') { if ($this->db_provider == 'pgsql') {
$db_options['disable_smart_seqname'] = true; $db_options['disable_smart_seqname'] = true;
@ -94,16 +93,15 @@ class rcube_mdb2
$dbh = MDB2::connect($dsn, $db_options); $dbh = MDB2::connect($dsn, $db_options);
if (MDB2::isError($dbh)) if (MDB2::isError($dbh)) {
{ $this->db_error = true;
$this->db_error = TRUE;
$this->db_error_msg = $dbh->getMessage(); $this->db_error_msg = $dbh->getMessage();
raise_error(array('code' => 500, 'type' => 'db', 'line' => __LINE__, raise_error(array('code' => 500, 'type' => 'db',
'file' => __FILE__, 'message' => $dbh->getUserInfo()), TRUE, FALSE); 'line' => __LINE__, 'file' => __FILE__,
'message' => $dbh->getUserInfo()), true, false);
} }
else if ($this->db_provider=='sqlite') else if ($this->db_provider == 'sqlite') {
{
$dsn_array = MDB2::parseDSN($dsn); $dsn_array = MDB2::parseDSN($dsn);
if (!filesize($dsn_array['database']) && !empty($this->sqlite_initials)) if (!filesize($dsn_array['database']) && !empty($this->sqlite_initials))
$this->_sqlite_create_database($dbh, $this->sqlite_initials); $this->_sqlite_create_database($dbh, $this->sqlite_initials);
@ -116,8 +114,7 @@ class rcube_mdb2
/** /**
* Connect to appropiate databse * Connect to appropiate database depending on the operation
* depending on the operation
* *
* @param string Connection mode (r|w) * @param string Connection mode (r|w)
* @access public * @access public
@ -127,8 +124,7 @@ class rcube_mdb2
$this->db_mode = $mode; $this->db_mode = $mode;
// Already connected // Already connected
if ($this->db_connected) if ($this->db_connected) {
{
// no replication, current connection is ok // no replication, current connection is ok
if ($this->db_dsnw == $this->db_dsnr) if ($this->db_dsnw == $this->db_dsnr)
return; return;
@ -142,10 +138,7 @@ class rcube_mdb2
return; return;
} }
if ($mode=='r') $dsn = ($mode == 'r') ? $this->db_dsnr : $this->db_dsnw;
$dsn = $this->db_dsnr;
else
$dsn = $this->db_dsnw;
$this->db_handle = $this->dsn_connect($dsn); $this->db_handle = $this->dsn_connect($dsn);
$this->db_connected = true; $this->db_connected = true;
@ -156,12 +149,12 @@ class rcube_mdb2
* Activate/deactivate debug mode * Activate/deactivate debug mode
* *
* @param boolean True if SQL queries should be logged * @param boolean True if SQL queries should be logged
* @access public
*/ */
function set_debug($dbg = true) function set_debug($dbg = true)
{ {
$this->debug_mode = $dbg; $this->debug_mode = $dbg;
if ($this->db_connected) if ($this->db_connected) {
{
$this->db_handle->setOption('debug', $dbg); $this->db_handle->setOption('debug', $dbg);
$this->db_handle->setOption('emulate_prepared', $dbg); $this->db_handle->setOption('emulate_prepared', $dbg);
} }
@ -172,10 +165,11 @@ class rcube_mdb2
* Getter for error state * Getter for error state
* *
* @param boolean True on error * @param boolean True on error
* @access public
*/ */
function is_error() function is_error()
{ {
return $this->db_error ? $this->db_error_msg : FALSE; return $this->db_error ? $this->db_error_msg : false;
} }
@ -183,10 +177,11 @@ class rcube_mdb2
* Connection state checker * Connection state checker
* *
* @param boolean True if in connected state * @param boolean True if in connected state
* @access public
*/ */
function is_connected() function is_connected()
{ {
return PEAR::isError($this->db_handle) ? false : true; return PEAR::isError($this->db_handle) ? false : $this->db_connected;
} }
@ -201,7 +196,7 @@ class rcube_mdb2
function query() function query()
{ {
if (!$this->is_connected()) if (!$this->is_connected())
return NULL; return null;
$params = func_get_args(); $params = func_get_args();
$query = array_shift($params); $query = array_shift($params);
@ -241,13 +236,10 @@ class rcube_mdb2
* @return number Query handle identifier * @return number Query handle identifier
* @access private * @access private
*/ */
function _query($query, $offset, $numrows, $params) private function _query($query, $offset, $numrows, $params)
{ {
// Read or write ? // Read or write ?
if (strtolower(substr(trim($query),0,6))=='select') $mode = (strtolower(substr(trim($query),0,6)) == 'select') ? 'r' : 'w';
$mode='r';
else
$mode='w';
$this->db_connect($mode); $this->db_connect($mode);
@ -259,21 +251,18 @@ class rcube_mdb2
if (empty($params)) if (empty($params))
$result = $mode == 'r' ? $this->db_handle->query($query) : $this->db_handle->exec($query); $result = $mode == 'r' ? $this->db_handle->query($query) : $this->db_handle->exec($query);
else else {
{
$params = (array)$params; $params = (array)$params;
$q = $this->db_handle->prepare($query, null, $mode=='w' ? MDB2_PREPARE_MANIP : null); $q = $this->db_handle->prepare($query, null, $mode=='w' ? MDB2_PREPARE_MANIP : null);
if ($this->db_handle->isError($q)) if ($this->db_handle->isError($q)) {
{ $this->db_error = true;
$this->db_error = TRUE;
$this->db_error_msg = $q->userinfo; $this->db_error_msg = $q->userinfo;
raise_error(array('code' => 500, 'type' => 'db', raise_error(array('code' => 500, 'type' => 'db',
'line' => __LINE__, 'file' => __FILE__, 'line' => __LINE__, 'file' => __FILE__,
'message' => $this->db_error_msg), TRUE, TRUE); 'message' => $this->db_error_msg), true, true);
} }
else else {
{
$result = $q->execute($params); $result = $q->execute($params);
$q->free(); $q->free();
} }
@ -289,18 +278,18 @@ class rcube_mdb2
* If no query handle is specified, the last query will be taken as reference * If no query handle is specified, the last query will be taken as reference
* *
* @param number Optional query handle identifier * @param number Optional query handle identifier
* @return mixed Number of rows or FALSE on failure * @return mixed Number of rows or false on failure
* @access public * @access public
*/ */
function num_rows($res_id=NULL) function num_rows($res_id=null)
{ {
if (!$this->db_handle) if (!$this->db_handle)
return FALSE; return false;
if ($result = $this->_get_result($res_id)) if ($result = $this->_get_result($res_id))
return $result->numRows(); return $result->numRows();
else else
return FALSE; return false;
} }
@ -308,13 +297,13 @@ class rcube_mdb2
* Get number of affected rows for the last query * Get number of affected rows for the last query
* *
* @param number Optional query handle identifier * @param number Optional query handle identifier
* @return mixed Number of rows or FALSE on failure * @return mixed Number of rows or false on failure
* @access public * @access public
*/ */
function affected_rows($res_id = null) function affected_rows($res_id = null)
{ {
if (!$this->db_handle) if (!$this->db_handle)
return FALSE; return false;
return (int) $this->_get_result($res_id); return (int) $this->_get_result($res_id);
} }
@ -325,13 +314,13 @@ class rcube_mdb2
* For Postgres databases, a sequence name is required * For Postgres databases, a sequence name is required
* *
* @param string Table name (to find the incremented sequence) * @param string Table name (to find the incremented sequence)
* @return mixed ID or FALSE on failure * @return mixed ID or false on failure
* @access public * @access public
*/ */
function insert_id($table = '') function insert_id($table = '')
{ {
if (!$this->db_handle || $this->db_mode == 'r') if (!$this->db_handle || $this->db_mode == 'r')
return FALSE; return false;
if ($table) { if ($table) {
if ($this->db_provider == 'pgsql') if ($this->db_provider == 'pgsql')
@ -353,10 +342,10 @@ class rcube_mdb2
* If no query handle is specified, the last query will be taken as reference * If no query handle is specified, the last query will be taken as reference
* *
* @param number Optional query handle identifier * @param number Optional query handle identifier
* @return mixed Array with col values or FALSE on failure * @return mixed Array with col values or false on failure
* @access public * @access public
*/ */
function fetch_assoc($res_id=NULL) function fetch_assoc($res_id=null)
{ {
$result = $this->_get_result($res_id); $result = $this->_get_result($res_id);
return $this->_fetch_row($result, MDB2_FETCHMODE_ASSOC); return $this->_fetch_row($result, MDB2_FETCHMODE_ASSOC);
@ -368,10 +357,10 @@ class rcube_mdb2
* If no query handle is specified, the last query will be taken as reference * If no query handle is specified, the last query will be taken as reference
* *
* @param number Optional query handle identifier * @param number Optional query handle identifier
* @return mixed Array with col values or FALSE on failure * @return mixed Array with col values or false on failure
* @access public * @access public
*/ */
function fetch_array($res_id=NULL) function fetch_array($res_id=null)
{ {
$result = $this->_get_result($res_id); $result = $this->_get_result($res_id);
return $this->_fetch_row($result, MDB2_FETCHMODE_ORDERED); return $this->_fetch_row($result, MDB2_FETCHMODE_ORDERED);
@ -383,13 +372,13 @@ class rcube_mdb2
* *
* @param object Query result handle * @param object Query result handle
* @param number Fetch mode identifier * @param number Fetch mode identifier
* @return mixed Array with col values or FALSE on failure * @return mixed Array with col values or false on failure
* @access private * @access private
*/ */
function _fetch_row($result, $mode) private function _fetch_row($result, $mode)
{ {
if ($result === FALSE || PEAR::isError($result) || !$this->is_connected()) if ($result === false || PEAR::isError($result) || !$this->is_connected())
return FALSE; return false;
return $result->fetchRow($mode); return $result->fetchRow($mode);
} }
@ -399,6 +388,8 @@ class rcube_mdb2
* Wrapper for the SHOW TABLES command * Wrapper for the SHOW TABLES command
* *
* @return array List of all tables of the current database * @return array List of all tables of the current database
* @access public
* @since 0.4-beta
*/ */
function list_tables() function list_tables()
{ {
@ -419,20 +410,20 @@ class rcube_mdb2
* Formats input so it can be safely used in a query * Formats input so it can be safely used in a query
* *
* @param mixed Value to quote * @param mixed Value to quote
* @param string Type of data
* @return string Quoted/converted string for use in query * @return string Quoted/converted string for use in query
* @access public * @access public
*/ */
function quote($input, $type = null) function quote($input, $type = null)
{ {
// handle int directly for better performance
if ($type == 'integer')
return intval($input);
// create DB handle if not available // create DB handle if not available
if (!$this->db_handle) if (!$this->db_handle)
$this->db_connect('r'); $this->db_connect('r');
// escape pear identifier chars
$rep_chars = array('?' => '\?',
'!' => '\!',
'&' => '\&');
return $this->db_handle->quote($input, $type); return $this->db_handle->quote($input, $type);
} }
@ -467,6 +458,7 @@ class rcube_mdb2
return $this->db_handle->quoteIdentifier($str); return $this->db_handle->quoteIdentifier($str);
} }
/** /**
* Escapes a string * Escapes a string
* *
@ -492,8 +484,7 @@ class rcube_mdb2
*/ */
function now() function now()
{ {
switch($this->db_provider) switch($this->db_provider) {
{
case 'mssql': case 'mssql':
case 'sqlsrv': case 'sqlsrv':
return "getdate()"; return "getdate()";
@ -507,8 +498,9 @@ class rcube_mdb2
/** /**
* Return list of elements for use with SQL's IN clause * Return list of elements for use with SQL's IN clause
* *
* @param string Input array * @param array Input array
* @return string Elements list string * @param string Type of data
* @return string Comma-separated list of quoted values for use in query
* @access public * @access public
*/ */
function array2list($arr, $type = null) function array2list($arr, $type = null)
@ -516,11 +508,10 @@ class rcube_mdb2
if (!is_array($arr)) if (!is_array($arr))
return $this->quote($arr, $type); return $this->quote($arr, $type);
$res = array(); foreach ($arr as $idx => $item)
foreach ($arr as $item) $arr[$idx] = $this->quote($item, $type);
$res[] = $this->quote($item, $type);
return implode(',', $res); return implode(',', $arr);
} }
@ -533,11 +524,9 @@ class rcube_mdb2
*/ */
function unixtimestamp($field) function unixtimestamp($field)
{ {
switch($this->db_provider) switch($this->db_provider) {
{
case 'pgsql': case 'pgsql':
return "EXTRACT (EPOCH FROM $field)"; return "EXTRACT (EPOCH FROM $field)";
break;
case 'mssql': case 'mssql':
case 'sqlsrv': case 'sqlsrv':
@ -558,8 +547,7 @@ class rcube_mdb2
*/ */
function fromunixtime($timestamp) function fromunixtime($timestamp)
{ {
switch($this->db_provider) switch($this->db_provider) {
{
case 'mysqli': case 'mysqli':
case 'mysql': case 'mysql':
case 'sqlite': case 'sqlite':
@ -582,8 +570,7 @@ class rcube_mdb2
function ilike($column, $value) function ilike($column, $value)
{ {
// TODO: use MDB2's matchPattern() function // TODO: use MDB2's matchPattern() function
switch($this->db_provider) switch($this->db_provider) {
{
case 'pgsql': case 'pgsql':
return $this->quote_identifier($column).' ILIKE '.$this->quote($value); return $this->quote_identifier($column).' ILIKE '.$this->quote($value);
default: default:
@ -647,18 +634,17 @@ class rcube_mdb2
* @return mixed Handle ID * @return mixed Handle ID
* @access private * @access private
*/ */
function _add_result($res) private function _add_result($res)
{ {
// sql error occured // sql error occured
if (PEAR::isError($res)) if (PEAR::isError($res)) {
{ $this->db_error = true;
$this->db_error = TRUE;
$this->db_error_msg = $res->getMessage(); $this->db_error_msg = $res->getMessage();
raise_error(array('code' => 500, 'type' => 'db', raise_error(array('code' => 500, 'type' => 'db',
'line' => __LINE__, 'file' => __FILE__, 'line' => __LINE__, 'file' => __FILE__,
'message' => $res->getMessage() . " Query: " 'message' => $res->getMessage() . " Query: "
. substr(preg_replace('/[\r\n]+\s*/', ' ', $res->userinfo), 0, 512)), . substr(preg_replace('/[\r\n]+\s*/', ' ', $res->userinfo), 0, 512)),
TRUE, FALSE); true, false);
} }
$res_id = sizeof($this->a_query_results); $res_id = sizeof($this->a_query_results);
@ -673,19 +659,19 @@ class rcube_mdb2
* If no ID is specified, the last resource handle will be returned * If no ID is specified, the last resource handle will be returned
* *
* @param number Handle ID * @param number Handle ID
* @return mixed Resource handle or FALSE on failure * @return mixed Resource handle or false on failure
* @access private * @access private
*/ */
function _get_result($res_id=NULL) private function _get_result($res_id = null)
{ {
if ($res_id==NULL) if ($res_id == null)
$res_id = $this->last_res_id; $res_id = $this->last_res_id;
if (isset($this->a_query_results[$res_id])) if (isset($this->a_query_results[$res_id]))
if (!PEAR::isError($this->a_query_results[$res_id])) if (!PEAR::isError($this->a_query_results[$res_id]))
return $this->a_query_results[$res_id]; return $this->a_query_results[$res_id];
return FALSE; return false;
} }
@ -696,7 +682,7 @@ class rcube_mdb2
* @param string File path to use for DB creation * @param string File path to use for DB creation
* @access private * @access private
*/ */
function _sqlite_create_database($dbh, $file_name) private function _sqlite_create_database($dbh, $file_name)
{ {
if (empty($file_name) || !is_string($file_name)) if (empty($file_name) || !is_string($file_name))
return; return;
@ -706,7 +692,8 @@ class rcube_mdb2
if (strlen($data)) if (strlen($data))
if (!sqlite_exec($dbh->connection, $data, $error) || MDB2::isError($dbh)) if (!sqlite_exec($dbh->connection, $data, $error) || MDB2::isError($dbh))
raise_error(array('code' => 500, 'type' => 'db', raise_error(array('code' => 500, 'type' => 'db',
'line' => __LINE__, 'file' => __FILE__, 'message' => $error), TRUE, FALSE); 'line' => __LINE__, 'file' => __FILE__,
'message' => $error), true, false);
} }
@ -716,26 +703,28 @@ class rcube_mdb2
* *
* @access private * @access private
*/ */
function _sqlite_prepare() private function _sqlite_prepare()
{ {
include_once('include/rcube_sqlite.inc'); include_once('include/rcube_sqlite.inc');
// we emulate via callback some missing MySQL function // we emulate via callback some missing MySQL function
sqlite_create_function($this->db_handle->connection, "from_unixtime", "rcube_sqlite_from_unixtime"); sqlite_create_function($this->db_handle->connection,
sqlite_create_function($this->db_handle->connection, "unix_timestamp", "rcube_sqlite_unix_timestamp"); 'from_unixtime', 'rcube_sqlite_from_unixtime');
sqlite_create_function($this->db_handle->connection, "now", "rcube_sqlite_now"); sqlite_create_function($this->db_handle->connection,
sqlite_create_function($this->db_handle->connection, "md5", "rcube_sqlite_md5"); 'unix_timestamp', 'rcube_sqlite_unix_timestamp');
sqlite_create_function($this->db_handle->connection,
'now', 'rcube_sqlite_now');
sqlite_create_function($this->db_handle->connection,
'md5', 'rcube_sqlite_md5');
} }
} // end class rcube_db } // end class rcube_db
/* this is our own debug handler for the MDB2 connection */ /* this is our own debug handler for the MDB2 connection */
function mdb2_debug_handler(&$db, $scope, $message, $context = array()) function mdb2_debug_handler(&$db, $scope, $message, $context = array())
{ {
if ($scope != 'prepare') if ($scope != 'prepare') {
{
$debug_output = $scope . '('.$db->db_index.'): ' . $message; $debug_output = $scope . '('.$db->db_index.'): ' . $message;
write_log('sql', $debug_output); write_log('sql', $debug_output);
} }

Loading…
Cancel
Save