[Fwd: [PEAR-CVS] cvs: php4 /pear/DB mssql.php]

From: Date: Wed, 15 Aug 2001 19:04:54 +0000
Subject: [Fwd: [PEAR-CVS] cvs: php4 /pear/DB mssql.php]
Groups: php.pear.dev 
Request: Send a blank email to pear-dev+get-1498@lists.php.net to get a copy of this message
Hi Esben, I commited your contribution (avaible now in last CVS), thanks!. I've made a cuple of changes to improve its usability. Please test the changes and say me what you find wrong. Also I tried to build the error code map stuff, but as I haven't a way to test them or access a MS SQL server, I cann't map the native error codes to the pear ones (needed for better error reporting and also in nextID). I put a temporal trigger_error() when an error code is not found in errorcode_map to help you in the task. Tomas V.V.Cox Note that last changes are experimental, don't rely on them yet. "Thomas V.V.Cox" wrote: > > cox Wed Aug 15 14:48:06 2001 EDT > > Modified files: > /php4/pear/DB mssql.php > Log: > > - added sequences (emulated), contributed by: Esben Maaløe <acebone@f2s.com> > - added extension error handling: errorCode, mssqRaiseError, errorcode_map,... > > untested changes, please test them or provide a SQL Server :-) > > > Index: php4/pear/DB/mssql.php > diff -u php4/pear/DB/mssql.php:1.24 php4/pear/DB/mssql.php:1.25 > --- php4/pear/DB/mssql.php:1.24 Tue Jul 31 19:19:13 2001 > +++ php4/pear/DB/mssql.php Wed Aug 15 14:48:05 2001 > @@ -16,7 +16,7 @@ > // | Authors: Sterling Hughes <sterling@php.net> | > // +----------------------------------------------------------------------+ > // > -// $Id: mssql.php,v 1.24 2001/07/31 23:19:13 ssb Exp $ > +// $Id: mssql.php,v 1.25 2001/08/15 18:48:05 cox Exp $ > // > // Database independent query interface definition for PHP's Microsoft SQL Server > // extension. > @@ -43,6 +43,10 @@ > 'pconnect' => true, > 'transactions' => true > ); > + // XXX Add here error codes ie: 'S100E' => DB_ERROR_SYNTAX > + $this->errorcode_map = array( > + > + ); > } > > function connect($dsninfo, $persistent = false) > @@ -59,10 +63,15 @@ > } else { > $conn = @$connect_function($dbhost); > } > + if (!$conn) { > + return $this->raiseError(DB_ERROR_CONNECT_FAILED, null, null, > + null, mssql_get_last_message()); > + } > if ($dsninfo['database']) { > - @mssql_select_db($dsninfo['database'], $conn); > - } else { > - return $this->raiseError(mssql_get_last_message()); > + if (!@mssql_select_db($dsninfo['database'], $conn)) { > + return $this->raiseError(DB_ERROR_NODBSELECTED, null, null, > + null, mssql_get_last_message()); > + } > } > $this->connection = $conn; > return DB_OK; > @@ -84,14 +93,14 @@ > if ($this->transaction_opcount == 0) { > $result = @mssql_query('BEGIN TRAN', $this->connection); > if (!$result) { > - return $this->raiseError(mssql_get_last_message()); > + return $this->mssqlRaiseError(); > } > } > $this->transaction_opcount++; > } > $result = @mssql_query($query, $this->connection); > if (!$result) { > - return $this->raiseError(mssql_get_last_message()); > + return $this->mssqlRaiseError(); > } > // Determine which queries that should return data, and which > // should return an error code only. > @@ -149,7 +158,7 @@ > { > $cols = @mssql_num_fields($result); > if (!$cols) { > - return $this->raiseError(mssql_get_last_message()); > + return $this->mssqlRaiseError(); > } > return $cols; > } > @@ -158,7 +167,7 @@ > { > $rows = @mssql_num_rows($result); > if (!$rows) { > - return $this->raiseError(mssql_get_last_message()); > + return $this->mssqlRaiseError(); > } > return $rows; > } > @@ -186,7 +195,7 @@ > $result = @mssql_query('COMMIT TRAN', $this->connection); > $this->transaction_opcount = 0; > if (!$result) { > - return $this->raiseError(mssql_get_last_message()); > + return $this->mssqlRaiseError(); > } > } > return DB_OK; > @@ -204,7 +213,7 @@ > $result = @mssql_query('ROLLBACK TRAN', $this->connection); > $this->transaction_opcount = 0; > if (!$result) { > - return $this->raiseError(mssql_get_last_message()); > + return $this->mssqlRaiseError(); > } > } > return DB_OK; > @@ -224,7 +233,7 @@ > if (DB::isManip($this->last_query)) { > $res = @mssql_query('select @@rowcount', $this->connection); > if (!$res) { > - return $this->raiseError(mssql_get_last_message()); > + return $this->mssqlRaiseError(); > } > $ar = @mssql_fetch_row($res); > if (!$ar) { > @@ -232,13 +241,96 @@ > } else { > @mssql_free_result($res); > $result = $ar[0]; > - } > + } > } else { > $result = 0; > } > return $result; > } > + // {{{ nextId() > + > + /** > + * Get the next value in a sequence. We emulate sequences > + * for MSSQL. Will create the sequence if it does not exist. > + * > + * @access public > + * > + * @param $seq_name the name of the sequence > + * > + * @param $ondemand whether to create the sequence table on demand > + * (default is true) > + * > + * @return a sequence integer, or a DB error > + */ > + function nextId($seq_name, $ondemand = true) > + { > + $sqn = preg_replace('/[^a-z0-9_]/i', '_', $seq_name); > + $repeat = 0; > + do { > + $result = $this->query("INSERT INTO ${sqn}_seq (vapor) VALUES (0)"); > + if ($ondemand && DB::isError($result) && > + ($result->getCode() == DB_ERROR || $result->getCode() == > DB_ERROR_NOSUCHTABLE)) > + { > + $repeat = 1; > + $result = $this->createSequence($seq_name); > + if (DB::isError($result)) { > + return $result; > + } > + } else { > + $result = $this->query("SELECT @@IDENTITY FROM ${sqn}_seq"); > + $repeat = 0; > + } > + } while ($repeat); > + if (DB::isError($result)) { > + return $result; > + } > + $result = $result->fetchRow(); > + return $result[0]; > + } > > + // }}} > + // {{{ createSequence() > + > + function createSequence($seq_name) > + { > + $sqn = preg_replace('/[^a-z0-9_]/i', '_', $seq_name); > + return $this->query("CREATE TABLE ${sqn}_seq". > + '([id] [int] IDENTITY (1, 1) NOT NULL ,' . > + '[vapor] [int] NULL)'); > + } > + // }}} > + // {{{ dropSequence() > + > + function dropSequence($seq_name) > + { > + $sqn = preg_replace('/[^a-z0-9_]/i', '_', $seq_name); > + return $this->query("DROP TABLE ${sqn}_seq"); > + } > + // }}} > + > + function errorCode() > + { > + $this->pushErrorHandling(PEAR_ERROR_RETURN); > + $error_code = $this->getOne('select @@ERROR as ErrorCode'); > + $this->popErrorHandling(); > + // XXX Debug > + if (!isset($this->errorcode_map[$error_code])) { > + trigger_error("Error code: '$error_code' is not defined, please add > it to \$this->errorcode_map", E_USER_WARNING); > + } > + return $error_code; > + } > + > + function mssqlRaiseError($code = null) > + { > + if ($code !== null) { > + $code = $this->errorCode(); > + if (DB::isError($code)) { > + return $this->raiseError($code); > + } > + } > + return $this->raiseError($code, null, null, null, > + mssql_get_last_message()); > + } > } > > -?> > +?> > \ No newline at end of file > > -- > PEAR CVS Mailing List (http://pear.php.net/) > To unsubscribe, e-mail: pear-cvs-unsubscribe@lists.php.net > For additional commands, e-mail: pear-cvs-help@lists.php.net > To contact the list administrators, e-mail: php-list-admin@lists.php.net

« previous php.pear.dev (#1498) next »