ssb Thu Mar 22 17:15:10 2001 EDT Modified files: /php4/pear DB.php PEAR.php.in /php4/pear/DB STATUS common.php oci8.php /php4/pear/DB/tests errors.inc fetchrow.inc numrows.inc sequences.inc /php4/pear/DB/tests/ibase mktable.inc /php4/pear/DB/tests/mysql mktable.inc /php4/pear/DB/tests/oci8 002.phpt 007.phpt 009.phpt 010.phpt connect.inc mktable.inc skipif.inc /php4/pear/DB/tests/odbc mktable.inc /php4/pear/DB/tests/pgsql mktable.inc Log: * fixed Oracle tests, fixed some bugs in DB_oci8, all tests but errorNative() pass now (but that may be a bug in the test :-) * implemented numRows() emulation in DB_oci8 that is available in "optimize portability" mode only
Index: php4/pear/DB.php diff -u php4/pear/DB.php:1.51 php4/pear/DB.php:1.52 --- php4/pear/DB.php:1.51 Tue Mar 20 20:15:40 2001 +++ php4/pear/DB.php Thu Mar 22 17:15:05 2001 @@ -17,7 +17,7 @@ // | Tomas V.V.Cox <[EMAIL PROTECTED]> | // +----------------------------------------------------------------------+ // -// $Id: DB.php,v 1.51 2001/03/21 04:15:40 jon Exp $ +// $Id: DB.php,v 1.52 2001/03/23 01:15:05 ssb Exp $ // // Database independent query interface. // @@ -56,6 +56,7 @@ define("DB_ERROR_NOT_LOCKED", -21); define("DB_ERROR_VALUE_COUNT_ON_ROW", -22); define("DB_ERROR_INVALID_DSN", -23); +define("DB_ERROR_CONNECT_FAILED", -24); /* * Warnings are not detected as errors by DB::isError(), and are not @@ -326,6 +327,8 @@ DB_ERROR_SYNTAX => 'syntax error', DB_ERROR_UNSUPPORTED => 'not supported', DB_ERROR_VALUE_COUNT_ON_ROW => 'value count on row', + DB_ERROR_INVALID_DSN => "invalid DSN", + DB_ERROR_CONNECT_FAILED => "connect failed", DB_OK => 'no error', DB_WARNING => 'unknown warning', DB_WARNING_READ_ONLY => 'read only' Index: php4/pear/PEAR.php.in diff -u php4/pear/PEAR.php.in:1.15 php4/pear/PEAR.php.in:1.16 --- php4/pear/PEAR.php.in:1.15 Sat Mar 10 01:59:15 2001 +++ php4/pear/PEAR.php.in Thu Mar 22 17:15:05 2001 @@ -17,7 +17,7 @@ // | Stig Bakken <[EMAIL PROTECTED]> | // +----------------------------------------------------------------------+ // -// $Id: PEAR.php.in,v 1.15 2001/03/10 09:59:15 ssb Exp $ +// $Id: PEAR.php.in,v 1.16 2001/03/23 01:15:05 ssb Exp $ // define('PEAR_ERROR_RETURN', 1); @@ -513,12 +513,12 @@ $modes[] = "return"; } return sprintf('[%s: message="%s" code=%d mode=%s level=%s prefix="%s" '. - 'prepend="%s" append="%s" debug="%s"]', + 'prepend="%s" append="%s" info="%s"]', get_class($this), $this->message, $this->code, implode("|", $modes), $levels[$this->level], $this->error_message_prefix, $this->error_prepend, $this->error_append, - $this->debuginfo); + $this->userinfo); } // }}} Index: php4/pear/DB/STATUS diff -u php4/pear/DB/STATUS:1.14 php4/pear/DB/STATUS:1.15 --- php4/pear/DB/STATUS:1.14 Sun Jan 14 17:19:28 2001 +++ php4/pear/DB/STATUS Thu Mar 22 17:15:06 2001 @@ -10,14 +10,14 @@ "-" - no implementation of this feature FEATURE ibase msql mssql mysql oci8 odbc pgsql sybase -simpleQuery x x x T x x T x -numCols x x x T x x T x -numRows n x x T n n T n +simpleQuery x x x T T x T x +numCols x x x T T x T x +numRows n x x T E n T n errorNative n n n T x x T n -prepare/execute x e e E x e E e -sequences n n n E n n T n -affectedRows n n n T x n T n -fetch modes x x x T x x T x +prepare/execute x e e E T e E e +sequences n n n E T n T n +affectedRows n n n T T n T n +fetch modes x x x T T x T x transactions x n n n x x x n auto-commit x n n n x x x n -error mapping - - - T - x E - +error mapping - - - T T x E - Index: php4/pear/DB/common.php diff -u php4/pear/DB/common.php:1.39 php4/pear/DB/common.php:1.40 --- php4/pear/DB/common.php:1.39 Mon Mar 12 01:33:21 2001 +++ php4/pear/DB/common.php Thu Mar 22 17:15:06 2001 @@ -161,10 +161,10 @@ * */ - function &raiseError($code = DB_ERROR, $mode = false, $level = false, - $debuginfo = false, $nativecode = false) + function &raiseError($code = DB_ERROR, $mode = null, $level = null, + $debuginfo = null, $nativecode = null) { - if (!$mode) { + if ($mode === null) { $mode = $this->error_mode; } @@ -175,12 +175,12 @@ $level = $this->error_callback; } } else { - if (!$level) { + if ($level === null) { $level = $this->error_level; } } - if (!$debuginfo) { + if ($debuginfo === null) { $debuginfo = $this->last_query; } Index: php4/pear/DB/oci8.php diff -u php4/pear/DB/oci8.php:1.20 php4/pear/DB/oci8.php:1.21 --- php4/pear/DB/oci8.php:1.20 Mon Mar 12 04:50:44 2001 +++ php4/pear/DB/oci8.php Thu Mar 22 17:15:06 2001 @@ -34,122 +34,132 @@ { // {{{ properties - var $connection; - var $phptype, $dbsyntax; - var $manip_query = array(); - var $prepare_types = array(); - var $autoCommit = 1; - var $last_stmt = false; + var $connection; + var $phptype, $dbsyntax; + var $manip_query = array(); + var $prepare_types = array(); + var $autoCommit = 1; + var $last_stmt = false; // }}} // {{{ constructor - function DB_oci8() + function DB_oci8() { $this->DB_common(); - $this->phptype = 'oci8'; - $this->dbsyntax = 'oci8'; - $this->features = array( - 'prepare' => false, - 'pconnect' => true, - 'transactions' => true - ); - $this->errorcode_map = array(); - } + $this->phptype = 'oci8'; + $this->dbsyntax = 'oci8'; + $this->features = array( + 'prepare' => false, + 'pconnect' => true, + 'transactions' => true + ); + $this->errorcode_map = array( + 900 => DB_ERROR_SYNTAX, + 904 => DB_ERROR_NOSUCHFIELD, + 923 => DB_ERROR_SYNTAX, + 942 => DB_ERROR_NOSUCHTABLE, + 955 => DB_ERROR_ALREADY_EXISTS, + 1476 => DB_ERROR_DIVZERO, + 1722 => DB_ERROR_INVALID_NUMBER, + 2289 => DB_ERROR_NOSUCHTABLE, + 2291 => DB_ERROR_CONSTRAINT, + 2449 => DB_ERROR_CONSTRAINT, + ); + } // }}} // {{{ connect() - /** - * Connect to a database and log in as the specified user. - * - * @param $dsn the data source name (see DB::parseDSN for syntax) - * @param $persistent (optional) whether the connection should - * be persistent - * - * @return int DB_OK on success, a DB error code on failure - */ - function connect($dsn, $persistent = false) - { - if (is_array($dsn)) { - $dsninfo = &$dsn; - } else { - $dsninfo = DB::parseDSN($dsn); - } - if (!$dsninfo || !$dsninfo['phptype']) { - return $this->raiseError(); - } + /** + * Connect to a database and log in as the specified user. + * + * @param $dsn the data source name (see DB::parseDSN for syntax) + * @param $persistent (optional) whether the connection should + * be persistent + * + * @return int DB_OK on success, a DB error code on failure + */ + function connect($dsn, $persistent = false) + { + if (is_array($dsn)) { + $dsninfo = &$dsn; + } else { + $dsninfo = DB::parseDSN($dsn); + } + if (!$dsninfo || !$dsninfo['phptype']) { + return $this->raiseError(DB_ERROR_INVALID_DSN); + } $this->dsn = $dsninfo; - $user = $dsninfo['username']; - $pw = $dsninfo['password']; - $hostspec = $dsninfo['hostspec']; + $user = $dsninfo['username']; + $pw = $dsninfo['password']; + $hostspec = $dsninfo['hostspec']; DB::assertExtension("oci8"); - $connect_function = $persistent ? 'OCIPLogon' : 'OCILogon'; - if ($hostspec) { - $conn = @$connect_function($user,$pw,$hostspec); - } elseif ($user || $pw) { - $conn = @$connect_function($user,$pw); - } else { - $conn = false; - } - if ($conn == false) { - return $this->raiseError(); - } - $this->connection = $conn; - return DB_OK; - } + $connect_function = $persistent ? 'OCIPLogon' : 'OCILogon'; + if ($hostspec) { + $conn = @$connect_function($user,$pw,$hostspec); + } elseif ($user || $pw) { + $conn = @$connect_function($user,$pw); + } else { + $conn = false; + } + if ($conn == false) { + return $this->raiseError(DB_ERROR_CONNECT_FAILED); + } + $this->connection = $conn; + return DB_OK; + } // }}} // {{{ disconnect() - /** - * Log out and disconnect from the database. - * - * @return bool TRUE on success, FALSE if not connected. - */ - function disconnect() + /** + * Log out and disconnect from the database. + * + * @return bool TRUE on success, FALSE if not connected. + */ + function disconnect() { - return @OCILogOff($this->connection); - } + return @OCILogOff($this->connection); + } // }}} // {{{ simpleQuery() - /** - * Send a query to oracle and return the results as an oci8 resource - * identifier. - * - * @param $query the SQL query - * - * @return int returns a valid oci8 result for successful SELECT - * queries, DB_OK for other successful queries. A DB error code - * is returned on failure. - */ - function simpleQuery($query) + /** + * Send a query to oracle and return the results as an oci8 resource + * identifier. + * + * @param $query the SQL query + * + * @return int returns a valid oci8 result for successful SELECT + * queries, DB_OK for other successful queries. A DB error code + * is returned on failure. + */ + function simpleQuery($query) { - $this->last_query = $query; + $this->last_query = $query; $query = $this->modifyQuery($query); - $result = @OCIParse($this->connection, $query); - if (!$result) { - return $this->raiseError(); - } - if ($this->autoCommit) { - $success = @OCIExecute($result,OCI_COMMIT_ON_SUCCESS); - } - else { - $success = @OCIExecute($result,OCI_DEFAULT); - } - if (!$success) { - return $this->raiseError(); - } - $this->last_stmt=$result; - // Determine which queries that should return data, and which - // should return an error code only. + $result = @OCIParse($this->connection, $query); + if (!$result) { + return $this->oci8RaiseError(); + } + if ($this->autoCommit) { + $success = @OCIExecute($result,OCI_COMMIT_ON_SUCCESS); + } else { + $success = @OCIExecute($result,OCI_DEFAULT); + } + if (!$success) { + return $this->oci8RaiseError($result); + } + $this->last_stmt=$result; + // Determine which queries that should return data, and which + // should return an error code only. return DB::isManip($query) ? DB_OK : $result; - } + } - // }}} + // }}} // {{{ fetchRow() /** @@ -163,280 +173,303 @@ */ function &fetchRow($result, $fetchmode = DB_FETCHMODE_DEFAULT) { - if ($fetchmode == DB_FETCHMODE_DEFAULT) { - $fetchmode = $this->fetchmode; - } - if ($fetchmode & DB_FETCHMODE_ASSOC) { - $moredata = @OCIFetchInto($result, $row, OCI_ASSOC + OCI_RETURN_NULLS + OCI_RETURN_LOBS); - } else { - $moredata = @OCIFetchInto($result, $row, OCI_RETURN_NULLS + OCI_RETURN_LOBS); - } - if (!$row) { - return $this->raiseError(); - } - if ($moredata == NULL) { - return NULL; - } - return $row; + if ($fetchmode == DB_FETCHMODE_DEFAULT) { + $fetchmode = $this->fetchmode; + } + if ($fetchmode & DB_FETCHMODE_ASSOC) { + $moredata = @OCIFetchInto($result, $row, OCI_ASSOC + OCI_RETURN_NULLS + +OCI_RETURN_LOBS); + } else { + $moredata = @OCIFetchInto($result, $row, OCI_RETURN_NULLS + +OCI_RETURN_LOBS); + } + if (!$moredata) { + return NULL; + } + return $row; } // }}} // {{{ fetchInto() - /** - * Fetch a row and insert the data into an existing array. - * - * @param $result oci8 result identifier - * @param $arr (reference) array where data from the row is stored - * @param $fetchmode how the array data should be indexed - * - * @return int DB_OK on success, a DB error code on failure - */ - function fetchInto($result, &$arr, $fetchmode = DB_FETCHMODE_DEFAULT) - { - if ($fetchmode == DB_FETCHMODE_DEFAULT) { - $fetchmode = $this->fetchmode; - } - if ($fetchmode & DB_FETCHMODE_ASSOC) { - $moredata = @OCIFetchInto($result,$arr,OCI_ASSOC+OCI_RETURN_NULLS+OCI_RETURN_LOBS); - } else { - $moredata = @OCIFetchInto($result,$arr,OCI_RETURN_NULLS+OCI_RETURN_LOBS); - } - if (!($arr && $moredata)) { - return $this->raiseError(); - } - return DB_OK; - } + /** + * Fetch a row and insert the data into an existing array. + * + * @param $result oci8 result identifier + * @param $arr (reference) array where data from the row is stored + * @param $fetchmode how the array data should be indexed + * + * @return int DB_OK on success, a DB error code on failure + */ + function fetchInto($result, &$arr, $fetchmode = DB_FETCHMODE_DEFAULT) + { + if ($fetchmode == DB_FETCHMODE_DEFAULT) { + $fetchmode = $this->fetchmode; + } + if ($fetchmode & DB_FETCHMODE_ASSOC) { + $moredata = +@OCIFetchInto($result,$arr,OCI_ASSOC+OCI_RETURN_NULLS+OCI_RETURN_LOBS); + } else { + $moredata = @OCIFetchInto($result,$arr,OCI_RETURN_NULLS+OCI_RETURN_LOBS); + } + if (!($arr && $moredata)) { + return $this->oci8RaiseError($result); + } + return DB_OK; + } - // }}} + // }}} // {{{ freeResult() - /** - * Free the internal resources associated with $result. - * - * @param $result oci8 result identifier or DB statement identifier - * - * @return bool TRUE on success, FALSE if $result is invalid - */ - function freeResult($result) - { - if (is_resource($result)) { - return @OCIFreeStatement($result); - } - if (!isset($this->prepare_tokens[$result])) { - return false; - } - unset($this->prepare_tokens[$result]); - unset($this->prepare_types[$result]); - return true; - } + /** + * Free the internal resources associated with $result. + * + * @param $result oci8 result identifier or DB statement identifier + * + * @return bool TRUE on success, FALSE if $result is invalid + */ + function freeResult($result) + { + if (is_resource($result)) { + return @OCIFreeStatement($result); + } + if (!isset($this->prepare_tokens[$result])) { + return false; + } + unset($this->prepare_tokens[$result]); + unset($this->prepare_types[$result]); + unset($this->manip_query[$result]); + return true; + } + + // }}} + // {{{ numRows() + + function numRows($result) + { + // emulate numRows for Oracle. yuck. + if ($this->options['optimize'] == 'portability' && + $result === $this->last_stmt) { + $countquery = preg_replace('/^\s*SELECT\s+(.*)\s+FROM\s+/i', + 'SELECT COUNT(\1) FROM ', + $this->last_query); + $save_query = $this->last_query; + $save_stmt = $this->last_stmt; + $count = $this->query($countquery); + if (DB::isError($count) || + DB::isError($row = $count->fetchRow(DB_FETCHMODE_ORDERED))) + { + $this->last_query = $save_query; + $this->last_stmt = $save_stmt; + return $this->raiseError(DB_ERROR_NOT_CAPABLE); + } + return $row[0]; + } + return $this->raiseError(DB_ERROR_NOT_CAPABLE); + } - // }}} + // }}} // {{{ numCols() - /** - * Get the number of columns in a result set. - * - * @param $result oci8 result identifier - * - * @return int the number of columns per row in $result - */ - function numCols($result) - { - $cols = @OCINumCols($result); - if (!$cols) { - return $this->raiseError(); - } - return $cols; - } + /** + * Get the number of columns in a result set. + * + * @param $result oci8 result identifier + * + * @return int the number of columns per row in $result + */ + function numCols($result) + { + $cols = @OCINumCols($result); + if (!$cols) { + return $this->oci8RaiseError($result); + } + return $cols; + } // }}} // {{{ errorNative() - /** - * Get the native error code of the last error (if any) that occured - * on the current connection. This does not work, as OCIError does - * not work unless given a statement. If OCIError does return - * something, so will this. - * - * @return int native oci8 error code - */ - function errorNative() - { - $error = @OCIError($this->connection); - if (is_array($error)) { - return $error['code']; - } - return false; - } + /** + * Get the native error code of the last error (if any) that occured + * on the current connection. This does not work, as OCIError does + * not work unless given a statement. If OCIError does return + * something, so will this. + * + * @return int native oci8 error code + */ + function errorNative() + { + if (is_resource($this->last_stmt)) { + $error = @OCIError($this->last_stmt); + } else { + $error = @OCIError($this->connection); + } + if (is_array($error)) { + return $error['code']; + } + return false; + } // }}} // {{{ prepare() - /** - * Prepares a query for multiple execution with execute(). With - * oci8, this is emulated. - * @param $query query to be prepared - * - * @return DB statement resource - */ - function prepare($query) - { - $tokens = split('[\&\?]', $query); - $token = 0; - $types = array(); - for ($i = 0; $i < strlen($query); $i++) { - switch ($query[$i]) { - case '?': - $types[$token++] = DB_PARAM_SCALAR; - break; - case '&': - $types[$token++] = DB_PARAM_OPAQUE; - break; - } - } - $binds = sizeof($tokens) - 1; - for ($i = 0; $i < $binds; $i++) { - $newquery .= $tokens[$i] . ":bind" . $i; - } - $newquery .= $tokens[$i]; - $this->last_query = $query; + /** + * Prepares a query for multiple execution with execute(). With + * oci8, this is emulated. + * @param $query query to be prepared + * + * @return DB statement resource + */ + function prepare($query) + { + $tokens = split('[\&\?]', $query); + $token = 0; + $types = array(); + for ($i = 0; $i < strlen($query); $i++) { + switch ($query[$i]) { + case '?': + $types[$token++] = DB_PARAM_SCALAR; + break; + case '&': + $types[$token++] = DB_PARAM_OPAQUE; + break; + } + } + $binds = sizeof($tokens) - 1; + for ($i = 0; $i < $binds; $i++) { + $newquery .= $tokens[$i] . ":bind" . $i; + } + $newquery .= $tokens[$i]; + $this->last_query = $query; $newquery = $this->modifyQuery($newquery); - $stmt = @OCIParse($this->connection, $newquery); - $this->prepare_types[$stmt] = $types; - $this->manip_query[$stmt] = DB::isManip($query); - return $stmt; - } + $stmt = @OCIParse($this->connection, $newquery); + $this->prepare_types[$stmt] = $types; + $this->manip_query[$stmt] = DB::isManip($query); + return $stmt; + } // }}} // {{{ execute() - /** - * Executes a DB statement prepared with prepare(). - * - * @param $stmt a DB statement resource (returned from prepare()) - * @param $data data to be used in execution of the statement - * - * @return int returns an oci8 result resource for successful - * SELECT queries, DB_OK for other successful queries. A DB error - * code is returned on failure. - */ - function execute($stmt, $data = false) - { - $types=&$this->prepare_types[$stmt]; - if (($size=sizeof($types))!=sizeof($data)) { - return $this->raiseError(); - } - for ($i=0;$i<$size;$i++) { - if (is_array($data)) { - $pdata[$i]=$data[$i]; - } - else { - $pdata[$i]=$data; - } - if ($types[$i]==DB_PARAM_OPAQUE) { - $fp = fopen($pdata[$i], "r"); - $pdata = ''; - if ($fp) { - while (($buf = fread($fp, 4096)) != false) { - $pdata[$i] .= $buf; - } - } - } - if (!@OCIBindByName($stmt,":bind".$i,$pdata[$i],-1)) { - return $this->raiseError(); - } - } - if ($this->autoCommit) { - $success = @OCIExecute($stmt,OCI_COMMIT_ON_SUCCESS); - } - else { - $success = @OCIExecute($stmt,OCI_DEFAULT); - } - if (!$success) { - return $this->raiseError(); - } - $this->last_stmt=$stmt; - if ($this->manip_query[$stmt]) { - return $DB_OK; - } else { - return $stmt; - } - } + /** + * Executes a DB statement prepared with prepare(). + * + * @param $stmt a DB statement resource (returned from prepare()) + * @param $data data to be used in execution of the statement + * + * @return int returns an oci8 result resource for successful + * SELECT queries, DB_OK for other successful queries. A DB error + * code is returned on failure. + */ + function execute($stmt, $data = false) + { + $types=&$this->prepare_types[$stmt]; + if (($size = sizeof($types)) != sizeof($data)) { + return $this->raiseError(DB_ERROR_MISMATCH); + } + for ($i = 0; $i < $size; $i++) { + if (is_array($data)) { + $pdata[$i] = $data[$i]; + } + else { + $pdata[$i] = $data; + } + if ($types[$i] == DB_PARAM_OPAQUE) { + $fp = fopen($pdata[$i], "r"); + $pdata = ''; + if ($fp) { + while (($buf = fread($fp, 4096)) != false) { + $pdata[$i] .= $buf; + } + } + } + if (!@OCIBindByName($stmt, ":bind" . $i, $pdata[$i], -1)) { + return $this->oci8RaiseError($stmt); + } + } + if ($this->autoCommit) { + $success = @OCIExecute($stmt, OCI_COMMIT_ON_SUCCESS); + } + else { + $success = @OCIExecute($stmt, OCI_DEFAULT); + } + if (!$success) { + return $this->oci8RaiseError($stmt); + } + $this->last_stmt = $stmt; + if ($this->manip_query[$stmt]) { + return $DB_OK; + } else { + return $stmt; + } + } // }}} // {{{ autoCommit() - /** - * Enable/disable automatic commits - * - * @param $onoff true/false whether to autocommit - */ - function autoCommit($onoff = false) - { - if (!$onoff) { - $this->autoCommit = 0; - } - else { - $this->autoCommit = 1; - } - return DB_OK; - } + /** + * Enable/disable automatic commits + * + * @param $onoff true/false whether to autocommit + */ + function autoCommit($onoff = false) + { + $this->autoCommit = (bool)$onoff;; + return DB_OK; + } // }}} // {{{ commit() - /** - * Commit transactions on the current connection - * - * @return DB_ERROR or DB_OK - */ - function commit() - { - $result = @OCICommit($this->connection); - if (!$result) { - return $this->raiseError(); - } - return DB_OK; - } + /** + * Commit transactions on the current connection + * + * @return DB_ERROR or DB_OK + */ + function commit() + { + $result = @OCICommit($this->connection); + if (!$result) { + return $this->oci8RaiseError(); + } + return DB_OK; + } // }}} // {{{ rollback() - /** - * Roll back all uncommitted transactions on the current connection. - * - * @return DB_ERROR or DB_OK - */ - function rollback() - { - $result = @OCIRollback($this->connection); - if (!$result) { - return $this->raiseError(); - } - return DB_OK; - } + /** + * Roll back all uncommitted transactions on the current connection. + * + * @return DB_ERROR or DB_OK + */ + function rollback() + { + $result = @OCIRollback($this->connection); + if (!$result) { + return $this->oci8RaiseError(); + } + return DB_OK; + } // }}} // {{{ affectedRows() - /** - * Gets the number of rows affected by the last query. - * if the last query was a select, returns 0. - * - * @return number of rows affected by the last query or DB_ERROR - */ - function affectedRows() - { - if ($this->last_stmt === false) { - return $this->raiseError(); - } - $result = @OCIRowCount($this->last_stmt); - if ($result === false) { - return $this->raiseError(); - } - return $result; - } + /** + * Gets the number of rows affected by the last query. + * if the last query was a select, returns 0. + * + * @return number of rows affected by the last query or DB_ERROR + */ + function affectedRows() + { + if ($this->last_stmt === false) { + return $this->oci8RaiseError(); + } + $result = @OCIRowCount($this->last_stmt); + if ($result === false) { + return $this->oci8RaiseError($this->last_stmt); + } + return $result; + } // }}} // {{{ modifyQuery() @@ -453,13 +486,88 @@ // }}} // {{{ quoteString() + + function quoteString($string) + { + return str_replace("'", "''", $string); + } + + // }}} + // {{{ nextId() + + /** + * Get the next value in a sequence. We emulate sequences + * for MySQL. 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("SELECT ${sqn}_seq.nextval FROM dual"); + if ($ondemand && DB::isError($result) && + $result->getCode() == DB_ERROR_NOSUCHTABLE) { + $repeat = 1; + $result = $this->createSequence($seq_name); + if (DB::isError($result)) { + return $result; + } + } else { + $repeat = 0; + } + } while ($repeat); + if (DB::isError($result)) { + return $result; + } + $arr = $result->fetchRow(DB_FETCHMODE_ORDERED); + return $arr[0]; + } + + // }}} + // {{{ createSequence() - function quoteString($string) + function createSequence($seq_name) { - return str_replace("'", "''", $string); - } + $sqn = preg_replace('/[^a-z0-9_]/i', '_', $seq_name); + return $this->query("CREATE SEQUENCE ${sqn}_seq"); + } - // }}} + // }}} + // {{{ dropSequence() + + function dropSequence($seq_name) + { + $sqn = preg_replace('/[^a-z0-9_]/i', '_', $seq_name); + return $this->query("DROP SEQUENCE ${sqn}_seq"); + } + + // }}} + // {{{ oci8RaiseError() + + function oci8RaiseError($errno = null) + { + if ($errno === null) { + $error = @OCIError($this->connection); + return $this->raiseError($this->errorCode($error['code']), + null, null, null, $error['message']); + } elseif (is_resource($errno)) { + $error = @OCIError($errno); + return $this->raiseError($this->errorCode($error['code']), + null, null, null, $error['message']); + } + return $this->raiseError($this->errorCode($errno)); + } + + // }}} } // Local variables: Index: php4/pear/DB/tests/errors.inc diff -u php4/pear/DB/tests/errors.inc:1.1 php4/pear/DB/tests/errors.inc:1.2 --- php4/pear/DB/tests/errors.inc:1.1 Thu Dec 14 18:36:18 2000 +++ php4/pear/DB/tests/errors.inc Thu Mar 22 17:15:06 2001 @@ -2,10 +2,14 @@ function errhandler($obj) { - $msg = $obj->getMessage(); - print " $msg"; - if (substr($msg, -1) != "\n") { - print "\n"; + if ($obj->getCode() == DB_ERROR) { + print " unknown: ".$obj->getUserInfo()."\n"; + } else { + $msg = $obj->getMessage(); + print " $msg"; + if (substr($msg, -1) != "\n") { + print "\n"; + } } } @@ -15,7 +19,7 @@ $dbh->query("SELECT * FROM tableThatDoesNotExist"); print "Trying to provoke DB_ERROR_ALREADY_EXISTS\n"; -$dbh->query("CREATE TABLE phptest (a INTEGER, b VARCHAR(40), c TEXT, d DATE)"); +$dbh->query($test_mktable_query); print "Trying to provoke DB_ERROR_NOSUCHTABLE\n"; $dbh->query("DROP TABLE tableThatDoesNotExist"); Index: php4/pear/DB/tests/fetchrow.inc diff -u php4/pear/DB/tests/fetchrow.inc:1.1 php4/pear/DB/tests/fetchrow.inc:1.2 --- php4/pear/DB/tests/fetchrow.inc:1.1 Sun Feb 18 16:50:30 2001 +++ php4/pear/DB/tests/fetchrow.inc Thu Mar 22 17:15:06 2001 @@ -10,6 +10,10 @@ for ($i = 1; $i <= 5; $i++) { print "row $i: "; $row = $sth->fetchRow(); + if (DB::isError($row)) { + print $row->toString() . "\n"; + continue; + } if (is_array($row)) { print implode(", ", $row) . "\n"; } else { Index: php4/pear/DB/tests/numrows.inc diff -u php4/pear/DB/tests/numrows.inc:1.4 php4/pear/DB/tests/numrows.inc:1.5 --- php4/pear/DB/tests/numrows.inc:1.4 Sun Feb 18 16:49:07 2001 +++ php4/pear/DB/tests/numrows.inc Thu Mar 22 17:15:06 2001 @@ -1,11 +1,10 @@ <?php -function errhandler($obj) +if (!function_exists("errhandler")) { - $msg = $obj->getMessage(); - print "$msg"; - if (substr($msg, -1) != "\n") { - print "\n"; + function errhandler($obj) + { + printf("%s\n", $obj->getMessage()); } } @@ -15,17 +14,33 @@ $dbh->setErrorHandling(PEAR_ERROR_DIE); } $sth = $dbh->query("SELECT a FROM phptest"); -printf("%d\n", $sth->numRows()); +if (!DB::isError($rows = $sth->numRows())) { + print "$rows\n"; +} else { + print "\n"; +} for ($i = 0; $i < 5; $i++) { $sth = $dbh->query("INSERT INTO phptest (a) VALUES($i)"); $sth = $dbh->query("SELECT a FROM phptest"); - printf("%d\n", $sth->numRows()); + if (!DB::isError($rows = $sth->numRows())) { + print "$rows\n"; + } else { + print "\n"; + } } $dbh->query("DELETE FROM phptest WHERE a < 4"); $sth = $dbh->query("SELECT a FROM phptest"); -printf("%d\n", $sth->numRows()); +if (!DB::isError($rows = $sth->numRows())) { + print "$rows\n"; +} else { + print "\n"; +} $sth = $dbh->query("SELECT a FROM phptest where a < 0"); -printf("%d\n", $sth->numRows()); +if (!DB::isError($rows = $sth->numRows())) { + print "$rows\n"; +} else { + print "\n"; +} $dbh->setErrorHandling(PEAR_ERROR_CALLBACK, "errhandler"); $test = $dbh->numRows(false); Index: php4/pear/DB/tests/sequences.inc diff -u php4/pear/DB/tests/sequences.inc:1.1 php4/pear/DB/tests/sequences.inc:1.2 --- php4/pear/DB/tests/sequences.inc:1.1 Wed Dec 13 06:41:04 2000 +++ php4/pear/DB/tests/sequences.inc Thu Mar 22 17:15:06 2001 @@ -7,12 +7,12 @@ $a = $dbh->nextId("test"); $b = $dbh->nextId("test"); if (DB::isError($a)) { - print "a: ".$a->getMessage()."\n"; + print "a: ".$a->toString()."\n"; } else { print "a=$a\n"; } if (DB::isError($b)) { - print "b: ".$b->getMessage()."\n"; + print "b: ".$b->toString()."\n"; } else { print "b=$b\n"; } Index: php4/pear/DB/tests/ibase/mktable.inc diff -u php4/pear/DB/tests/ibase/mktable.inc:1.2 php4/pear/DB/tests/ibase/mktable.inc:1.3 --- php4/pear/DB/tests/ibase/mktable.inc:1.2 Sun Feb 18 16:50:30 2001 +++ php4/pear/DB/tests/ibase/mktable.inc Thu Mar 22 17:15:07 2001 @@ -6,7 +6,8 @@ $dbh->query("DROP TABLE phptest"); $dbh->setErrorHandling(PEAR_ERROR_TRIGGER); -$dbh->query("CREATE TABLE phptest (a INTEGER, b VARCHAR(40), c TEXT, d DATE)"); +$test_mktable_query = "CREATE TABLE phptest (a INTEGER, b VARCHAR(40), c TEXT, d +DATE)" +$dbh->query($test_mktable_query); $dbh->query("INSERT INTO phptest VALUES(42, 'bing', 'This is a test', '1999-11-21')"); $dbh->setErrorHandling(PEAR_ERROR_RETURN); Index: php4/pear/DB/tests/mysql/mktable.inc diff -u php4/pear/DB/tests/mysql/mktable.inc:1.3 php4/pear/DB/tests/mysql/mktable.inc:1.4 --- php4/pear/DB/tests/mysql/mktable.inc:1.3 Sun Feb 18 16:50:30 2001 +++ php4/pear/DB/tests/mysql/mktable.inc Thu Mar 22 17:15:07 2001 @@ -6,7 +6,8 @@ $dbh->query("DROP TABLE phptest"); $dbh->setErrorHandling(PEAR_ERROR_TRIGGER); -$dbh->query("CREATE TABLE phptest (a INTEGER, b VARCHAR(40), c TEXT, d DATE)"); +$test_mktable_query = "CREATE TABLE phptest (a INTEGER, b VARCHAR(40), c TEXT, d +DATE)"; +$dbh->query($test_mktable_query); $dbh->query("INSERT INTO phptest VALUES(42, 'bing', 'This is a test', '1999-11-21')"); $dbh->setErrorHandling(PEAR_ERROR_RETURN); Index: php4/pear/DB/tests/oci8/002.phpt diff -u php4/pear/DB/tests/oci8/002.phpt:1.1 php4/pear/DB/tests/oci8/002.phpt:1.2 --- php4/pear/DB/tests/oci8/002.phpt:1.1 Sun Feb 18 16:49:07 2001 +++ php4/pear/DB/tests/oci8/002.phpt Thu Mar 22 17:15:07 2001 @@ -11,10 +11,10 @@ ?> --EXPECT-- testing fetchrow: -row 1: 42, bing, This is a test, 11-21-1999 -row 2: 1, one, One, 02-16-2001 -row 3: 2, two, Two, 02-15-2001 -row 4: 3, three, Three, 02-14-2001 +row 1: 42, bing, This is a test, 1999-11-21 +row 2: 1, one, One, 2001-02-16 +row 3: 2, two, Two, 2001-02-15 +row 4: 3, three, Three, 2001-02-14 row 5: NULL testing fetchmodes: fetchrow default default 0 1 2 3 @@ -23,16 +23,16 @@ testing fetchmodes: fetchrow ordered default 0 1 2 3 testing fetchmodes: fetchrow assoc default -a b c d +A B C D testing fetchmodes: fetchrow ordered default with assoc specified -a b c d +A B C D testing fetchmodes: fetchrow assoc default with ordered specified 0 1 2 3 testing fetchmodes: fetchinto ordered default 0 1 2 3 testing fetchmodes: fetchinto assoc default -a b c d +A B C D testing fetchmodes: fetchinto ordered default with assoc specified -a b c d +A B C D testing fetchmodes: fetchinto assoc default with ordered specified 0 1 2 3 Index: php4/pear/DB/tests/oci8/007.phpt diff -u php4/pear/DB/tests/oci8/007.phpt:1.1 php4/pear/DB/tests/oci8/007.phpt:1.2 --- php4/pear/DB/tests/oci8/007.phpt:1.1 Sun Feb 18 16:49:07 2001 +++ php4/pear/DB/tests/oci8/007.phpt Thu Mar 22 17:15:07 2001 @@ -1,13 +1,12 @@ --TEST-- DB_oci8::errorNative test --SKIPIF-- -<?php include("skipif.inc"); ?> +<?php /*include("skipif.inc");*/ print "skip\n"; ?> --FILE-- <?php require_once "DB.php"; include("mktable.inc"); -$dbh->query("syntax error please"); +$err = $dbh->query("SELECT foo FROM tablethatdoesnotexist"); print $dbh->errorNative() . "\n"; ?> --EXPECT-- -XXX fill me in Index: php4/pear/DB/tests/oci8/009.phpt diff -u php4/pear/DB/tests/oci8/009.phpt:1.1 php4/pear/DB/tests/oci8/009.phpt:1.2 --- php4/pear/DB/tests/oci8/009.phpt:1.1 Sun Feb 18 16:49:07 2001 +++ php4/pear/DB/tests/oci8/009.phpt Thu Mar 22 17:15:07 2001 @@ -6,10 +6,26 @@ <?php require "connect.inc"; require "mktable.inc"; +$dbh->autoCommit(false); +$dbh->setOption("optimize", "portability"); $test_error_mode = PEAR_ERROR_PRINT; include "../numrows.inc"; +$dbh->rollback(); +$dbh->setOption("optimize", "performance"); +include "../numrows.inc"; +$dbh->rollback(); ?> --EXPECT-- +1 +2 +3 +4 +5 +6 +2 +0 +DB Error: DB backend not capable +DB Error: DB backend not capable DB Error: DB backend not capable DB Error: DB backend not capable DB Error: DB backend not capable @@ -18,4 +34,3 @@ DB Error: DB backend not capable DB Error: DB backend not capable DB Error: DB backend not capable -DB Error: unknown error Index: php4/pear/DB/tests/oci8/010.phpt diff -u php4/pear/DB/tests/oci8/010.phpt:1.1 php4/pear/DB/tests/oci8/010.phpt:1.2 --- php4/pear/DB/tests/oci8/010.phpt:1.1 Sun Feb 18 16:49:07 2001 +++ php4/pear/DB/tests/oci8/010.phpt Thu Mar 22 17:15:07 2001 @@ -16,6 +16,8 @@ Trying to provoke DB_ERROR_NOSUCHTABLE DB Error: no such table Trying to provoke DB_ERROR_CONSTRAINT + DB Error: constraint violation + DB Error: constraint violation Trying to provoke DB_ERROR_DIVZERO DB Error: division by zero Trying to provoke DB_ERROR_INVALID_NUMBER Index: php4/pear/DB/tests/oci8/connect.inc diff -u php4/pear/DB/tests/oci8/connect.inc:1.1 php4/pear/DB/tests/oci8/connect.inc:1.2 --- php4/pear/DB/tests/oci8/connect.inc:1.1 Sun Feb 18 16:49:07 2001 +++ php4/pear/DB/tests/oci8/connect.inc Thu Mar 22 17:15:07 2001 @@ -1,4 +1,4 @@ <?php require_once "DB.php"; -$dbh = DB::connect("oci8://test:test@test"); +$dbh = DB::connect("oci8://system:manager@test"); ?> Index: php4/pear/DB/tests/oci8/mktable.inc diff -u php4/pear/DB/tests/oci8/mktable.inc:1.1 php4/pear/DB/tests/oci8/mktable.inc:1.2 --- php4/pear/DB/tests/oci8/mktable.inc:1.1 Sun Feb 18 16:49:07 2001 +++ php4/pear/DB/tests/oci8/mktable.inc Thu Mar 22 17:15:07 2001 @@ -2,11 +2,18 @@ require_once "connect.inc"; +function mktable_error_handler($errobj) { + print "mktable error: ".$errobj->getMessage().": ".$errobj->getUserInfo(); + print "\n"; + exit; +} + $dbh->setErrorHandling(PEAR_ERROR_RETURN); $dbh->query("DROP TABLE phptest"); -$dbh->setErrorHandling(PEAR_ERROR_TRIGGER); -$dbh->query("CREATE TABLE phptest (a INTEGER, b VARCHAR2(40), c TEXT, d DATE)"); +$dbh->setErrorHandling(PEAR_ERROR_CALLBACK, "mktable_error_handler"); +$test_mktable_query = "CREATE TABLE phptest (a INTEGER, b VARCHAR2(40), c LONG +VARCHAR, d VARCHAR2(20))"; +$dbh->query($test_mktable_query); $dbh->query("INSERT INTO phptest VALUES(42, 'bing', 'This is a test', '1999-11-21')"); $dbh->setErrorHandling(PEAR_ERROR_RETURN); Index: php4/pear/DB/tests/oci8/skipif.inc diff -u php4/pear/DB/tests/oci8/skipif.inc:1.1 php4/pear/DB/tests/oci8/skipif.inc:1.2 --- php4/pear/DB/tests/oci8/skipif.inc:1.1 Sun Feb 18 16:49:07 2001 +++ php4/pear/DB/tests/oci8/skipif.inc Thu Mar 22 17:15:07 2001 @@ -10,7 +10,7 @@ if (!extension_loaded("oci8")) { die("skip\n"); } -$conn = @OCILogon("test", "test", "test"); +$conn = @OCILogon("system", "manager", "test"); if (!is_resource($conn)) { die("skip\n"); } Index: php4/pear/DB/tests/odbc/mktable.inc diff -u php4/pear/DB/tests/odbc/mktable.inc:1.2 php4/pear/DB/tests/odbc/mktable.inc:1.3 --- php4/pear/DB/tests/odbc/mktable.inc:1.2 Sun Feb 18 16:50:30 2001 +++ php4/pear/DB/tests/odbc/mktable.inc Thu Mar 22 17:15:07 2001 @@ -6,7 +6,8 @@ $dbh->query("DROP TABLE phptest"); $dbh->setErrorHandling(PEAR_ERROR_TRIGGER); -$dbh->query("CREATE TABLE phptest (a INTEGER, b VARCHAR(40), c TEXT, d DATE)"); +$test_mktable_query = "CREATE TABLE phptest (a INTEGER, b VARCHAR(40), c TEXT, d +DATE)"; +$dbh->query($test_mktable_query); $dbh->query("INSERT INTO phptest VALUES(42, 'bing', 'This is a test', '1999-11-21')"); $dbh->setErrorHandling(PEAR_ERROR_RETURN); Index: php4/pear/DB/tests/pgsql/mktable.inc diff -u php4/pear/DB/tests/pgsql/mktable.inc:1.3 php4/pear/DB/tests/pgsql/mktable.inc:1.4 --- php4/pear/DB/tests/pgsql/mktable.inc:1.3 Sun Feb 18 16:50:31 2001 +++ php4/pear/DB/tests/pgsql/mktable.inc Thu Mar 22 17:15:08 2001 @@ -6,7 +6,8 @@ $dbh->query("DROP TABLE phptest"); $dbh->setErrorHandling(PEAR_ERROR_TRIGGER); -$dbh->query("CREATE TABLE phptest (a INTEGER, b VARCHAR(40), c TEXT, d DATE)"); +$test_mktable_query = "CREATE TABLE phptest (a INTEGER, b VARCHAR(40), c TEXT, d +DATE)"; +$dbh->query($test_mktable_query); $dbh->query("INSERT INTO phptest VALUES(42, 'bing', 'This is a test', '1999-11-21')"); $dbh->setErrorHandling(PEAR_ERROR_RETURN);
-- PHP CVS Mailing List (http://www.php.net/) To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED] To contact the list administrators, e-mail: [EMAIL PROTECTED]