]> git.mxchange.org Git - quix0rs-gnu-social.git/blobdiff - extlib/DB/common.php
Merge branch 'ATOM-priority" from Alexandre Alapetite into HEAD
[quix0rs-gnu-social.git] / extlib / DB / common.php
index 73e3eb69f7e0116cebb1a03c49583d5e5d8ac46f..7252ce27864bb7b448f16ef8b9d634c295cc47e2 100644 (file)
@@ -53,7 +53,7 @@ class DB_common extends PEAR
      * The current default fetch mode
      * @var integer
      */
-    var $fetchmode = DB_FETCHMODE_ORDERED;
+    public $fetchmode = DB_FETCHMODE_ORDERED;
 
     /**
      * The name of the class into which results should be fetched when
@@ -61,20 +61,20 @@ class DB_common extends PEAR
      *
      * @var string
      */
-    var $fetchmode_object_class = 'stdClass';
+    public $fetchmode_object_class = 'stdClass';
 
     /**
      * Was a connection present when the object was serialized()?
      * @var bool
      * @see DB_common::__sleep(), DB_common::__wake()
      */
-    var $was_connected = null;
+    public $was_connected = null;
 
     /**
      * The most recently executed query
      * @var string
      */
-    var $last_query = '';
+    public $last_query = '';
 
     /**
      * Run-time configuration options
@@ -85,7 +85,7 @@ class DB_common extends PEAR
      * @var array
      * @see DB_common::setOption()
      */
-    var $options = array(
+    public $options = array(
         'result_buffering' => 500,
         'persistent' => false,
         'ssl' => false,
@@ -101,32 +101,32 @@ class DB_common extends PEAR
      * @var array
      * @since Property available since Release 1.7.0
      */
-    var $last_parameters = array();
+    public $last_parameters = array();
 
     /**
      * The elements from each prepared statement
      * @var array
      */
-    var $prepare_tokens = array();
+    public $prepare_tokens = array();
 
     /**
      * The data types of the various elements in each prepared statement
      * @var array
      */
-    var $prepare_types = array();
+    public $prepare_types = array();
 
     /**
      * The prepared queries
      * @var array
      */
-    var $prepared_queries = array();
+    public $prepared_queries = array();
 
     /**
      * Flag indicating that the last query was a manipulation query.
      * @access protected
      * @var boolean
      */
-    var $_last_query_manip = false;
+    public $_last_query_manip = false;
 
     /**
      * Flag indicating that the next query <em>must</em> be a manipulation
@@ -134,7 +134,7 @@ class DB_common extends PEAR
      * @access protected
      * @var boolean
      */
-    var $_next_query_manip = false;
+    public $_next_query_manip = false;
 
 
     // }}}
@@ -145,7 +145,7 @@ class DB_common extends PEAR
      *
      * @return void
      */
-    function __construct()
+    public function __construct()
     {
         $this->PEAR('DB_Error');
     }
@@ -159,7 +159,7 @@ class DB_common extends PEAR
      *
      * @return array  the array of properties names that should be saved
      */
-    function __sleep()
+    public function __sleep()
     {
         if ($this->connection) {
             // Don't disconnect(), people use serialize() for many reasons
@@ -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',
+            );
         }
     }
 
@@ -201,7 +201,7 @@ class DB_common extends PEAR
      *
      * @return void
      */
-    function __wakeup()
+    public function __wakeup()
     {
         if ($this->was_connected) {
             $this->connect($this->dsn, $this->options['persistent']);
@@ -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
      */
-    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
      */
-    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,14 +252,14 @@ 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
      *
      * @see DB_common::quoteSmart(), DB_common::escapeSimple()
      * @deprecated Method deprecated some time before Release 1.2
      */
-    function quoteString($string)
+    public function quoteString($string)
     {
         $string = $this->quoteSmart($string);
         if ($string{0} == "'") {
@@ -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 <samp>NULL</samp>
-     *                  if the value submitted is <kbd>null</kbd>.
-     *
-     * @see DB_common::quoteSmart(), DB_common::escapeSimple()
-     * @deprecated Deprecated in release 1.6.0
-     */
-    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 (<kbd>`</kbd>) -- due to MySQL
-     *   + double quote (<kbd>"</kbd>) -- due to Oracle
-     *   + brackets (<kbd>[</kbd> or <kbd>]</kbd>) -- 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 <kbd>set quoted_identifier on</kbd> 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
-     */
-    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:
@@ -436,7 +372,7 @@ class DB_common extends PEAR
      * @see DB_common::escapeSimple()
      * @since Method available since Release 1.6.0
      */
-    function quoteSmart($in)
+    public function quoteSmart($in)
     {
         if (is_int($in)) {
             return $in;
@@ -448,14 +384,53 @@ class DB_common extends PEAR
             return 'NULL';
         } else {
             if ($this->dbsyntax == 'access'
-                && preg_match('/^#.+#$/', $in))
-            {
+                && preg_match('/^#.+#$/', $in)) {
                 return $this->escapeSimple($in);
             }
             return "'" . $this->escapeSimple($in) . "'";
         }
     }
 
+    // }}}
+    // {{{ 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()
 
@@ -468,47 +443,73 @@ class DB_common extends PEAR
      * @see DB_common::quoteSmart()
      * @since Method available since release 1.7.8.
      */
-    function quoteBoolean($boolean) {
+    public function quoteBoolean($boolean)
+    {
         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 <samp>NULL</samp>
+     *                  if the value submitted is <kbd>null</kbd>.
+     *
+     * @see DB_common::quoteSmart(), DB_common::escapeSimple()
+     * @deprecated Deprecated in release 1.6.0
      */
-    function quoteFloat($float) {
-        return "'".$this->escapeSimple(str_replace(',', '.', strval(floatval($float))))."'";
+    public function quote($string = null)
+    {
+        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 (<kbd>`</kbd>) -- due to MySQL
+     *   + double quote (<kbd>"</kbd>) -- due to Oracle
+     *   + brackets (<kbd>[</kbd> or <kbd>]</kbd>) -- 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 <kbd>set quoted_identifier on</kbd> 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
      */
-    function escapeSimple($str)
+    public function quoteIdentifier($str)
     {
-        return str_replace("'", "''", $str);
+        return '"' . str_replace('"', '""', $str) . '"';
     }
 
     // }}}
@@ -517,11 +518,11 @@ 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
      */
-    function provides($feature)
+    public function provides($feature)
     {
         return $this->features[$feature];
     }
@@ -532,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
@@ -542,13 +543,15 @@ 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
      */
-    function setFetchMode($fetchmode, $object_class = 'stdClass')
+    public function setFetchMode($fetchmode, $object_class = 'stdClass')
     {
         switch ($fetchmode) {
             case DB_FETCHMODE_OBJECT:
                 $this->fetchmode_object_class = $object_class;
+            // no break
             case DB_FETCHMODE_ORDERED:
             case DB_FETCHMODE_ASSOC:
                 $this->fetchmode = $fetchmode;
@@ -556,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
      *
@@ -693,13 +780,13 @@ class DB_common extends PEAR
      * </code>
      *
      * @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
      */
-    function setOption($option, $value)
+    public function setOption($option, $value)
     {
         if (isset($this->options[$option])) {
             $this->options[$option] = $value;
@@ -713,15 +800,15 @@ class DB_common extends PEAR
                     switch ($this->phptype) {
                         case 'oci8':
                             $this->options['portability'] =
-                                    DB_PORTABILITY_LOWERCASE |
-                                    DB_PORTABILITY_NUMROWS;
+                                DB_PORTABILITY_LOWERCASE |
+                                DB_PORTABILITY_NUMROWS;
                             break;
                         case 'fbsql':
                         case 'mysql':
                         case 'mysqli':
                         case 'sqlite':
                             $this->options['portability'] =
-                                    DB_PORTABILITY_DELETE_COUNT;
+                                DB_PORTABILITY_DELETE_COUNT;
                             break;
                     }
                 } else {
@@ -734,102 +821,47 @@ class DB_common extends PEAR
         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
-     */
-    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:
-     *   + <kbd>?</kbd>  scalar value (i.e. strings, integers).  The system
-     *                   will automatically quote and escape the data.
-     *   + <kbd>!</kbd>  value is inserted 'as is'
-     *   + <kbd>&</kbd>  requires a file name.  The file's contents get
-     *                   inserted into the query (i.e. saving binary
-     *                   data in a db)
-     *
-     * Example 1.
-     * <code>
-     * $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);
-     * </code>
-     *
-     * Use backslashes to escape placeholder characters if you don't want
-     * them to be interpreted as placeholders:
-     * <pre>
-     *    "UPDATE foo SET col=? WHERE col='over \& under'"
-     * </pre>
-     *
-     * With some database backends, this is emulated.
-     *
-     * {@internal ibase and oci8 have their own prepare() methods.}}
+     * Automaticaly generates an insert or update query and call prepare()
+     * and execute() with it
      *
-     * @param string $query  the query to be prepared
+     * @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:
+     *                               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 mixed  DB statement resource on success. A DB_Error object
-     *                 on failure.
+     * @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.
      *
-     * @see DB_common::execute()
+     * @uses DB_common::autoPrepare(), DB_common::execute()
      */
-    function prepare($query)
+    public function autoExecute(
+        $table,
+        $fields_values,
+        $mode = DB_AUTOQUERY_INSERT,
+        $where = false
+    )
     {
-        $tokens   = preg_split('/((?<!\\\)[&?!])/', $query, -1,
-                               PREG_SPLIT_DELIM_CAPTURE);
-        $token     = 0;
-        $types     = array();
-        $newtokens = array();
-
-        foreach ($tokens as $val) {
-            switch ($val) {
-                case '?':
-                    $types[$token++] = DB_PARAM_SCALAR;
-                    break;
-                case '&':
-                    $types[$token++] = DB_PARAM_OPAQUE;
-                    break;
-                case '!':
-                    $types[$token++] = DB_PARAM_MISC;
-                    break;
-                default:
-                    $newtokens[] = preg_replace('/\\\([&?!])/', "\\1", $val);
-            }
+        $sth = $this->autoPrepare(
+            $table,
+            array_keys($fields_values),
+            $mode,
+            $where
+        );
+        if (DB::isError($sth)) {
+            return $sth;
         }
-
-        $this->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;
+        $ret = $this->execute($sth, array_values($fields_values));
+        $this->freePrepared($sth);
+        return $ret;
     }
 
     // }}}
@@ -838,20 +870,24 @@ class DB_common extends PEAR
     /**
      * 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:
+     * @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.
      *
-     * @return resource  the query handle
+     * @return resource|string
      *
      * @uses DB_common::prepare(), DB_common::buildManipSQL()
      */
-    function autoPrepare($table, $table_fields, $mode = DB_AUTOQUERY_INSERT,
-                         $where = false)
+    public function autoPrepare(
+        $table,
+        $table_fields,
+        $mode = DB_AUTOQUERY_INSERT,
+        $where = false
+    )
     {
         $query = $this->buildManipSQL($table, $table_fields, $mode, $where);
         if (DB::isError($query)) {
@@ -863,42 +899,6 @@ class DB_common extends PEAR
     // }}}
     // {{{ autoExecute()
 
-    /**
-     * 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
-     *                               field name and $value its value
-     * @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 mixed  a new DB_result object for successful SELECT queries
-     *                 or DB_OK for successul data manipulation queries.
-     *                 A DB_Error object on failure.
-     *
-     * @uses DB_common::autoPrepare(), DB_common::execute()
-     */
-    function autoExecute($table, $fields_values, $mode = DB_AUTOQUERY_INSERT,
-                         $where = false)
-    {
-        $sth = $this->autoPrepare($table, array_keys($fields_values), $mode,
-                                  $where);
-        if (DB::isError($sth)) {
-            return $sth;
-        }
-        $ret = $this->execute($sth, array_values($fields_values));
-        $this->freePrepared($sth);
-        return $ret;
-
-    }
-
-    // }}}
-    // {{{ buildManipSQL()
-
     /**
      * Produces an SQL query string for autoPrepare()
      *
@@ -919,17 +919,17 @@ 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.
      *
      * @return string  the sql query for autoPrepare()
      */
-    function buildManipSQL($table, $table_fields, $mode, $where = false)
+    public function buildManipSQL($table, $table_fields, $mode, $where = false)
     {
         if (count($table_fields) == 0) {
             return $this->raiseError(DB_ERROR_NEED_MORE_DATA);
@@ -970,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:
+     *   + <kbd>?</kbd>  scalar value (i.e. strings, integers).  The system
+     *                   will automatically quote and escape the data.
+     *   + <kbd>!</kbd>  value is inserted 'as is'
+     *   + <kbd>&</kbd>  requires a file name.  The file's contents get
+     *                   inserted into the query (i.e. saving binary
+     *                   data in a db)
+     *
+     * Example 1.
+     * <code>
+     * $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);
+     * </code>
+     *
+     * Use backslashes to escape placeholder characters if you don't want
+     * them to be interpreted as placeholders:
+     * <pre>
+     *    "UPDATE foo SET col=? WHERE col='over \& under'"
+     * </pre>
+     *
+     * 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(
+            '/((?<!\\\)[&?!])/',
+            $query,
+            -1,
+            PREG_SPLIT_DELIM_CAPTURE
+        );
+        $token = 0;
+        $types = array();
+        $newtokens = array();
+
+        foreach ($tokens as $val) {
+            switch ($val) {
+                case '?':
+                    $types[$token++] = DB_PARAM_SCALAR;
+                    break;
+                case '&':
+                    $types[$token++] = DB_PARAM_OPAQUE;
+                    break;
+                case '!':
+                    $types[$token++] = DB_PARAM_MISC;
+                    break;
+                default:
+                    $newtokens[] = preg_replace('/\\\([&?!])/', "\\1", $val);
+            }
+        }
+
+        $this->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()
 
@@ -987,8 +1071,8 @@ class DB_common extends PEAR
      * $res = $db->execute($sth, $data);
      * </code>
      *
-     * @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
@@ -1002,7 +1086,7 @@ class DB_common extends PEAR
      *
      * @see DB_common::prepare()
      */
-    function &execute($stmt, $data = array())
+    public function &execute($stmt, $data = array())
     {
         $realquery = $this->executeEmulateQuery($stmt, $data);
         if (DB::isError($realquery)) {
@@ -1024,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
@@ -1037,7 +1121,7 @@ class DB_common extends PEAR
      * @access protected
      * @see DB_common::execute()
      */
-    function executeEmulateQuery($stmt, $data = array())
+    public function executeEmulateQuery($stmt, $data = array())
     {
         $stmt = (int)$stmt;
         $data = (array)$data;
@@ -1074,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
      *
@@ -1083,15 +1194,15 @@ 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.
      *
      * @see DB_common::prepare(), DB_common::execute()
      */
-    function executeMultiple($stmt, $data)
+    public function executeMultiple($stmt, $data)
     {
         foreach ($data as $value) {
             $res = $this->execute($stmt, $value);
@@ -1102,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()
-     */
-    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()
 
@@ -1137,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
      *
@@ -1145,13 +1229,46 @@ class DB_common extends PEAR
      * @see DB_mysql::modifyQuery(), DB_oci8::modifyQuery(),
      *      DB_sqlite::modifyQuery()
      */
-    function modifyQuery($query)
+    public function modifyQuery($query)
     {
         return $query;
     }
 
     // }}}
-    // {{{ modifyLimitQuery()
+    // {{{ 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
@@ -1159,10 +1276,10 @@ class DB_common extends PEAR
      * 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
@@ -1172,13 +1289,13 @@ class DB_common extends PEAR
      *
      * @access protected
      */
-    function modifyLimitQuery($query, $from, $count, $params = array())
+    public function modifyLimitQuery($query, $from, $count, $params = array())
     {
         return $query;
     }
 
     // }}}
-    // {{{ query()
+    // {{{ limitQuery()
 
     /**
      * Sends a query to the database server
@@ -1187,8 +1304,8 @@ class DB_common extends PEAR
      * to the server OR if <var>$params</var> 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
@@ -1200,7 +1317,7 @@ class DB_common extends PEAR
      *
      * @see DB_result, DB_common::prepare(), DB_common::execute()
      */
-    function &query($query, $params = array())
+    public function &query($query, $params = array())
     {
         if (sizeof($params) > 0) {
             $sth = $this->prepare($query);
@@ -1222,39 +1339,6 @@ class DB_common extends PEAR
         }
     }
 
-    // }}}
-    // {{{ 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.
-     */
-    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;
-    }
-
     // }}}
     // {{{ getOne()
 
@@ -1263,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
@@ -1273,7 +1357,7 @@ class DB_common extends PEAR
      * @return mixed  the returned value of the query.
      *                 A DB_Error object on failure.
      */
-    function &getOne($query, $params = array())
+    public function &getOne($query, $params = array())
     {
         $params = (array)$params;
         // modifyLimitQuery() would be nice here, but it causes BC issues
@@ -1310,19 +1394,22 @@ 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.
      */
-    function &getRow($query, $params = array(),
-                     $fetchmode = DB_FETCHMODE_DEFAULT)
+    public function &getRow(
+        $query,
+        $params = array(),
+        $fetchmode = DB_FETCHMODE_DEFAULT
+    )
     {
         // compat check, the params and fetchmode parameters used to
         // have the opposite order
@@ -1370,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()
-     */
-    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
@@ -1496,30 +1519,35 @@ 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.
      */
-    function &getAssoc($query, $force_array = false, $params = array(),
-                       $fetchmode = DB_FETCHMODE_DEFAULT, $group = false)
+    public function &getAssoc(
+        $query,
+        $force_array = false,
+        $params = array(),
+        $fetchmode = DB_FETCHMODE_DEFAULT,
+        $group = false
+    )
     {
         $params = (array)$params;
         if (sizeof($params) > 0) {
@@ -1609,28 +1637,31 @@ 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
      */
-    function &getAll($query, $params = array(),
-                     $fetchmode = DB_FETCHMODE_DEFAULT)
+    public function &getAll(
+        $query,
+        $params = array(),
+        $fetchmode = DB_FETCHMODE_DEFAULT
+    )
     {
         // compat check, the params and fetchmode parameters used to
         // have the opposite order
@@ -1687,79 +1718,79 @@ 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.
      */
-    function autoCommit($onoff = false)
+    public function autoCommit($onoff = false)
     {
         return $this->raiseError(DB_ERROR_NOT_CAPABLE);
     }
 
     // }}}
-    // {{{ commit()
+    // {{{ autoCommit()
 
     /**
      * Commits the current transaction
      *
-     * @return int  DB_OK on success.  A DB_Error object on failure.
+     * @return int|object
      */
-    function commit()
+    public function commit()
     {
         return $this->raiseError(DB_ERROR_NOT_CAPABLE);
     }
 
     // }}}
-    // {{{ rollback()
+    // {{{ commit()
 
     /**
      * Reverts the current transaction
      *
-     * @return int  DB_OK on success.  A DB_Error object on failure.
+     * @return int|object
      */
-    function rollback()
+    public function rollback()
     {
         return $this->raiseError(DB_ERROR_NOT_CAPABLE);
     }
 
     // }}}
-    // {{{ 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
      */
-    function numRows($result)
+    public function numRows($result)
     {
         return $this->raiseError(DB_ERROR_NOT_CAPABLE);
     }
 
     // }}}
-    // {{{ 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
      */
-    function affectedRows()
+    public function affectedRows()
     {
         return $this->raiseError(DB_ERROR_NOT_CAPABLE);
     }
 
     // }}}
-    // {{{ getSequenceName()
+    // {{{ affectedRows()
 
     /**
      * Generates the name used inside the database for a sequence
@@ -1767,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
      *
@@ -1775,10 +1806,30 @@ class DB_common extends PEAR
      * @see DB_common::createSequence(), DB_common::dropSequence(),
      *      DB_common::nextID(), DB_common::setOption()
      */
-    function getSequenceName($sqn)
+    public function getSequenceName($sqn)
+    {
+        return sprintf(
+            $this->getOption('seqname_format'),
+            preg_replace('/[^a-z0-9_.]/i', '_', $sqn)
+        );
+    }
+
+    // }}}
+    // {{{ 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)
     {
-        return sprintf($this->getOption('seqname_format'),
-                       preg_replace('/[^a-z0-9_.]/i', '_', $sqn));
+        if (isset($this->options[$option])) {
+            return $this->options[$option];
+        }
+        return $this->raiseError("unknown option $option");
     }
 
     // }}}
@@ -1787,17 +1838,17 @@ class DB_common extends PEAR
     /**
      * 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(),
      *      DB_common::getSequenceName()
      */
-    function nextId($seq_name, $ondemand = true)
+    public function nextId($seq_name, $ondemand = true)
     {
         return $this->raiseError(DB_ERROR_NOT_CAPABLE);
     }
@@ -1815,14 +1866,14 @@ class DB_common extends PEAR
      *
      * <var>seqname_format</var> 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()
      */
-    function createSequence($seq_name)
+    public function createSequence($seq_name)
     {
         return $this->raiseError(DB_ERROR_NOT_CAPABLE);
     }
@@ -1833,14 +1884,14 @@ 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()
      */
-    function dropSequence($seq_name)
+    public function dropSequence($seq_name)
     {
         return $this->raiseError(DB_ERROR_NOT_CAPABLE);
     }
@@ -1848,94 +1899,31 @@ 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
-     */
-    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
      *
      * @return mixed  the DBMS' error code.  A DB_Error object on failure.
      */
-    function errorNative()
+    public function errorNative()
     {
         return $this->raiseError(DB_ERROR_NOT_CAPABLE);
     }
 
     // }}}
-    // {{{ errorCode()
+    // {{{ errorNative()
 
     /**
      * Maps native error codes to DB's portable ones
      *
      * Uses the <var>$errorcode_map</var> 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
      *               $nativecode submitted.
      */
-    function errorCode($nativecode)
+    public function errorCode($nativecode)
     {
         if (isset($this->errorcode_map[$nativecode])) {
             return $this->errorcode_map[$nativecode];
@@ -1945,25 +1933,25 @@ 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.
      *
      * @see DB::errorMessage()
      */
-    function errorMessage($dbcode)
+    public function errorMessage($dbcode)
     {
         return DB::errorMessage($this->errorcode_map[$dbcode]);
     }
 
     // }}}
-    // {{{ tableInfo()
+    // {{{ errorMessage()
 
     /**
      * Returns information about a table or a result set
@@ -2068,24 +2056,24 @@ class DB_common extends PEAR
      * If the 'portability' option has <samp>DB_PORTABILITY_LOWERCASE</samp>
      * 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:
      *                     <kbd>DB_TABLEINFO_ORDERTABLE</kbd>,
      *                     <kbd>DB_TABLEINFO_ORDER</kbd> or
      *                     <kbd>DB_TABLEINFO_FULL</kbd> (which does both).
      *                     These are bitwise, so the first two can be
      *                     combined using <kbd>|</kbd>.
      *
-     * @return array  an associative array with the information requested.
+     * @return array|object
      *                 A DB_Error object on failure.
      *
      * @see DB_common::setOption()
      */
-    function tableInfo($result, $mode = null)
+    public function tableInfo($result, $mode = null)
     {
         /*
          * If the DB_<driver> class has a tableInfo() method, that one
@@ -2096,7 +2084,7 @@ class DB_common extends PEAR
     }
 
     // }}}
-    // {{{ getTables()
+    // {{{ tableInfo()
 
     /**
      * Lists the tables in the current database
@@ -2105,26 +2093,26 @@ class DB_common extends PEAR
      *
      * @deprecated Method deprecated some time before Release 1.2
      */
-    function getTables()
+    public function getTables()
     {
         return $this->getListOf('tables');
     }
 
     // }}}
-    // {{{ 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.
      */
-    function getListOf($type)
+    public function getListOf($type)
     {
         $sql = $this->getSpecialQuery($type);
         if ($sql === null) {
@@ -2142,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
@@ -2155,11 +2143,75 @@ class DB_common extends PEAR
      * @access protected
      * @see DB_common::getListOf()
      */
-    function getSpecialQuery($type)
+    public function getSpecialQuery($type)
     {
         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()
 
@@ -2174,7 +2226,7 @@ class DB_common extends PEAR
      *
      * @access public
      */
-    function nextQueryIsManip($manip)
+    public function nextQueryIsManip($manip)
     {
         $this->_next_query_manip = $manip;
     }
@@ -2194,7 +2246,7 @@ class DB_common extends PEAR
      *
      * @access protected
      */
-    function _checkManip($query)
+    public function _checkManip($query)
     {
         if ($this->_next_query_manip || DB::isManip($query)) {
             $this->_last_query_manip = true;
@@ -2203,7 +2255,6 @@ class DB_common extends PEAR
         }
         $this->_next_query_manip = false;
         return $this->_last_query_manip;
-        $manip = $this->_next_query_manip;
     }
 
     // }}}
@@ -2212,13 +2263,13 @@ 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
      *
      * @access protected
      */
-    function _rtrimArrayValues(&$array)
+    public function _rtrimArrayValues(&$array)
     {
         foreach ($array as $key => $value) {
             if (is_string($value)) {
@@ -2233,13 +2284,13 @@ 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
      *
      * @access protected
      */
-    function _convertNullArrayValuesToEmpty(&$array)
+    public function _convertNullArrayValuesToEmpty(&$array)
     {
         foreach ($array as $key => $value) {
             if (is_null($value)) {
@@ -2257,5 +2308,3 @@ class DB_common extends PEAR
  * c-basic-offset: 4
  * End:
  */
-
-?>