Source for file SqlsrvConnector.php
Documentation is available at SqlsrvConnector.php
///////////////////////////////////////////////////////////////////////////////
* IConnector implementation for the sqlsrv (Microsoft SQL Server 2005 Driver
* for PHP) database extension.
* <li>The {@link http://www.codeplex.com/SQL2K5PHP Microsoft SQL Server 2005 Driver for PHP}</li>
* This library is free software: you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
* The Connector library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* {@link http://www.gnu.org/copyleft/lesser.html GNU Lesser General Public License}
* @author Per Egil Roksvaag
* @copyright 2009 Per Egil Roksvaag
* @license http://www.gnu.org/copyleft/lesser.html GNU Lesser General Public License
///////////////////////////////////////////////////////////////////////////////
* Include the parent class.
require_once("BaseConnector.php");
* IConnector implementation for Microsoft SQL Server 2005 Driver for PHP.
///////////////////////////////////////////////////////////////////////////
* @var array Multibyte character encodings matching the MSSQL unicode format.
static protected $unicode =
array("UCS-2LE", "UTF-16LE");
///////////////////////////////////////////////////////////////////////////
* Open a connection to a MSSQL Server 2005 or higher and set global options.
* @param array $connection An associated array of connection settings, like host and user name.
* @param array $options An associated array of global options for the resulting instance.
* @return SqlsrvConnector
if($this->open($connection))
$this->options[self::PARAM_QUERIES] =
true;
$this->options[self::PARAM_NAMED] =
false;
$this->options[self::PARAM_PREFIX] =
"?";
else if($this->lookup("throwException", $options))
throw
new Exception("SqlsrvConnector error: Connection failed.");
else if($this->lookup(self::LOG_ERROR, $options))
$log =
"SqlsrvConnector error: Connection failed in ";
///////////////////////////////////////////////////////////////////////////
* Open a database connection.
* @param array $connection An associated array of connection settings, like host and user name.
* @return bool <var>true</var>, if a database connection was successfully opened, <var>false</var> otherwise.
protected function open($connection)
$hostname =
$this->lookup(self::CONN_HOSTNAME, $connection);
$database =
$this->lookup(self::CONN_DATABASE, $connection);
$username =
$this->lookup(self::CONN_USERNAME, $connection);
$password =
$this->lookup(self::CONN_PASSWORD, $connection);
$port =
$this->lookup(self::CONN_PORT, $connection);
$pool =
$this->lookup(self::CONN_POOL, $connection, true);
$native =
$this->lookup(self::CONN_NATIVE, $connection, array());
$database &&
$native["Database"] =
$database;
$username &&
$native["UID"] =
$username;
$password &&
$native["PWD"] =
$password;
$native["ConnectionPooling"] =
$pool;
$port &&
$hostname.=
",".
$port;
///////////////////////////////////////////////////////////////////////////
* Send a SQL SELECT query to the database and get the query result.
* @see IConnector::select().
* @param string $query A SQL query to execute on a database.
* @param array $param An associated array of values to be used in the $query.
* @param array $map An array of type definitions for the <var>$param</var> values.
* @param array $options An associated array of options, see the {@tutorial connector.pkg#options.element}.
* @throws Exception when $param doesn't match the type definition $map.
* @return array The query result as a table (array of associated arrays).
public function select($query, $param =
array(), $map =
array(), $options =
array())
$query =
$this->bind($query, $param, $stack, $options);
$query =
$this->build($query, $options);
$hash =
$this->getHash($query, $stack, $options);
if($this->lookup(self::LOG_DEBUG, $options))
$log1 =
"SqlsrvConnector debug: Select query in ";
$log2 =
$stack ?
LB.
"Params: ".
@implode(", ", $stack) :
"";
error_log($log1.
$_SERVER["SCRIPT_FILENAME"].
LB.
$query.
$log2);
if($this->getCache($hash, $table, $options))
do
$table[] =
$this->fetch($stmt, $options);
$this->setCache($hash, $table, $options);
if($this->lookup(self::LOG_ERROR, $options))
$log1 =
"SqlsrvConnector error: Select query in ";
$log2 =
$stack ?
LB.
"Params: ".
@implode(", ", $stack) :
"";
error_log($log1.
$_SERVER["SCRIPT_FILENAME"].
LB.
$query.
$log2);
///////////////////////////////////////////////////////////////////////////
* Send a SQL INSERT query to the database and get the IDENTITY ID
* generated from the last INSERT operation (if any).
* @see IConnector::insert().
* @param string $query A SQL query to execute on a database.
* @param array $param An associated array of values to be used in the $query.
* @param array $map An array of type definitions for the <var>$param</var> values.
* @param array $options An associated array of options, see the {@tutorial connector.pkg#options.element}.
* @throws Exception when $param doesn't match the type definition $map.
* @return int The IDENTITY ID of the last inserted row.
public function insert($query, $param =
array(), $map =
array(), $options =
array())
$query =
$this->bind($query, $param, $stack, $options);
$query =
rtrim($query, ";").
";".
LB.
"SELECT SCOPE_IDENTITY();";
if($this->lookup(self::LOG_DEBUG, $options))
$log1 =
"SqlsrvConnector debug: Insert query in ";
$log2 =
$stack ?
LB.
"Params: ".
@implode(", ", $stack) :
"";
error_log($log1.
$_SERVER["SCRIPT_FILENAME"].
LB.
$query.
$log2);
else if($this->lookup(self::LOG_ERROR, $options))
$log1 =
"SqlsrvConnector error: Insert query in ";
$log2 =
$stack ?
LB.
"Params: ".
@implode(", ", $stack) :
"";
error_log($log1.
$_SERVER["SCRIPT_FILENAME"].
LB.
$query.
$log2);
///////////////////////////////////////////////////////////////////////////
* Send a SQL UPDATE query to the database and get the number of rows
* @see IConnector::update().
* @param string $query A SQL query to execute on a database.
* @param array $param An associated array of values to be used in the $query.
* @param array $map An array of type definitions for the <var>$param</var> values.
* @param array $options An associated array of options, see the {@tutorial connector.pkg#options.element}.
* @throws Exception when $param doesn't match the type definition $map.
* @return int The number of rows updates by the query.
public function update($query, $param =
array(), $map =
array(), $options =
array())
$query =
$this->bind($query, $param, $stack, $options);
if($this->lookup(self::LOG_DEBUG, $options))
$log1 =
"SqlsrvConnector debug: Update query in ";
$log2 =
$stack ?
LB.
"Params: ".
@implode(", ", $stack) :
"";
error_log($log1.
$_SERVER["SCRIPT_FILENAME"].
LB.
$query.
$log2);
else if($this->lookup(self::LOG_ERROR, $options))
$log1 =
"SqlsrvConnector error: Update query in ";
$log2 =
$stack ?
LB.
"Params: ".
@implode(", ", $stack) :
"";
error_log($log1.
$_SERVER["SCRIPT_FILENAME"].
LB.
$query.
$log2);
///////////////////////////////////////////////////////////////////////////
* Send a SQL DELETE query to the database and get the number of rows
* @see IConnector::delete().
* @param string $query A SQL query to execute on a database.
* @param array $param An associated array of values to be used in the $query.
* @param array $map An array of type definitions for the <var>$param</var> values.
* @param array $options An associated array of options, see the {@tutorial connector.pkg#options.element}.
* @throws Exception when $param doesn't match the type definition $map.
* @return int The number of rows deleted by the query.
public function delete($query, $param =
array(), $map =
array(), $options =
array())
$query =
$this->bind($query, $param, $stack, $options);
if($this->lookup(self::LOG_DEBUG, $options))
$log1 =
"SqlsrvConnector debug: Delete query in ";
$log2 =
$stack ?
LB.
"Params: ".
@implode(", ", $stack) :
"";
error_log($log1.
$_SERVER["SCRIPT_FILENAME"].
LB.
$query.
$log2);
else if($this->lookup(self::LOG_ERROR, $options))
$log1 =
"SqlsrvConnector error: Delete query in ";
$log2 =
$stack ?
LB.
"Params: ".
@implode(", ", $stack) :
"";
error_log($log1.
$_SERVER["SCRIPT_FILENAME"].
LB.
$query.
$log2);
///////////////////////////////////////////////////////////////////////////
* Begins a transaction on the current connection.
* The current transaction includes all statements on the connection that
* were executed after the call to transaction() and before any calls
* to rollback() or commit().
* @see IConnector::transaction().
* @param array $options An associated array of options, see the {@tutorial connector.pkg#options.element}.
* @return bool true if the transaction was successfully begun, false otherwise.
if($this->lookup(self::LOG_DEBUG, $options))
$log =
"SqlsrvConnector debug: Begin transaction in ";
else if($this->lookup(self::LOG_ERROR, $options))
$log =
"SqlsrvConnector error: Begin transaction in ";
///////////////////////////////////////////////////////////////////////////
* Commits the current transaction on the current connection.
* The current transaction includes all statements on the connection that
* were executed after the call to transaction() and before any calls
* to rollback() or commit().
* @see IConnector::commit().
* @param array $options An associated array of options, see the {@tutorial connector.pkg#options.element}.
* @return bool true if the transaction was successfully committed, false otherwise.
public function commit($options =
array())
if($this->lookup(self::LOG_DEBUG, $options))
$log =
"SqlsrvConnector debug: Commit in ";
else if($this->lookup(self::LOG_ERROR, $options))
$log =
"SqlsrvConnector error: Commit in ";
///////////////////////////////////////////////////////////////////////////
* Rolls back the current transaction on the current connection.
* The current transaction includes all statements on the connection that
* were executed after the call to transaction() and before any calls
* to rollback() or commit().
* @see IConnector::rollback().
* @param array $options An associated array of options, see the {@tutorial connector.pkg#options.element}.
* @return bool true if the transaction was successfully rolled back, false otherwise.
public function rollback($options =
array())
if($this->lookup(self::LOG_DEBUG, $options))
$log =
"SqlsrvConnector debug: Rollback in ";
else if($this->lookup(self::LOG_ERROR, $options))
$log =
"SqlsrvConnector error: Rollback in ";
///////////////////////////////////////////////////////////////////////////
* MSSQL unicode strings are converted to the special sqlsrv format.
* @param string $value The parameter to replace the query placeholder.
* @param array &$stack An array of values for use in parameterized queries.
* @param array $options An associated array of options.
* @return string A valid SQL string or placeholder.
protected function castString($value, $name, &$stack, $options =
array())
$charset =
$this->lookup(self::CHAR_DATABASE, $options);
$parameterized =
$this->lookup(self::PARAM_QUERIES, $options);
if($parameterized &&
in_array($charset, self::$unicode))
$value =
$this->strStrip($value, $options);
$value =
array($value, SQLSRV_PARAM_IN, SQLSRV_PHPTYPE_STRING(SQLSRV_ENC_BINARY), SQLSRV_SQLTYPE_NVARCHAR('max'));
return $this->push($value, $name, $stack, $options);
return parent::castString($value, $name, $stack, $options);
///////////////////////////////////////////////////////////////////////////
* Add a TOP x statement to a SQL SELECT query when the
* {@link IConnector::RESULT_LENGTH} is set.
* @param string $query A SQL query to execute on a database.
* @param array $options An associated array of options.
* @return string A modified SQL query.
protected function build($query, $options =
array())
$offset =
$this->lookup(self::RESULT_OFFSET, $options, 0);
$length =
$this->lookup(self::RESULT_LENGTH, $options);
$number =
$offset +
$length;
$pattern =
"/\A(SELECT)([\s]+(ALL|DISTINCT))?\b/i";
$query =
preg_replace($pattern, "$0 TOP {$number}", $query);
///////////////////////////////////////////////////////////////////////////
* Fetch multiple rows of a query result.
* If the {@link IConnector::RESULT_LENGTH} or {@link IConnector::RESULT_OFFSET}
* options are set, some rows are omitted from the beginning and/or the end
* If the {@link IConnector::RESULT_KEY_FIELD} option is set, the
* resulting table is an <b>associated</b> array of rows.
* @param resource $stmt A statement resource corresponding to an executed statement.
* @param array $options An associated array of options.
* @return array The query result as a table (array of associated arrays).
protected function fetch($stmt, $options =
array())
return in_array($this->lookup(self::CHAR_DATABASE, $options), self::$unicode)
///////////////////////////////////////////////////////////////////////////
* Fetch multiple rows of a query result with single byte string encoding.
* If the {@link IConnector::RESULT_LENGTH} or {@link IConnector::RESULT_OFFSET}
* options are set, some rows are omitted from the beginning and/or the end
* If the {@link IConnector::RESULT_KEY_FIELD} option is set, the
* resulting table is an <b>associated</b> array of rows.
* @param resource $stmt A statement resource corresponding to an executed statement.
* @param array $options An associated array of options.
* @return array The query result as a table (array of associated arrays).
$key =
$this->lookup(self::RESULT_KEY_FIELD, $options);
$offset =
$this->lookup(self::RESULT_OFFSET, $options, 0);
$length =
$this->lookup(self::RESULT_LENGTH, $options);
$number =
is_null($length) ?
PHP_INT_MAX :
$length +
$offset;
if($number <=
$index) break;
if($offset >
$index++
) continue;
$key ?
$table[$row[$key]] =
$row :
$table[] =
$row;
///////////////////////////////////////////////////////////////////////////
* Fetch multiple rows of a query result with double byte string encoding.
* If the {@link IConnector::RESULT_LENGTH} or {@link IConnector::RESULT_OFFSET}
* options are set, some rows are omitted from the beginning and/or the end
* If the {@link IConnector::RESULT_KEY_FIELD} option is set, the
* resulting table is an <b>associated</b> array of rows.
* WARNING: To override the default PHP types, binary strings are fetched
* with the sqlsrv_fetch/sqlsrv_get_field functions. This combination is
* REALLY slow. sqlsrv_fetch_array is about 100 times faster.
* @param resource $stmt A statement resource corresponding to an executed statement.
* @param array $options An associated array of options.
* @return array The query result as a table (array of associated arrays).
$key =
$this->lookup(self::RESULT_KEY_FIELD, $options);
$offset =
$this->lookup(self::RESULT_OFFSET, $options);
$length =
$this->lookup(self::RESULT_LENGTH, $options);
$number =
is_null($length) ?
PHP_INT_MAX :
$length +
$offset;
if($number <=
$index) break;
if($offset >
$index++
) continue;
for($i =
0; $i <
$len; $i++
)
$name =
$meta[$i]["Name"];
$type =
$meta[$i]["Type"];
$key ?
$table[$row[$key]] =
$row :
$table[] =
$row;
///////////////////////////////////////////////////////////////////////////
Documentation generated on Wed, 03 Jun 2009 12:41:56 +0200 by phpDocumentor 1.4.1