summaryrefslogtreecommitdiff
path: root/program/lib/DB.php
diff options
context:
space:
mode:
Diffstat (limited to 'program/lib/DB.php')
-rw-r--r--program/lib/DB.php151
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()
*/