From 2273d4117fd50ee44dcdaa28fd6444383dc403a0 Mon Sep 17 00:00:00 2001 From: alecpl Date: Tue, 26 Jan 2010 13:45:16 +0000 Subject: - Add support for MDB2's 'sqlsrv' driver (#1486395) --- program/lib/MDB2/Driver/mysqli.php | 114 +++++++++++++++++++++---------------- 1 file changed, 66 insertions(+), 48 deletions(-) (limited to 'program/lib/MDB2/Driver/mysqli.php') diff --git a/program/lib/MDB2/Driver/mysqli.php b/program/lib/MDB2/Driver/mysqli.php index 8f0379147..4543f5fe1 100644 --- a/program/lib/MDB2/Driver/mysqli.php +++ b/program/lib/MDB2/Driver/mysqli.php @@ -43,7 +43,7 @@ // | Author: Lukas Smith | // +----------------------------------------------------------------------+ // -// $Id: mysqli.php,v 1.188 2008/03/13 03:31:55 afz Exp $ +// $Id: mysqli.php 292715 2009-12-28 14:06:34Z quipo $ // /** @@ -189,7 +189,7 @@ class MDB2_Driver_mysqli extends MDB2_Driver_Common $native_code = @mysqli_connect_errno(); $native_msg = @mysqli_connect_error(); } - if (is_null($error)) { + if (null === $error) { static $ecode_map; if (empty($ecode_map)) { $ecode_map = array( @@ -320,7 +320,7 @@ class MDB2_Driver_mysqli extends MDB2_Driver_Common { $this->debug('Starting transaction/savepoint', __FUNCTION__, array('is_manip' => true, 'savepoint' => $savepoint)); $this->_getServerCapabilities(); - if (!is_null($savepoint)) { + if (null !== $savepoint) { if (!$this->supports('savepoints')) { return $this->raiseError(MDB2_ERROR_UNSUPPORTED, null, null, 'savepoints are not supported', __FUNCTION__); @@ -331,10 +331,11 @@ class MDB2_Driver_mysqli extends MDB2_Driver_Common } $query = 'SAVEPOINT '.$savepoint; return $this->_doQuery($query, true); - } elseif ($this->in_transaction) { + } + if ($this->in_transaction) { return MDB2_OK; //nothing to do } - $query = $this->start_transaction ? 'START TRANSACTION' : 'SET AUTOCOMMIT = 1'; + $query = $this->start_transaction ? 'START TRANSACTION' : 'SET AUTOCOMMIT = 0'; $result =& $this->_doQuery($query, true); if (PEAR::isError($result)) { return $result; @@ -364,7 +365,7 @@ class MDB2_Driver_mysqli extends MDB2_Driver_Common return $this->raiseError(MDB2_ERROR_INVALID, null, null, 'commit/release savepoint cannot be done changes are auto committed', __FUNCTION__); } - if (!is_null($savepoint)) { + if (null !== $savepoint) { if (!$this->supports('savepoints')) { return $this->raiseError(MDB2_ERROR_UNSUPPORTED, null, null, 'savepoints are not supported', __FUNCTION__); @@ -387,7 +388,7 @@ class MDB2_Driver_mysqli extends MDB2_Driver_Common return $result; } if (!$this->start_transaction) { - $query = 'SET AUTOCOMMIT = 0'; + $query = 'SET AUTOCOMMIT = 1'; $result =& $this->_doQuery($query, true); if (PEAR::isError($result)) { return $result; @@ -418,7 +419,7 @@ class MDB2_Driver_mysqli extends MDB2_Driver_Common return $this->raiseError(MDB2_ERROR_INVALID, null, null, 'rollback cannot be done changes are auto committed', __FUNCTION__); } - if (!is_null($savepoint)) { + if (null !== $savepoint) { if (!$this->supports('savepoints')) { return $this->raiseError(MDB2_ERROR_UNSUPPORTED, null, null, 'savepoints are not supported', __FUNCTION__); @@ -433,7 +434,7 @@ class MDB2_Driver_mysqli extends MDB2_Driver_Common return $result; } if (!$this->start_transaction) { - $query = 'SET AUTOCOMMIT = 0'; + $query = 'SET AUTOCOMMIT = 1'; $result =& $this->_doQuery($query, true); if (PEAR::isError($result)) { return $result; @@ -590,7 +591,7 @@ class MDB2_Driver_mysqli extends MDB2_Driver_Common */ function setCharset($charset, $connection = null) { - if (is_null($connection)) { + if (null === $connection) { $connection = $this->getConnection(); if (PEAR::isError($connection)) { return $connection; @@ -606,7 +607,7 @@ class MDB2_Driver_mysqli extends MDB2_Driver_Common ((50000 <= $client_info) && (50006 > $client_info))) ) { $query = "SET NAMES '".mysqli_real_escape_string($connection, $charset)."'"; - if (!is_null($collation)) { + if (null !== $collation) { $query .= " COLLATE '".mysqli_real_escape_string($connection, $collation)."'"; } return $this->_doQuery($query, true, $connection); @@ -673,8 +674,14 @@ class MDB2_Driver_mysqli extends MDB2_Driver_Common } if ($force) { - @mysqli_close($this->connection); + $ok = @mysqli_close($this->connection); + if (!$ok) { + return $this->raiseError(MDB2_ERROR_DISCONNECT_FAILED, + null, null, null, __FUNCTION__); + } } + } else { + return false; } return parent::disconnect($force); } @@ -742,13 +749,13 @@ class MDB2_Driver_mysqli extends MDB2_Driver_Common return $result; } - if (is_null($connection)) { + if (null === $connection) { $connection = $this->getConnection(); if (PEAR::isError($connection)) { return $connection; } } - if (is_null($database_name)) { + if (null === $database_name) { $database_name = $this->database_name; } @@ -770,7 +777,7 @@ class MDB2_Driver_mysqli extends MDB2_Driver_Common $result = mysqli_query($connection, $query); } - if (!$result) { + if (!$result && 0 !== mysqli_errno($connection)) { $err =& $this->raiseError(null, null, null, 'Could not execute statement', __FUNCTION__); return $err; @@ -807,7 +814,7 @@ class MDB2_Driver_mysqli extends MDB2_Driver_Common */ function _affectedRows($connection, $result = null) { - if (is_null($connection)) { + if (null === $connection) { $connection = $this->getConnection(); if (PEAR::isError($connection)) { return $connection; @@ -946,7 +953,7 @@ class MDB2_Driver_mysqli extends MDB2_Driver_Common $this->supported['prepared_statements'] = true; } - // SAVEPOINTS were introduced in MySQL 4.0.14 and 4.1.1 (InnoDB) + // SAVEPOINTs were introduced in MySQL 4.0.14 and 4.1.1 (InnoDB) if (version_compare($server_version, '4.1.0', '>=')) { if (version_compare($server_version, '4.1.1', '<')) { $this->supported['savepoints'] = false; @@ -988,7 +995,7 @@ class MDB2_Driver_mysqli extends MDB2_Driver_Common function _skipUserDefinedVariable($query, $position) { $found = strpos(strrev(substr($query, 0, $position)), '@'); - if ($found === false) { + if (false === $found) { return $position; } $pos = strlen($query) - strlen(substr($query, $position)) - $found - 1; @@ -1025,6 +1032,12 @@ class MDB2_Driver_mysqli extends MDB2_Driver_Common */ function &prepare($query, $types = null, $result_types = null, $lobs = array()) { + // connect to get server capabilities (http://pear.php.net/bugs/16147) + $connection = $this->getConnection(); + if (PEAR::isError($connection)) { + return $connection; + } + if ($this->options['emulate_prepared'] || $this->supported['prepared_statements'] !== true ) { @@ -1060,7 +1073,7 @@ class MDB2_Driver_mysqli extends MDB2_Driver_Common } else { break; } - if (is_null($placeholder_type)) { + if (null === $placeholder_type) { $placeholder_type_guess = $query[$p_position]; } @@ -1081,7 +1094,7 @@ class MDB2_Driver_mysqli extends MDB2_Driver_Common } if ($query[$position] == $placeholder_type_guess) { - if (is_null($placeholder_type)) { + if (null === $placeholder_type) { $placeholder_type = $query[$p_position]; $question = $colon = $placeholder_type; } @@ -1103,10 +1116,6 @@ class MDB2_Driver_mysqli extends MDB2_Driver_Common $position = $p_position; } } - $connection = $this->getConnection(); - if (PEAR::isError($connection)) { - return $connection; - } if (!$is_manip) { static $prep_statement_counter = 1; @@ -1140,8 +1149,7 @@ class MDB2_Driver_mysqli extends MDB2_Driver_Common /** * Execute a SQL REPLACE query. A REPLACE query is identical to a INSERT * query, except that if there is already a row in the table with the same - * key field values, the REPLACE query just updates its values instead of - * inserting a new row. + * key field values, the old row is deleted before the new row is inserted. * * The REPLACE type of query does not make part of the SQL standards. Since * practically only MySQL implements it natively, this type of query is @@ -1199,6 +1207,7 @@ class MDB2_Driver_mysqli extends MDB2_Driver_Common * * Default: 0 * + * @see http://dev.mysql.com/doc/refman/5.0/en/replace.html * @return mixed MDB2_OK on success, a MDB2 error on failure */ function replace($table, $fields) @@ -1357,7 +1366,7 @@ class MDB2_Result_mysqli extends MDB2_Result_Common */ function &fetchRow($fetchmode = MDB2_FETCHMODE_DEFAULT, $rownum = null) { - if (!is_null($rownum)) { + if (null !== $rownum) { $seek = $this->seek($rownum); if (PEAR::isError($seek)) { return $seek; @@ -1378,7 +1387,7 @@ class MDB2_Result_mysqli extends MDB2_Result_Common } if (!$row) { - if ($this->result === false) { + if (false === $this->result) { $err =& $this->db->raiseError(MDB2_ERROR_NEED_MORE_DATA, null, null, 'resultset has already been freed', __FUNCTION__); return $err; @@ -1409,7 +1418,8 @@ class MDB2_Result_mysqli extends MDB2_Result_Common if ($object_class == 'stdClass') { $row = (object) $row; } else { - $row = new $object_class($row); + $rowObj = new $object_class($row); + $row = $rowObj; } } ++$this->rownum; @@ -1458,11 +1468,12 @@ class MDB2_Result_mysqli extends MDB2_Result_Common function numCols() { $cols = @mysqli_num_fields($this->result); - if (is_null($cols)) { - if ($this->result === false) { + if (null === $cols) { + if (false === $this->result) { return $this->db->raiseError(MDB2_ERROR_NEED_MORE_DATA, null, null, 'resultset has already been freed', __FUNCTION__); - } elseif (is_null($this->result)) { + } + if (null === $this->result) { return count($this->types); } return $this->db->raiseError(null, null, null, @@ -1510,13 +1521,16 @@ class MDB2_Result_mysqli extends MDB2_Result_Common */ function free() { - if (is_object($this->result) && $this->db->connection) { - $free = @mysqli_free_result($this->result); - if ($free === false) { - return $this->db->raiseError(null, null, null, - 'Could not free result', __FUNCTION__); + do { + if (is_object($this->result) && $this->db->connection) { + $free = @mysqli_free_result($this->result); + if (false === $free) { + return $this->db->raiseError(null, null, null, + 'Could not free result', __FUNCTION__); + } } - } + } while ($this->result = $this->nextResult()); + $this->result = false; return MDB2_OK; } @@ -1544,10 +1558,11 @@ class MDB2_BufferedResult_mysqli extends MDB2_Result_mysqli function seek($rownum = 0) { if ($this->rownum != ($rownum - 1) && !@mysqli_data_seek($this->result, $rownum)) { - if ($this->result === false) { + if (false === $this->result) { return $this->db->raiseError(MDB2_ERROR_NEED_MORE_DATA, null, null, 'resultset has already been freed', __FUNCTION__); - } elseif (is_null($this->result)) { + } + if (null === $this->result) { return MDB2_OK; } return $this->db->raiseError(MDB2_ERROR_INVALID, null, null, @@ -1587,11 +1602,12 @@ class MDB2_BufferedResult_mysqli extends MDB2_Result_mysqli function numRows() { $rows = @mysqli_num_rows($this->result); - if (is_null($rows)) { - if ($this->result === false) { + if (null === $rows) { + if (false === $this->result) { return $this->db->raiseError(MDB2_ERROR_NEED_MORE_DATA, null, null, 'resultset has already been freed', __FUNCTION__); - } elseif (is_null($this->result)) { + } + if (null === $this->result) { return 0; } return $this->db->raiseError(null, null, null, @@ -1646,12 +1662,14 @@ class MDB2_Statement_mysqli extends MDB2_Statement_Common * * @param mixed $result_class string which specifies which result class to use * @param mixed $result_wrap_class string which specifies which class to wrap results in - * @return mixed a result handle or MDB2_OK on success, a MDB2 error on failure + * + * @return mixed MDB2_Result or integer (affected rows) on success, + * a MDB2 error on failure * @access private */ function &_execute($result_class = true, $result_wrap_class = false) { - if (is_null($this->statement)) { + if (null === $this->statement) { $result =& parent::_execute($result_class, $result_wrap_class); return $result; } @@ -1731,7 +1749,7 @@ class MDB2_Statement_mysqli extends MDB2_Statement_Common $query.= ' USING @'.implode(', @', array_values($this->positions)); } else { $result = @call_user_func_array('mysqli_stmt_bind_param', $parameters); - if ($result === false) { + if (false === $result) { $err =& $this->db->raiseError(null, null, null, 'Unable to bind parameters', __FUNCTION__); return $err; @@ -1813,7 +1831,7 @@ class MDB2_Statement_mysqli extends MDB2_Statement_Common */ function free() { - if (is_null($this->positions)) { + if (null === $this->positions) { return $this->db->raiseError(MDB2_ERROR, null, null, 'Prepared statement has already been freed', __FUNCTION__); } @@ -1824,7 +1842,7 @@ class MDB2_Statement_mysqli extends MDB2_Statement_Common $result = $this->db->raiseError(null, null, null, 'Could not free statement', __FUNCTION__); } - } elseif (!is_null($this->statement)) { + } elseif (null !== $this->statement) { $connection = $this->db->getConnection(); if (PEAR::isError($connection)) { return $connection; -- cgit v1.2.3