X-Git-Url: https://git.mxchange.org/?a=blobdiff_plain;f=extlib%2FDB%2Fcommon.php;h=7252ce27864bb7b448f16ef8b9d634c295cc47e2;hb=515682c0cd3b7000fb02c7b79d759c347f57da09;hp=22fac96d9910277970357b97931ed09761bbd8ee;hpb=38f2ecefacd501cd5ce9c5ce0bacf2a93968e358;p=quix0rs-gnu-social.git diff --git a/extlib/DB/common.php b/extlib/DB/common.php index 22fac96d99..7252ce2786 100644 --- a/extlib/DB/common.php +++ b/extlib/DB/common.php @@ -169,23 +169,23 @@ class DB_common extends PEAR } if (isset($this->autocommit)) { return array('autocommit', - 'dbsyntax', - 'dsn', - 'features', - 'fetchmode', - 'fetchmode_object_class', - 'options', - 'was_connected', - ); + 'dbsyntax', + 'dsn', + 'features', + 'fetchmode', + 'fetchmode_object_class', + 'options', + 'was_connected', + ); } else { return array('dbsyntax', - 'dsn', - 'features', - 'fetchmode', - 'fetchmode_object_class', - 'options', - 'was_connected', - ); + 'dsn', + 'features', + 'fetchmode', + 'fetchmode_object_class', + 'options', + 'was_connected', + ); } } @@ -212,37 +212,37 @@ class DB_common extends PEAR // {{{ __toString() /** - * Automatic string conversion for PHP 5 + * DEPRECATED: String conversion method * * @return string a string describing the current PEAR DB object * - * @since Method available since Release 1.7.0 + * @deprecated Method deprecated in Release 1.7.0 */ - public function __toString() + public function toString() { - $info = strtolower(get_class($this)); - $info .= ': (phptype=' . $this->phptype . - ', dbsyntax=' . $this->dbsyntax . - ')'; - if ($this->connection) { - $info .= ' [connected]'; - } - return $info; + return $this->__toString(); } // }}} // {{{ toString() /** - * DEPRECATED: String conversion method + * Automatic string conversion for PHP 5 * * @return string a string describing the current PEAR DB object * - * @deprecated Method deprecated in Release 1.7.0 + * @since Method available since Release 1.7.0 */ - public function toString() + public function __toString() { - return $this->__toString(); + $info = strtolower(get_class($this)); + $info .= ': (phptype=' . $this->phptype . + ', dbsyntax=' . $this->dbsyntax . + ')'; + if ($this->connection) { + $info .= ' [connected]'; + } + return $info; } // }}} @@ -252,7 +252,7 @@ class DB_common extends PEAR * DEPRECATED: Quotes a string so it can be safely used within string * delimiters in a query * - * @param string $string the string to be quoted + * @param string $string the string to be quoted * * @return string the quoted string * @@ -271,77 +271,13 @@ class DB_common extends PEAR // }}} // {{{ quote() - /** - * DEPRECATED: Quotes a string so it can be safely used in a query - * - * @param string $string the string to quote - * - * @return string the quoted string or the string NULL - * if the value submitted is null. - * - * @see DB_common::quoteSmart(), DB_common::escapeSimple() - * @deprecated Deprecated in release 1.6.0 - */ - public function quote($string = null) - { - return $this->quoteSmart($string); - } - - // }}} - // {{{ quoteIdentifier() - - /** - * Quotes a string so it can be safely used as a table or column name - * - * Delimiting style depends on which database driver is being used. - * - * NOTE: just because you CAN use delimited identifiers doesn't mean - * you SHOULD use them. In general, they end up causing way more - * problems than they solve. - * - * Portability is broken by using the following characters inside - * delimited identifiers: - * + backtick (`) -- due to MySQL - * + double quote (") -- due to Oracle - * + brackets ([ or ]) -- due to Access - * - * Delimited identifiers are known to generally work correctly under - * the following drivers: - * + mssql - * + mysql - * + mysqli - * + oci8 - * + odbc(access) - * + odbc(db2) - * + pgsql - * + sqlite - * + sybase (must execute set quoted_identifier on sometime - * prior to use) - * - * InterBase doesn't seem to be able to use delimited identifiers - * via PHP 4. They work fine under PHP 5. - * - * @param string $str the identifier name to be quoted - * - * @return string the quoted identifier - * - * @since Method available since Release 1.6.0 - */ - public function quoteIdentifier($str) - { - return '"' . str_replace('"', '""', $str) . '"'; - } - - // }}} - // {{{ quoteSmart() - /** * Formats input so it can be safely used in a query * * The output depends on the PHP data type of input and the database * type being used. * - * @param mixed $in the data to be formatted + * @param mixed $in the data to be formatted * * @return mixed the formatted data. The format depends on the input's * PHP type: @@ -455,6 +391,46 @@ class DB_common extends PEAR } } + // }}} + // {{{ quoteIdentifier() + + /** + * Formats a float value for use within a query in a locale-independent + * manner. + * + * @param float the float value to be quoted. + * @return string the quoted string. + * @see DB_common::quoteSmart() + * @since Method available since release 1.7.8. + */ + public function quoteFloat($float) + { + return "'" . $this->escapeSimple(str_replace(',', '.', strval(floatval($float)))) . "'"; + } + + // }}} + // {{{ quoteSmart() + + /** + * Escapes a string according to the current DBMS's standards + * + * In SQLite, this makes things safe for inserts/updates, but may + * cause problems when performing text comparisons against columns + * containing binary data. See the + * {@link http://php.net/sqlite_escape_string PHP manual} for more info. + * + * @param string $str the string to be escaped + * + * @return string the escaped string + * + * @see DB_common::quoteSmart() + * @since Method available since Release 1.6.0 + */ + public function escapeSimple($str) + { + return str_replace("'", "''", $str); + } + // }}} // {{{ quoteBoolean() @@ -471,45 +447,69 @@ class DB_common extends PEAR { return $boolean ? '1' : '0'; } - + // }}} // {{{ quoteFloat() /** - * Formats a float value for use within a query in a locale-independent - * manner. + * DEPRECATED: Quotes a string so it can be safely used in a query * - * @param float the float value to be quoted. - * @return string the quoted string. - * @see DB_common::quoteSmart() - * @since Method available since release 1.7.8. + * @param string $string the string to quote + * + * @return string the quoted string or the string NULL + * if the value submitted is null. + * + * @see DB_common::quoteSmart(), DB_common::escapeSimple() + * @deprecated Deprecated in release 1.6.0 */ - public function quoteFloat($float) + public function quote($string = null) { - return "'".$this->escapeSimple(str_replace(',', '.', strval(floatval($float))))."'"; + return $this->quoteSmart($string); } - + // }}} // {{{ escapeSimple() /** - * Escapes a string according to the current DBMS's standards + * Quotes a string so it can be safely used as a table or column name * - * In SQLite, this makes things safe for inserts/updates, but may - * cause problems when performing text comparisons against columns - * containing binary data. See the - * {@link http://php.net/sqlite_escape_string PHP manual} for more info. + * Delimiting style depends on which database driver is being used. * - * @param string $str the string to be escaped + * NOTE: just because you CAN use delimited identifiers doesn't mean + * you SHOULD use them. In general, they end up causing way more + * problems than they solve. * - * @return string the escaped string + * Portability is broken by using the following characters inside + * delimited identifiers: + * + backtick (`) -- due to MySQL + * + double quote (") -- due to Oracle + * + brackets ([ or ]) -- due to Access + * + * Delimited identifiers are known to generally work correctly under + * the following drivers: + * + mssql + * + mysql + * + mysqli + * + oci8 + * + odbc(access) + * + odbc(db2) + * + pgsql + * + sqlite + * + sybase (must execute set quoted_identifier on sometime + * prior to use) + * + * InterBase doesn't seem to be able to use delimited identifiers + * via PHP 4. They work fine under PHP 5. + * + * @param string $str the identifier name to be quoted + * + * @return string the quoted identifier * - * @see DB_common::quoteSmart() * @since Method available since Release 1.6.0 */ - public function escapeSimple($str) + public function quoteIdentifier($str) { - return str_replace("'", "''", $str); + return '"' . str_replace('"', '""', $str) . '"'; } // }}} @@ -518,7 +518,7 @@ class DB_common extends PEAR /** * Tells whether the present driver supports a given feature * - * @param string $feature the feature you're curious about + * @param string $feature the feature you're curious about * * @return bool whether this driver supports $feature */ @@ -533,9 +533,9 @@ class DB_common extends PEAR /** * Sets the fetch mode that should be used by default for query results * - * @param integer $fetchmode DB_FETCHMODE_ORDERED, DB_FETCHMODE_ASSOC + * @param integer $fetchmode DB_FETCHMODE_ORDERED, DB_FETCHMODE_ASSOC * or DB_FETCHMODE_OBJECT - * @param string $object_class the class name of the object to be returned + * @param string $object_class the class name of the object to be returned * by the fetch methods when the * DB_FETCHMODE_OBJECT mode is selected. * If no class is specified by default a cast @@ -543,6 +543,7 @@ class DB_common extends PEAR * done. There is also the posibility to use * and extend the 'DB_row' class. * + * @return object * @see DB_FETCHMODE_ORDERED, DB_FETCHMODE_ASSOC, DB_FETCHMODE_OBJECT */ public function setFetchMode($fetchmode, $object_class = 'stdClass') @@ -550,7 +551,7 @@ class DB_common extends PEAR switch ($fetchmode) { case DB_FETCHMODE_OBJECT: $this->fetchmode_object_class = $object_class; - // no break + // no break case DB_FETCHMODE_ORDERED: case DB_FETCHMODE_ASSOC: $this->fetchmode = $fetchmode; @@ -558,11 +559,95 @@ class DB_common extends PEAR default: return $this->raiseError('invalid fetchmode mode'); } + return null; } // }}} // {{{ setOption() + /** + * Communicates an error and invoke error callbacks, etc + * + * Basically a wrapper for PEAR::raiseError without the message string. + * + * @param mixed integer error code, or a PEAR error object (all + * other parameters are ignored if this parameter is + * an object + * @param int error mode, see PEAR_Error docs + * @param mixed if error mode is PEAR_ERROR_TRIGGER, this is the + * error level (E_USER_NOTICE etc). If error mode is + * PEAR_ERROR_CALLBACK, this is the callback function, + * either as a function name, or as an array of an + * object and method name. For other error modes this + * parameter is ignored. + * @param string extra debug information. Defaults to the last + * query and native error code. + * @param mixed native error code, integer or string depending the + * backend + * @param mixed dummy parameter for E_STRICT compatibility with + * PEAR::raiseError + * @param mixed dummy parameter for E_STRICT compatibility with + * PEAR::raiseError + * + * @return object the PEAR_Error object + * + * @see PEAR_Error + */ + public function &raiseError( + $code = DB_ERROR, + $mode = null, + $options = null, + $userinfo = null, + $nativecode = null, + $dummy1 = null, + $dummy2 = null + ) + { + // The error is yet a DB error object + if (is_object($code)) { + // because we the static PEAR::raiseError, our global + // handler should be used if it is set + if ($mode === null && !empty($this->_default_error_mode)) { + $mode = $this->_default_error_mode; + $options = $this->_default_error_options; + } + $tmp = PEAR::raiseError( + $code, + null, + $mode, + $options, + null, + null, + true + ); + return $tmp; + } + + if ($userinfo === null) { + $userinfo = $this->last_query; + } + + if ($nativecode) { + $userinfo .= ' [nativecode=' . trim($nativecode) . ']'; + } else { + $userinfo .= ' [DB Error: ' . DB::errorMessage($code) . ']'; + } + + $tmp = PEAR::raiseError( + null, + $code, + $mode, + $options, + $userinfo, + 'DB_Error', + true + ); + return $tmp; + } + + // }}} + // {{{ getOption() + /** * Sets run-time configuration options for PEAR DB * @@ -695,9 +780,9 @@ class DB_common extends PEAR * * * @param string $option option name - * @param mixed $value value for the option + * @param mixed $value value for the option * - * @return int DB_OK on success. A DB_Error object on failure. + * @return int|object * * @see DB_common::$options */ @@ -715,173 +800,40 @@ class DB_common extends PEAR switch ($this->phptype) { case 'oci8': $this->options['portability'] = - DB_PORTABILITY_LOWERCASE | - DB_PORTABILITY_NUMROWS; - break; - case 'fbsql': - case 'mysql': - case 'mysqli': - case 'sqlite': - $this->options['portability'] = - DB_PORTABILITY_DELETE_COUNT; - break; - } - } else { - $this->options['portability'] = DB_PORTABILITY_NONE; - } - } - - return DB_OK; - } - return $this->raiseError("unknown option $option"); - } - - // }}} - // {{{ getOption() - - /** - * Returns the value of an option - * - * @param string $option the option name you're curious about - * - * @return mixed the option's value - */ - public function getOption($option) - { - if (isset($this->options[$option])) { - return $this->options[$option]; - } - return $this->raiseError("unknown option $option"); - } - - // }}} - // {{{ prepare() - - /** - * Prepares a query for multiple execution with execute() - * - * Creates a query that can be run multiple times. Each time it is run, - * the placeholders, if any, will be replaced by the contents of - * execute()'s $data argument. - * - * Three types of placeholders can be used: - * + ? scalar value (i.e. strings, integers). The system - * will automatically quote and escape the data. - * + ! value is inserted 'as is' - * + & requires a file name. The file's contents get - * inserted into the query (i.e. saving binary - * data in a db) - * - * Example 1. - * - * $sth = $db->prepare('INSERT INTO tbl (a, b, c) VALUES (?, !, &)'); - * $data = array( - * "John's text", - * "'it''s good'", - * 'filename.txt' - * ); - * $res = $db->execute($sth, $data); - * - * - * Use backslashes to escape placeholder characters if you don't want - * them to be interpreted as placeholders: - *
-     *    "UPDATE foo SET col=? WHERE col='over \& under'"
-     * 
- * - * With some database backends, this is emulated. - * - * {@internal ibase and oci8 have their own prepare() methods.}} - * - * @param string $query the query to be prepared - * - * @return mixed DB statement resource on success. A DB_Error object - * on failure. - * - * @see DB_common::execute() - */ - public function prepare($query) - { - $tokens = preg_split( - '/((?prepare_tokens[] = &$newtokens; - end($this->prepare_tokens); - - $k = key($this->prepare_tokens); - $this->prepare_types[$k] = $types; - $this->prepared_queries[$k] = implode(' ', $newtokens); - - return $k; - } - - // }}} - // {{{ autoPrepare() + DB_PORTABILITY_LOWERCASE | + DB_PORTABILITY_NUMROWS; + break; + case 'fbsql': + case 'mysql': + case 'mysqli': + case 'sqlite': + $this->options['portability'] = + DB_PORTABILITY_DELETE_COUNT; + break; + } + } else { + $this->options['portability'] = DB_PORTABILITY_NONE; + } + } - /** - * Automaticaly generates an insert or update query and pass it to prepare() - * - * @param string $table the table name - * @param array $table_fields the array of field names - * @param int $mode a type of query to make: - * DB_AUTOQUERY_INSERT or DB_AUTOQUERY_UPDATE - * @param string $where for update queries: the WHERE clause to - * append to the SQL statement. Don't - * include the "WHERE" keyword. - * - * @return resource the query handle - * - * @uses DB_common::prepare(), DB_common::buildManipSQL() - */ - public function autoPrepare( - $table, - $table_fields, - $mode = DB_AUTOQUERY_INSERT, - $where = false - ) { - $query = $this->buildManipSQL($table, $table_fields, $mode, $where); - if (DB::isError($query)) { - return $query; + return DB_OK; } - return $this->prepare($query); + return $this->raiseError("unknown option $option"); } // }}} - // {{{ autoExecute() + // {{{ prepare() /** * Automaticaly generates an insert or update query and call prepare() * and execute() with it * - * @param string $table the table name - * @param array $fields_values the associative array where $key is a + * @param string $table the table name + * @param array $fields_values the associative array where $key is a * field name and $value its value - * @param int $mode a type of query to make: + * @param int $mode a type of query to make: * DB_AUTOQUERY_INSERT or DB_AUTOQUERY_UPDATE - * @param string $where for update queries: the WHERE clause to + * @param bool $where for update queries: the WHERE clause to * append to the SQL statement. Don't * include the "WHERE" keyword. * @@ -896,7 +848,8 @@ class DB_common extends PEAR $fields_values, $mode = DB_AUTOQUERY_INSERT, $where = false - ) { + ) + { $sth = $this->autoPrepare( $table, array_keys($fields_values), @@ -912,7 +865,39 @@ class DB_common extends PEAR } // }}} - // {{{ buildManipSQL() + // {{{ autoPrepare() + + /** + * Automaticaly generates an insert or update query and pass it to prepare() + * + * @param string $table the table name + * @param array $table_fields the array of field names + * @param int $mode a type of query to make: + * DB_AUTOQUERY_INSERT or DB_AUTOQUERY_UPDATE + * @param bool $where for update queries: the WHERE clause to + * append to the SQL statement. Don't + * include the "WHERE" keyword. + * + * @return resource|string + * + * @uses DB_common::prepare(), DB_common::buildManipSQL() + */ + public function autoPrepare( + $table, + $table_fields, + $mode = DB_AUTOQUERY_INSERT, + $where = false + ) + { + $query = $this->buildManipSQL($table, $table_fields, $mode, $where); + if (DB::isError($query)) { + return $query; + } + return $this->prepare($query); + } + + // }}} + // {{{ autoExecute() /** * Produces an SQL query string for autoPrepare() @@ -934,11 +919,11 @@ class DB_common extends PEAR * - Be carefull! If you don't give a $where param with an UPDATE * query, all the records of the table will be updated! * - * @param string $table the table name - * @param array $table_fields the array of field names - * @param int $mode a type of query to make: + * @param string $table the table name + * @param array $table_fields the array of field names + * @param int $mode a type of query to make: * DB_AUTOQUERY_INSERT or DB_AUTOQUERY_UPDATE - * @param string $where for update queries: the WHERE clause to + * @param bool $where for update queries: the WHERE clause to * append to the SQL statement. Don't * include the "WHERE" keyword. * @@ -985,6 +970,90 @@ class DB_common extends PEAR } } + // }}} + // {{{ buildManipSQL() + + /** + * Prepares a query for multiple execution with execute() + * + * Creates a query that can be run multiple times. Each time it is run, + * the placeholders, if any, will be replaced by the contents of + * execute()'s $data argument. + * + * Three types of placeholders can be used: + * + ? scalar value (i.e. strings, integers). The system + * will automatically quote and escape the data. + * + ! value is inserted 'as is' + * + & requires a file name. The file's contents get + * inserted into the query (i.e. saving binary + * data in a db) + * + * Example 1. + * + * $sth = $db->prepare('INSERT INTO tbl (a, b, c) VALUES (?, !, &)'); + * $data = array( + * "John's text", + * "'it''s good'", + * 'filename.txt' + * ); + * $res = $db->execute($sth, $data); + * + * + * Use backslashes to escape placeholder characters if you don't want + * them to be interpreted as placeholders: + *
+     *    "UPDATE foo SET col=? WHERE col='over \& under'"
+     * 
+ * + * With some database backends, this is emulated. + * + * {@internal ibase and oci8 have their own prepare() methods.}} + * + * @param string $query the query to be prepared + * + * @return mixed DB statement resource on success. A DB_Error object + * on failure. + * + * @see DB_common::execute() + */ + public function prepare($query) + { + $tokens = preg_split( + '/((?prepare_tokens[] = &$newtokens; + end($this->prepare_tokens); + + $k = key($this->prepare_tokens); + $this->prepare_types[$k] = $types; + $this->prepared_queries[$k] = implode(' ', $newtokens); + + return $k; + } + // }}} // {{{ execute() @@ -1002,8 +1071,8 @@ class DB_common extends PEAR * $res = $db->execute($sth, $data); * * - * @param resource $stmt a DB statement resource returned from prepare() - * @param mixed $data array, string or numeric data to be used in + * @param resource $stmt a DB statement resource returned from prepare() + * @param mixed $data array, string or numeric data to be used in * execution of the statement. Quantity of items * passed must match quantity of placeholders in * query: meaning 1 placeholder for non-array @@ -1039,8 +1108,8 @@ class DB_common extends PEAR /** * Emulates executing prepared statements if the DBMS not support them * - * @param resource $stmt a DB statement resource returned from execute() - * @param mixed $data array, string or numeric data to be used in + * @param resource $stmt a DB statement resource returned from execute() + * @param mixed $data array, string or numeric data to be used in * execution of the statement. Quantity of items * passed must match quantity of placeholders in * query: meaning 1 placeholder for non-array @@ -1089,6 +1158,33 @@ class DB_common extends PEAR // }}} // {{{ executeMultiple() + /** + * Frees the internal resources associated with a prepared query + * + * @param resource $stmt the prepared statement's PHP resource + * @param bool $free_resource should the PHP resource be freed too? + * Use false if you need to get data + * from the result set later. + * + * @return bool TRUE on success, FALSE if $result is invalid + * + * @see DB_common::prepare() + */ + public function freePrepared($stmt, $free_resource = true) + { + $stmt = (int)$stmt; + if (isset($this->prepare_tokens[$stmt])) { + unset($this->prepare_tokens[$stmt]); + unset($this->prepare_types[$stmt]); + unset($this->prepared_queries[$stmt]); + return true; + } + return false; + } + + // }}} + // {{{ freePrepared() + /** * Performs several execute() calls on the same statement handle * @@ -1098,8 +1194,8 @@ class DB_common extends PEAR * If an error occurs during execute(), executeMultiple() does not * execute the unfinished rows, but rather returns that error. * - * @param resource $stmt query handle from prepare() - * @param array $data numeric array containing the + * @param resource $stmt query handle from prepare() + * @param array $data numeric array containing the * data to insert into the query * * @return int DB_OK on success. A DB_Error object on failure. @@ -1117,33 +1213,6 @@ class DB_common extends PEAR return DB_OK; } - // }}} - // {{{ freePrepared() - - /** - * Frees the internal resources associated with a prepared query - * - * @param resource $stmt the prepared statement's PHP resource - * @param bool $free_resource should the PHP resource be freed too? - * Use false if you need to get data - * from the result set later. - * - * @return bool TRUE on success, FALSE if $result is invalid - * - * @see DB_common::prepare() - */ - public function freePrepared($stmt, $free_resource = true) - { - $stmt = (int)$stmt; - if (isset($this->prepare_tokens[$stmt])) { - unset($this->prepare_tokens[$stmt]); - unset($this->prepare_types[$stmt]); - unset($this->prepared_queries[$stmt]); - return true; - } - return false; - } - // }}} // {{{ modifyQuery() @@ -1152,7 +1221,7 @@ class DB_common extends PEAR * * It is defined here to ensure all drivers have this method available. * - * @param string $query the query string to modify + * @param string $query the query string to modify * * @return string the modified query string * @@ -1168,16 +1237,49 @@ class DB_common extends PEAR // }}} // {{{ modifyLimitQuery() + /** + * Generates and executes a LIMIT query + * + * @param string $query the query + * @param intr $from the row to start to fetching (0 = the first row) + * @param int $count the numbers of rows to fetch + * @param mixed $params array, string or numeric data to be used in + * execution of the statement. Quantity of items + * passed must match quantity of placeholders in + * query: meaning 1 placeholder for non-array + * parameters or 1 placeholder per array element. + * + * @return mixed a new DB_result object for successful SELECT queries + * or DB_OK for successul data manipulation queries. + * A DB_Error object on failure. + */ + public function &limitQuery($query, $from, $count, $params = array()) + { + $query = $this->modifyLimitQuery($query, $from, $count, $params); + if (DB::isError($query)) { + return $query; + } + $result = $this->query($query, $params); + if (is_object($result) && is_a($result, 'DB_result')) { + $result->setOption('limit_from', $from); + $result->setOption('limit_count', $count); + } + return $result; + } + + // }}} + // {{{ query() + /** * Adds LIMIT clauses to a query string according to current DBMS standards * * It is defined here to assure that all implementations * have this method defined. * - * @param string $query the query to modify - * @param int $from the row to start to fetching (0 = the first row) - * @param int $count the numbers of rows to fetch - * @param mixed $params array, string or numeric data to be used in + * @param string $query the query to modify + * @param int $from the row to start to fetching (0 = the first row) + * @param int $count the numbers of rows to fetch + * @param mixed $params array, string or numeric data to be used in * execution of the statement. Quantity of items * passed must match quantity of placeholders in * query: meaning 1 placeholder for non-array @@ -1193,7 +1295,7 @@ class DB_common extends PEAR } // }}} - // {{{ query() + // {{{ limitQuery() /** * Sends a query to the database server @@ -1202,8 +1304,8 @@ class DB_common extends PEAR * to the server OR if $params are passed the query can have * placeholders and it will be passed through prepare() and execute(). * - * @param string $query the SQL query or the statement to prepare - * @param mixed $params array, string or numeric data to be used in + * @param string $query the SQL query or the statement to prepare + * @param mixed $params array, string or numeric data to be used in * execution of the statement. Quantity of items * passed must match quantity of placeholders in * query: meaning 1 placeholder for non-array @@ -1231,43 +1333,10 @@ class DB_common extends PEAR if ($result === DB_OK || DB::isError($result)) { return $result; } else { - $tmp = new DB_result($this, $result); - return $tmp; - } - } - } - - // }}} - // {{{ limitQuery() - - /** - * Generates and executes a LIMIT query - * - * @param string $query the query - * @param intr $from the row to start to fetching (0 = the first row) - * @param int $count the numbers of rows to fetch - * @param mixed $params array, string or numeric data to be used in - * execution of the statement. Quantity of items - * passed must match quantity of placeholders in - * query: meaning 1 placeholder for non-array - * parameters or 1 placeholder per array element. - * - * @return mixed a new DB_result object for successful SELECT queries - * or DB_OK for successul data manipulation queries. - * A DB_Error object on failure. - */ - public function &limitQuery($query, $from, $count, $params = array()) - { - $query = $this->modifyLimitQuery($query, $from, $count, $params); - if (DB::isError($query)) { - return $query; - } - $result = $this->query($query, $params); - if (is_object($result) && is_a($result, 'DB_result')) { - $result->setOption('limit_from', $from); - $result->setOption('limit_count', $count); + $tmp = new DB_result($this, $result); + return $tmp; + } } - return $result; } // }}} @@ -1278,8 +1347,8 @@ class DB_common extends PEAR * * Takes care of doing the query and freeing the results when finished. * - * @param string $query the SQL query - * @param mixed $params array, string or numeric data to be used in + * @param string $query the SQL query + * @param mixed $params array, string or numeric data to be used in * execution of the statement. Quantity of items * passed must match quantity of placeholders in * query: meaning 1 placeholder for non-array @@ -1325,13 +1394,13 @@ class DB_common extends PEAR * * Takes care of doing the query and freeing the results when finished. * - * @param string $query the SQL query - * @param mixed $params array, string or numeric data to be used in + * @param string $query the SQL query + * @param mixed $params array, string or numeric data to be used in * execution of the statement. Quantity of items * passed must match quantity of placeholders in * query: meaning 1 placeholder for non-array * parameters or 1 placeholder per array element. - * @param int $fetchmode the fetch mode to use + * @param int $fetchmode the fetch mode to use * * @return array the first row of results as an array. * A DB_Error object on failure. @@ -1340,7 +1409,8 @@ class DB_common extends PEAR $query, $params = array(), $fetchmode = DB_FETCHMODE_DEFAULT - ) { + ) + { // compat check, the params and fetchmode parameters used to // have the opposite order if (!is_array($params)) { @@ -1387,70 +1457,6 @@ class DB_common extends PEAR // }}} // {{{ getCol() - /** - * Fetches a single column from a query result and returns it as an - * indexed array - * - * @param string $query the SQL query - * @param mixed $col which column to return (integer [column number, - * starting at 0] or string [column name]) - * @param mixed $params array, string or numeric data to be used in - * execution of the statement. Quantity of items - * passed must match quantity of placeholders in - * query: meaning 1 placeholder for non-array - * parameters or 1 placeholder per array element. - * - * @return array the results as an array. A DB_Error object on failure. - * - * @see DB_common::query() - */ - public function &getCol($query, $col = 0, $params = array()) - { - $params = (array)$params; - if (sizeof($params) > 0) { - $sth = $this->prepare($query); - - if (DB::isError($sth)) { - return $sth; - } - - $res = $this->execute($sth, $params); - $this->freePrepared($sth); - } else { - $res = $this->query($query); - } - - if (DB::isError($res)) { - return $res; - } - - $fetchmode = is_int($col) ? DB_FETCHMODE_ORDERED : DB_FETCHMODE_ASSOC; - - if (!is_array($row = $res->fetchRow($fetchmode))) { - $ret = array(); - } else { - if (!array_key_exists($col, $row)) { - $ret = $this->raiseError(DB_ERROR_NOSUCHFIELD); - } else { - $ret = array($row[$col]); - while (is_array($row = $res->fetchRow($fetchmode))) { - $ret[] = $row[$col]; - } - } - } - - $res->free(); - - if (DB::isError($row)) { - $ret = $row; - } - - return $ret; - } - - // }}} - // {{{ getAssoc() - /** * Fetches an entire query result and returns it as an * associative array using the first column as the key @@ -1513,26 +1519,26 @@ class DB_common extends PEAR * Keep in mind that database functions in PHP usually return string * values for results regardless of the database's internal type. * - * @param string $query the SQL query - * @param bool $force_array used only when the query returns + * @param string $query the SQL query + * @param bool $force_array used only when the query returns * exactly two columns. If true, the values * of the returned array will be one-element * arrays instead of scalars. - * @param mixed $params array, string or numeric data to be used in + * @param mixed $params array, string or numeric data to be used in * execution of the statement. Quantity of * items passed must match quantity of * placeholders in query: meaning 1 * placeholder for non-array parameters or * 1 placeholder per array element. - * @param int $fetchmode the fetch mode to use - * @param bool $group if true, the values of the returned array + * @param int $fetchmode the fetch mode to use + * @param bool $group if true, the values of the returned array * is wrapped in another array. If the same * key value (in the first column) repeats * itself, the values will be appended to * this array instead of overwriting the * existing values. * - * @return array the associative array containing the query results. + * @return array|object * A DB_Error object on failure. */ public function &getAssoc( @@ -1541,7 +1547,8 @@ class DB_common extends PEAR $params = array(), $fetchmode = DB_FETCHMODE_DEFAULT, $group = false - ) { + ) + { $params = (array)$params; if (sizeof($params) > 0) { $sth = $this->prepare($query); @@ -1630,31 +1637,32 @@ class DB_common extends PEAR } // }}} - // {{{ getAll() + // {{{ getAssoc() /** * Fetches all of the rows from a query result * - * @param string $query the SQL query - * @param mixed $params array, string or numeric data to be used in + * @param string $query the SQL query + * @param mixed $params array, string or numeric data to be used in * execution of the statement. Quantity of * items passed must match quantity of * placeholders in query: meaning 1 * placeholder for non-array parameters or * 1 placeholder per array element. - * @param int $fetchmode the fetch mode to use: + * @param int $fetchmode the fetch mode to use: * + DB_FETCHMODE_ORDERED * + DB_FETCHMODE_ASSOC * + DB_FETCHMODE_ORDERED | DB_FETCHMODE_FLIPPED * + DB_FETCHMODE_ASSOC | DB_FETCHMODE_FLIPPED * - * @return array the nested array. A DB_Error object on failure. + * @return array|object */ public function &getAll( $query, $params = array(), $fetchmode = DB_FETCHMODE_DEFAULT - ) { + ) + { // compat check, the params and fetchmode parameters used to // have the opposite order if (!is_array($params)) { @@ -1710,14 +1718,14 @@ class DB_common extends PEAR } // }}} - // {{{ autoCommit() + // {{{ getAll() /** * Enables or disables automatic commits * - * @param bool $onoff true turns it on, false turns it off + * @param bool $onoff true turns it on, false turns it off * - * @return int DB_OK on success. A DB_Error object if the driver + * @return int|object * doesn't support auto-committing transactions. */ public function autoCommit($onoff = false) @@ -1726,12 +1734,12 @@ class DB_common extends PEAR } // }}} - // {{{ commit() + // {{{ autoCommit() /** * Commits the current transaction * - * @return int DB_OK on success. A DB_Error object on failure. + * @return int|object */ public function commit() { @@ -1739,12 +1747,12 @@ class DB_common extends PEAR } // }}} - // {{{ rollback() + // {{{ commit() /** * Reverts the current transaction * - * @return int DB_OK on success. A DB_Error object on failure. + * @return int|object */ public function rollback() { @@ -1752,14 +1760,14 @@ class DB_common extends PEAR } // }}} - // {{{ numRows() + // {{{ rollback() /** * Determines the number of rows in a query result * - * @param resource $result the query result idenifier produced by PHP + * @param resource $result the query result idenifier produced by PHP * - * @return int the number of rows. A DB_Error object on failure. + * @return int|object */ public function numRows($result) { @@ -1767,14 +1775,14 @@ class DB_common extends PEAR } // }}} - // {{{ affectedRows() + // {{{ numRows() /** * Determines the number of rows affected by a data maniuplation query * * 0 is returned for queries that don't manipulate data. * - * @return int the number of rows. A DB_Error object on failure. + * @return int|object */ public function affectedRows() { @@ -1782,7 +1790,7 @@ class DB_common extends PEAR } // }}} - // {{{ getSequenceName() + // {{{ affectedRows() /** * Generates the name used inside the database for a sequence @@ -1790,7 +1798,7 @@ class DB_common extends PEAR * The createSequence() docblock contains notes about storing sequence * names. * - * @param string $sqn the sequence's public name + * @param string $sqn the sequence's public name * * @return string the sequence's name in the backend * @@ -1806,17 +1814,35 @@ class DB_common extends PEAR ); } + // }}} + // {{{ getSequenceName() + + /** + * Returns the value of an option + * + * @param string $option the option name you're curious about + * + * @return mixed the option's value + */ + public function getOption($option) + { + if (isset($this->options[$option])) { + return $this->options[$option]; + } + return $this->raiseError("unknown option $option"); + } + // }}} // {{{ nextId() /** * Returns the next free id in a sequence * - * @param string $seq_name name of the sequence - * @param boolean $ondemand when true, the seqence is automatically + * @param string $seq_name name of the sequence + * @param boolean $ondemand when true, the seqence is automatically * created if it does not exist * - * @return int the next id number in the sequence. + * @return int|object * A DB_Error object on failure. * * @see DB_common::createSequence(), DB_common::dropSequence(), @@ -1840,9 +1866,9 @@ class DB_common extends PEAR * * seqname_format is set via setOption(). * - * @param string $seq_name name of the new sequence + * @param string $seq_name name of the new sequence * - * @return int DB_OK on success. A DB_Error object on failure. + * @return int|object * * @see DB_common::dropSequence(), DB_common::getSequenceName(), * DB_common::nextID() @@ -1858,9 +1884,9 @@ class DB_common extends PEAR /** * Deletes a sequence * - * @param string $seq_name name of the sequence to be deleted + * @param string $seq_name name of the sequence to be deleted * - * @return int DB_OK on success. A DB_Error object on failure. + * @return int|object * * @see DB_common::createSequence(), DB_common::getSequenceName(), * DB_common::nextID() @@ -1873,88 +1899,6 @@ class DB_common extends PEAR // }}} // {{{ raiseError() - /** - * Communicates an error and invoke error callbacks, etc - * - * Basically a wrapper for PEAR::raiseError without the message string. - * - * @param mixed integer error code, or a PEAR error object (all - * other parameters are ignored if this parameter is - * an object - * @param int error mode, see PEAR_Error docs - * @param mixed if error mode is PEAR_ERROR_TRIGGER, this is the - * error level (E_USER_NOTICE etc). If error mode is - * PEAR_ERROR_CALLBACK, this is the callback function, - * either as a function name, or as an array of an - * object and method name. For other error modes this - * parameter is ignored. - * @param string extra debug information. Defaults to the last - * query and native error code. - * @param mixed native error code, integer or string depending the - * backend - * @param mixed dummy parameter for E_STRICT compatibility with - * PEAR::raiseError - * @param mixed dummy parameter for E_STRICT compatibility with - * PEAR::raiseError - * - * @return object the PEAR_Error object - * - * @see PEAR_Error - */ - public function &raiseError( - $code = DB_ERROR, - $mode = null, - $options = null, - $userinfo = null, - $nativecode = null, - $dummy1 = null, - $dummy2 = null - ) { - // The error is yet a DB error object - if (is_object($code)) { - // because we the static PEAR::raiseError, our global - // handler should be used if it is set - if ($mode === null && !empty($this->_default_error_mode)) { - $mode = $this->_default_error_mode; - $options = $this->_default_error_options; - } - $tmp = PEAR::raiseError( - $code, - null, - $mode, - $options, - null, - null, - true - ); - return $tmp; - } - - if ($userinfo === null) { - $userinfo = $this->last_query; - } - - if ($nativecode) { - $userinfo .= ' [nativecode=' . trim($nativecode) . ']'; - } else { - $userinfo .= ' [DB Error: ' . DB::errorMessage($code) . ']'; - } - - $tmp = PEAR::raiseError( - null, - $code, - $mode, - $options, - $userinfo, - 'DB_Error', - true - ); - return $tmp; - } - - // }}} - // {{{ errorNative() - /** * Gets the DBMS' native error code produced by the last query * @@ -1966,14 +1910,14 @@ class DB_common extends PEAR } // }}} - // {{{ errorCode() + // {{{ errorNative() /** * Maps native error codes to DB's portable ones * * Uses the $errorcode_map property defined in each driver. * - * @param string|int $nativecode the error code returned by the DBMS + * @param string|int $nativecode the error code returned by the DBMS * * @return int the portable DB error code. Return DB_ERROR if the * current driver doesn't have a mapping for the @@ -1989,12 +1933,12 @@ class DB_common extends PEAR } // }}} - // {{{ errorMessage() + // {{{ errorCode() /** * Maps a DB error code to a textual message * - * @param integer $dbcode the DB error code + * @param integer $dbcode the DB error code * * @return string the error message corresponding to the error code * submitted. FALSE if the error code is unknown. @@ -2007,7 +1951,7 @@ class DB_common extends PEAR } // }}} - // {{{ tableInfo() + // {{{ errorMessage() /** * Returns information about a table or a result set @@ -2112,19 +2056,19 @@ class DB_common extends PEAR * If the 'portability' option has DB_PORTABILITY_LOWERCASE * turned on, the names of tables and fields will be lowercased. * - * @param object|string $result DB_result object from a query or a + * @param object|string $result DB_result object from a query or a * string containing the name of a table. * While this also accepts a query result * resource identifier, this behavior is * deprecated. - * @param int $mode either unused or one of the tableInfo modes: + * @param int $mode either unused or one of the tableInfo modes: * DB_TABLEINFO_ORDERTABLE, * DB_TABLEINFO_ORDER or * DB_TABLEINFO_FULL (which does both). * These are bitwise, so the first two can be * combined using |. * - * @return array an associative array with the information requested. + * @return array|object * A DB_Error object on failure. * * @see DB_common::setOption() @@ -2140,7 +2084,7 @@ class DB_common extends PEAR } // }}} - // {{{ getTables() + // {{{ tableInfo() /** * Lists the tables in the current database @@ -2155,17 +2099,17 @@ class DB_common extends PEAR } // }}} - // {{{ getListOf() + // {{{ getTables() /** * Lists internal database information * - * @param string $type type of information being sought. + * @param string $type type of information being sought. * Common items being sought are: * tables, databases, users, views, functions * Each DBMS's has its own capabilities. * - * @return array an array listing the items sought. + * @return array|object * A DB DB_Error object on failure. */ public function getListOf($type) @@ -2186,12 +2130,12 @@ class DB_common extends PEAR } // }}} - // {{{ getSpecialQuery() + // {{{ getListOf() /** * Obtains the query string needed for listing a given type of objects * - * @param string $type the kind of objects you want to retrieve + * @param string $type the kind of objects you want to retrieve * * @return string the SQL query string or null if the driver doesn't * support the object type requested @@ -2204,6 +2148,70 @@ class DB_common extends PEAR return $this->raiseError(DB_ERROR_UNSUPPORTED); } + // }}} + // {{{ getSpecialQuery() + + /** + * Fetches a single column from a query result and returns it as an + * indexed array + * + * @param string $query the SQL query + * @param mixed $col which column to return (integer [column number, + * starting at 0] or string [column name]) + * @param mixed $params array, string or numeric data to be used in + * execution of the statement. Quantity of items + * passed must match quantity of placeholders in + * query: meaning 1 placeholder for non-array + * parameters or 1 placeholder per array element. + * + * @return array the results as an array. A DB_Error object on failure. + * + * @see DB_common::query() + */ + public function &getCol($query, $col = 0, $params = array()) + { + $params = (array)$params; + if (sizeof($params) > 0) { + $sth = $this->prepare($query); + + if (DB::isError($sth)) { + return $sth; + } + + $res = $this->execute($sth, $params); + $this->freePrepared($sth); + } else { + $res = $this->query($query); + } + + if (DB::isError($res)) { + return $res; + } + + $fetchmode = is_int($col) ? DB_FETCHMODE_ORDERED : DB_FETCHMODE_ASSOC; + + if (!is_array($row = $res->fetchRow($fetchmode))) { + $ret = array(); + } else { + if (!array_key_exists($col, $row)) { + $ret = $this->raiseError(DB_ERROR_NOSUCHFIELD); + } else { + $ret = array($row[$col]); + while (is_array($row = $res->fetchRow($fetchmode))) { + $ret[] = $row[$col]; + } + } + } + + $res->free(); + + if (DB::isError($row)) { + $ret = $row; + } + + return $ret; + } + // }}} // {{{ nextQueryIsManip() @@ -2247,7 +2255,6 @@ class DB_common extends PEAR } $this->_next_query_manip = false; return $this->_last_query_manip; - $manip = $this->_next_query_manip; } // }}} @@ -2256,7 +2263,7 @@ class DB_common extends PEAR /** * Right-trims all strings in an array * - * @param array $array the array to be trimmed (passed by reference) + * @param array $array the array to be trimmed (passed by reference) * * @return void * @@ -2277,7 +2284,7 @@ class DB_common extends PEAR /** * Converts all null values in an array to empty strings * - * @param array $array the array to be de-nullified (passed by reference) + * @param array $array the array to be de-nullified (passed by reference) * * @return void *