diff options
Diffstat (limited to 'program/lib/DB.php')
-rw-r--r-- | program/lib/DB.php | 151 |
1 files changed, 126 insertions, 25 deletions
diff --git a/program/lib/DB.php b/program/lib/DB.php index e2beecaf2..f76913367 100644 --- a/program/lib/DB.php +++ b/program/lib/DB.php @@ -18,7 +18,7 @@ * @author Stig Bakken <ssb@php.net> * @author Tomas V.V.Cox <cox@idecnet.com> * @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 @@ -424,9 +424,9 @@ define('DB_PORTABILITY_ALL', 63); * @author Stig Bakken <ssb@php.net> * @author Tomas V.V.Cox <cox@idecnet.com> * @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 @@ -467,7 +467,7 @@ class DB return $tmp; } - @$obj =& new $classname; + @$obj = new $classname; foreach ($options as $option => $value) { $test = $obj->setOption($option, $value); @@ -544,7 +544,7 @@ class DB return $tmp; } - @$obj =& new $classname; + @$obj = new $classname; foreach ($options as $option => $value) { $test = $obj->setOption($option, $value); @@ -555,7 +555,11 @@ class DB $err = $obj->connect($dsninfo, $obj->getOption('persistent')); if (DB::isError($err)) { - $err->addUserInfo($dsn); + if (is_array($dsn)) { + $err->addUserInfo(DB::getDSNString($dsn, true)); + } else { + $err->addUserInfo($dsn); + } return $err; } @@ -572,7 +576,7 @@ class DB */ function apiVersion() { - return '@package_version@'; + return '1.7.13'; } // }}} @@ -625,7 +629,7 @@ class DB { $manips = 'INSERT|UPDATE|DELETE|REPLACE|' . 'CREATE|DROP|' - . 'LOAD DATA|SELECT .* INTO|COPY|' + . 'LOAD DATA|SELECT .* INTO .* FROM|COPY|' . 'ALTER|GRANT|REVOKE|' . 'LOCK|UNLOCK'; if (preg_match('/^\s*"?(' . $manips . ')\s+/i', $query)) { @@ -808,13 +812,11 @@ class DB // process the different protocol options $parsed['protocol'] = (!empty($proto)) ? $proto : 'tcp'; $proto_opts = rawurldecode($proto_opts); + if (strpos($proto_opts, ':') !== false) { + list($proto_opts, $parsed['port']) = explode(':', $proto_opts); + } if ($parsed['protocol'] == 'tcp') { - if (strpos($proto_opts, ':') !== false) { - list($parsed['hostspec'], - $parsed['port']) = explode(':', $proto_opts); - } else { - $parsed['hostspec'] = $proto_opts; - } + $parsed['hostspec'] = $proto_opts; } elseif ($parsed['protocol'] == 'unix') { $parsed['socket'] = $proto_opts; } @@ -848,6 +850,82 @@ class DB } // }}} + // {{{ getDSNString() + + /** + * Returns the given DSN in a string format suitable for output. + * + * @param array|string the DSN to parse and format + * @param boolean true to hide the password, false to include it + * @return string + */ + function getDSNString($dsn, $hidePassword) { + /* Calling parseDSN will ensure that we have all the array elements + * defined, and means that we deal with strings and array in the same + * manner. */ + $dsnArray = DB::parseDSN($dsn); + + if ($hidePassword) { + $dsnArray['password'] = 'PASSWORD'; + } + + /* Protocol is special-cased, as using the default "tcp" along with an + * Oracle TNS connection string fails. */ + if (is_string($dsn) && strpos($dsn, 'tcp') === false && $dsnArray['protocol'] == 'tcp') { + $dsnArray['protocol'] = false; + } + + // Now we just have to construct the actual string. This is ugly. + $dsnString = $dsnArray['phptype']; + if ($dsnArray['dbsyntax']) { + $dsnString .= '('.$dsnArray['dbsyntax'].')'; + } + $dsnString .= '://' + .$dsnArray['username'] + .':' + .$dsnArray['password'] + .'@' + .$dsnArray['protocol']; + if ($dsnArray['socket']) { + $dsnString .= '('.$dsnArray['socket'].')'; + } + if ($dsnArray['protocol'] && $dsnArray['hostspec']) { + $dsnString .= '+'; + } + $dsnString .= $dsnArray['hostspec']; + if ($dsnArray['port']) { + $dsnString .= ':'.$dsnArray['port']; + } + $dsnString .= '/'.$dsnArray['database']; + + /* Option handling. Unfortunately, parseDSN simply places options into + * the top-level array, so we'll first get rid of the fields defined by + * DB and see what's left. */ + unset($dsnArray['phptype'], + $dsnArray['dbsyntax'], + $dsnArray['username'], + $dsnArray['password'], + $dsnArray['protocol'], + $dsnArray['socket'], + $dsnArray['hostspec'], + $dsnArray['port'], + $dsnArray['database'] + ); + if (count($dsnArray) > 0) { + $dsnString .= '?'; + $i = 0; + foreach ($dsnArray as $key => $value) { + if (++$i > 1) { + $dsnString .= '&'; + } + $dsnString .= $key.'='.$value; + } + } + + return $dsnString; + } + + // }}} } // }}} @@ -860,9 +938,9 @@ class DB * @category Database * @package DB * @author Stig Bakken <ssb@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_Error extends PEAR_Error @@ -907,9 +985,9 @@ class DB_Error extends PEAR_Error * @category Database * @package DB * @author Stig Bakken <ssb@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_result @@ -1089,7 +1167,7 @@ class DB_result $fetchmode = DB_FETCHMODE_ASSOC; $object_class = $this->fetchmode_object_class; } - if ($this->limit_from !== null) { + if (is_null($rownum) && $this->limit_from !== null) { if ($this->row_counter === null) { $this->row_counter = $this->limit_from; // Skip rows @@ -1121,7 +1199,7 @@ class DB_result if ($object_class == 'stdClass') { $arr = (object) $arr; } else { - $arr = &new $object_class($arr); + $arr = new $object_class($arr); } } return $arr; @@ -1171,7 +1249,7 @@ class DB_result $fetchmode = DB_FETCHMODE_ASSOC; $object_class = $this->fetchmode_object_class; } - if ($this->limit_from !== null) { + if (is_null($rownum) && $this->limit_from !== null) { if ($this->row_counter === null) { $this->row_counter = $this->limit_from; // Skip rows @@ -1253,10 +1331,33 @@ class DB_result while ($res->fetchInto($tmp, DB_FETCHMODE_ORDERED)) { $i++; } - return $i; + $count = $i; } else { - return $this->dbh->numRows($this->result); + $count = $this->dbh->numRows($this->result); } + + /* fbsql is checked for here because limit queries are implemented + * using a TOP() function, which results in fbsql_num_rows still + * returning the total number of rows that would have been returned, + * rather than the real number. As a result, we'll just do the limit + * calculations for fbsql in the same way as a database with emulated + * limits. Unfortunately, we can't just do this in DB_fbsql::numRows() + * because that only gets the result resource, rather than the full + * DB_Result object. */ + if (($this->dbh->features['limit'] === 'emulate' + && $this->limit_from !== null) + || $this->dbh->phptype == 'fbsql') { + $limit_count = is_null($this->limit_count) ? $count : $this->limit_count; + if ($count < $this->limit_from) { + $count = 0; + } elseif ($count < ($this->limit_from + $limit_count)) { + $count -= $this->limit_from; + } else { + $count = $limit_count; + } + } + + return $count; } // }}} @@ -1349,9 +1450,9 @@ class DB_result * @category Database * @package DB * @author Stig Bakken <ssb@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 * @see DB_common::setFetchMode() */ |