summaryrefslogtreecommitdiff
path: root/program/lib/DB/mssql.php
diff options
context:
space:
mode:
Diffstat (limited to 'program/lib/DB/mssql.php')
-rw-r--r--program/lib/DB/mssql.php79
1 files changed, 64 insertions, 15 deletions
diff --git a/program/lib/DB/mssql.php b/program/lib/DB/mssql.php
index a84db89f6..8452f08b1 100644
--- a/program/lib/DB/mssql.php
+++ b/program/lib/DB/mssql.php
@@ -18,7 +18,7 @@
* @package DB
* @author Sterling Hughes <sterling@php.net>
* @author Daniel Convissor <danielc@php.net>
- * @copyright 1997-2005 The PHP Group
+ * @copyright 1997-2007 The PHP Group
* @license http://www.php.net/license/3_0.txt PHP License 3.0
* @version CVS: $Id$
* @link http://pear.php.net/package/DB
@@ -35,13 +35,21 @@ require_once 'DB/common.php';
*
* These methods overload the ones declared in DB_common.
*
+ * DB's mssql driver is only for Microsfoft SQL Server databases.
+ *
+ * If you're connecting to a Sybase database, you MUST specify "sybase"
+ * as the "phptype" in the DSN.
+ *
+ * This class only works correctly if you have compiled PHP using
+ * --with-mssql=[dir_to_FreeTDS].
+ *
* @category Database
* @package DB
* @author Sterling Hughes <sterling@php.net>
* @author Daniel Convissor <danielc@php.net>
- * @copyright 1997-2005 The PHP Group
+ * @copyright 1997-2007 The PHP Group
* @license http://www.php.net/license/3_0.txt PHP License 3.0
- * @version Release: @package_version@
+ * @version Release: 1.7.13
* @link http://pear.php.net/package/DB
*/
class DB_mssql extends DB_common
@@ -89,19 +97,40 @@ class DB_mssql extends DB_common
*/
// XXX Add here error codes ie: 'S100E' => DB_ERROR_SYNTAX
var $errorcode_map = array(
+ 102 => DB_ERROR_SYNTAX,
110 => DB_ERROR_VALUE_COUNT_ON_ROW,
155 => DB_ERROR_NOSUCHFIELD,
+ 156 => DB_ERROR_SYNTAX,
170 => DB_ERROR_SYNTAX,
207 => DB_ERROR_NOSUCHFIELD,
208 => DB_ERROR_NOSUCHTABLE,
245 => DB_ERROR_INVALID_NUMBER,
+ 319 => DB_ERROR_SYNTAX,
+ 321 => DB_ERROR_NOSUCHFIELD,
+ 325 => DB_ERROR_SYNTAX,
+ 336 => DB_ERROR_SYNTAX,
515 => DB_ERROR_CONSTRAINT_NOT_NULL,
547 => DB_ERROR_CONSTRAINT,
+ 1018 => DB_ERROR_SYNTAX,
+ 1035 => DB_ERROR_SYNTAX,
1913 => DB_ERROR_ALREADY_EXISTS,
+ 2209 => DB_ERROR_SYNTAX,
+ 2223 => DB_ERROR_SYNTAX,
+ 2248 => DB_ERROR_SYNTAX,
+ 2256 => DB_ERROR_SYNTAX,
+ 2257 => DB_ERROR_SYNTAX,
2627 => DB_ERROR_CONSTRAINT,
2714 => DB_ERROR_ALREADY_EXISTS,
+ 3607 => DB_ERROR_DIVZERO,
3701 => DB_ERROR_NOSUCHTABLE,
+ 7630 => DB_ERROR_SYNTAX,
8134 => DB_ERROR_DIVZERO,
+ 9303 => DB_ERROR_SYNTAX,
+ 9317 => DB_ERROR_SYNTAX,
+ 9318 => DB_ERROR_SYNTAX,
+ 9331 => DB_ERROR_SYNTAX,
+ 9332 => DB_ERROR_SYNTAX,
+ 15253 => DB_ERROR_SYNTAX,
);
/**
@@ -244,7 +273,7 @@ class DB_mssql extends DB_common
*/
function simpleQuery($query)
{
- $ismanip = DB::isManip($query);
+ $ismanip = $this->_checkManip($query);
$this->last_query = $query;
if (!@mssql_select_db($this->_db, $this->connection)) {
return $this->mssqlRaiseError(DB_ERROR_NODBSELECTED);
@@ -316,7 +345,7 @@ class DB_mssql extends DB_common
}
}
if ($fetchmode & DB_FETCHMODE_ASSOC) {
- $arr = @mssql_fetch_array($result, MSSQL_ASSOC);
+ $arr = @mssql_fetch_assoc($result);
if ($this->options['portability'] & DB_PORTABILITY_LOWERCASE && $arr) {
$arr = array_change_key_case($arr, CASE_LOWER);
}
@@ -353,7 +382,7 @@ class DB_mssql extends DB_common
*/
function freeResult($result)
{
- return @mssql_free_result($result);
+ return is_resource($result) ? mssql_free_result($result) : false;
}
// }}}
@@ -483,7 +512,7 @@ class DB_mssql extends DB_common
*/
function affectedRows()
{
- if (DB::isManip($this->last_query)) {
+ if ($this->_last_query_manip) {
$res = @mssql_query('select @@rowcount', $this->connection);
if (!$res) {
return $this->mssqlRaiseError();
@@ -537,7 +566,15 @@ class DB_mssql extends DB_common
return $this->raiseError($result);
}
} elseif (!DB::isError($result)) {
- $result =& $this->query("SELECT @@IDENTITY FROM $seqname");
+ $result = $this->query("SELECT IDENT_CURRENT('$seqname')");
+ if (DB::isError($result)) {
+ /* Fallback code for MS SQL Server 7.0, which doesn't have
+ * IDENT_CURRENT. This is *not* safe for concurrent
+ * requests, and really, if you're using it, you're in a
+ * world of hurt. Nevertheless, it's here to ensure BC. See
+ * bug #181 for the gory details.*/
+ $result = $this->query("SELECT @@IDENTITY FROM $seqname");
+ }
$repeat = 0;
} else {
$repeat = false;
@@ -745,16 +782,22 @@ class DB_mssql extends DB_common
}
for ($i = 0; $i < $count; $i++) {
+ if ($got_string) {
+ $flags = $this->_mssql_field_flags($result,
+ @mssql_field_name($id, $i));
+ if (DB::isError($flags)) {
+ return $flags;
+ }
+ } else {
+ $flags = '';
+ }
+
$res[$i] = array(
'table' => $got_string ? $case_func($result) : '',
'name' => $case_func(@mssql_field_name($id, $i)),
'type' => @mssql_field_type($id, $i),
'len' => @mssql_field_length($id, $i),
- // We only support flags for table
- 'flags' => $got_string
- ? $this->_mssql_field_flags($result,
- @mssql_field_name($id, $i))
- : '',
+ 'flags' => $flags,
);
if ($mode & DB_TABLEINFO_ORDER) {
$res['order'][$res[$i]['name']] = $i;
@@ -805,7 +848,10 @@ class DB_mssql extends DB_common
$tableName = $table;
// get unique and primary keys
- $res = $this->getAll("EXEC SP_HELPINDEX[$table]", DB_FETCHMODE_ASSOC);
+ $res = $this->getAll("EXEC SP_HELPINDEX $table", DB_FETCHMODE_ASSOC);
+ if (DB::isError($res)) {
+ return $res;
+ }
foreach ($res as $val) {
$keys = explode(', ', $val['index_keys']);
@@ -828,7 +874,10 @@ class DB_mssql extends DB_common
}
// get auto_increment, not_null and timestamp
- $res = $this->getAll("EXEC SP_COLUMNS[$table]", DB_FETCHMODE_ASSOC);
+ $res = $this->getAll("EXEC SP_COLUMNS $table", DB_FETCHMODE_ASSOC);
+ if (DB::isError($res)) {
+ return $res;
+ }
foreach ($res as $val) {
$val = array_change_key_case($val, CASE_LOWER);