diff options
| author | Cash Costello <cash.costello@gmail.com> | 2011-11-10 07:06:54 -0500 | 
|---|---|---|
| committer | Cash Costello <cash.costello@gmail.com> | 2011-11-10 07:06:54 -0500 | 
| commit | 30fe751219cd087eabcd0c880015c2d71f8186e1 (patch) | |
| tree | e066ece9baa5f001c051e2bb405c573aa7e25db2 /lib/phpFlickr | |
| parent | b46b9b1464249916d105ee46f0bdb7972863070d (diff) | |
| download | elgg-30fe751219cd087eabcd0c880015c2d71f8186e1.tar.gz elgg-30fe751219cd087eabcd0c880015c2d71f8186e1.tar.bz2  | |
removed flickr integration
Diffstat (limited to 'lib/phpFlickr')
| -rw-r--r-- | lib/phpFlickr/PEAR/DB.php | 1388 | ||||
| -rw-r--r-- | lib/phpFlickr/PEAR/DB/common.php | 2157 | ||||
| -rw-r--r-- | lib/phpFlickr/PEAR/DB/mysql.php | 1034 | ||||
| -rw-r--r-- | lib/phpFlickr/PEAR/DB/pgsql.php | 1097 | ||||
| -rw-r--r-- | lib/phpFlickr/PEAR/DB/storage.php | 504 | ||||
| -rw-r--r-- | lib/phpFlickr/PEAR/HTTP/Request.php | 1484 | ||||
| -rw-r--r-- | lib/phpFlickr/PEAR/HTTP/Request/Listener.php | 106 | ||||
| -rw-r--r-- | lib/phpFlickr/PEAR/Net/Socket.php | 528 | ||||
| -rw-r--r-- | lib/phpFlickr/PEAR/Net/URL.php | 410 | ||||
| -rw-r--r-- | lib/phpFlickr/PEAR/PEAR.php | 1108 | ||||
| -rw-r--r-- | lib/phpFlickr/README.txt | 215 | ||||
| -rw-r--r-- | lib/phpFlickr/auth.php | 37 | ||||
| -rw-r--r-- | lib/phpFlickr/example.php | 30 | ||||
| -rw-r--r-- | lib/phpFlickr/getToken.php | 19 | ||||
| -rw-r--r-- | lib/phpFlickr/phpFlickr.php | 1453 | 
15 files changed, 0 insertions, 11570 deletions
diff --git a/lib/phpFlickr/PEAR/DB.php b/lib/phpFlickr/PEAR/DB.php deleted file mode 100644 index a3eede070..000000000 --- a/lib/phpFlickr/PEAR/DB.php +++ /dev/null @@ -1,1388 +0,0 @@ -<?php - -/* vim: set expandtab tabstop=4 shiftwidth=4 softtabstop=4: */ - -/** - * Database independent query interface - * - * PHP versions 4 and 5 - * - * LICENSE: This source file is subject to version 3.0 of the PHP license - * that is available through the world-wide-web at the following URI: - * http://www.php.net/license/3_0.txt.  If you did not receive a copy of - * the PHP License and are unable to obtain it through the web, please - * send a note to license@php.net so we can mail you a copy immediately. - * - * @category   Database - * @package    DB - * @author     Stig Bakken <ssb@php.net> - * @author     Tomas V.V.Cox <cox@idecnet.com> - * @author     Daniel Convissor <danielc@php.net> - * @copyright  1997-2005 The PHP Group - * @license    http://www.php.net/license/3_0.txt  PHP License 3.0 - * @version    CVS: $Id: DB.php 32 2005-08-01 06:21:02Z dancoulter $ - * @link       http://pear.php.net/package/DB - */ - -/** - * Obtain the PEAR class so it can be extended from - */ -require_once 'PEAR.php'; - - -// {{{ constants -// {{{ error codes - -/**#@+ - * One of PEAR DB's portable error codes. - * @see DB_common::errorCode(), DB::errorMessage() - * - * {@internal If you add an error code here, make sure you also add a textual - * version of it in DB::errorMessage().}} - */ - -/** - * The code returned by many methods upon success - */ -define('DB_OK', 1); - -/** - * Unkown error - */ -define('DB_ERROR', -1); - -/** - * Syntax error - */ -define('DB_ERROR_SYNTAX', -2); - -/** - * Tried to insert a duplicate value into a primary or unique index - */ -define('DB_ERROR_CONSTRAINT', -3); - -/** - * An identifier in the query refers to a non-existant object - */ -define('DB_ERROR_NOT_FOUND', -4); - -/** - * Tried to create a duplicate object - */ -define('DB_ERROR_ALREADY_EXISTS', -5); - -/** - * The current driver does not support the action you attempted - */ -define('DB_ERROR_UNSUPPORTED', -6); - -/** - * The number of parameters does not match the number of placeholders - */ -define('DB_ERROR_MISMATCH', -7); - -/** - * A literal submitted did not match the data type expected - */ -define('DB_ERROR_INVALID', -8); - -/** - * The current DBMS does not support the action you attempted - */ -define('DB_ERROR_NOT_CAPABLE', -9); - -/** - * A literal submitted was too long so the end of it was removed - */ -define('DB_ERROR_TRUNCATED', -10); - -/** - * A literal number submitted did not match the data type expected - */ -define('DB_ERROR_INVALID_NUMBER', -11); - -/** - * A literal date submitted did not match the data type expected - */ -define('DB_ERROR_INVALID_DATE', -12); - -/** - * Attempt to divide something by zero - */ -define('DB_ERROR_DIVZERO', -13); - -/** - * A database needs to be selected - */ -define('DB_ERROR_NODBSELECTED', -14); - -/** - * Could not create the object requested - */ -define('DB_ERROR_CANNOT_CREATE', -15); - -/** - * Could not drop the database requested because it does not exist - */ -define('DB_ERROR_CANNOT_DROP', -17); - -/** - * An identifier in the query refers to a non-existant table - */ -define('DB_ERROR_NOSUCHTABLE', -18); - -/** - * An identifier in the query refers to a non-existant column - */ -define('DB_ERROR_NOSUCHFIELD', -19); - -/** - * The data submitted to the method was inappropriate - */ -define('DB_ERROR_NEED_MORE_DATA', -20); - -/** - * The attempt to lock the table failed - */ -define('DB_ERROR_NOT_LOCKED', -21); - -/** - * The number of columns doesn't match the number of values - */ -define('DB_ERROR_VALUE_COUNT_ON_ROW', -22); - -/** - * The DSN submitted has problems - */ -define('DB_ERROR_INVALID_DSN', -23); - -/** - * Could not connect to the database - */ -define('DB_ERROR_CONNECT_FAILED', -24); - -/** - * The PHP extension needed for this DBMS could not be found - */ -define('DB_ERROR_EXTENSION_NOT_FOUND',-25); - -/** - * The present user has inadequate permissions to perform the task requestd - */ -define('DB_ERROR_ACCESS_VIOLATION', -26); - -/** - * The database requested does not exist - */ -define('DB_ERROR_NOSUCHDB', -27); - -/** - * Tried to insert a null value into a column that doesn't allow nulls - */ -define('DB_ERROR_CONSTRAINT_NOT_NULL',-29); -/**#@-*/ - - -// }}} -// {{{ prepared statement-related - - -/**#@+ - * Identifiers for the placeholders used in prepared statements. - * @see DB_common::prepare() - */ - -/** - * Indicates a scalar (<kbd>?</kbd>) placeholder was used - * - * Quote and escape the value as necessary. - */ -define('DB_PARAM_SCALAR', 1); - -/** - * Indicates an opaque (<kbd>&</kbd>) placeholder was used - * - * The value presented is a file name.  Extract the contents of that file - * and place them in this column. - */ -define('DB_PARAM_OPAQUE', 2); - -/** - * Indicates a misc (<kbd>!</kbd>) placeholder was used - * - * The value should not be quoted or escaped. - */ -define('DB_PARAM_MISC',   3); -/**#@-*/ - - -// }}} -// {{{ binary data-related - - -/**#@+ - * The different ways of returning binary data from queries. - */ - -/** - * Sends the fetched data straight through to output - */ -define('DB_BINMODE_PASSTHRU', 1); - -/** - * Lets you return data as usual - */ -define('DB_BINMODE_RETURN', 2); - -/** - * Converts the data to hex format before returning it - * - * For example the string "123" would become "313233". - */ -define('DB_BINMODE_CONVERT', 3); -/**#@-*/ - - -// }}} -// {{{ fetch modes - - -/**#@+ - * Fetch Modes. - * @see DB_common::setFetchMode() - */ - -/** - * Indicates the current default fetch mode should be used - * @see DB_common::$fetchmode - */ -define('DB_FETCHMODE_DEFAULT', 0); - -/** - * Column data indexed by numbers, ordered from 0 and up - */ -define('DB_FETCHMODE_ORDERED', 1); - -/** - * Column data indexed by column names - */ -define('DB_FETCHMODE_ASSOC', 2); - -/** - * Column data as object properties - */ -define('DB_FETCHMODE_OBJECT', 3); - -/** - * For multi-dimensional results, make the column name the first level - * of the array and put the row number in the second level of the array - * - * This is flipped from the normal behavior, which puts the row numbers - * in the first level of the array and the column names in the second level. - */ -define('DB_FETCHMODE_FLIPPED', 4); -/**#@-*/ - -/**#@+ - * Old fetch modes.  Left here for compatibility. - */ -define('DB_GETMODE_ORDERED', DB_FETCHMODE_ORDERED); -define('DB_GETMODE_ASSOC',   DB_FETCHMODE_ASSOC); -define('DB_GETMODE_FLIPPED', DB_FETCHMODE_FLIPPED); -/**#@-*/ - - -// }}} -// {{{ tableInfo() && autoPrepare()-related - - -/**#@+ - * The type of information to return from the tableInfo() method. - * - * Bitwised constants, so they can be combined using <kbd>|</kbd> - * and removed using <kbd>^</kbd>. - * - * @see DB_common::tableInfo() - * - * {@internal Since the TABLEINFO constants are bitwised, if more of them are - * added in the future, make sure to adjust DB_TABLEINFO_FULL accordingly.}} - */ -define('DB_TABLEINFO_ORDER', 1); -define('DB_TABLEINFO_ORDERTABLE', 2); -define('DB_TABLEINFO_FULL', 3); -/**#@-*/ - - -/**#@+ - * The type of query to create with the automatic query building methods. - * @see DB_common::autoPrepare(), DB_common::autoExecute() - */ -define('DB_AUTOQUERY_INSERT', 1); -define('DB_AUTOQUERY_UPDATE', 2); -/**#@-*/ - - -// }}} -// {{{ portability modes - - -/**#@+ - * Portability Modes. - * - * Bitwised constants, so they can be combined using <kbd>|</kbd> - * and removed using <kbd>^</kbd>. - * - * @see DB_common::setOption() - * - * {@internal Since the PORTABILITY constants are bitwised, if more of them are - * added in the future, make sure to adjust DB_PORTABILITY_ALL accordingly.}} - */ - -/** - * Turn off all portability features - */ -define('DB_PORTABILITY_NONE', 0); - -/** - * Convert names of tables and fields to lower case - * when using the get*(), fetch*() and tableInfo() methods - */ -define('DB_PORTABILITY_LOWERCASE', 1); - -/** - * Right trim the data output by get*() and fetch*() - */ -define('DB_PORTABILITY_RTRIM', 2); - -/** - * Force reporting the number of rows deleted - */ -define('DB_PORTABILITY_DELETE_COUNT', 4); - -/** - * Enable hack that makes numRows() work in Oracle - */ -define('DB_PORTABILITY_NUMROWS', 8); - -/** - * Makes certain error messages in certain drivers compatible - * with those from other DBMS's - * - * + mysql, mysqli:  change unique/primary key constraints - *   DB_ERROR_ALREADY_EXISTS -> DB_ERROR_CONSTRAINT - * - * + odbc(access):  MS's ODBC driver reports 'no such field' as code - *   07001, which means 'too few parameters.'  When this option is on - *   that code gets mapped to DB_ERROR_NOSUCHFIELD. - */ -define('DB_PORTABILITY_ERRORS', 16); - -/** - * Convert null values to empty strings in data output by - * get*() and fetch*() - */ -define('DB_PORTABILITY_NULL_TO_EMPTY', 32); - -/** - * Turn on all portability features - */ -define('DB_PORTABILITY_ALL', 63); -/**#@-*/ - -// }}} - - -// }}} -// {{{ class DB - -/** - * Database independent query interface - * - * The main "DB" class is simply a container class with some static - * methods for creating DB objects as well as some utility functions - * common to all parts of DB. - * - * The object model of DB is as follows (indentation means inheritance): - * <pre> - * DB           The main DB class.  This is simply a utility class - *              with some "static" methods for creating DB objects as - *              well as common utility functions for other DB classes. - * - * DB_common    The base for each DB implementation.  Provides default - * |            implementations (in OO lingo virtual methods) for - * |            the actual DB implementations as well as a bunch of - * |            query utility functions. - * | - * +-DB_mysql   The DB implementation for MySQL.  Inherits DB_common. - *              When calling DB::factory or DB::connect for MySQL - *              connections, the object returned is an instance of this - *              class. - * </pre> - * - * @category   Database - * @package    DB - * @author     Stig Bakken <ssb@php.net> - * @author     Tomas V.V.Cox <cox@idecnet.com> - * @author     Daniel Convissor <danielc@php.net> - * @copyright  1997-2005 The PHP Group - * @license    http://www.php.net/license/3_0.txt  PHP License 3.0 - * @version    Release: @package_version@ - * @link       http://pear.php.net/package/DB - */ -class DB -{ -    // {{{ &factory() - -    /** -     * Create a new DB object for the specified database type but don't -     * connect to the database -     * -     * @param string $type     the database type (eg "mysql") -     * @param array  $options  an associative array of option names and values -     * -     * @return object  a new DB object.  A DB_Error object on failure. -     * -     * @see DB_common::setOption() -     */ -    function &factory($type, $options = false) -    { -        if (!is_array($options)) { -            $options = array('persistent' => $options); -        } - -        if (isset($options['debug']) && $options['debug'] >= 2) { -            // expose php errors with sufficient debug level -            include_once "DB/{$type}.php"; -        } else { -            @include_once "DB/{$type}.php"; -        } - -        $classname = "DB_${type}"; - -        if (!class_exists($classname)) { -            $tmp = PEAR::raiseError(null, DB_ERROR_NOT_FOUND, null, null, -                                    "Unable to include the DB/{$type}.php" -                                    . " file for '$dsn'", -                                    'DB_Error', true); -            return $tmp; -        } - -        @$obj =& new $classname; - -        foreach ($options as $option => $value) { -            $test = $obj->setOption($option, $value); -            if (DB::isError($test)) { -                return $test; -            } -        } - -        return $obj; -    } - -    // }}} -    // {{{ &connect() - -    /** -     * Create a new DB object including a connection to the specified database -     * -     * Example 1. -     * <code> -     * require_once 'DB.php'; -     * -     * $dsn = 'pgsql://user:password@host/database'; -     * $options = array( -     *     'debug'       => 2, -     *     'portability' => DB_PORTABILITY_ALL, -     * ); -     * -     * $db =& DB::connect($dsn, $options); -     * if (PEAR::isError($db)) { -     *     die($db->getMessage()); -     * } -     * </code> -     * -     * @param mixed $dsn      the string "data source name" or array in the -     *                         format returned by DB::parseDSN() -     * @param array $options  an associative array of option names and values -     * -     * @return object  a new DB object.  A DB_Error object on failure. -     * -     * @uses DB_dbase::connect(), DB_fbsql::connect(), DB_ibase::connect(), -     *       DB_ifx::connect(), DB_msql::connect(), DB_mssql::connect(), -     *       DB_mysql::connect(), DB_mysqli::connect(), DB_oci8::connect(), -     *       DB_odbc::connect(), DB_pgsql::connect(), DB_sqlite::connect(), -     *       DB_sybase::connect() -     * -     * @uses DB::parseDSN(), DB_common::setOption(), PEAR::isError() -     */ -    function &connect($dsn, $options = array()) -    { -        $dsninfo = DB::parseDSN($dsn); -        $type = $dsninfo['phptype']; - -        if (!is_array($options)) { -            /* -             * For backwards compatibility.  $options used to be boolean, -             * indicating whether the connection should be persistent. -             */ -            $options = array('persistent' => $options); -        } - -        if (isset($options['debug']) && $options['debug'] >= 2) { -            // expose php errors with sufficient debug level -            include_once "DB/${type}.php"; -        } else { -            @include_once "DB/${type}.php"; -        } - -        $classname = "DB_${type}"; -        if (!class_exists($classname)) { -            $tmp = PEAR::raiseError(null, DB_ERROR_NOT_FOUND, null, null, -                                    "Unable to include the DB/{$type}.php" -                                    . " file for '$dsn'", -                                    'DB_Error', true); -            return $tmp; -        } - -        @$obj =& new $classname; - -        foreach ($options as $option => $value) { -            $test = $obj->setOption($option, $value); -            if (DB::isError($test)) { -                return $test; -            } -        } - -        $err = $obj->connect($dsninfo, $obj->getOption('persistent')); -        if (DB::isError($err)) { -            $err->addUserInfo($dsn); -            return $err; -        } - -        return $obj; -    } - -    // }}} -    // {{{ apiVersion() - -    /** -     * Return the DB API version -     * -     * @return string  the DB API version number -     */ -    function apiVersion() -    { -        return '@package_version@'; -    } - -    // }}} -    // {{{ isError() - -    /** -     * Determines if a variable is a DB_Error object -     * -     * @param mixed $value  the variable to check -     * -     * @return bool  whether $value is DB_Error object -     */ -    function isError($value) -    { -        return is_a($value, 'DB_Error'); -    } - -    // }}} -    // {{{ isConnection() - -    /** -     * Determines if a value is a DB_<driver> object -     * -     * @param mixed $value  the value to test -     * -     * @return bool  whether $value is a DB_<driver> object -     */ -    function isConnection($value) -    { -        return (is_object($value) && -                is_subclass_of($value, 'db_common') && -                method_exists($value, 'simpleQuery')); -    } - -    // }}} -    // {{{ isManip() - -    /** -     * Tell whether a query is a data manipulation or data definition query -     * -     * Examples of data manipulation queries are INSERT, UPDATE and DELETE. -     * Examples of data definition queries are CREATE, DROP, ALTER, GRANT, -     * REVOKE. -     * -     * @param string $query  the query -     * -     * @return boolean  whether $query is a data manipulation query -     */ -    function isManip($query) -    { -        $manips = 'INSERT|UPDATE|DELETE|REPLACE|' -                . 'CREATE|DROP|' -                . 'LOAD DATA|SELECT .* INTO|COPY|' -                . 'ALTER|GRANT|REVOKE|' -                . 'LOCK|UNLOCK'; -        if (preg_match('/^\s*"?(' . $manips . ')\s+/i', $query)) { -            return true; -        } -        return false; -    } - -    // }}} -    // {{{ errorMessage() - -    /** -     * Return a textual error message for a DB error code -     * -     * @param integer $value  the DB error code -     * -     * @return string  the error message or false if the error code was -     *                  not recognized -     */ -    function errorMessage($value) -    { -        static $errorMessages; -        if (!isset($errorMessages)) { -            $errorMessages = array( -                DB_ERROR                    => 'unknown error', -                DB_ERROR_ACCESS_VIOLATION   => 'insufficient permissions', -                DB_ERROR_ALREADY_EXISTS     => 'already exists', -                DB_ERROR_CANNOT_CREATE      => 'can not create', -                DB_ERROR_CANNOT_DROP        => 'can not drop', -                DB_ERROR_CONNECT_FAILED     => 'connect failed', -                DB_ERROR_CONSTRAINT         => 'constraint violation', -                DB_ERROR_CONSTRAINT_NOT_NULL=> 'null value violates not-null constraint', -                DB_ERROR_DIVZERO            => 'division by zero', -                DB_ERROR_EXTENSION_NOT_FOUND=> 'extension not found', -                DB_ERROR_INVALID            => 'invalid', -                DB_ERROR_INVALID_DATE       => 'invalid date or time', -                DB_ERROR_INVALID_DSN        => 'invalid DSN', -                DB_ERROR_INVALID_NUMBER     => 'invalid number', -                DB_ERROR_MISMATCH           => 'mismatch', -                DB_ERROR_NEED_MORE_DATA     => 'insufficient data supplied', -                DB_ERROR_NODBSELECTED       => 'no database selected', -                DB_ERROR_NOSUCHDB           => 'no such database', -                DB_ERROR_NOSUCHFIELD        => 'no such field', -                DB_ERROR_NOSUCHTABLE        => 'no such table', -                DB_ERROR_NOT_CAPABLE        => 'DB backend not capable', -                DB_ERROR_NOT_FOUND          => 'not found', -                DB_ERROR_NOT_LOCKED         => 'not locked', -                DB_ERROR_SYNTAX             => 'syntax error', -                DB_ERROR_UNSUPPORTED        => 'not supported', -                DB_ERROR_TRUNCATED          => 'truncated', -                DB_ERROR_VALUE_COUNT_ON_ROW => 'value count on row', -                DB_OK                       => 'no error', -            ); -        } - -        if (DB::isError($value)) { -            $value = $value->getCode(); -        } - -        return isset($errorMessages[$value]) ? $errorMessages[$value] -                     : $errorMessages[DB_ERROR]; -    } - -    // }}} -    // {{{ parseDSN() - -    /** -     * Parse a data source name -     * -     * Additional keys can be added by appending a URI query string to the -     * end of the DSN. -     * -     * The format of the supplied DSN is in its fullest form: -     * <code> -     *  phptype(dbsyntax)://username:password@protocol+hostspec/database?option=8&another=true -     * </code> -     * -     * Most variations are allowed: -     * <code> -     *  phptype://username:password@protocol+hostspec:110//usr/db_file.db?mode=0644 -     *  phptype://username:password@hostspec/database_name -     *  phptype://username:password@hostspec -     *  phptype://username@hostspec -     *  phptype://hostspec/database -     *  phptype://hostspec -     *  phptype(dbsyntax) -     *  phptype -     * </code> -     * -     * @param string $dsn Data Source Name to be parsed -     * -     * @return array an associative array with the following keys: -     *  + phptype:  Database backend used in PHP (mysql, odbc etc.) -     *  + dbsyntax: Database used with regards to SQL syntax etc. -     *  + protocol: Communication protocol to use (tcp, unix etc.) -     *  + hostspec: Host specification (hostname[:port]) -     *  + database: Database to use on the DBMS server -     *  + username: User name for login -     *  + password: Password for login -     */ -    function parseDSN($dsn) -    { -        $parsed = array( -            'phptype'  => false, -            'dbsyntax' => false, -            'username' => false, -            'password' => false, -            'protocol' => false, -            'hostspec' => false, -            'port'     => false, -            'socket'   => false, -            'database' => false, -        ); - -        if (is_array($dsn)) { -            $dsn = array_merge($parsed, $dsn); -            if (!$dsn['dbsyntax']) { -                $dsn['dbsyntax'] = $dsn['phptype']; -            } -            return $dsn; -        } - -        // Find phptype and dbsyntax -        if (($pos = strpos($dsn, '://')) !== false) { -            $str = substr($dsn, 0, $pos); -            $dsn = substr($dsn, $pos + 3); -        } else { -            $str = $dsn; -            $dsn = null; -        } - -        // Get phptype and dbsyntax -        // $str => phptype(dbsyntax) -        if (preg_match('|^(.+?)\((.*?)\)$|', $str, $arr)) { -            $parsed['phptype']  = $arr[1]; -            $parsed['dbsyntax'] = !$arr[2] ? $arr[1] : $arr[2]; -        } else { -            $parsed['phptype']  = $str; -            $parsed['dbsyntax'] = $str; -        } - -        if (!count($dsn)) { -            return $parsed; -        } - -        // Get (if found): username and password -        // $dsn => username:password@protocol+hostspec/database -        if (($at = strrpos($dsn,'@')) !== false) { -            $str = substr($dsn, 0, $at); -            $dsn = substr($dsn, $at + 1); -            if (($pos = strpos($str, ':')) !== false) { -                $parsed['username'] = rawurldecode(substr($str, 0, $pos)); -                $parsed['password'] = rawurldecode(substr($str, $pos + 1)); -            } else { -                $parsed['username'] = rawurldecode($str); -            } -        } - -        // Find protocol and hostspec - -        if (preg_match('|^([^(]+)\((.*?)\)/?(.*?)$|', $dsn, $match)) { -            // $dsn => proto(proto_opts)/database -            $proto       = $match[1]; -            $proto_opts  = $match[2] ? $match[2] : false; -            $dsn         = $match[3]; - -        } else { -            // $dsn => protocol+hostspec/database (old format) -            if (strpos($dsn, '+') !== false) { -                list($proto, $dsn) = explode('+', $dsn, 2); -            } -            if (strpos($dsn, '/') !== false) { -                list($proto_opts, $dsn) = explode('/', $dsn, 2); -            } else { -                $proto_opts = $dsn; -                $dsn = null; -            } -        } - -        // process the different protocol options -        $parsed['protocol'] = (!empty($proto)) ? $proto : 'tcp'; -        $proto_opts = rawurldecode($proto_opts); -        if ($parsed['protocol'] == 'tcp') { -            if (strpos($proto_opts, ':') !== false) { -                list($parsed['hostspec'], -                     $parsed['port']) = explode(':', $proto_opts); -            } else { -                $parsed['hostspec'] = $proto_opts; -            } -        } elseif ($parsed['protocol'] == 'unix') { -            $parsed['socket'] = $proto_opts; -        } - -        // Get dabase if any -        // $dsn => database -        if ($dsn) { -            if (($pos = strpos($dsn, '?')) === false) { -                // /database -                $parsed['database'] = rawurldecode($dsn); -            } else { -                // /database?param1=value1¶m2=value2 -                $parsed['database'] = rawurldecode(substr($dsn, 0, $pos)); -                $dsn = substr($dsn, $pos + 1); -                if (strpos($dsn, '&') !== false) { -                    $opts = explode('&', $dsn); -                } else { // database?param1=value1 -                    $opts = array($dsn); -                } -                foreach ($opts as $opt) { -                    list($key, $value) = explode('=', $opt); -                    if (!isset($parsed[$key])) { -                        // don't allow params overwrite -                        $parsed[$key] = rawurldecode($value); -                    } -                } -            } -        } - -        return $parsed; -    } - -    // }}} -} - -// }}} -// {{{ class DB_Error - -/** - * DB_Error implements a class for reporting portable database error - * messages - * - * @category   Database - * @package    DB - * @author     Stig Bakken <ssb@php.net> - * @copyright  1997-2005 The PHP Group - * @license    http://www.php.net/license/3_0.txt  PHP License 3.0 - * @version    Release: @package_version@ - * @link       http://pear.php.net/package/DB - */ -class DB_Error extends PEAR_Error -{ -    // {{{ constructor - -    /** -     * DB_Error constructor -     * -     * @param mixed $code       DB error code, or string with error message -     * @param int   $mode       what "error mode" to operate in -     * @param int   $level      what error level to use for $mode & -     *                           PEAR_ERROR_TRIGGER -     * @param mixed $debuginfo  additional debug info, such as the last query -     * -     * @see PEAR_Error -     */ -    function DB_Error($code = DB_ERROR, $mode = PEAR_ERROR_RETURN, -                      $level = E_USER_NOTICE, $debuginfo = null) -    { -        if (is_int($code)) { -            $this->PEAR_Error('DB Error: ' . DB::errorMessage($code), $code, -                              $mode, $level, $debuginfo); -        } else { -            $this->PEAR_Error("DB Error: $code", DB_ERROR, -                              $mode, $level, $debuginfo); -        } -    } - -    // }}} -} - -// }}} -// {{{ class DB_result - -/** - * This class implements a wrapper for a DB result set - * - * A new instance of this class will be returned by the DB implementation - * after processing a query that returns data. - * - * @category   Database - * @package    DB - * @author     Stig Bakken <ssb@php.net> - * @copyright  1997-2005 The PHP Group - * @license    http://www.php.net/license/3_0.txt  PHP License 3.0 - * @version    Release: @package_version@ - * @link       http://pear.php.net/package/DB - */ -class DB_result -{ -    // {{{ properties - -    /** -     * Should results be freed automatically when there are no more rows? -     * @var boolean -     * @see DB_common::$options -     */ -    var $autofree; - -    /** -     * A reference to the DB_<driver> object -     * @var object -     */ -    var $dbh; - -    /** -     * The current default fetch mode -     * @var integer -     * @see DB_common::$fetchmode -     */ -    var $fetchmode; - -    /** -     * The name of the class into which results should be fetched when -     * DB_FETCHMODE_OBJECT is in effect -     * -     * @var string -     * @see DB_common::$fetchmode_object_class -     */ -    var $fetchmode_object_class; - -    /** -     * The number of rows to fetch from a limit query -     * @var integer -     */ -    var $limit_count = null; - -    /** -     * The row to start fetching from in limit queries -     * @var integer -     */ -    var $limit_from = null; - -    /** -     * The execute parameters that created this result -     * @var array -     * @since Property available since Release 1.7.0 -     */ -    var $parameters; - -    /** -     * The query string that created this result -     * -     * Copied here incase it changes in $dbh, which is referenced -     * -     * @var string -     * @since Property available since Release 1.7.0 -     */ -    var $query; - -    /** -     * The query result resource id created by PHP -     * @var resource -     */ -    var $result; - -    /** -     * The present row being dealt with -     * @var integer -     */ -    var $row_counter = null; - -    /** -     * The prepared statement resource id created by PHP in $dbh -     * -     * This resource is only available when the result set was created using -     * a driver's native execute() method, not PEAR DB's emulated one. -     * -     * Copied here incase it changes in $dbh, which is referenced -     * -     * {@internal  Mainly here because the InterBase/Firebird API is only -     * able to retrieve data from result sets if the statemnt handle is -     * still in scope.}} -     * -     * @var resource -     * @since Property available since Release 1.7.0 -     */ -    var $statement; - - -    // }}} -    // {{{ constructor - -    /** -     * This constructor sets the object's properties -     * -     * @param object   &$dbh     the DB object reference -     * @param resource $result   the result resource id -     * @param array    $options  an associative array with result options -     * -     * @return void -     */ -    function DB_result(&$dbh, $result, $options = array()) -    { -        $this->autofree    = $dbh->options['autofree']; -        $this->dbh         = &$dbh; -        $this->fetchmode   = $dbh->fetchmode; -        $this->fetchmode_object_class = $dbh->fetchmode_object_class; -        $this->parameters  = $dbh->last_parameters; -        $this->query       = $dbh->last_query; -        $this->result      = $result; -        $this->statement   = empty($dbh->last_stmt) ? null : $dbh->last_stmt; -        foreach ($options as $key => $value) { -            $this->setOption($key, $value); -        } -    } - -    /** -     * Set options for the DB_result object -     * -     * @param string $key    the option to set -     * @param mixed  $value  the value to set the option to -     * -     * @return void -     */ -    function setOption($key, $value = null) -    { -        switch ($key) { -            case 'limit_from': -                $this->limit_from = $value; -                break; -            case 'limit_count': -                $this->limit_count = $value; -        } -    } - -    // }}} -    // {{{ fetchRow() - -    /** -     * Fetch a row of data and return it by reference into an array -     * -     * The type of array returned can be controlled either by setting this -     * method's <var>$fetchmode</var> parameter or by changing the default -     * fetch mode setFetchMode() before calling this method. -     * -     * There are two options for standardizing the information returned -     * from databases, ensuring their values are consistent when changing -     * DBMS's.  These portability options can be turned on when creating a -     * new DB object or by using setOption(). -     * -     *   + <var>DB_PORTABILITY_LOWERCASE</var> -     *     convert names of fields to lower case -     * -     *   + <var>DB_PORTABILITY_RTRIM</var> -     *     right trim the data -     * -     * @param int $fetchmode  the constant indicating how to format the data -     * @param int $rownum     the row number to fetch (index starts at 0) -     * -     * @return mixed  an array or object containing the row's data, -     *                 NULL when the end of the result set is reached -     *                 or a DB_Error object on failure. -     * -     * @see DB_common::setOption(), DB_common::setFetchMode() -     */ -    function &fetchRow($fetchmode = DB_FETCHMODE_DEFAULT, $rownum = null) -    { -        if ($fetchmode === DB_FETCHMODE_DEFAULT) { -            $fetchmode = $this->fetchmode; -        } -        if ($fetchmode === DB_FETCHMODE_OBJECT) { -            $fetchmode = DB_FETCHMODE_ASSOC; -            $object_class = $this->fetchmode_object_class; -        } -        if ($this->limit_from !== null) { -            if ($this->row_counter === null) { -                $this->row_counter = $this->limit_from; -                // Skip rows -                if ($this->dbh->features['limit'] === false) { -                    $i = 0; -                    while ($i++ < $this->limit_from) { -                        $this->dbh->fetchInto($this->result, $arr, $fetchmode); -                    } -                } -            } -            if ($this->row_counter >= ($this->limit_from + $this->limit_count)) -            { -                if ($this->autofree) { -                    $this->free(); -                } -                $tmp = null; -                return $tmp; -            } -            if ($this->dbh->features['limit'] === 'emulate') { -                $rownum = $this->row_counter; -            } -            $this->row_counter++; -        } -        $res = $this->dbh->fetchInto($this->result, $arr, $fetchmode, $rownum); -        if ($res === DB_OK) { -            if (isset($object_class)) { -                // The default mode is specified in the -                // DB_common::fetchmode_object_class property -                if ($object_class == 'stdClass') { -                    $arr = (object) $arr; -                } else { -                    $arr = &new $object_class($arr); -                } -            } -            return $arr; -        } -        if ($res == null && $this->autofree) { -            $this->free(); -        } -        return $res; -    } - -    // }}} -    // {{{ fetchInto() - -    /** -     * Fetch a row of data into an array which is passed by reference -     * -     * The type of array returned can be controlled either by setting this -     * method's <var>$fetchmode</var> parameter or by changing the default -     * fetch mode setFetchMode() before calling this method. -     * -     * There are two options for standardizing the information returned -     * from databases, ensuring their values are consistent when changing -     * DBMS's.  These portability options can be turned on when creating a -     * new DB object or by using setOption(). -     * -     *   + <var>DB_PORTABILITY_LOWERCASE</var> -     *     convert names of fields to lower case -     * -     *   + <var>DB_PORTABILITY_RTRIM</var> -     *     right trim the data -     * -     * @param array &$arr       the variable where the data should be placed -     * @param int   $fetchmode  the constant indicating how to format the data -     * @param int   $rownum     the row number to fetch (index starts at 0) -     * -     * @return mixed  DB_OK if a row is processed, NULL when the end of the -     *                 result set is reached or a DB_Error object on failure -     * -     * @see DB_common::setOption(), DB_common::setFetchMode() -     */ -    function fetchInto(&$arr, $fetchmode = DB_FETCHMODE_DEFAULT, $rownum = null) -    { -        if ($fetchmode === DB_FETCHMODE_DEFAULT) { -            $fetchmode = $this->fetchmode; -        } -        if ($fetchmode === DB_FETCHMODE_OBJECT) { -            $fetchmode = DB_FETCHMODE_ASSOC; -            $object_class = $this->fetchmode_object_class; -        } -        if ($this->limit_from !== null) { -            if ($this->row_counter === null) { -                $this->row_counter = $this->limit_from; -                // Skip rows -                if ($this->dbh->features['limit'] === false) { -                    $i = 0; -                    while ($i++ < $this->limit_from) { -                        $this->dbh->fetchInto($this->result, $arr, $fetchmode); -                    } -                } -            } -            if ($this->row_counter >= ( -                    $this->limit_from + $this->limit_count)) -            { -                if ($this->autofree) { -                    $this->free(); -                } -                return null; -            } -            if ($this->dbh->features['limit'] === 'emulate') { -                $rownum = $this->row_counter; -            } - -            $this->row_counter++; -        } -        $res = $this->dbh->fetchInto($this->result, $arr, $fetchmode, $rownum); -        if ($res === DB_OK) { -            if (isset($object_class)) { -                // default mode specified in the -                // DB_common::fetchmode_object_class property -                if ($object_class == 'stdClass') { -                    $arr = (object) $arr; -                } else { -                    $arr = new $object_class($arr); -                } -            } -            return DB_OK; -        } -        if ($res == null && $this->autofree) { -            $this->free(); -        } -        return $res; -    } - -    // }}} -    // {{{ numCols() - -    /** -     * Get the the number of columns in a result set -     * -     * @return int  the number of columns.  A DB_Error object on failure. -     */ -    function numCols() -    { -        return $this->dbh->numCols($this->result); -    } - -    // }}} -    // {{{ numRows() - -    /** -     * Get the number of rows in a result set -     * -     * @return int  the number of rows.  A DB_Error object on failure. -     */ -    function numRows() -    { -        if ($this->dbh->features['numrows'] === 'emulate' -            && $this->dbh->options['portability'] & DB_PORTABILITY_NUMROWS) -        { -            if ($this->dbh->features['prepare']) { -                $res = $this->dbh->query($this->query, $this->parameters); -            } else { -                $res = $this->dbh->query($this->query); -            } -            if (DB::isError($res)) { -                return $res; -            } -            $i = 0; -            while ($res->fetchInto($tmp, DB_FETCHMODE_ORDERED)) { -                $i++; -            } -            return $i; -        } else { -            return $this->dbh->numRows($this->result); -        } -    } - -    // }}} -    // {{{ nextResult() - -    /** -     * Get the next result if a batch of queries was executed -     * -     * @return bool  true if a new result is available or false if not -     */ -    function nextResult() -    { -        return $this->dbh->nextResult($this->result); -    } - -    // }}} -    // {{{ free() - -    /** -     * Frees the resources allocated for this result set -     * -     * @return bool  true on success.  A DB_Error object on failure. -     */ -    function free() -    { -        $err = $this->dbh->freeResult($this->result); -        if (DB::isError($err)) { -            return $err; -        } -        $this->result = false; -        $this->statement = false; -        return true; -    } - -    // }}} -    // {{{ tableInfo() - -    /** -     * @see DB_common::tableInfo() -     * @deprecated Method deprecated some time before Release 1.2 -     */ -    function tableInfo($mode = null) -    { -        if (is_string($mode)) { -            return $this->dbh->raiseError(DB_ERROR_NEED_MORE_DATA); -        } -        return $this->dbh->tableInfo($this, $mode); -    } - -    // }}} -    // {{{ getQuery() - -    /** -     * Determine the query string that created this result -     * -     * @return string  the query string -     * -     * @since Method available since Release 1.7.0 -     */ -    function getQuery() -    { -        return $this->query; -    } - -    // }}} -    // {{{ getRowCounter() - -    /** -     * Tells which row number is currently being processed -     * -     * @return integer  the current row being looked at.  Starts at 1. -     */ -    function getRowCounter() -    { -        return $this->row_counter; -    } - -    // }}} -} - -// }}} -// {{{ class DB_row - -/** - * PEAR DB Row Object - * - * The object contains a row of data from a result set.  Each column's data - * is placed in a property named for the column. - * - * @category   Database - * @package    DB - * @author     Stig Bakken <ssb@php.net> - * @copyright  1997-2005 The PHP Group - * @license    http://www.php.net/license/3_0.txt  PHP License 3.0 - * @version    Release: @package_version@ - * @link       http://pear.php.net/package/DB - * @see        DB_common::setFetchMode() - */ -class DB_row -{ -    // {{{ constructor - -    /** -     * The constructor places a row's data into properties of this object -     * -     * @param array  the array containing the row's data -     * -     * @return void -     */ -    function DB_row(&$arr) -    { -        foreach ($arr as $key => $value) { -            $this->$key = &$arr[$key]; -        } -    } - -    // }}} -} - -// }}} - -/* - * Local variables: - * tab-width: 4 - * c-basic-offset: 4 - * End: - */ - -?> diff --git a/lib/phpFlickr/PEAR/DB/common.php b/lib/phpFlickr/PEAR/DB/common.php deleted file mode 100644 index 04e71ff52..000000000 --- a/lib/phpFlickr/PEAR/DB/common.php +++ /dev/null @@ -1,2157 +0,0 @@ -<?php - -/* vim: set expandtab tabstop=4 shiftwidth=4 softtabstop=4: */ - -/** - * Contains the DB_common base class - * - * PHP versions 4 and 5 - * - * LICENSE: This source file is subject to version 3.0 of the PHP license - * that is available through the world-wide-web at the following URI: - * http://www.php.net/license/3_0.txt.  If you did not receive a copy of - * the PHP License and are unable to obtain it through the web, please - * send a note to license@php.net so we can mail you a copy immediately. - * - * @category   Database - * @package    DB - * @author     Stig Bakken <ssb@php.net> - * @author     Tomas V.V. Cox <cox@idecnet.com> - * @author     Daniel Convissor <danielc@php.net> - * @copyright  1997-2005 The PHP Group - * @license    http://www.php.net/license/3_0.txt  PHP License 3.0 - * @version    CVS: $Id: common.php 32 2005-08-01 06:21:02Z dancoulter $ - * @link       http://pear.php.net/package/DB - */ - -/** - * Obtain the PEAR class so it can be extended from - */ -require_once 'PEAR.php'; - -/** - * DB_common is the base class from which each database driver class extends - * - * All common methods are declared here.  If a given DBMS driver contains - * a particular method, that method will overload the one here. - * - * @category   Database - * @package    DB - * @author     Stig Bakken <ssb@php.net> - * @author     Tomas V.V. Cox <cox@idecnet.com> - * @author     Daniel Convissor <danielc@php.net> - * @copyright  1997-2005 The PHP Group - * @license    http://www.php.net/license/3_0.txt  PHP License 3.0 - * @version    Release: @package_version@ - * @link       http://pear.php.net/package/DB - */ -class DB_common extends PEAR -{ -    // {{{ properties - -    /** -     * The current default fetch mode -     * @var integer -     */ -    var $fetchmode = DB_FETCHMODE_ORDERED; - -    /** -     * The name of the class into which results should be fetched when -     * DB_FETCHMODE_OBJECT is in effect -     * -     * @var string -     */ -    var $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; - -    /** -     * The most recently executed query -     * @var string -     */ -    var $last_query = ''; - -    /** -     * Run-time configuration options -     * -     * The 'optimize' option has been deprecated.  Use the 'portability' -     * option instead. -     * -     * @var array -     * @see DB_common::setOption() -     */ -    var $options = array( -        'result_buffering' => 500, -        'persistent' => false, -        'ssl' => false, -        'debug' => 0, -        'seqname_format' => '%s_seq', -        'autofree' => false, -        'portability' => DB_PORTABILITY_NONE, -        'optimize' => 'performance',  // Deprecated.  Use 'portability'. -    ); - -    /** -     * The parameters from the most recently executed query -     * @var array -     * @since Property available since Release 1.7.0 -     */ -    var $last_parameters = array(); - -    /** -     * The elements from each prepared statement -     * @var array -     */ -    var $prepare_tokens = array(); - -    /** -     * The data types of the various elements in each prepared statement -     * @var array -     */ -    var $prepare_types = array(); - -    /** -     * The prepared queries -     * @var array -     */ -    var $prepared_queries = array(); - - -    // }}} -    // {{{ DB_common - -    /** -     * This constructor calls <kbd>$this->PEAR('DB_Error')</kbd> -     * -     * @return void -     */ -    function DB_common() -    { -        $this->PEAR('DB_Error'); -    } - -    // }}} -    // {{{ __sleep() - -    /** -     * Automatically indicates which properties should be saved -     * when PHP's serialize() function is called -     * -     * @return array  the array of properties names that should be saved -     */ -    function __sleep() -    { -        if ($this->connection) { -            // Don't disconnect(), people use serialize() for many reasons -            $this->was_connected = true; -        } else { -            $this->was_connected = false; -        } -        if (isset($this->autocommit)) { -            return array('autocommit', -                         'dbsyntax', -                         'dsn', -                         'features', -                         'fetchmode', -                         'fetchmode_object_class', -                         'options', -                         'was_connected', -                   ); -        } else { -            return array('dbsyntax', -                         'dsn', -                         'features', -                         'fetchmode', -                         'fetchmode_object_class', -                         'options', -                         'was_connected', -                   ); -        } -    } - -    // }}} -    // {{{ __wakeup() - -    /** -     * Automatically reconnects to the database when PHP's unserialize() -     * function is called -     * -     * The reconnection attempt is only performed if the object was connected -     * at the time PHP's serialize() function was run. -     * -     * @return void -     */ -    function __wakeup() -    { -        if ($this->was_connected) { -            $this->connect($this->dsn, $this->options); -        } -    } - -    // }}} -    // {{{ __toString() - -    /** -     * Automatic string conversion for PHP 5 -     * -     * @return string  a string describing the current PEAR DB object -     * -     * @since Method available since Release 1.7.0 -     */ -    function __toString() -    { -        $info = strtolower(get_class($this)); -        $info .=  ': (phptype=' . $this->phptype . -                  ', dbsyntax=' . $this->dbsyntax . -                  ')'; -        if ($this->connection) { -            $info .= ' [connected]'; -        } -        return $info; -    } - -    // }}} -    // {{{ toString() - -    /** -     * DEPRECATED:  String conversion method -     * -     * @return string  a string describing the current PEAR DB object -     * -     * @deprecated Method deprecated in Release 1.7.0 -     */ -    function toString() -    { -        return $this->__toString(); -    } - -    // }}} -    // {{{ quoteString() - -    /** -     * DEPRECATED: Quotes a string so it can be safely used within string -     * delimiters in a query -     * -     * @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) -    { -        $string = $this->quote($string); -        if ($string{0} == "'") { -            return substr($string, 1, -1); -        } -        return $string; -    } - -    // }}} -    // {{{ 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 ($string === null) ? 'NULL' -                                  : "'" . str_replace("'", "''", $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 -     * -     * @return mixed  the formatted data.  The format depends on the input's -     *                 PHP type: -     * <ul> -     *  <li> -     *    <kbd>input</kbd> -> <samp>returns</samp> -     *  </li> -     *  <li> -     *    <kbd>null</kbd> -> the string <samp>NULL</samp> -     *  </li> -     *  <li> -     *    <kbd>integer</kbd> or <kbd>double</kbd> -> the unquoted number -     *  </li> -     *  <li> -     *    <kbd>bool</kbd> -> output depends on the driver in use -     *    Most drivers return integers: <samp>1</samp> if -     *    <kbd>true</kbd> or <samp>0</samp> if -     *    <kbd>false</kbd>. -     *    Some return strings: <samp>TRUE</samp> if -     *    <kbd>true</kbd> or <samp>FALSE</samp> if -     *    <kbd>false</kbd>. -     *    Finally one returns strings: <samp>T</samp> if -     *    <kbd>true</kbd> or <samp>F</samp> if -     *    <kbd>false</kbd>. Here is a list of each DBMS, -     *    the values returned and the suggested column type: -     *    <ul> -     *      <li> -     *        <kbd>dbase</kbd> -> <samp>T/F</samp> -     *        (<kbd>Logical</kbd>) -     *      </li> -     *      <li> -     *        <kbd>fbase</kbd> -> <samp>TRUE/FALSE</samp> -     *        (<kbd>BOOLEAN</kbd>) -     *      </li> -     *      <li> -     *        <kbd>ibase</kbd> -> <samp>1/0</samp> -     *        (<kbd>SMALLINT</kbd>) [1] -     *      </li> -     *      <li> -     *        <kbd>ifx</kbd> -> <samp>1/0</samp> -     *        (<kbd>SMALLINT</kbd>) [1] -     *      </li> -     *      <li> -     *        <kbd>msql</kbd> -> <samp>1/0</samp> -     *        (<kbd>INTEGER</kbd>) -     *      </li> -     *      <li> -     *        <kbd>mssql</kbd> -> <samp>1/0</samp> -     *        (<kbd>BIT</kbd>) -     *      </li> -     *      <li> -     *        <kbd>mysql</kbd> -> <samp>1/0</samp> -     *        (<kbd>TINYINT(1)</kbd>) -     *      </li> -     *      <li> -     *        <kbd>mysqli</kbd> -> <samp>1/0</samp> -     *        (<kbd>TINYINT(1)</kbd>) -     *      </li> -     *      <li> -     *        <kbd>oci8</kbd> -> <samp>1/0</samp> -     *        (<kbd>NUMBER(1)</kbd>) -     *      </li> -     *      <li> -     *        <kbd>odbc</kbd> -> <samp>1/0</samp> -     *        (<kbd>SMALLINT</kbd>) [1] -     *      </li> -     *      <li> -     *        <kbd>pgsql</kbd> -> <samp>TRUE/FALSE</samp> -     *        (<kbd>BOOLEAN</kbd>) -     *      </li> -     *      <li> -     *        <kbd>sqlite</kbd> -> <samp>1/0</samp> -     *        (<kbd>INTEGER</kbd>) -     *      </li> -     *      <li> -     *        <kbd>sybase</kbd> -> <samp>1/0</samp> -     *        (<kbd>TINYINT(1)</kbd>) -     *      </li> -     *    </ul> -     *    [1] Accommodate the lowest common denominator because not all -     *    versions of have <kbd>BOOLEAN</kbd>. -     *  </li> -     *  <li> -     *    other (including strings and numeric strings) -> -     *    the data with single quotes escaped by preceeding -     *    single quotes, backslashes are escaped by preceeding -     *    backslashes, then the whole string is encapsulated -     *    between single quotes -     *  </li> -     * </ul> -     * -     * @see DB_common::escapeSimple() -     * @since Method available since Release 1.6.0 -     */ -    function quoteSmart($in) -    { -        if (is_int($in) || is_double($in)) { -            return $in; -        } elseif (is_bool($in)) { -            return $in ? 1 : 0; -        } elseif (is_null($in)) { -            return 'NULL'; -        } else { -            return "'" . $this->escapeSimple($in) . "'"; -        } -    } - -    // }}} -    // {{{ escapeSimple() - -    /** -     * 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 -     */ -    function escapeSimple($str) -    { -        return str_replace("'", "''", $str); -    } - -    // }}} -    // {{{ provides() - -    /** -     * Tells whether the present driver supports a given feature -     * -     * @param string $feature  the feature you're curious about -     * -     * @return bool  whether this driver supports $feature -     */ -    function provides($feature) -    { -        return $this->features[$feature]; -    } - -    // }}} -    // {{{ setFetchMode() - -    /** -     * Sets the fetch mode that should be used by default for query results -     * -     * @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 -     *                               by the fetch methods when the -     *                               DB_FETCHMODE_OBJECT mode is selected. -     *                               If no class is specified by default a cast -     *                               to object from the assoc array row will be -     *                               done.  There is also the posibility to use -     *                               and extend the 'DB_row' class. -     * -     * @see DB_FETCHMODE_ORDERED, DB_FETCHMODE_ASSOC, DB_FETCHMODE_OBJECT -     */ -    function setFetchMode($fetchmode, $object_class = 'stdClass') -    { -        switch ($fetchmode) { -            case DB_FETCHMODE_OBJECT: -                $this->fetchmode_object_class = $object_class; -            case DB_FETCHMODE_ORDERED: -            case DB_FETCHMODE_ASSOC: -                $this->fetchmode = $fetchmode; -                break; -            default: -                return $this->raiseError('invalid fetchmode mode'); -        } -    } - -    // }}} -    // {{{ setOption() - -    /** -     * Sets run-time configuration options for PEAR DB -     * -     * Options, their data types, default values and description: -     * <ul> -     * <li> -     * <var>autofree</var> <kbd>boolean</kbd> = <samp>false</samp> -     *      <br />should results be freed automatically when there are no -     *            more rows? -     * </li><li> -     * <var>result_buffering</var> <kbd>integer</kbd> = <samp>500</samp> -     *      <br />how many rows of the result set should be buffered? -     *      <br />In mysql: mysql_unbuffered_query() is used instead of -     *            mysql_query() if this value is 0.  (Release 1.7.0) -     *      <br />In oci8: this value is passed to ocisetprefetch(). -     *            (Release 1.7.0) -     * </li><li> -     * <var>debug</var> <kbd>integer</kbd> = <samp>0</samp> -     *      <br />debug level -     * </li><li> -     * <var>persistent</var> <kbd>boolean</kbd> = <samp>false</samp> -     *      <br />should the connection be persistent? -     * </li><li> -     * <var>portability</var> <kbd>integer</kbd> = <samp>DB_PORTABILITY_NONE</samp> -     *      <br />portability mode constant (see below) -     * </li><li> -     * <var>seqname_format</var> <kbd>string</kbd> = <samp>%s_seq</samp> -     *      <br />the sprintf() format string used on sequence names.  This -     *            format is applied to sequence names passed to -     *            createSequence(), nextID() and dropSequence(). -     * </li><li> -     * <var>ssl</var> <kbd>boolean</kbd> = <samp>false</samp> -     *      <br />use ssl to connect? -     * </li> -     * </ul> -     * -     * ----------------------------------------- -     * -     * PORTABILITY MODES -     * -     * These modes are bitwised, so they can be combined using <kbd>|</kbd> -     * and removed using <kbd>^</kbd>.  See the examples section below on how -     * to do this. -     * -     * <samp>DB_PORTABILITY_NONE</samp> -     * turn off all portability features -     * -     * This mode gets automatically turned on if the deprecated -     * <var>optimize</var> option gets set to <samp>performance</samp>. -     * -     * -     * <samp>DB_PORTABILITY_LOWERCASE</samp> -     * convert names of tables and fields to lower case when using -     * <kbd>get*()</kbd>, <kbd>fetch*()</kbd> and <kbd>tableInfo()</kbd> -     * -     * This mode gets automatically turned on in the following databases -     * if the deprecated option <var>optimize</var> gets set to -     * <samp>portability</samp>: -     * + oci8 -     * -     * -     * <samp>DB_PORTABILITY_RTRIM</samp> -     * right trim the data output by <kbd>get*()</kbd> <kbd>fetch*()</kbd> -     * -     * -     * <samp>DB_PORTABILITY_DELETE_COUNT</samp> -     * force reporting the number of rows deleted -     * -     * Some DBMS's don't count the number of rows deleted when performing -     * simple <kbd>DELETE FROM tablename</kbd> queries.  This portability -     * mode tricks such DBMS's into telling the count by adding -     * <samp>WHERE 1=1</samp> to the end of <kbd>DELETE</kbd> queries. -     * -     * This mode gets automatically turned on in the following databases -     * if the deprecated option <var>optimize</var> gets set to -     * <samp>portability</samp>: -     * + fbsql -     * + mysql -     * + mysqli -     * + sqlite -     * -     * -     * <samp>DB_PORTABILITY_NUMROWS</samp> -     * enable hack that makes <kbd>numRows()</kbd> work in Oracle -     * -     * This mode gets automatically turned on in the following databases -     * if the deprecated option <var>optimize</var> gets set to -     * <samp>portability</samp>: -     * + oci8 -     * -     * -     * <samp>DB_PORTABILITY_ERRORS</samp> -     * makes certain error messages in certain drivers compatible -     * with those from other DBMS's -     * -     * + mysql, mysqli:  change unique/primary key constraints -     *   DB_ERROR_ALREADY_EXISTS -> DB_ERROR_CONSTRAINT -     * -     * + odbc(access):  MS's ODBC driver reports 'no such field' as code -     *   07001, which means 'too few parameters.'  When this option is on -     *   that code gets mapped to DB_ERROR_NOSUCHFIELD. -     *   DB_ERROR_MISMATCH -> DB_ERROR_NOSUCHFIELD -     * -     * <samp>DB_PORTABILITY_NULL_TO_EMPTY</samp> -     * convert null values to empty strings in data output by get*() and -     * fetch*().  Needed because Oracle considers empty strings to be null, -     * while most other DBMS's know the difference between empty and null. -     * -     * -     * <samp>DB_PORTABILITY_ALL</samp> -     * turn on all portability features -     * -     * ----------------------------------------- -     * -     * Example 1. Simple setOption() example -     * <code> -     * $db->setOption('autofree', true); -     * </code> -     * -     * Example 2. Portability for lowercasing and trimming -     * <code> -     * $db->setOption('portability', -     *                 DB_PORTABILITY_LOWERCASE | DB_PORTABILITY_RTRIM); -     * </code> -     * -     * Example 3. All portability options except trimming -     * <code> -     * $db->setOption('portability', -     *                 DB_PORTABILITY_ALL ^ DB_PORTABILITY_RTRIM); -     * </code> -     * -     * @param string $option option name -     * @param mixed  $value value for the option -     * -     * @return int  DB_OK on success.  A DB_Error object on failure. -     * -     * @see DB_common::$options -     */ -    function setOption($option, $value) -    { -        if (isset($this->options[$option])) { -            $this->options[$option] = $value; - -            /* -             * Backwards compatibility check for the deprecated 'optimize' -             * option.  Done here in case settings change after connecting. -             */ -            if ($option == 'optimize') { -                if ($value == 'portability') { -                    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 -     */ -    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.}} -     * -     * @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() -     */ -    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; -    } - -    // }}} -    // {{{ 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 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() -     */ -    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() - -    /** -     * 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() -     * -     * Example: -     * <pre> -     * buildManipSQL('table_sql', array('field1', 'field2', 'field3'), -     *               DB_AUTOQUERY_INSERT); -     * </pre> -     * -     * That returns -     * <samp> -     * INSERT INTO table_sql (field1,field2,field3) VALUES (?,?,?) -     * </samp> -     * -     * NOTES: -     *   - This belongs more to a SQL Builder class, but this is a simple -     *     facility. -     *   - 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: -     *                               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 string  the sql query for autoPrepare() -     */ -    function buildManipSQL($table, $table_fields, $mode, $where = false) -    { -        if (count($table_fields) == 0) { -            return $this->raiseError(DB_ERROR_NEED_MORE_DATA); -        } -        $first = true; -        switch ($mode) { -            case DB_AUTOQUERY_INSERT: -                $values = ''; -                $names = ''; -                foreach ($table_fields as $value) { -                    if ($first) { -                        $first = false; -                    } else { -                        $names .= ','; -                        $values .= ','; -                    } -                    $names .= $value; -                    $values .= '?'; -                } -                return "INSERT INTO $table ($names) VALUES ($values)"; -            case DB_AUTOQUERY_UPDATE: -                $set = ''; -                foreach ($table_fields as $value) { -                    if ($first) { -                        $first = false; -                    } else { -                        $set .= ','; -                    } -                    $set .= "$value = ?"; -                } -                $sql = "UPDATE $table SET $set"; -                if ($where) { -                    $sql .= " WHERE $where"; -                } -                return $sql; -            default: -                return $this->raiseError(DB_ERROR_SYNTAX); -        } -    } - -    // }}} -    // {{{ execute() - -    /** -     * Executes a DB statement prepared with prepare() -     * -     * 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> -     * -     * @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 -     *                         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. -     * -     * {@internal ibase and oci8 have their own execute() methods.}} -     * -     * @see DB_common::prepare() -     */ -    function &execute($stmt, $data = array()) -    { -        $realquery = $this->executeEmulateQuery($stmt, $data); -        if (DB::isError($realquery)) { -            return $realquery; -        } -        $result = $this->simpleQuery($realquery); - -        if ($result === DB_OK || DB::isError($result)) { -            return $result; -        } else { -            $tmp =& new DB_result($this, $result); -            return $tmp; -        } -    } - -    // }}} -    // {{{ executeEmulateQuery() - -    /** -     * 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 -     *                         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 string containing the real query run when emulating -     *                 prepare/execute.  A DB_Error object on failure. -     * -     * @access protected -     * @see DB_common::execute() -     */ -    function executeEmulateQuery($stmt, $data = array()) -    { -        $stmt = (int)$stmt; -        $data = (array)$data; -        $this->last_parameters = $data; - -        if (count($this->prepare_types[$stmt]) != count($data)) { -            $this->last_query = $this->prepared_queries[$stmt]; -            return $this->raiseError(DB_ERROR_MISMATCH); -        } - -        $realquery = $this->prepare_tokens[$stmt][0]; - -        $i = 0; -        foreach ($data as $value) { -            if ($this->prepare_types[$stmt][$i] == DB_PARAM_SCALAR) { -                $realquery .= $this->quoteSmart($value); -            } elseif ($this->prepare_types[$stmt][$i] == DB_PARAM_OPAQUE) { -                $fp = @fopen($value, 'rb'); -                if (!$fp) { -                    return $this->raiseError(DB_ERROR_ACCESS_VIOLATION); -                } -                $realquery .= $this->quoteSmart(fread($fp, filesize($value))); -                fclose($fp); -            } else { -                $realquery .= $value; -            } - -            $realquery .= $this->prepare_tokens[$stmt][++$i]; -        } - -        return $realquery; -    } - -    // }}} -    // {{{ executeMultiple() - -    /** -     * Performs several execute() calls on the same statement handle -     * -     * $data must be an array indexed numerically -     * from 0, one execute call is done for every "row" in the array. -     * -     * 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 -     *                         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) -    { -        foreach ($data as $value) { -            $res =& $this->execute($stmt, $value); -            if (DB::isError($res)) { -                return $res; -            } -        } -        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() - -    /** -     * Changes a query string for various DBMS specific reasons -     * -     * It is defined here to ensure all drivers have this method available. -     * -     * @param string $query  the query string to modify -     * -     * @return string  the modified query string -     * -     * @access protected -     * @see DB_mysql::modifyQuery(), DB_oci8::modifyQuery(), -     *      DB_sqlite::modifyQuery() -     */ -    function modifyQuery($query) -    { -        return $query; -    } - -    // }}} -    // {{{ modifyLimitQuery() - -    /** -     * 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 -     *                         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 string  the query string with LIMIT clauses added -     * -     * @access protected -     */ -    function modifyLimitQuery($query, $from, $count, $params = array()) -    { -        return $query; -    } - -    // }}} -    // {{{ query() - -    /** -     * Sends a query to the database server -     * -     * The query string can be either a normal statement to be sent directly -     * 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 -     *                         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. -     * -     * @see DB_result, DB_common::prepare(), DB_common::execute() -     */ -    function &query($query, $params = array()) -    { -        if (sizeof($params) > 0) { -            $sth = $this->prepare($query); -            if (DB::isError($sth)) { -                return $sth; -            } -            $ret =& $this->execute($sth, $params); -            $this->freePrepared($sth, false); -            return $ret; -        } else { -            $this->last_parameters = array(); -            $result = $this->simpleQuery($query); -            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. -     */ -    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_a($result, 'DB_result')) { -            $result->setOption('limit_from', $from); -            $result->setOption('limit_count', $count); -        } -        return $result; -    } - -    // }}} -    // {{{ getOne() - -    /** -     * Fetches the first column of the first row from a query result -     * -     * 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 -     *                         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  the returned value of the query. -     *                 A DB_Error object on failure. -     */ -    function &getOne($query, $params = array()) -    { -        $params = (array)$params; -        // modifyLimitQuery() would be nice here, but it causes BC issues -        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; -        } - -        $err = $res->fetchInto($row, DB_FETCHMODE_ORDERED); -        $res->free(); - -        if ($err !== DB_OK) { -            return $err; -        } - -        return $row[0]; -    } - -    // }}} -    // {{{ getRow() - -    /** -     * Fetches the first row of data returned from a query result -     * -     * 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 -     *                         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 -     * -     * @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) -    { -        // compat check, the params and fetchmode parameters used to -        // have the opposite order -        if (!is_array($params)) { -            if (is_array($fetchmode)) { -                if ($params === null) { -                    $tmp = DB_FETCHMODE_DEFAULT; -                } else { -                    $tmp = $params; -                } -                $params = $fetchmode; -                $fetchmode = $tmp; -            } elseif ($params !== null) { -                $fetchmode = $params; -                $params = array(); -            } -        } -        // modifyLimitQuery() would be nice here, but it causes BC issues -        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; -        } - -        $err = $res->fetchInto($row, $fetchmode); - -        $res->free(); - -        if ($err !== DB_OK) { -            return $err; -        } - -        return $row; -    } - -    // }}} -    // {{{ 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 -     * -     * If the result set contains more than two columns, the value -     * will be an array of the values from column 2-n.  If the result -     * set contains only two columns, the returned value will be a -     * scalar with the value of the second column (unless forced to an -     * array with the $force_array parameter).  A DB error code is -     * returned on errors.  If the result set contains fewer than two -     * columns, a DB_ERROR_TRUNCATED error is returned. -     * -     * For example, if the table "mytable" contains: -     * -     * <pre> -     *  ID      TEXT       DATE -     * -------------------------------- -     *  1       'one'      944679408 -     *  2       'two'      944679408 -     *  3       'three'    944679408 -     * </pre> -     * -     * Then the call getAssoc('SELECT id,text FROM mytable') returns: -     * <pre> -     *   array( -     *     '1' => 'one', -     *     '2' => 'two', -     *     '3' => 'three', -     *   ) -     * </pre> -     * -     * ...while the call getAssoc('SELECT id,text,date FROM mytable') returns: -     * <pre> -     *   array( -     *     '1' => array('one', '944679408'), -     *     '2' => array('two', '944679408'), -     *     '3' => array('three', '944679408') -     *   ) -     * </pre> -     * -     * If the more than one row occurs with the same value in the -     * first column, the last row overwrites all previous ones by -     * default.  Use the $group parameter if you don't want to -     * overwrite like this.  Example: -     * -     * <pre> -     * getAssoc('SELECT category,id,name FROM mytable', false, null, -     *          DB_FETCHMODE_ASSOC, true) returns: -     * -     *   array( -     *     '1' => array(array('id' => '4', 'name' => 'number four'), -     *                  array('id' => '6', 'name' => 'number six') -     *            ), -     *     '9' => array(array('id' => '4', 'name' => 'number four'), -     *                  array('id' => '6', 'name' => 'number six') -     *            ) -     *   ) -     * </pre> -     * -     * 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 -     *                              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 -     *                              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 -     *                              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. -     *                A DB_Error object on failure. -     */ -    function &getAssoc($query, $force_array = false, $params = array(), -                       $fetchmode = DB_FETCHMODE_DEFAULT, $group = false) -    { -        $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; -        } -        if ($fetchmode == DB_FETCHMODE_DEFAULT) { -            $fetchmode = $this->fetchmode; -        } -        $cols = $res->numCols(); - -        if ($cols < 2) { -            $tmp =& $this->raiseError(DB_ERROR_TRUNCATED); -            return $tmp; -        } - -        $results = array(); - -        if ($cols > 2 || $force_array) { -            // return array values -            // XXX this part can be optimized -            if ($fetchmode == DB_FETCHMODE_ASSOC) { -                while (is_array($row = $res->fetchRow(DB_FETCHMODE_ASSOC))) { -                    reset($row); -                    $key = current($row); -                    unset($row[key($row)]); -                    if ($group) { -                        $results[$key][] = $row; -                    } else { -                        $results[$key] = $row; -                    } -                } -            } elseif ($fetchmode == DB_FETCHMODE_OBJECT) { -                while ($row = $res->fetchRow(DB_FETCHMODE_OBJECT)) { -                    $arr = get_object_vars($row); -                    $key = current($arr); -                    if ($group) { -                        $results[$key][] = $row; -                    } else { -                        $results[$key] = $row; -                    } -                } -            } else { -                while (is_array($row = $res->fetchRow(DB_FETCHMODE_ORDERED))) { -                    // we shift away the first element to get -                    // indices running from 0 again -                    $key = array_shift($row); -                    if ($group) { -                        $results[$key][] = $row; -                    } else { -                        $results[$key] = $row; -                    } -                } -            } -            if (DB::isError($row)) { -                $results = $row; -            } -        } else { -            // return scalar values -            while (is_array($row = $res->fetchRow(DB_FETCHMODE_ORDERED))) { -                if ($group) { -                    $results[$row[0]][] = $row[1]; -                } else { -                    $results[$row[0]] = $row[1]; -                } -            } -            if (DB::isError($row)) { -                $results = $row; -            } -        } - -        $res->free(); - -        return $results; -    } - -    // }}} -    // {{{ getAll() - -    /** -     * 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 -     *                            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: -     *                            + 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. -     */ -    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)) { -            if (is_array($fetchmode)) { -                if ($params === null) { -                    $tmp = DB_FETCHMODE_DEFAULT; -                } else { -                    $tmp = $params; -                } -                $params = $fetchmode; -                $fetchmode = $tmp; -            } elseif ($params !== null) { -                $fetchmode = $params; -                $params = array(); -            } -        } - -        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 ($res === DB_OK || DB::isError($res)) { -            return $res; -        } - -        $results = array(); -        while (DB_OK === $res->fetchInto($row, $fetchmode)) { -            if ($fetchmode & DB_FETCHMODE_FLIPPED) { -                foreach ($row as $key => $val) { -                    $results[$key][] = $val; -                } -            } else { -                $results[] = $row; -            } -        } - -        $res->free(); - -        if (DB::isError($row)) { -            $tmp =& $this->raiseError($row); -            return $tmp; -        } -        return $results; -    } - -    // }}} -    // {{{ autoCommit() - -    /** -     * Enables or disables automatic commits -     * -     * @param bool $onoff  true turns it on, false turns it off -     * -     * @return int  DB_OK on success.  A DB_Error object if the driver -     *               doesn't support auto-committing transactions. -     */ -    function autoCommit($onoff = false) -    { -        return $this->raiseError(DB_ERROR_NOT_CAPABLE); -    } - -    // }}} -    // {{{ commit() - -    /** -     * Commits the current transaction -     * -     * @return int  DB_OK on success.  A DB_Error object on failure. -     */ -    function commit() -    { -        return $this->raiseError(DB_ERROR_NOT_CAPABLE); -    } - -    // }}} -    // {{{ rollback() - -    /** -     * Reverts the current transaction -     * -     * @return int  DB_OK on success.  A DB_Error object on failure. -     */ -    function rollback() -    { -        return $this->raiseError(DB_ERROR_NOT_CAPABLE); -    } - -    // }}} -    // {{{ numRows() - -    /** -     * Determines the number of rows in a query result -     * -     * @param resource $result  the query result idenifier produced by PHP -     * -     * @return int  the number of rows.  A DB_Error object on failure. -     */ -    function numRows($result) -    { -        return $this->raiseError(DB_ERROR_NOT_CAPABLE); -    } - -    // }}} -    // {{{ affectedRows() - -    /** -     * 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. -     */ -    function affectedRows() -    { -        return $this->raiseError(DB_ERROR_NOT_CAPABLE); -    } - -    // }}} -    // {{{ getSequenceName() - -    /** -     * Generates the name used inside the database for a sequence -     * -     * The createSequence() docblock contains notes about storing sequence -     * names. -     * -     * @param string $sqn  the sequence's public name -     * -     * @return string  the sequence's name in the backend -     * -     * @access protected -     * @see DB_common::createSequence(), DB_common::dropSequence(), -     *      DB_common::nextID(), DB_common::setOption() -     */ -    function getSequenceName($sqn) -    { -        return sprintf($this->getOption('seqname_format'), -                       preg_replace('/[^a-z0-9_.]/i', '_', $sqn)); -    } - -    // }}} -    // {{{ 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 -     *                            created if it does not exist -     * -     * @return int  the next id number in the sequence. -     *               A DB_Error object on failure. -     * -     * @see DB_common::createSequence(), DB_common::dropSequence(), -     *      DB_common::getSequenceName() -     */ -    function nextId($seq_name, $ondemand = true) -    { -        return $this->raiseError(DB_ERROR_NOT_CAPABLE); -    } - -    // }}} -    // {{{ createSequence() - -    /** -     * Creates a new sequence -     * -     * The name of a given sequence is determined by passing the string -     * provided in the <var>$seq_name</var> argument through PHP's sprintf() -     * function using the value from the <var>seqname_format</var> option as -     * the sprintf()'s format argument. -     * -     * <var>seqname_format</var> is set via setOption(). -     * -     * @param string $seq_name  name of the new sequence -     * -     * @return int  DB_OK on success.  A DB_Error object on failure. -     * -     * @see DB_common::dropSequence(), DB_common::getSequenceName(), -     *      DB_common::nextID() -     */ -    function createSequence($seq_name) -    { -        return $this->raiseError(DB_ERROR_NOT_CAPABLE); -    } - -    // }}} -    // {{{ dropSequence() - -    /** -     * Deletes a sequence -     * -     * @param string $seq_name  name of the sequence to be deleted -     * -     * @return int  DB_OK on success.  A DB_Error object on failure. -     * -     * @see DB_common::createSequence(), DB_common::getSequenceName(), -     *      DB_common::nextID() -     */ -    function dropSequence($seq_name) -    { -        return $this->raiseError(DB_ERROR_NOT_CAPABLE); -    } - -    // }}} -    // {{{ 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 -     * -     * @return object  the PEAR_Error object -     * -     * @see PEAR_Error -     */ -    function &raiseError($code = DB_ERROR, $mode = null, $options = null, -                         $userinfo = null, $nativecode = 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() -    { -        return $this->raiseError(DB_ERROR_NOT_CAPABLE); -    } - -    // }}} -    // {{{ errorCode() - -    /** -     * 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 -     * -     * @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) -    { -        if (isset($this->errorcode_map[$nativecode])) { -            return $this->errorcode_map[$nativecode]; -        } -        // Fall back to DB_ERROR if there was no mapping. -        return DB_ERROR; -    } - -    // }}} -    // {{{ errorMessage() - -    /** -     * Maps a DB error code to a textual message -     * -     * @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) -    { -        return DB::errorMessage($this->errorcode_map[$dbcode]); -    } - -    // }}} -    // {{{ tableInfo() - -    /** -     * Returns information about a table or a result set -     * -     * The format of the resulting array depends on which <var>$mode</var> -     * you select.  The sample output below is based on this query: -     * <pre> -     *    SELECT tblFoo.fldID, tblFoo.fldPhone, tblBar.fldId -     *    FROM tblFoo -     *    JOIN tblBar ON tblFoo.fldId = tblBar.fldId -     * </pre> -     * -     * <ul> -     * <li> -     * -     * <kbd>null</kbd> (default) -     *   <pre> -     *   [0] => Array ( -     *       [table] => tblFoo -     *       [name] => fldId -     *       [type] => int -     *       [len] => 11 -     *       [flags] => primary_key not_null -     *   ) -     *   [1] => Array ( -     *       [table] => tblFoo -     *       [name] => fldPhone -     *       [type] => string -     *       [len] => 20 -     *       [flags] => -     *   ) -     *   [2] => Array ( -     *       [table] => tblBar -     *       [name] => fldId -     *       [type] => int -     *       [len] => 11 -     *       [flags] => primary_key not_null -     *   ) -     *   </pre> -     * -     * </li><li> -     * -     * <kbd>DB_TABLEINFO_ORDER</kbd> -     * -     *   <p>In addition to the information found in the default output, -     *   a notation of the number of columns is provided by the -     *   <samp>num_fields</samp> element while the <samp>order</samp> -     *   element provides an array with the column names as the keys and -     *   their location index number (corresponding to the keys in the -     *   the default output) as the values.</p> -     * -     *   <p>If a result set has identical field names, the last one is -     *   used.</p> -     * -     *   <pre> -     *   [num_fields] => 3 -     *   [order] => Array ( -     *       [fldId] => 2 -     *       [fldTrans] => 1 -     *   ) -     *   </pre> -     * -     * </li><li> -     * -     * <kbd>DB_TABLEINFO_ORDERTABLE</kbd> -     * -     *   <p>Similar to <kbd>DB_TABLEINFO_ORDER</kbd> but adds more -     *   dimensions to the array in which the table names are keys and -     *   the field names are sub-keys.  This is helpful for queries that -     *   join tables which have identical field names.</p> -     * -     *   <pre> -     *   [num_fields] => 3 -     *   [ordertable] => Array ( -     *       [tblFoo] => Array ( -     *           [fldId] => 0 -     *           [fldPhone] => 1 -     *       ) -     *       [tblBar] => Array ( -     *           [fldId] => 2 -     *       ) -     *   ) -     *   </pre> -     * -     * </li> -     * </ul> -     * -     * The <samp>flags</samp> element contains a space separated list -     * of extra information about the field.  This data is inconsistent -     * between DBMS's due to the way each DBMS works. -     *   + <samp>primary_key</samp> -     *   + <samp>unique_key</samp> -     *   + <samp>multiple_key</samp> -     *   + <samp>not_null</samp> -     * -     * Most DBMS's only provide the <samp>table</samp> and <samp>flags</samp> -     * elements if <var>$result</var> is a table name.  The following DBMS's -     * provide full information from queries: -     *   + fbsql -     *   + mysql -     * -     * 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 -     *                                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: -     *                     <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. -     *                 A DB_Error object on failure. -     * -     * @see DB_common::setOption() -     */ -    function tableInfo($result, $mode = null) -    { -        /* -         * If the DB_<driver> class has a tableInfo() method, that one -         * overrides this one.  But, if the driver doesn't have one, -         * this method runs and tells users about that fact. -         */ -        return $this->raiseError(DB_ERROR_NOT_CAPABLE); -    } - -    // }}} -    // {{{ getTables() - -    /** -     * Lists the tables in the current database -     * -     * @return array  the list of tables.  A DB_Error object on failure. -     * -     * @deprecated Method deprecated some time before Release 1.2 -     */ -    function getTables() -    { -        return $this->getListOf('tables'); -    } - -    // }}} -    // {{{ getListOf() - -    /** -     * Lists internal database information -     * -     * @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. -     *                 A DB DB_Error object on failure. -     */ -    function getListOf($type) -    { -        $sql = $this->getSpecialQuery($type); -        if ($sql === null) { -            $this->last_query = ''; -            return $this->raiseError(DB_ERROR_UNSUPPORTED); -        } elseif (is_int($sql) || DB::isError($sql)) { -            // Previous error -            return $this->raiseError($sql); -        } elseif (is_array($sql)) { -            // Already the result -            return $sql; -        } -        // Launch this query -        return $this->getCol($sql); -    } - -    // }}} -    // {{{ getSpecialQuery() - -    /** -     * Obtains the query string needed for listing a given type of objects -     * -     * @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 -     * -     * @access protected -     * @see DB_common::getListOf() -     */ -    function getSpecialQuery($type) -    { -        return $this->raiseError(DB_ERROR_UNSUPPORTED); -    } - -    // }}} -    // {{{ _rtrimArrayValues() - -    /** -     * Right-trims all strings in an array -     * -     * @param array $array  the array to be trimmed (passed by reference) -     * -     * @return void -     * -     * @access protected -     */ -    function _rtrimArrayValues(&$array) -    { -        foreach ($array as $key => $value) { -            if (is_string($value)) { -                $array[$key] = rtrim($value); -            } -        } -    } - -    // }}} -    // {{{ _convertNullArrayValuesToEmpty() - -    /** -     * Converts all null values in an array to empty strings -     * -     * @param array  $array  the array to be de-nullified (passed by reference) -     * -     * @return void -     * -     * @access protected -     */ -    function _convertNullArrayValuesToEmpty(&$array) -    { -        foreach ($array as $key => $value) { -            if (is_null($value)) { -                $array[$key] = ''; -            } -        } -    } - -    // }}} -} - -/* - * Local variables: - * tab-width: 4 - * c-basic-offset: 4 - * End: - */ - -?> diff --git a/lib/phpFlickr/PEAR/DB/mysql.php b/lib/phpFlickr/PEAR/DB/mysql.php deleted file mode 100644 index 3ae0adf86..000000000 --- a/lib/phpFlickr/PEAR/DB/mysql.php +++ /dev/null @@ -1,1034 +0,0 @@ -<?php - -/* vim: set expandtab tabstop=4 shiftwidth=4 softtabstop=4: */ - -/** - * The PEAR DB driver for PHP's mysql extension - * for interacting with MySQL databases - * - * PHP versions 4 and 5 - * - * LICENSE: This source file is subject to version 3.0 of the PHP license - * that is available through the world-wide-web at the following URI: - * http://www.php.net/license/3_0.txt.  If you did not receive a copy of - * the PHP License and are unable to obtain it through the web, please - * send a note to license@php.net so we can mail you a copy immediately. - * - * @category   Database - * @package    DB - * @author     Stig Bakken <ssb@php.net> - * @author     Daniel Convissor <danielc@php.net> - * @copyright  1997-2005 The PHP Group - * @license    http://www.php.net/license/3_0.txt  PHP License 3.0 - * @version    CVS: $Id: mysql.php 32 2005-08-01 06:21:02Z dancoulter $ - * @link       http://pear.php.net/package/DB - */ - -/** - * Obtain the DB_common class so it can be extended from - */ -require_once 'DB/common.php'; - -/** - * The methods PEAR DB uses to interact with PHP's mysql extension - * for interacting with MySQL databases - * - * These methods overload the ones declared in DB_common. - * - * @category   Database - * @package    DB - * @author     Stig Bakken <ssb@php.net> - * @author     Daniel Convissor <danielc@php.net> - * @copyright  1997-2005 The PHP Group - * @license    http://www.php.net/license/3_0.txt  PHP License 3.0 - * @version    Release: @package_version@ - * @link       http://pear.php.net/package/DB - */ -class DB_mysql extends DB_common -{ -    // {{{ properties - -    /** -     * The DB driver type (mysql, oci8, odbc, etc.) -     * @var string -     */ -    var $phptype = 'mysql'; - -    /** -     * The database syntax variant to be used (db2, access, etc.), if any -     * @var string -     */ -    var $dbsyntax = 'mysql'; - -    /** -     * The capabilities of this DB implementation -     * -     * The 'new_link' element contains the PHP version that first provided -     * new_link support for this DBMS.  Contains false if it's unsupported. -     * -     * Meaning of the 'limit' element: -     *   + 'emulate' = emulate with fetch row by number -     *   + 'alter'   = alter the query -     *   + false     = skip rows -     * -     * @var array -     */ -    var $features = array( -        'limit'         => 'alter', -        'new_link'      => '4.2.0', -        'numrows'       => true, -        'pconnect'      => true, -        'prepare'       => false, -        'ssl'           => false, -        'transactions'  => true, -    ); - -    /** -     * A mapping of native error codes to DB error codes -     * @var array -     */ -    var $errorcode_map = array( -        1004 => DB_ERROR_CANNOT_CREATE, -        1005 => DB_ERROR_CANNOT_CREATE, -        1006 => DB_ERROR_CANNOT_CREATE, -        1007 => DB_ERROR_ALREADY_EXISTS, -        1008 => DB_ERROR_CANNOT_DROP, -        1022 => DB_ERROR_ALREADY_EXISTS, -        1044 => DB_ERROR_ACCESS_VIOLATION, -        1046 => DB_ERROR_NODBSELECTED, -        1048 => DB_ERROR_CONSTRAINT, -        1049 => DB_ERROR_NOSUCHDB, -        1050 => DB_ERROR_ALREADY_EXISTS, -        1051 => DB_ERROR_NOSUCHTABLE, -        1054 => DB_ERROR_NOSUCHFIELD, -        1061 => DB_ERROR_ALREADY_EXISTS, -        1062 => DB_ERROR_ALREADY_EXISTS, -        1064 => DB_ERROR_SYNTAX, -        1091 => DB_ERROR_NOT_FOUND, -        1100 => DB_ERROR_NOT_LOCKED, -        1136 => DB_ERROR_VALUE_COUNT_ON_ROW, -        1142 => DB_ERROR_ACCESS_VIOLATION, -        1146 => DB_ERROR_NOSUCHTABLE, -        1216 => DB_ERROR_CONSTRAINT, -        1217 => DB_ERROR_CONSTRAINT, -    ); - -    /** -     * The raw database connection created by PHP -     * @var resource -     */ -    var $connection; - -    /** -     * The DSN information for connecting to a database -     * @var array -     */ -    var $dsn = array(); - - -    /** -     * Should data manipulation queries be committed automatically? -     * @var bool -     * @access private -     */ -    var $autocommit = true; - -    /** -     * The quantity of transactions begun -     * -     * {@internal  While this is private, it can't actually be designated -     * private in PHP 5 because it is directly accessed in the test suite.}} -     * -     * @var integer -     * @access private -     */ -    var $transaction_opcount = 0; - -    /** -     * The database specified in the DSN -     * -     * It's a fix to allow calls to different databases in the same script. -     * -     * @var string -     * @access private -     */ -    var $_db = ''; - - -    // }}} -    // {{{ constructor - -    /** -     * This constructor calls <kbd>$this->DB_common()</kbd> -     * -     * @return void -     */ -    function DB_mysql() -    { -        $this->DB_common(); -    } - -    // }}} -    // {{{ connect() - -    /** -     * Connect to the database server, log in and open the database -     * -     * Don't call this method directly.  Use DB::connect() instead. -     * -     * PEAR DB's mysql driver supports the following extra DSN options: -     *   + new_link      If set to true, causes subsequent calls to connect() -     *                    to return a new connection link instead of the -     *                    existing one.  WARNING: this is not portable to -     *                    other DBMS's. Available since PEAR DB 1.7.0. -     *   + client_flags  Any combination of MYSQL_CLIENT_* constants. -     *                    Only used if PHP is at version 4.3.0 or greater. -     *                    Available since PEAR DB 1.7.0. -     * -     * @param array $dsn         the data source name -     * @param bool  $persistent  should the connection be persistent? -     * -     * @return int  DB_OK on success. A DB_Error object on failure. -     */ -    function connect($dsn, $persistent = false) -    { -        if (!PEAR::loadExtension('mysql')) { -            return $this->raiseError(DB_ERROR_EXTENSION_NOT_FOUND); -        } - -        $this->dsn = $dsn; -        if ($dsn['dbsyntax']) { -            $this->dbsyntax = $dsn['dbsyntax']; -        } - -        $params = array(); -        if ($dsn['protocol'] && $dsn['protocol'] == 'unix') { -            $params[0] = ':' . $dsn['socket']; -        } else { -            $params[0] = $dsn['hostspec'] ? $dsn['hostspec'] -                         : 'localhost'; -            if ($dsn['port']) { -                $params[0] .= ':' . $dsn['port']; -            } -        } -        $params[] = $dsn['username'] ? $dsn['username'] : null; -        $params[] = $dsn['password'] ? $dsn['password'] : null; - -        if (!$persistent) { -            if (isset($dsn['new_link']) -                && ($dsn['new_link'] == 'true' || $dsn['new_link'] === true)) -            { -                $params[] = true; -            } else { -                $params[] = false; -            } -        } -        if (version_compare(phpversion(), '4.3.0', '>=')) { -            $params[] = isset($dsn['client_flags']) -                        ? $dsn['client_flags'] : null; -        } - -        $connect_function = $persistent ? 'mysql_pconnect' : 'mysql_connect'; - -        $ini = ini_get('track_errors'); -        $php_errormsg = ''; -        if ($ini) { -            $this->connection = @call_user_func_array($connect_function, -                                                      $params); -        } else { -            ini_set('track_errors', 1); -            $this->connection = @call_user_func_array($connect_function, -                                                      $params); -            ini_set('track_errors', $ini); -        } - -        if (!$this->connection) { -            if (($err = @mysql_error()) != '') { -                return $this->raiseError(DB_ERROR_CONNECT_FAILED, -                                         null, null, null,  -                                         $err); -            } else { -                return $this->raiseError(DB_ERROR_CONNECT_FAILED, -                                         null, null, null, -                                         $php_errormsg); -            } -        } - -        if ($dsn['database']) { -            if (!@mysql_select_db($dsn['database'], $this->connection)) { -                return $this->mysqlRaiseError(); -            } -            $this->_db = $dsn['database']; -        } - -        return DB_OK; -    } - -    // }}} -    // {{{ disconnect() - -    /** -     * Disconnects from the database server -     * -     * @return bool  TRUE on success, FALSE on failure -     */ -    function disconnect() -    { -        $ret = @mysql_close($this->connection); -        $this->connection = null; -        return $ret; -    } - -    // }}} -    // {{{ simpleQuery() - -    /** -     * Sends a query to the database server -     * -     * Generally uses mysql_query().  If you want to use -     * mysql_unbuffered_query() set the "result_buffering" option to 0 using -     * setOptions().  This option was added in Release 1.7.0. -     * -     * @param string  the SQL query string -     * -     * @return mixed  + a PHP result resrouce for successful SELECT queries -     *                + the DB_OK constant for other successful queries -     *                + a DB_Error object on failure -     */ -    function simpleQuery($query) -    { -        $ismanip = DB::isManip($query); -        $this->last_query = $query; -        $query = $this->modifyQuery($query); -        if ($this->_db) { -            if (!@mysql_select_db($this->_db, $this->connection)) { -                return $this->mysqlRaiseError(DB_ERROR_NODBSELECTED); -            } -        } -        if (!$this->autocommit && $ismanip) { -            if ($this->transaction_opcount == 0) { -                $result = @mysql_query('SET AUTOCOMMIT=0', $this->connection); -                $result = @mysql_query('BEGIN', $this->connection); -                if (!$result) { -                    return $this->mysqlRaiseError(); -                } -            } -            $this->transaction_opcount++; -        } -        if (!$this->options['result_buffering']) { -            $result = @mysql_unbuffered_query($query, $this->connection); -        } else { -            $result = @mysql_query($query, $this->connection); -        } -        if (!$result) { -            return $this->mysqlRaiseError(); -        } -        if (is_resource($result)) { -            return $result; -        } -        return DB_OK; -    } - -    // }}} -    // {{{ nextResult() - -    /** -     * Move the internal mysql result pointer to the next available result -     * -     * This method has not been implemented yet. -     * -     * @param a valid sql result resource -     * -     * @return false -     */ -    function nextResult($result) -    { -        return false; -    } - -    // }}} -    // {{{ fetchInto() - -    /** -     * Places a row from the result set into the given array -     * -     * Formating of the array and the data therein are configurable. -     * See DB_result::fetchInto() for more information. -     * -     * This method is not meant to be called directly.  Use -     * DB_result::fetchInto() instead.  It can't be declared "protected" -     * because DB_result is a separate object. -     * -     * @param resource $result    the query result resource -     * @param array    $arr       the referenced array to put the data in -     * @param int      $fetchmode how the resulting array should be indexed -     * @param int      $rownum    the row number to fetch (0 = first row) -     * -     * @return mixed  DB_OK on success, NULL when the end of a result set is -     *                 reached or on failure -     * -     * @see DB_result::fetchInto() -     */ -    function fetchInto($result, &$arr, $fetchmode, $rownum = null) -    { -        if ($rownum !== null) { -            if (!@mysql_data_seek($result, $rownum)) { -                return null; -            } -        } -        if ($fetchmode & DB_FETCHMODE_ASSOC) { -            $arr = @mysql_fetch_array($result, MYSQL_ASSOC); -            if ($this->options['portability'] & DB_PORTABILITY_LOWERCASE && $arr) { -                $arr = array_change_key_case($arr, CASE_LOWER); -            } -        } else { -            $arr = @mysql_fetch_row($result); -        } -        if (!$arr) { -            return null; -        } -        if ($this->options['portability'] & DB_PORTABILITY_RTRIM) { -            /* -             * Even though this DBMS already trims output, we do this because -             * a field might have intentional whitespace at the end that -             * gets removed by DB_PORTABILITY_RTRIM under another driver. -             */ -            $this->_rtrimArrayValues($arr); -        } -        if ($this->options['portability'] & DB_PORTABILITY_NULL_TO_EMPTY) { -            $this->_convertNullArrayValuesToEmpty($arr); -        } -        return DB_OK; -    } - -    // }}} -    // {{{ freeResult() - -    /** -     * Deletes the result set and frees the memory occupied by the result set -     * -     * This method is not meant to be called directly.  Use -     * DB_result::free() instead.  It can't be declared "protected" -     * because DB_result is a separate object. -     * -     * @param resource $result  PHP's query result resource -     * -     * @return bool  TRUE on success, FALSE if $result is invalid -     * -     * @see DB_result::free() -     */ -    function freeResult($result) -    { -        return @mysql_free_result($result); -    } - -    // }}} -    // {{{ numCols() - -    /** -     * Gets the number of columns in a result set -     * -     * This method is not meant to be called directly.  Use -     * DB_result::numCols() instead.  It can't be declared "protected" -     * because DB_result is a separate object. -     * -     * @param resource $result  PHP's query result resource -     * -     * @return int  the number of columns.  A DB_Error object on failure. -     * -     * @see DB_result::numCols() -     */ -    function numCols($result) -    { -        $cols = @mysql_num_fields($result); -        if (!$cols) { -            return $this->mysqlRaiseError(); -        } -        return $cols; -    } - -    // }}} -    // {{{ numRows() - -    /** -     * Gets the number of rows in a result set -     * -     * This method is not meant to be called directly.  Use -     * DB_result::numRows() instead.  It can't be declared "protected" -     * because DB_result is a separate object. -     * -     * @param resource $result  PHP's query result resource -     * -     * @return int  the number of rows.  A DB_Error object on failure. -     * -     * @see DB_result::numRows() -     */ -    function numRows($result) -    { -        $rows = @mysql_num_rows($result); -        if ($rows === null) { -            return $this->mysqlRaiseError(); -        } -        return $rows; -    } - -    // }}} -    // {{{ autoCommit() - -    /** -     * Enables or disables automatic commits -     * -     * @param bool $onoff  true turns it on, false turns it off -     * -     * @return int  DB_OK on success.  A DB_Error object if the driver -     *               doesn't support auto-committing transactions. -     */ -    function autoCommit($onoff = false) -    { -        // XXX if $this->transaction_opcount > 0, we should probably -        // issue a warning here. -        $this->autocommit = $onoff ? true : false; -        return DB_OK; -    } - -    // }}} -    // {{{ commit() - -    /** -     * Commits the current transaction -     * -     * @return int  DB_OK on success.  A DB_Error object on failure. -     */ -    function commit() -    { -        if ($this->transaction_opcount > 0) { -            if ($this->_db) { -                if (!@mysql_select_db($this->_db, $this->connection)) { -                    return $this->mysqlRaiseError(DB_ERROR_NODBSELECTED); -                } -            } -            $result = @mysql_query('COMMIT', $this->connection); -            $result = @mysql_query('SET AUTOCOMMIT=1', $this->connection); -            $this->transaction_opcount = 0; -            if (!$result) { -                return $this->mysqlRaiseError(); -            } -        } -        return DB_OK; -    } - -    // }}} -    // {{{ rollback() - -    /** -     * Reverts the current transaction -     * -     * @return int  DB_OK on success.  A DB_Error object on failure. -     */ -    function rollback() -    { -        if ($this->transaction_opcount > 0) { -            if ($this->_db) { -                if (!@mysql_select_db($this->_db, $this->connection)) { -                    return $this->mysqlRaiseError(DB_ERROR_NODBSELECTED); -                } -            } -            $result = @mysql_query('ROLLBACK', $this->connection); -            $result = @mysql_query('SET AUTOCOMMIT=1', $this->connection); -            $this->transaction_opcount = 0; -            if (!$result) { -                return $this->mysqlRaiseError(); -            } -        } -        return DB_OK; -    } - -    // }}} -    // {{{ affectedRows() - -    /** -     * 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. -     */ -    function affectedRows() -    { -        if (DB::isManip($this->last_query)) { -            return @mysql_affected_rows($this->connection); -        } else { -            return 0; -        } -     } - -    // }}} -    // {{{ 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 -     *                            created if it does not exist -     * -     * @return int  the next id number in the sequence. -     *               A DB_Error object on failure. -     * -     * @see DB_common::nextID(), DB_common::getSequenceName(), -     *      DB_mysql::createSequence(), DB_mysql::dropSequence() -     */ -    function nextId($seq_name, $ondemand = true) -    { -        $seqname = $this->getSequenceName($seq_name); -        do { -            $repeat = 0; -            $this->pushErrorHandling(PEAR_ERROR_RETURN); -            $result = $this->query("UPDATE ${seqname} ". -                                   'SET id=LAST_INSERT_ID(id+1)'); -            $this->popErrorHandling(); -            if ($result === DB_OK) { -                // COMMON CASE -                $id = @mysql_insert_id($this->connection); -                if ($id != 0) { -                    return $id; -                } -                // EMPTY SEQ TABLE -                // Sequence table must be empty for some reason, so fill -                // it and return 1 and obtain a user-level lock -                $result = $this->getOne("SELECT GET_LOCK('${seqname}_lock',10)"); -                if (DB::isError($result)) { -                    return $this->raiseError($result); -                } -                if ($result == 0) { -                    // Failed to get the lock -                    return $this->mysqlRaiseError(DB_ERROR_NOT_LOCKED); -                } - -                // add the default value -                $result = $this->query("REPLACE INTO ${seqname} (id) VALUES (0)"); -                if (DB::isError($result)) { -                    return $this->raiseError($result); -                } - -                // Release the lock -                $result = $this->getOne('SELECT RELEASE_LOCK(' -                                        . "'${seqname}_lock')"); -                if (DB::isError($result)) { -                    return $this->raiseError($result); -                } -                // We know what the result will be, so no need to try again -                return 1; - -            } elseif ($ondemand && DB::isError($result) && -                $result->getCode() == DB_ERROR_NOSUCHTABLE) -            { -                // ONDEMAND TABLE CREATION -                $result = $this->createSequence($seq_name); -                if (DB::isError($result)) { -                    return $this->raiseError($result); -                } else { -                    $repeat = 1; -                } - -            } elseif (DB::isError($result) && -                      $result->getCode() == DB_ERROR_ALREADY_EXISTS) -            { -                // BACKWARDS COMPAT -                // see _BCsequence() comment -                $result = $this->_BCsequence($seqname); -                if (DB::isError($result)) { -                    return $this->raiseError($result); -                } -                $repeat = 1; -            } -        } while ($repeat); - -        return $this->raiseError($result); -    } - -    // }}} -    // {{{ createSequence() - -    /** -     * Creates a new sequence -     * -     * @param string $seq_name  name of the new sequence -     * -     * @return int  DB_OK on success.  A DB_Error object on failure. -     * -     * @see DB_common::createSequence(), DB_common::getSequenceName(), -     *      DB_mysql::nextID(), DB_mysql::dropSequence() -     */ -    function createSequence($seq_name) -    { -        $seqname = $this->getSequenceName($seq_name); -        $res = $this->query('CREATE TABLE ' . $seqname -                            . ' (id INTEGER UNSIGNED AUTO_INCREMENT NOT NULL,' -                            . ' PRIMARY KEY(id))'); -        if (DB::isError($res)) { -            return $res; -        } -        // insert yields value 1, nextId call will generate ID 2 -        $res = $this->query("INSERT INTO ${seqname} (id) VALUES (0)"); -        if (DB::isError($res)) { -            return $res; -        } -        // so reset to zero -        return $this->query("UPDATE ${seqname} SET id = 0"); -    } - -    // }}} -    // {{{ dropSequence() - -    /** -     * Deletes a sequence -     * -     * @param string $seq_name  name of the sequence to be deleted -     * -     * @return int  DB_OK on success.  A DB_Error object on failure. -     * -     * @see DB_common::dropSequence(), DB_common::getSequenceName(), -     *      DB_mysql::nextID(), DB_mysql::createSequence() -     */ -    function dropSequence($seq_name) -    { -        return $this->query('DROP TABLE ' . $this->getSequenceName($seq_name)); -    } - -    // }}} -    // {{{ _BCsequence() - -    /** -     * Backwards compatibility with old sequence emulation implementation -     * (clean up the dupes) -     * -     * @param string $seqname  the sequence name to clean up -     * -     * @return bool  true on success.  A DB_Error object on failure. -     * -     * @access private -     */ -    function _BCsequence($seqname) -    { -        // Obtain a user-level lock... this will release any previous -        // application locks, but unlike LOCK TABLES, it does not abort -        // the current transaction and is much less frequently used. -        $result = $this->getOne("SELECT GET_LOCK('${seqname}_lock',10)"); -        if (DB::isError($result)) { -            return $result; -        } -        if ($result == 0) { -            // Failed to get the lock, can't do the conversion, bail -            // with a DB_ERROR_NOT_LOCKED error -            return $this->mysqlRaiseError(DB_ERROR_NOT_LOCKED); -        } - -        $highest_id = $this->getOne("SELECT MAX(id) FROM ${seqname}"); -        if (DB::isError($highest_id)) { -            return $highest_id; -        } -        // This should kill all rows except the highest -        // We should probably do something if $highest_id isn't -        // numeric, but I'm at a loss as how to handle that... -        $result = $this->query('DELETE FROM ' . $seqname -                               . " WHERE id <> $highest_id"); -        if (DB::isError($result)) { -            return $result; -        } - -        // If another thread has been waiting for this lock, -        // it will go thru the above procedure, but will have no -        // real effect -        $result = $this->getOne("SELECT RELEASE_LOCK('${seqname}_lock')"); -        if (DB::isError($result)) { -            return $result; -        } -        return true; -    } - -    // }}} -    // {{{ quoteIdentifier() - -    /** -     * Quotes a string so it can be safely used as a table or column name -     * -     * MySQL can't handle the backtick character (<kbd>`</kbd>) in -     * table or column names. -     * -     * @param string $str  identifier name to be quoted -     * -     * @return string  quoted identifier string -     * -     * @see DB_common::quoteIdentifier() -     * @since Method available since Release 1.6.0 -     */ -    function quoteIdentifier($str) -    { -        return '`' . $str . '`'; -    } - -    // }}} -    // {{{ quote() - -    /** -     * @deprecated  Deprecated in release 1.6.0 -     */ -    function quote($str) -    { -        return $this->quoteSmart($str); -    } - -    // }}} -    // {{{ escapeSimple() - -    /** -     * Escapes a string according to the current DBMS's standards -     * -     * @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 -     */ -    function escapeSimple($str) -    { -        if (function_exists('mysql_real_escape_string')) { -            return @mysql_real_escape_string($str, $this->connection); -        } else { -            return @mysql_escape_string($str); -        } -    } - -    // }}} -    // {{{ modifyQuery() - -    /** -     * Changes a query string for various DBMS specific reasons -     * -     * This little hack lets you know how many rows were deleted -     * when running a "DELETE FROM table" query.  Only implemented -     * if the DB_PORTABILITY_DELETE_COUNT portability option is on. -     * -     * @param string $query  the query string to modify -     * -     * @return string  the modified query string -     * -     * @access protected -     * @see DB_common::setOption() -     */ -    function modifyQuery($query) -    { -        if ($this->options['portability'] & DB_PORTABILITY_DELETE_COUNT) { -            // "DELETE FROM table" gives 0 affected rows in MySQL. -            // This little hack lets you know how many rows were deleted. -            if (preg_match('/^\s*DELETE\s+FROM\s+(\S+)\s*$/i', $query)) { -                $query = preg_replace('/^\s*DELETE\s+FROM\s+(\S+)\s*$/', -                                      'DELETE FROM \1 WHERE 1=1', $query); -            } -        } -        return $query; -    } - -    // }}} -    // {{{ modifyLimitQuery() - -    /** -     * Adds LIMIT clauses to a query string according to current DBMS standards -     * -     * @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 -     *                         parameters or 1 placeholder per array element. -     * -     * @return string  the query string with LIMIT clauses added -     * -     * @access protected -     */ -    function modifyLimitQuery($query, $from, $count, $params = array()) -    { -        if (DB::isManip($query)) { -            return $query . " LIMIT $count"; -        } else { -            return $query . " LIMIT $from, $count"; -        } -    } - -    // }}} -    // {{{ mysqlRaiseError() - -    /** -     * Produces a DB_Error object regarding the current problem -     * -     * @param int $errno  if the error is being manually raised pass a -     *                     DB_ERROR* constant here.  If this isn't passed -     *                     the error information gathered from the DBMS. -     * -     * @return object  the DB_Error object -     * -     * @see DB_common::raiseError(), -     *      DB_mysql::errorNative(), DB_common::errorCode() -     */ -    function mysqlRaiseError($errno = null) -    { -        if ($errno === null) { -            if ($this->options['portability'] & DB_PORTABILITY_ERRORS) { -                $this->errorcode_map[1022] = DB_ERROR_CONSTRAINT; -                $this->errorcode_map[1048] = DB_ERROR_CONSTRAINT_NOT_NULL; -                $this->errorcode_map[1062] = DB_ERROR_CONSTRAINT; -            } else { -                // Doing this in case mode changes during runtime. -                $this->errorcode_map[1022] = DB_ERROR_ALREADY_EXISTS; -                $this->errorcode_map[1048] = DB_ERROR_CONSTRAINT; -                $this->errorcode_map[1062] = DB_ERROR_ALREADY_EXISTS; -            } -            $errno = $this->errorCode(mysql_errno($this->connection)); -        } -        return $this->raiseError($errno, null, null, null, -                                 @mysql_errno($this->connection) . ' ** ' . -                                 @mysql_error($this->connection)); -    } - -    // }}} -    // {{{ errorNative() - -    /** -     * Gets the DBMS' native error code produced by the last query -     * -     * @return int  the DBMS' error code -     */ -    function errorNative() -    { -        return @mysql_errno($this->connection); -    } - -    // }}} -    // {{{ tableInfo() - -    /** -     * Returns information about a table or a result set -     * -     * @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    a valid tableInfo mode -     * -     * @return array  an associative array with the information requested. -     *                 A DB_Error object on failure. -     * -     * @see DB_common::tableInfo() -     */ -    function tableInfo($result, $mode = null) -    { -        if (is_string($result)) { -            /* -             * Probably received a table name. -             * Create a result resource identifier. -             */ -            $id = @mysql_list_fields($this->dsn['database'], -                                     $result, $this->connection); -            $got_string = true; -        } elseif (isset($result->result)) { -            /* -             * Probably received a result object. -             * Extract the result resource identifier. -             */ -            $id = $result->result; -            $got_string = false; -        } else { -            /* -             * Probably received a result resource identifier. -             * Copy it. -             * Deprecated.  Here for compatibility only. -             */ -            $id = $result; -            $got_string = false; -        } - -        if (!is_resource($id)) { -            return $this->mysqlRaiseError(DB_ERROR_NEED_MORE_DATA); -        } - -        if ($this->options['portability'] & DB_PORTABILITY_LOWERCASE) { -            $case_func = 'strtolower'; -        } else { -            $case_func = 'strval'; -        } - -        $count = @mysql_num_fields($id); -        $res   = array(); - -        if ($mode) { -            $res['num_fields'] = $count; -        } - -        for ($i = 0; $i < $count; $i++) { -            $res[$i] = array( -                'table' => $case_func(@mysql_field_table($id, $i)), -                'name'  => $case_func(@mysql_field_name($id, $i)), -                'type'  => @mysql_field_type($id, $i), -                'len'   => @mysql_field_len($id, $i), -                'flags' => @mysql_field_flags($id, $i), -            ); -            if ($mode & DB_TABLEINFO_ORDER) { -                $res['order'][$res[$i]['name']] = $i; -            } -            if ($mode & DB_TABLEINFO_ORDERTABLE) { -                $res['ordertable'][$res[$i]['table']][$res[$i]['name']] = $i; -            } -        } - -        // free the result only if we were called on a table -        if ($got_string) { -            @mysql_free_result($id); -        } -        return $res; -    } - -    // }}} -    // {{{ getSpecialQuery() - -    /** -     * Obtains the query string needed for listing a given type of objects -     * -     * @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 -     * -     * @access protected -     * @see DB_common::getListOf() -     */ -    function getSpecialQuery($type) -    { -        switch ($type) { -            case 'tables': -                return 'SHOW TABLES'; -            case 'users': -                return 'SELECT DISTINCT User FROM mysql.user'; -            case 'databases': -                return 'SHOW DATABASES'; -            default: -                return null; -        } -    } - -    // }}} - -} - -/* - * Local variables: - * tab-width: 4 - * c-basic-offset: 4 - * End: - */ - -?> diff --git a/lib/phpFlickr/PEAR/DB/pgsql.php b/lib/phpFlickr/PEAR/DB/pgsql.php deleted file mode 100644 index 1e58f48d6..000000000 --- a/lib/phpFlickr/PEAR/DB/pgsql.php +++ /dev/null @@ -1,1097 +0,0 @@ -<?php - -/* vim: set expandtab tabstop=4 shiftwidth=4 softtabstop=4: */ - -/** - * The PEAR DB driver for PHP's pgsql extension - * for interacting with PostgreSQL databases - * - * PHP versions 4 and 5 - * - * LICENSE: This source file is subject to version 3.0 of the PHP license - * that is available through the world-wide-web at the following URI: - * http://www.php.net/license/3_0.txt.  If you did not receive a copy of - * the PHP License and are unable to obtain it through the web, please - * send a note to license@php.net so we can mail you a copy immediately. - * - * @category   Database - * @package    DB - * @author     Rui Hirokawa <hirokawa@php.net> - * @author     Stig Bakken <ssb@php.net> - * @author     Daniel Convissor <danielc@php.net> - * @copyright  1997-2005 The PHP Group - * @license    http://www.php.net/license/3_0.txt  PHP License 3.0 - * @version    CVS: $Id: pgsql.php 32 2005-08-01 06:21:02Z dancoulter $ - * @link       http://pear.php.net/package/DB - */ - -/** - * Obtain the DB_common class so it can be extended from - */ -require_once 'DB/common.php'; - -/** - * The methods PEAR DB uses to interact with PHP's pgsql extension - * for interacting with PostgreSQL databases - * - * These methods overload the ones declared in DB_common. - * - * @category   Database - * @package    DB - * @author     Rui Hirokawa <hirokawa@php.net> - * @author     Stig Bakken <ssb@php.net> - * @author     Daniel Convissor <danielc@php.net> - * @copyright  1997-2005 The PHP Group - * @license    http://www.php.net/license/3_0.txt  PHP License 3.0 - * @version    Release: @package_version@ - * @link       http://pear.php.net/package/DB - */ -class DB_pgsql extends DB_common -{ -    // {{{ properties - -    /** -     * The DB driver type (mysql, oci8, odbc, etc.) -     * @var string -     */ -    var $phptype = 'pgsql'; - -    /** -     * The database syntax variant to be used (db2, access, etc.), if any -     * @var string -     */ -    var $dbsyntax = 'pgsql'; - -    /** -     * The capabilities of this DB implementation -     * -     * The 'new_link' element contains the PHP version that first provided -     * new_link support for this DBMS.  Contains false if it's unsupported. -     * -     * Meaning of the 'limit' element: -     *   + 'emulate' = emulate with fetch row by number -     *   + 'alter'   = alter the query -     *   + false     = skip rows -     * -     * @var array -     */ -    var $features = array( -        'limit'         => 'alter', -        'new_link'      => '4.3.0', -        'numrows'       => true, -        'pconnect'      => true, -        'prepare'       => false, -        'ssl'           => true, -        'transactions'  => true, -    ); - -    /** -     * A mapping of native error codes to DB error codes -     * @var array -     */ -    var $errorcode_map = array( -    ); - -    /** -     * The raw database connection created by PHP -     * @var resource -     */ -    var $connection; - -    /** -     * The DSN information for connecting to a database -     * @var array -     */ -    var $dsn = array(); - - -    /** -     * Should data manipulation queries be committed automatically? -     * @var bool -     * @access private -     */ -    var $autocommit = true; - -    /** -     * The quantity of transactions begun -     * -     * {@internal  While this is private, it can't actually be designated -     * private in PHP 5 because it is directly accessed in the test suite.}} -     * -     * @var integer -     * @access private -     */ -    var $transaction_opcount = 0; - -    /** -     * The number of rows affected by a data manipulation query -     * @var integer -     */ -    var $affected = 0; - -    /** -     * The current row being looked at in fetchInto() -     * @var array -     * @access private -     */ -    var $row = array(); - -    /** -     * The number of rows in a given result set -     * @var array -     * @access private -     */ -    var $_num_rows = array(); - - -    // }}} -    // {{{ constructor - -    /** -     * This constructor calls <kbd>$this->DB_common()</kbd> -     * -     * @return void -     */ -    function DB_pgsql() -    { -        $this->DB_common(); -    } - -    // }}} -    // {{{ connect() - -    /** -     * Connect to the database server, log in and open the database -     * -     * Don't call this method directly.  Use DB::connect() instead. -     * -     * PEAR DB's pgsql driver supports the following extra DSN options: -     *   + connect_timeout  How many seconds to wait for a connection to -     *                       be established.  Available since PEAR DB 1.7.0. -     *   + new_link         If set to true, causes subsequent calls to -     *                       connect() to return a new connection link -     *                       instead of the existing one.  WARNING: this is -     *                       not portable to other DBMS's.  Available only -     *                       if PHP is >= 4.3.0 and PEAR DB is >= 1.7.0. -     *   + options          Command line options to be sent to the server. -     *                       Available since PEAR DB 1.6.4. -     *   + service          Specifies a service name in pg_service.conf that -     *                       holds additional connection parameters. -     *                       Available since PEAR DB 1.7.0. -     *   + sslmode          How should SSL be used when connecting?  Values: -     *                       disable, allow, prefer or require. -     *                       Available since PEAR DB 1.7.0. -     *   + tty              This was used to specify where to send server -     *                       debug output.  Available since PEAR DB 1.6.4. -     * -     * Example of connecting to a new link via a socket: -     * <code> -     * require_once 'DB.php'; -     *  -     * $dsn = 'pgsql://user:pass@unix(/tmp)/dbname?new_link=true'; -     * $options = array( -     *     'portability' => DB_PORTABILITY_ALL, -     * ); -     *  -     * $db =& DB::connect($dsn, $options); -     * if (PEAR::isError($db)) { -     *     die($db->getMessage()); -     * } -     * </code> -     * -     * @param array $dsn         the data source name -     * @param bool  $persistent  should the connection be persistent? -     * -     * @return int  DB_OK on success. A DB_Error object on failure. -     * -     * @link http://www.postgresql.org/docs/current/static/libpq.html#LIBPQ-CONNECT -     */ -    function connect($dsn, $persistent = false) -    { -        if (!PEAR::loadExtension('pgsql')) { -            return $this->raiseError(DB_ERROR_EXTENSION_NOT_FOUND); -        } - -        $this->dsn = $dsn; -        if ($dsn['dbsyntax']) { -            $this->dbsyntax = $dsn['dbsyntax']; -        } - -        $protocol = $dsn['protocol'] ? $dsn['protocol'] : 'tcp'; - -        $params = array(''); -        if ($protocol == 'tcp') { -            if ($dsn['hostspec']) { -                $params[0] .= 'host=' . $dsn['hostspec']; -            } -            if ($dsn['port']) { -                $params[0] .= ' port=' . $dsn['port']; -            } -        } elseif ($protocol == 'unix') { -            // Allow for pg socket in non-standard locations. -            if ($dsn['socket']) { -                $params[0] .= 'host=' . $dsn['socket']; -            } -            if ($dsn['port']) { -                $params[0] .= ' port=' . $dsn['port']; -            } -        } -        if ($dsn['database']) { -            $params[0] .= ' dbname=\'' . addslashes($dsn['database']) . '\''; -        } -        if ($dsn['username']) { -            $params[0] .= ' user=\'' . addslashes($dsn['username']) . '\''; -        } -        if ($dsn['password']) { -            $params[0] .= ' password=\'' . addslashes($dsn['password']) . '\''; -        } -        if (!empty($dsn['options'])) { -            $params[0] .= ' options=' . $dsn['options']; -        } -        if (!empty($dsn['tty'])) { -            $params[0] .= ' tty=' . $dsn['tty']; -        } -        if (!empty($dsn['connect_timeout'])) { -            $params[0] .= ' connect_timeout=' . $dsn['connect_timeout']; -        } -        if (!empty($dsn['sslmode'])) { -            $params[0] .= ' sslmode=' . $dsn['sslmode']; -        } -        if (!empty($dsn['service'])) { -            $params[0] .= ' service=' . $dsn['service']; -        } - -        if (isset($dsn['new_link']) -            && ($dsn['new_link'] == 'true' || $dsn['new_link'] === true)) -        { -            if (version_compare(phpversion(), '4.3.0', '>=')) { -                $params[] = PGSQL_CONNECT_FORCE_NEW; -            } -        } - -        $connect_function = $persistent ? 'pg_pconnect' : 'pg_connect'; - -        $ini = ini_get('track_errors'); -        $php_errormsg = ''; -        if ($ini) { -            $this->connection = @call_user_func_array($connect_function, -                                                      $params); -        } else { -            ini_set('track_errors', 1); -            $this->connection = @call_user_func_array($connect_function, -                                                      $params); -            ini_set('track_errors', $ini); -        } - -        if (!$this->connection) { -            return $this->raiseError(DB_ERROR_CONNECT_FAILED, -                                     null, null, null, -                                     $php_errormsg); -        } -        return DB_OK; -    } - -    // }}} -    // {{{ disconnect() - -    /** -     * Disconnects from the database server -     * -     * @return bool  TRUE on success, FALSE on failure -     */ -    function disconnect() -    { -        $ret = @pg_close($this->connection); -        $this->connection = null; -        return $ret; -    } - -    // }}} -    // {{{ simpleQuery() - -    /** -     * Sends a query to the database server -     * -     * @param string  the SQL query string -     * -     * @return mixed  + a PHP result resrouce for successful SELECT queries -     *                + the DB_OK constant for other successful queries -     *                + a DB_Error object on failure -     */ -    function simpleQuery($query) -    { -        $ismanip = DB::isManip($query); -        $this->last_query = $query; -        $query = $this->modifyQuery($query); -        if (!$this->autocommit && $ismanip) { -            if ($this->transaction_opcount == 0) { -                $result = @pg_exec($this->connection, 'begin;'); -                if (!$result) { -                    return $this->pgsqlRaiseError(); -                } -            } -            $this->transaction_opcount++; -        } -        $result = @pg_exec($this->connection, $query); -        if (!$result) { -            return $this->pgsqlRaiseError(); -        } -        // Determine which queries that should return data, and which -        // should return an error code only. -        if ($ismanip) { -            $this->affected = @pg_affected_rows($result); -            return DB_OK; -        } elseif (preg_match('/^\s*\(*\s*(SELECT|EXPLAIN|SHOW)\s/si', $query)) { -            /* PostgreSQL commands: -               ABORT, ALTER, BEGIN, CLOSE, CLUSTER, COMMIT, COPY, -               CREATE, DECLARE, DELETE, DROP TABLE, EXPLAIN, FETCH, -               GRANT, INSERT, LISTEN, LOAD, LOCK, MOVE, NOTIFY, RESET, -               REVOKE, ROLLBACK, SELECT, SELECT INTO, SET, SHOW, -               UNLISTEN, UPDATE, VACUUM -            */ -            $this->row[(int)$result] = 0; // reset the row counter. -            $numrows = $this->numRows($result); -            if (is_object($numrows)) { -                return $numrows; -            } -            $this->_num_rows[(int)$result] = $numrows; -            $this->affected = 0; -            return $result; -        } else { -            $this->affected = 0; -            return DB_OK; -        } -    } - -    // }}} -    // {{{ nextResult() - -    /** -     * Move the internal pgsql result pointer to the next available result -     * -     * @param a valid fbsql result resource -     * -     * @access public -     * -     * @return true if a result is available otherwise return false -     */ -    function nextResult($result) -    { -        return false; -    } - -    // }}} -    // {{{ fetchInto() - -    /** -     * Places a row from the result set into the given array -     * -     * Formating of the array and the data therein are configurable. -     * See DB_result::fetchInto() for more information. -     * -     * This method is not meant to be called directly.  Use -     * DB_result::fetchInto() instead.  It can't be declared "protected" -     * because DB_result is a separate object. -     * -     * @param resource $result    the query result resource -     * @param array    $arr       the referenced array to put the data in -     * @param int      $fetchmode how the resulting array should be indexed -     * @param int      $rownum    the row number to fetch (0 = first row) -     * -     * @return mixed  DB_OK on success, NULL when the end of a result set is -     *                 reached or on failure -     * -     * @see DB_result::fetchInto() -     */ -    function fetchInto($result, &$arr, $fetchmode, $rownum = null) -    { -        $result_int = (int)$result; -        $rownum = ($rownum !== null) ? $rownum : $this->row[$result_int]; -        if ($rownum >= $this->_num_rows[$result_int]) { -            return null; -        } -        if ($fetchmode & DB_FETCHMODE_ASSOC) { -            $arr = @pg_fetch_array($result, $rownum, PGSQL_ASSOC); -            if ($this->options['portability'] & DB_PORTABILITY_LOWERCASE && $arr) { -                $arr = array_change_key_case($arr, CASE_LOWER); -            } -        } else { -            $arr = @pg_fetch_row($result, $rownum); -        } -        if (!$arr) { -            return null; -        } -        if ($this->options['portability'] & DB_PORTABILITY_RTRIM) { -            $this->_rtrimArrayValues($arr); -        } -        if ($this->options['portability'] & DB_PORTABILITY_NULL_TO_EMPTY) { -            $this->_convertNullArrayValuesToEmpty($arr); -        } -        $this->row[$result_int] = ++$rownum; -        return DB_OK; -    } - -    // }}} -    // {{{ freeResult() - -    /** -     * Deletes the result set and frees the memory occupied by the result set -     * -     * This method is not meant to be called directly.  Use -     * DB_result::free() instead.  It can't be declared "protected" -     * because DB_result is a separate object. -     * -     * @param resource $result  PHP's query result resource -     * -     * @return bool  TRUE on success, FALSE if $result is invalid -     * -     * @see DB_result::free() -     */ -    function freeResult($result) -    { -        if (is_resource($result)) { -            unset($this->row[(int)$result]); -            unset($this->_num_rows[(int)$result]); -            $this->affected = 0; -            return @pg_freeresult($result); -        } -        return false; -    } - -    // }}} -    // {{{ quote() - -    /** -     * @deprecated  Deprecated in release 1.6.0 -     * @internal -     */ -    function quote($str) -    { -        return $this->quoteSmart($str); -    } - -    // }}} -    // {{{ quoteSmart() - -    /** -     * Formats input so it can be safely used in a query -     * -     * @param mixed $in  the data to be formatted -     * -     * @return mixed  the formatted data.  The format depends on the input's -     *                 PHP type: -     *                 + null = the string <samp>NULL</samp> -     *                 + boolean = string <samp>TRUE</samp> or <samp>FALSE</samp> -     *                 + integer or double = the unquoted number -     *                 + other (including strings and numeric strings) = -     *                   the data escaped according to MySQL's settings -     *                   then encapsulated between single quotes -     * -     * @see DB_common::quoteSmart() -     * @since Method available since Release 1.6.0 -     */ -    function quoteSmart($in) -    { -        if (is_int($in) || is_double($in)) { -            return $in; -        } elseif (is_bool($in)) { -            return $in ? 'TRUE' : 'FALSE'; -        } elseif (is_null($in)) { -            return 'NULL'; -        } else { -            return "'" . $this->escapeSimple($in) . "'"; -        } -    } - -    // }}} -    // {{{ escapeSimple() - -    /** -     * Escapes a string according to the current DBMS's standards -     * -     * {@internal PostgreSQL treats a backslash as an escape character, -     * so they are escaped as well. -     * -     * Not using pg_escape_string() yet because it requires PostgreSQL -     * to be at version 7.2 or greater.}} -     * -     * @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 -     */ -    function escapeSimple($str) -    { -        return str_replace("'", "''", str_replace('\\', '\\\\', $str)); -    } - -    // }}} -    // {{{ numCols() - -    /** -     * Gets the number of columns in a result set -     * -     * This method is not meant to be called directly.  Use -     * DB_result::numCols() instead.  It can't be declared "protected" -     * because DB_result is a separate object. -     * -     * @param resource $result  PHP's query result resource -     * -     * @return int  the number of columns.  A DB_Error object on failure. -     * -     * @see DB_result::numCols() -     */ -    function numCols($result) -    { -        $cols = @pg_numfields($result); -        if (!$cols) { -            return $this->pgsqlRaiseError(); -        } -        return $cols; -    } - -    // }}} -    // {{{ numRows() - -    /** -     * Gets the number of rows in a result set -     * -     * This method is not meant to be called directly.  Use -     * DB_result::numRows() instead.  It can't be declared "protected" -     * because DB_result is a separate object. -     * -     * @param resource $result  PHP's query result resource -     * -     * @return int  the number of rows.  A DB_Error object on failure. -     * -     * @see DB_result::numRows() -     */ -    function numRows($result) -    { -        $rows = @pg_numrows($result); -        if ($rows === null) { -            return $this->pgsqlRaiseError(); -        } -        return $rows; -    } - -    // }}} -    // {{{ autoCommit() - -    /** -     * Enables or disables automatic commits -     * -     * @param bool $onoff  true turns it on, false turns it off -     * -     * @return int  DB_OK on success.  A DB_Error object if the driver -     *               doesn't support auto-committing transactions. -     */ -    function autoCommit($onoff = false) -    { -        // XXX if $this->transaction_opcount > 0, we should probably -        // issue a warning here. -        $this->autocommit = $onoff ? true : false; -        return DB_OK; -    } - -    // }}} -    // {{{ commit() - -    /** -     * Commits the current transaction -     * -     * @return int  DB_OK on success.  A DB_Error object on failure. -     */ -    function commit() -    { -        if ($this->transaction_opcount > 0) { -            // (disabled) hack to shut up error messages from libpq.a -            //@fclose(@fopen("php://stderr", "w")); -            $result = @pg_exec($this->connection, 'end;'); -            $this->transaction_opcount = 0; -            if (!$result) { -                return $this->pgsqlRaiseError(); -            } -        } -        return DB_OK; -    } - -    // }}} -    // {{{ rollback() - -    /** -     * Reverts the current transaction -     * -     * @return int  DB_OK on success.  A DB_Error object on failure. -     */ -    function rollback() -    { -        if ($this->transaction_opcount > 0) { -            $result = @pg_exec($this->connection, 'abort;'); -            $this->transaction_opcount = 0; -            if (!$result) { -                return $this->pgsqlRaiseError(); -            } -        } -        return DB_OK; -    } - -    // }}} -    // {{{ affectedRows() - -    /** -     * 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. -     */ -    function affectedRows() -    { -        return $this->affected; -    } - -    // }}} -    // {{{ 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 -     *                            created if it does not exist -     * -     * @return int  the next id number in the sequence. -     *               A DB_Error object on failure. -     * -     * @see DB_common::nextID(), DB_common::getSequenceName(), -     *      DB_pgsql::createSequence(), DB_pgsql::dropSequence() -     */ -    function nextId($seq_name, $ondemand = true) -    { -        $seqname = $this->getSequenceName($seq_name); -        $repeat = false; -        do { -            $this->pushErrorHandling(PEAR_ERROR_RETURN); -            $result =& $this->query("SELECT NEXTVAL('${seqname}')"); -            $this->popErrorHandling(); -            if ($ondemand && DB::isError($result) && -                $result->getCode() == DB_ERROR_NOSUCHTABLE) { -                $repeat = true; -                $this->pushErrorHandling(PEAR_ERROR_RETURN); -                $result = $this->createSequence($seq_name); -                $this->popErrorHandling(); -                if (DB::isError($result)) { -                    return $this->raiseError($result); -                } -            } else { -                $repeat = false; -            } -        } while ($repeat); -        if (DB::isError($result)) { -            return $this->raiseError($result); -        } -        $arr = $result->fetchRow(DB_FETCHMODE_ORDERED); -        $result->free(); -        return $arr[0]; -    } - -    // }}} -    // {{{ createSequence() - -    /** -     * Creates a new sequence -     * -     * @param string $seq_name  name of the new sequence -     * -     * @return int  DB_OK on success.  A DB_Error object on failure. -     * -     * @see DB_common::createSequence(), DB_common::getSequenceName(), -     *      DB_pgsql::nextID(), DB_pgsql::dropSequence() -     */ -    function createSequence($seq_name) -    { -        $seqname = $this->getSequenceName($seq_name); -        $result = $this->query("CREATE SEQUENCE ${seqname}"); -        return $result; -    } - -    // }}} -    // {{{ dropSequence() - -    /** -     * Deletes a sequence -     * -     * @param string $seq_name  name of the sequence to be deleted -     * -     * @return int  DB_OK on success.  A DB_Error object on failure. -     * -     * @see DB_common::dropSequence(), DB_common::getSequenceName(), -     *      DB_pgsql::nextID(), DB_pgsql::createSequence() -     */ -    function dropSequence($seq_name) -    { -        return $this->query('DROP SEQUENCE ' -                            . $this->getSequenceName($seq_name)); -    } - -    // }}} -    // {{{ modifyLimitQuery() - -    /** -     * Adds LIMIT clauses to a query string according to current DBMS standards -     * -     * @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 -     *                         parameters or 1 placeholder per array element. -     * -     * @return string  the query string with LIMIT clauses added -     * -     * @access protected -     */ -    function modifyLimitQuery($query, $from, $count, $params = array()) -    { -        return "$query LIMIT $count OFFSET $from"; -    } - -    // }}} -    // {{{ pgsqlRaiseError() - -    /** -     * Produces a DB_Error object regarding the current problem -     * -     * @param int $errno  if the error is being manually raised pass a -     *                     DB_ERROR* constant here.  If this isn't passed -     *                     the error information gathered from the DBMS. -     * -     * @return object  the DB_Error object -     * -     * @see DB_common::raiseError(), -     *      DB_pgsql::errorNative(), DB_pgsql::errorCode() -     */ -    function pgsqlRaiseError($errno = null) -    { -        $native = $this->errorNative(); -        if ($errno === null) { -            $errno = $this->errorCode($native); -        } -        return $this->raiseError($errno, null, null, null, $native); -    } - -    // }}} -    // {{{ errorNative() - -    /** -     * Gets the DBMS' native error message produced by the last query -     * -     * {@internal Error messages are used instead of error codes  -     * in order to support older versions of PostgreSQL.}} -     * -     * @return string  the DBMS' error message -     */ -    function errorNative() -    { -        return @pg_errormessage($this->connection); -    } - -    // }}} -    // {{{ errorCode() - -    /** -     * Determines PEAR::DB error code from the database's text error message. -     * -     * @param  string  $errormsg  error message returned from the database -     * @return integer  an error number from a DB error constant -     */ -    function errorCode($errormsg) -    { -        static $error_regexps; -        if (!isset($error_regexps)) { -            $error_regexps = array( -                '/(relation|sequence|table).*does not exist|class .* not found/i' -                    => DB_ERROR_NOSUCHTABLE, -                '/index .* does not exist/' -                    => DB_ERROR_NOT_FOUND, -                '/column .* does not exist/i' -                    => DB_ERROR_NOSUCHFIELD, -                '/relation .* already exists/i' -                    => DB_ERROR_ALREADY_EXISTS, -                '/(divide|division) by zero$/i' -                    => DB_ERROR_DIVZERO, -                '/pg_atoi: error in .*: can\'t parse /i' -                    => DB_ERROR_INVALID_NUMBER, -                '/invalid input syntax for( type)? (integer|numeric)/i' -                    => DB_ERROR_INVALID_NUMBER, -                '/value .* is out of range for type \w*int/i' -                    => DB_ERROR_INVALID_NUMBER, -                '/integer out of range/i' -                    => DB_ERROR_INVALID_NUMBER, -                '/value too long for type character/i' -                    => DB_ERROR_INVALID, -                '/attribute .* not found|relation .* does not have attribute/i' -                    => DB_ERROR_NOSUCHFIELD, -                '/column .* specified in USING clause does not exist in (left|right) table/i' -                    => DB_ERROR_NOSUCHFIELD, -                '/parser: parse error at or near/i' -                    => DB_ERROR_SYNTAX, -                '/syntax error at/' -                    => DB_ERROR_SYNTAX, -                '/column reference .* is ambiguous/i' -                    => DB_ERROR_SYNTAX, -                '/permission denied/' -                    => DB_ERROR_ACCESS_VIOLATION, -                '/violates not-null constraint/' -                    => DB_ERROR_CONSTRAINT_NOT_NULL, -                '/violates [\w ]+ constraint/' -                    => DB_ERROR_CONSTRAINT, -                '/referential integrity violation/' -                    => DB_ERROR_CONSTRAINT, -                '/more expressions than target columns/i' -                    => DB_ERROR_VALUE_COUNT_ON_ROW, -            ); -        } -        foreach ($error_regexps as $regexp => $code) { -            if (preg_match($regexp, $errormsg)) { -                return $code; -            } -        } -        // Fall back to DB_ERROR if there was no mapping. -        return DB_ERROR; -    } - -    // }}} -    // {{{ tableInfo() - -    /** -     * Returns information about a table or a result set -     * -     * NOTE: only supports 'table' and 'flags' if <var>$result</var> -     * is a table name. -     * -     * @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    a valid tableInfo mode -     * -     * @return array  an associative array with the information requested. -     *                 A DB_Error object on failure. -     * -     * @see DB_common::tableInfo() -     */ -    function tableInfo($result, $mode = null) -    { -        if (is_string($result)) { -            /* -             * Probably received a table name. -             * Create a result resource identifier. -             */ -            $id = @pg_exec($this->connection, "SELECT * FROM $result LIMIT 0"); -            $got_string = true; -        } elseif (isset($result->result)) { -            /* -             * Probably received a result object. -             * Extract the result resource identifier. -             */ -            $id = $result->result; -            $got_string = false; -        } else { -            /* -             * Probably received a result resource identifier. -             * Copy it. -             * Deprecated.  Here for compatibility only. -             */ -            $id = $result; -            $got_string = false; -        } - -        if (!is_resource($id)) { -            return $this->pgsqlRaiseError(DB_ERROR_NEED_MORE_DATA); -        } - -        if ($this->options['portability'] & DB_PORTABILITY_LOWERCASE) { -            $case_func = 'strtolower'; -        } else { -            $case_func = 'strval'; -        } - -        $count = @pg_numfields($id); -        $res   = array(); - -        if ($mode) { -            $res['num_fields'] = $count; -        } - -        for ($i = 0; $i < $count; $i++) { -            $res[$i] = array( -                'table' => $got_string ? $case_func($result) : '', -                'name'  => $case_func(@pg_fieldname($id, $i)), -                'type'  => @pg_fieldtype($id, $i), -                'len'   => @pg_fieldsize($id, $i), -                'flags' => $got_string -                           ? $this->_pgFieldFlags($id, $i, $result) -                           : '', -            ); -            if ($mode & DB_TABLEINFO_ORDER) { -                $res['order'][$res[$i]['name']] = $i; -            } -            if ($mode & DB_TABLEINFO_ORDERTABLE) { -                $res['ordertable'][$res[$i]['table']][$res[$i]['name']] = $i; -            } -        } - -        // free the result only if we were called on a table -        if ($got_string) { -            @pg_freeresult($id); -        } -        return $res; -    } - -    // }}} -    // {{{ _pgFieldFlags() - -    /** -     * Get a column's flags -     * -     * Supports "not_null", "default_value", "primary_key", "unique_key" -     * and "multiple_key".  The default value is passed through -     * rawurlencode() in case there are spaces in it. -     * -     * @param int $resource   the PostgreSQL result identifier -     * @param int $num_field  the field number -     * -     * @return string  the flags -     * -     * @access private -     */ -    function _pgFieldFlags($resource, $num_field, $table_name) -    { -        $field_name = @pg_fieldname($resource, $num_field); - -        $result = @pg_exec($this->connection, "SELECT f.attnotnull, f.atthasdef -                                FROM pg_attribute f, pg_class tab, pg_type typ -                                WHERE tab.relname = typ.typname -                                AND typ.typrelid = f.attrelid -                                AND f.attname = '$field_name' -                                AND tab.relname = '$table_name'"); -        if (@pg_numrows($result) > 0) { -            $row = @pg_fetch_row($result, 0); -            $flags  = ($row[0] == 't') ? 'not_null ' : ''; - -            if ($row[1] == 't') { -                $result = @pg_exec($this->connection, "SELECT a.adsrc -                                    FROM pg_attribute f, pg_class tab, pg_type typ, pg_attrdef a -                                    WHERE tab.relname = typ.typname AND typ.typrelid = f.attrelid -                                    AND f.attrelid = a.adrelid AND f.attname = '$field_name' -                                    AND tab.relname = '$table_name' AND f.attnum = a.adnum"); -                $row = @pg_fetch_row($result, 0); -                $num = preg_replace("/'(.*)'::\w+/", "\\1", $row[0]); -                $flags .= 'default_' . rawurlencode($num) . ' '; -            } -        } else { -            $flags = ''; -        } -        $result = @pg_exec($this->connection, "SELECT i.indisunique, i.indisprimary, i.indkey -                                FROM pg_attribute f, pg_class tab, pg_type typ, pg_index i -                                WHERE tab.relname = typ.typname -                                AND typ.typrelid = f.attrelid -                                AND f.attrelid = i.indrelid -                                AND f.attname = '$field_name' -                                AND tab.relname = '$table_name'"); -        $count = @pg_numrows($result); - -        for ($i = 0; $i < $count ; $i++) { -            $row = @pg_fetch_row($result, $i); -            $keys = explode(' ', $row[2]); - -            if (in_array($num_field + 1, $keys)) { -                $flags .= ($row[0] == 't' && $row[1] == 'f') ? 'unique_key ' : ''; -                $flags .= ($row[1] == 't') ? 'primary_key ' : ''; -                if (count($keys) > 1) -                    $flags .= 'multiple_key '; -            } -        } - -        return trim($flags); -    } - -    // }}} -    // {{{ getSpecialQuery() - -    /** -     * Obtains the query string needed for listing a given type of objects -     * -     * @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 -     * -     * @access protected -     * @see DB_common::getListOf() -     */ -    function getSpecialQuery($type) -    { -        switch ($type) { -            case 'tables': -                return 'SELECT c.relname AS "Name"' -                        . ' FROM pg_class c, pg_user u' -                        . ' WHERE c.relowner = u.usesysid' -                        . " AND c.relkind = 'r'" -                        . ' AND NOT EXISTS' -                        . ' (SELECT 1 FROM pg_views' -                        . '  WHERE viewname = c.relname)' -                        . " AND c.relname !~ '^(pg_|sql_)'" -                        . ' UNION' -                        . ' SELECT c.relname AS "Name"' -                        . ' FROM pg_class c' -                        . " WHERE c.relkind = 'r'" -                        . ' AND NOT EXISTS' -                        . ' (SELECT 1 FROM pg_views' -                        . '  WHERE viewname = c.relname)' -                        . ' AND NOT EXISTS' -                        . ' (SELECT 1 FROM pg_user' -                        . '  WHERE usesysid = c.relowner)' -                        . " AND c.relname !~ '^pg_'"; -            case 'schema.tables': -                return "SELECT schemaname || '.' || tablename" -                        . ' AS "Name"' -                        . ' FROM pg_catalog.pg_tables' -                        . ' WHERE schemaname NOT IN' -                        . " ('pg_catalog', 'information_schema', 'pg_toast')"; -            case 'views': -                // Table cols: viewname | viewowner | definition -                return 'SELECT viewname from pg_views WHERE schemaname' -                        . " NOT IN ('information_schema', 'pg_catalog')"; -            case 'users': -                // cols: usename |usesysid|usecreatedb|usetrace|usesuper|usecatupd|passwd  |valuntil -                return 'SELECT usename FROM pg_user'; -            case 'databases': -                return 'SELECT datname FROM pg_database'; -            case 'functions': -            case 'procedures': -                return 'SELECT proname FROM pg_proc WHERE proowner <> 1'; -            default: -                return null; -        } -    } - -    // }}} - -} - -/* - * Local variables: - * tab-width: 4 - * c-basic-offset: 4 - * End: - */ - -?> diff --git a/lib/phpFlickr/PEAR/DB/storage.php b/lib/phpFlickr/PEAR/DB/storage.php deleted file mode 100644 index f597b36d7..000000000 --- a/lib/phpFlickr/PEAR/DB/storage.php +++ /dev/null @@ -1,504 +0,0 @@ -<?php - -/* vim: set expandtab tabstop=4 shiftwidth=4 softtabstop=4: */ - -/** - * Provides an object interface to a table row - * - * PHP versions 4 and 5 - * - * LICENSE: This source file is subject to version 3.0 of the PHP license - * that is available through the world-wide-web at the following URI: - * http://www.php.net/license/3_0.txt.  If you did not receive a copy of - * the PHP License and are unable to obtain it through the web, please - * send a note to license@php.net so we can mail you a copy immediately. - * - * @category   Database - * @package    DB - * @author     Stig Bakken <stig@php.net> - * @copyright  1997-2005 The PHP Group - * @license    http://www.php.net/license/3_0.txt  PHP License 3.0 - * @version    CVS: $Id: storage.php 32 2005-08-01 06:21:02Z dancoulter $ - * @link       http://pear.php.net/package/DB - */ - -/** - * Obtain the DB class so it can be extended from - */ -require_once 'DB.php'; - -/** - * Provides an object interface to a table row - * - * It lets you add, delete and change rows using objects rather than SQL - * statements. - * - * @category   Database - * @package    DB - * @author     Stig Bakken <stig@php.net> - * @copyright  1997-2005 The PHP Group - * @license    http://www.php.net/license/3_0.txt  PHP License 3.0 - * @version    Release: @package_version@ - * @link       http://pear.php.net/package/DB - */ -class DB_storage extends PEAR -{ -    // {{{ properties - -    /** the name of the table (or view, if the backend database supports -        updates in views) we hold data from */ -    var $_table = null; - -    /** which column(s) in the table contains primary keys, can be a -        string for single-column primary keys, or an array of strings -        for multiple-column primary keys */ -    var $_keycolumn = null; - -    /** DB connection handle used for all transactions */ -    var $_dbh = null; - -    /** an assoc with the names of database fields stored as properties -        in this object */ -    var $_properties = array(); - -    /** an assoc with the names of the properties in this object that -        have been changed since they were fetched from the database */ -    var $_changes = array(); - -    /** flag that decides if data in this object can be changed. -        objects that don't have their table's key column in their -        property lists will be flagged as read-only. */ -    var $_readonly = false; - -    /** function or method that implements a validator for fields that -        are set, this validator function returns true if the field is -        valid, false if not */ -    var $_validator = null; - -    // }}} -    // {{{ constructor - -    /** -     * Constructor -     * -     * @param $table string the name of the database table -     * -     * @param $keycolumn mixed string with name of key column, or array of -     * strings if the table has a primary key of more than one column -     * -     * @param $dbh object database connection object -     * -     * @param $validator mixed function or method used to validate -     * each new value, called with three parameters: the name of the -     * field/column that is changing, a reference to the new value and -     * a reference to this object -     * -     */ -    function DB_storage($table, $keycolumn, &$dbh, $validator = null) -    { -        $this->PEAR('DB_Error'); -        $this->_table = $table; -        $this->_keycolumn = $keycolumn; -        $this->_dbh = $dbh; -        $this->_readonly = false; -        $this->_validator = $validator; -    } - -    // }}} -    // {{{ _makeWhere() - -    /** -     * Utility method to build a "WHERE" clause to locate ourselves in -     * the table. -     * -     * XXX future improvement: use rowids? -     * -     * @access private -     */ -    function _makeWhere($keyval = null) -    { -        if (is_array($this->_keycolumn)) { -            if ($keyval === null) { -                for ($i = 0; $i < sizeof($this->_keycolumn); $i++) { -                    $keyval[] = $this->{$this->_keycolumn[$i]}; -                } -            } -            $whereclause = ''; -            for ($i = 0; $i < sizeof($this->_keycolumn); $i++) { -                if ($i > 0) { -                    $whereclause .= ' AND '; -                } -                $whereclause .= $this->_keycolumn[$i]; -                if (is_null($keyval[$i])) { -                    // there's not much point in having a NULL key, -                    // but we support it anyway -                    $whereclause .= ' IS NULL'; -                } else { -                    $whereclause .= ' = ' . $this->_dbh->quote($keyval[$i]); -                } -            } -        } else { -            if ($keyval === null) { -                $keyval = @$this->{$this->_keycolumn}; -            } -            $whereclause = $this->_keycolumn; -            if (is_null($keyval)) { -                // there's not much point in having a NULL key, -                // but we support it anyway -                $whereclause .= ' IS NULL'; -            } else { -                $whereclause .= ' = ' . $this->_dbh->quote($keyval); -            } -        } -        return $whereclause; -    } - -    // }}} -    // {{{ setup() - -    /** -     * Method used to initialize a DB_storage object from the -     * configured table. -     * -     * @param $keyval mixed the key[s] of the row to fetch (string or array) -     * -     * @return int DB_OK on success, a DB error if not -     */ -    function setup($keyval) -    { -        $whereclause = $this->_makeWhere($keyval); -        $query = 'SELECT * FROM ' . $this->_table . ' WHERE ' . $whereclause; -        $sth = $this->_dbh->query($query); -        if (DB::isError($sth)) { -            return $sth; -        } -        $row = $sth->fetchRow(DB_FETCHMODE_ASSOC); -        if (DB::isError($row)) { -            return $row; -        } -        if (!$row) { -            return $this->raiseError(null, DB_ERROR_NOT_FOUND, null, null, -                                     $query, null, true); -        } -        foreach ($row as $key => $value) { -            $this->_properties[$key] = true; -            $this->$key = $value; -        } -        return DB_OK; -    } - -    // }}} -    // {{{ insert() - -    /** -     * Create a new (empty) row in the configured table for this -     * object. -     */ -    function insert($newpk) -    { -        if (is_array($this->_keycolumn)) { -            $primarykey = $this->_keycolumn; -        } else { -            $primarykey = array($this->_keycolumn); -        } -        settype($newpk, "array"); -        for ($i = 0; $i < sizeof($primarykey); $i++) { -            $pkvals[] = $this->_dbh->quote($newpk[$i]); -        } - -        $sth = $this->_dbh->query("INSERT INTO $this->_table (" . -                                  implode(",", $primarykey) . ") VALUES(" . -                                  implode(",", $pkvals) . ")"); -        if (DB::isError($sth)) { -            return $sth; -        } -        if (sizeof($newpk) == 1) { -            $newpk = $newpk[0]; -        } -        $this->setup($newpk); -    } - -    // }}} -    // {{{ toString() - -    /** -     * Output a simple description of this DB_storage object. -     * @return string object description -     */ -    function toString() -    { -        $info = strtolower(get_class($this)); -        $info .= " (table="; -        $info .= $this->_table; -        $info .= ", keycolumn="; -        if (is_array($this->_keycolumn)) { -            $info .= "(" . implode(",", $this->_keycolumn) . ")"; -        } else { -            $info .= $this->_keycolumn; -        } -        $info .= ", dbh="; -        if (is_object($this->_dbh)) { -            $info .= $this->_dbh->toString(); -        } else { -            $info .= "null"; -        } -        $info .= ")"; -        if (sizeof($this->_properties)) { -            $info .= " [loaded, key="; -            $keyname = $this->_keycolumn; -            if (is_array($keyname)) { -                $info .= "("; -                for ($i = 0; $i < sizeof($keyname); $i++) { -                    if ($i > 0) { -                        $info .= ","; -                    } -                    $info .= $this->$keyname[$i]; -                } -                $info .= ")"; -            } else { -                $info .= $this->$keyname; -            } -            $info .= "]"; -        } -        if (sizeof($this->_changes)) { -            $info .= " [modified]"; -        } -        return $info; -    } - -    // }}} -    // {{{ dump() - -    /** -     * Dump the contents of this object to "standard output". -     */ -    function dump() -    { -        foreach ($this->_properties as $prop => $foo) { -            print "$prop = "; -            print htmlentities($this->$prop); -            print "<br />\n"; -        } -    } - -    // }}} -    // {{{ &create() - -    /** -     * Static method used to create new DB storage objects. -     * @param $data assoc. array where the keys are the names -     *              of properties/columns -     * @return object a new instance of DB_storage or a subclass of it -     */ -    function &create($table, &$data) -    { -        $classname = strtolower(get_class($this)); -        $obj =& new $classname($table); -        foreach ($data as $name => $value) { -            $obj->_properties[$name] = true; -            $obj->$name = &$value; -        } -        return $obj; -    } - -    // }}} -    // {{{ loadFromQuery() - -    /** -     * Loads data into this object from the given query.  If this -     * object already contains table data, changes will be saved and -     * the object re-initialized first. -     * -     * @param $query SQL query -     * -     * @param $params parameter list in case you want to use -     * prepare/execute mode -     * -     * @return int DB_OK on success, DB_WARNING_READ_ONLY if the -     * returned object is read-only (because the object's specified -     * key column was not found among the columns returned by $query), -     * or another DB error code in case of errors. -     */ -// XXX commented out for now -/* -    function loadFromQuery($query, $params = null) -    { -        if (sizeof($this->_properties)) { -            if (sizeof($this->_changes)) { -                $this->store(); -                $this->_changes = array(); -            } -            $this->_properties = array(); -        } -        $rowdata = $this->_dbh->getRow($query, DB_FETCHMODE_ASSOC, $params); -        if (DB::isError($rowdata)) { -            return $rowdata; -        } -        reset($rowdata); -        $found_keycolumn = false; -        while (list($key, $value) = each($rowdata)) { -            if ($key == $this->_keycolumn) { -                $found_keycolumn = true; -            } -            $this->_properties[$key] = true; -            $this->$key = &$value; -            unset($value); // have to unset, or all properties will -                           // refer to the same value -        } -        if (!$found_keycolumn) { -            $this->_readonly = true; -            return DB_WARNING_READ_ONLY; -        } -        return DB_OK; -    } - */ - -    // }}} -    // {{{ set() - -    /** -     * Modify an attriute value. -     */ -    function set($property, $newvalue) -    { -        // only change if $property is known and object is not -        // read-only -        if ($this->_readonly) { -            return $this->raiseError(null, DB_WARNING_READ_ONLY, null, -                                     null, null, null, true); -        } -        if (@isset($this->_properties[$property])) { -            if (empty($this->_validator)) { -                $valid = true; -            } else { -                $valid = @call_user_func($this->_validator, -                                         $this->_table, -                                         $property, -                                         $newvalue, -                                         $this->$property, -                                         $this); -            } -            if ($valid) { -                $this->$property = $newvalue; -                if (empty($this->_changes[$property])) { -                    $this->_changes[$property] = 0; -                } else { -                    $this->_changes[$property]++; -                } -            } else { -                return $this->raiseError(null, DB_ERROR_INVALID, null, -                                         null, "invalid field: $property", -                                         null, true); -            } -            return true; -        } -        return $this->raiseError(null, DB_ERROR_NOSUCHFIELD, null, -                                 null, "unknown field: $property", -                                 null, true); -    } - -    // }}} -    // {{{ &get() - -    /** -     * Fetch an attribute value. -     * -     * @param string attribute name -     * -     * @return attribute contents, or null if the attribute name is -     * unknown -     */ -    function &get($property) -    { -        // only return if $property is known -        if (isset($this->_properties[$property])) { -            return $this->$property; -        } -        $tmp = null; -        return $tmp; -    } - -    // }}} -    // {{{ _DB_storage() - -    /** -     * Destructor, calls DB_storage::store() if there are changes -     * that are to be kept. -     */ -    function _DB_storage() -    { -        if (sizeof($this->_changes)) { -            $this->store(); -        } -        $this->_properties = array(); -        $this->_changes = array(); -        $this->_table = null; -    } - -    // }}} -    // {{{ store() - -    /** -     * Stores changes to this object in the database. -     * -     * @return DB_OK or a DB error -     */ -    function store() -    { -        foreach ($this->_changes as $name => $foo) { -            $params[] = &$this->$name; -            $vars[] = $name . ' = ?'; -        } -        if ($vars) { -            $query = 'UPDATE ' . $this->_table . ' SET ' . -                implode(', ', $vars) . ' WHERE ' . -                $this->_makeWhere(); -            $stmt = $this->_dbh->prepare($query); -            $res = $this->_dbh->execute($stmt, $params); -            if (DB::isError($res)) { -                return $res; -            } -            $this->_changes = array(); -        } -        return DB_OK; -    } - -    // }}} -    // {{{ remove() - -    /** -     * Remove the row represented by this object from the database. -     * -     * @return mixed DB_OK or a DB error -     */ -    function remove() -    { -        if ($this->_readonly) { -            return $this->raiseError(null, DB_WARNING_READ_ONLY, null, -                                     null, null, null, true); -        } -        $query = 'DELETE FROM ' . $this->_table .' WHERE '. -            $this->_makeWhere(); -        $res = $this->_dbh->query($query); -        if (DB::isError($res)) { -            return $res; -        } -        foreach ($this->_properties as $prop => $foo) { -            unset($this->$prop); -        } -        $this->_properties = array(); -        $this->_changes = array(); -        return DB_OK; -    } - -    // }}} -} - -/* - * Local variables: - * tab-width: 4 - * c-basic-offset: 4 - * End: - */ - -?> diff --git a/lib/phpFlickr/PEAR/HTTP/Request.php b/lib/phpFlickr/PEAR/HTTP/Request.php deleted file mode 100644 index 55e227b3a..000000000 --- a/lib/phpFlickr/PEAR/HTTP/Request.php +++ /dev/null @@ -1,1484 +0,0 @@ -<?php -/** - * Class for performing HTTP requests - * - * PHP versions 4 and 5 - *  - * LICENSE: - * - * Copyright (c) 2002-2007, Richard Heyes - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * o Redistributions of source code must retain the above copyright - *   notice, this list of conditions and the following disclaimer. - * o Redistributions in binary form must reproduce the above copyright - *   notice, this list of conditions and the following disclaimer in the - *   documentation and/or other materials provided with the distribution. - * o The names of the authors may not be used to endorse or promote - *   products derived from this software without specific prior written - *   permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR - * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT - * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, - * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT - * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, - * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY - * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * @category    HTTP - * @package     HTTP_Request - * @author      Richard Heyes <richard@phpguru.org> - * @author      Alexey Borzov <avb@php.net> - * @copyright   2002-2007 Richard Heyes - * @license     http://opensource.org/licenses/bsd-license.php New BSD License - * @version     CVS: $Id: Request.php 127 2008-01-17 20:21:37Z dcoulter $ - * @link        http://pear.php.net/package/HTTP_Request/  - */ - -/** - * PEAR and PEAR_Error classes (for error handling) - */ -require_once 'PEAR.php'; -/** - * Socket class - */ -require_once 'Net/Socket.php'; -/** - * URL handling class - */  -require_once 'Net/URL.php'; - -/**#@+ - * Constants for HTTP request methods - */  -define('HTTP_REQUEST_METHOD_GET',     'GET',     true); -define('HTTP_REQUEST_METHOD_HEAD',    'HEAD',    true); -define('HTTP_REQUEST_METHOD_POST',    'POST',    true); -define('HTTP_REQUEST_METHOD_PUT',     'PUT',     true); -define('HTTP_REQUEST_METHOD_DELETE',  'DELETE',  true); -define('HTTP_REQUEST_METHOD_OPTIONS', 'OPTIONS', true); -define('HTTP_REQUEST_METHOD_TRACE',   'TRACE',   true); -/**#@-*/ - -/**#@+ - * Constants for HTTP request error codes - */  -define('HTTP_REQUEST_ERROR_FILE',             1); -define('HTTP_REQUEST_ERROR_URL',              2); -define('HTTP_REQUEST_ERROR_PROXY',            4); -define('HTTP_REQUEST_ERROR_REDIRECTS',        8); -define('HTTP_REQUEST_ERROR_RESPONSE',        16);   -define('HTTP_REQUEST_ERROR_GZIP_METHOD',     32); -define('HTTP_REQUEST_ERROR_GZIP_READ',       64); -define('HTTP_REQUEST_ERROR_GZIP_DATA',      128); -define('HTTP_REQUEST_ERROR_GZIP_CRC',       256); -/**#@-*/ - -/**#@+ - * Constants for HTTP protocol versions - */ -define('HTTP_REQUEST_HTTP_VER_1_0', '1.0', true); -define('HTTP_REQUEST_HTTP_VER_1_1', '1.1', true); -/**#@-*/ - -if (extension_loaded('mbstring') && (2 & ini_get('mbstring.func_overload'))) { -   /** -    * Whether string functions are overloaded by their mbstring equivalents  -    */ -    define('HTTP_REQUEST_MBSTRING', true); -} else { -   /** -    * @ignore -    */ -    define('HTTP_REQUEST_MBSTRING', false); -} - -/** - * Class for performing HTTP requests - * - * Simple example (fetches yahoo.com and displays it): - * <code> - * $a = &new HTTP_Request('http://www.yahoo.com/'); - * $a->sendRequest(); - * echo $a->getResponseBody(); - * </code> - * - * @category    HTTP - * @package     HTTP_Request - * @author      Richard Heyes <richard@phpguru.org> - * @author      Alexey Borzov <avb@php.net> - * @version     Release: 1.4.2 - */ -class HTTP_Request -{ -   /**#@+ -    * @access private -    */ -    /** -    * Instance of Net_URL -    * @var Net_URL -    */ -    var $_url; - -    /** -    * Type of request -    * @var string -    */ -    var $_method; - -    /** -    * HTTP Version -    * @var string -    */ -    var $_http; - -    /** -    * Request headers -    * @var array -    */ -    var $_requestHeaders; - -    /** -    * Basic Auth Username -    * @var string -    */ -    var $_user; -     -    /** -    * Basic Auth Password -    * @var string -    */ -    var $_pass; - -    /** -    * Socket object -    * @var Net_Socket -    */ -    var $_sock; -     -    /** -    * Proxy server -    * @var string -    */ -    var $_proxy_host; -     -    /** -    * Proxy port -    * @var integer -    */ -    var $_proxy_port; -     -    /** -    * Proxy username -    * @var string -    */ -    var $_proxy_user; -     -    /** -    * Proxy password -    * @var string -    */ -    var $_proxy_pass; - -    /** -    * Post data -    * @var array -    */ -    var $_postData; - -   /** -    * Request body   -    * @var string -    */ -    var $_body; - -   /** -    * A list of methods that MUST NOT have a request body, per RFC 2616 -    * @var array -    */ -    var $_bodyDisallowed = array('TRACE'); - -   /** -    * Files to post  -    * @var array -    */ -    var $_postFiles = array(); - -    /** -    * Connection timeout. -    * @var float -    */ -    var $_timeout; -     -    /** -    * HTTP_Response object -    * @var HTTP_Response -    */ -    var $_response; -     -    /** -    * Whether to allow redirects -    * @var boolean -    */ -    var $_allowRedirects; -     -    /** -    * Maximum redirects allowed -    * @var integer -    */ -    var $_maxRedirects; -     -    /** -    * Current number of redirects -    * @var integer -    */ -    var $_redirects; - -   /** -    * Whether to append brackets [] to array variables -    * @var bool -    */ -    var $_useBrackets = true; - -   /** -    * Attached listeners -    * @var array -    */ -    var $_listeners = array(); - -   /** -    * Whether to save response body in response object property   -    * @var bool -    */ -    var $_saveBody = true; - -   /** -    * Timeout for reading from socket (array(seconds, microseconds)) -    * @var array -    */ -    var $_readTimeout = null; - -   /** -    * Options to pass to Net_Socket::connect. See stream_context_create -    * @var array -    */ -    var $_socketOptions = null; -   /**#@-*/ - -    /** -    * Constructor -    * -    * Sets up the object -    * @param    string  The url to fetch/access -    * @param    array   Associative array of parameters which can have the following keys: -    * <ul> -    *   <li>method         - Method to use, GET, POST etc (string)</li> -    *   <li>http           - HTTP Version to use, 1.0 or 1.1 (string)</li> -    *   <li>user           - Basic Auth username (string)</li> -    *   <li>pass           - Basic Auth password (string)</li> -    *   <li>proxy_host     - Proxy server host (string)</li> -    *   <li>proxy_port     - Proxy server port (integer)</li> -    *   <li>proxy_user     - Proxy auth username (string)</li> -    *   <li>proxy_pass     - Proxy auth password (string)</li> -    *   <li>timeout        - Connection timeout in seconds (float)</li> -    *   <li>allowRedirects - Whether to follow redirects or not (bool)</li> -    *   <li>maxRedirects   - Max number of redirects to follow (integer)</li> -    *   <li>useBrackets    - Whether to append [] to array variable names (bool)</li> -    *   <li>saveBody       - Whether to save response body in response object property (bool)</li> -    *   <li>readTimeout    - Timeout for reading / writing data over the socket (array (seconds, microseconds))</li> -    *   <li>socketOptions  - Options to pass to Net_Socket object (array)</li> -    * </ul> -    * @access public -    */ -    function HTTP_Request($url = '', $params = array()) -    { -        $this->_method         =  HTTP_REQUEST_METHOD_GET; -        $this->_http           =  HTTP_REQUEST_HTTP_VER_1_1; -        $this->_requestHeaders = array(); -        $this->_postData       = array(); -        $this->_body           = null; - -        $this->_user = null; -        $this->_pass = null; - -        $this->_proxy_host = null; -        $this->_proxy_port = null; -        $this->_proxy_user = null; -        $this->_proxy_pass = null; - -        $this->_allowRedirects = false; -        $this->_maxRedirects   = 3; -        $this->_redirects      = 0; - -        $this->_timeout  = null; -        $this->_response = null; - -        foreach ($params as $key => $value) { -            $this->{'_' . $key} = $value; -        } - -        if (!empty($url)) { -            $this->setURL($url); -        } - -        // Default useragent -        $this->addHeader('User-Agent', 'PEAR HTTP_Request class ( http://pear.php.net/ )'); - -        // We don't do keep-alives by default -        $this->addHeader('Connection', 'close'); - -        // Basic authentication -        if (!empty($this->_user)) { -            $this->addHeader('Authorization', 'Basic ' . base64_encode($this->_user . ':' . $this->_pass)); -        } - -        // Proxy authentication (see bug #5913) -        if (!empty($this->_proxy_user)) { -            $this->addHeader('Proxy-Authorization', 'Basic ' . base64_encode($this->_proxy_user . ':' . $this->_proxy_pass)); -        } - -        // Use gzip encoding if possible -        if (HTTP_REQUEST_HTTP_VER_1_1 == $this->_http && extension_loaded('zlib')) { -            $this->addHeader('Accept-Encoding', 'gzip'); -        } -    } -     -    /** -    * Generates a Host header for HTTP/1.1 requests -    * -    * @access private -    * @return string -    */ -    function _generateHostHeader() -    { -        if ($this->_url->port != 80 AND strcasecmp($this->_url->protocol, 'http') == 0) { -            $host = $this->_url->host . ':' . $this->_url->port; - -        } elseif ($this->_url->port != 443 AND strcasecmp($this->_url->protocol, 'https') == 0) { -            $host = $this->_url->host . ':' . $this->_url->port; - -        } elseif ($this->_url->port == 443 AND strcasecmp($this->_url->protocol, 'https') == 0 AND strpos($this->_url->url, ':443') !== false) { -            $host = $this->_url->host . ':' . $this->_url->port; -         -        } else { -            $host = $this->_url->host; -        } - -        return $host; -    } -     -    /** -    * Resets the object to its initial state (DEPRECATED). -    * Takes the same parameters as the constructor. -    * -    * @param  string $url    The url to be requested -    * @param  array  $params Associative array of parameters -    *                        (see constructor for details) -    * @access public -    * @deprecated deprecated since 1.2, call the constructor if this is necessary -    */ -    function reset($url, $params = array()) -    { -        $this->HTTP_Request($url, $params); -    } - -    /** -    * Sets the URL to be requested -    * -    * @param  string The url to be requested -    * @access public -    */ -    function setURL($url) -    { -        $this->_url = &new Net_URL($url, $this->_useBrackets); - -        if (!empty($this->_url->user) || !empty($this->_url->pass)) { -            $this->setBasicAuth($this->_url->user, $this->_url->pass); -        } - -        if (HTTP_REQUEST_HTTP_VER_1_1 == $this->_http) { -            $this->addHeader('Host', $this->_generateHostHeader()); -        } - -        // set '/' instead of empty path rather than check later (see bug #8662) -        if (empty($this->_url->path)) { -            $this->_url->path = '/'; -        }  -    } -     -   /** -    * Returns the current request URL   -    * -    * @return   string  Current request URL -    * @access   public -    */ -    function getUrl() -    { -        return empty($this->_url)? '': $this->_url->getUrl(); -    } - -    /** -    * Sets a proxy to be used -    * -    * @param string     Proxy host -    * @param int        Proxy port -    * @param string     Proxy username -    * @param string     Proxy password -    * @access public -    */ -    function setProxy($host, $port = 8080, $user = null, $pass = null) -    { -        $this->_proxy_host = $host; -        $this->_proxy_port = $port; -        $this->_proxy_user = $user; -        $this->_proxy_pass = $pass; - -        if (!empty($user)) { -            $this->addHeader('Proxy-Authorization', 'Basic ' . base64_encode($user . ':' . $pass)); -        } -    } - -    /** -    * Sets basic authentication parameters -    * -    * @param string     Username -    * @param string     Password -    */ -    function setBasicAuth($user, $pass) -    { -        $this->_user = $user; -        $this->_pass = $pass; - -        $this->addHeader('Authorization', 'Basic ' . base64_encode($user . ':' . $pass)); -    } - -    /** -    * Sets the method to be used, GET, POST etc. -    * -    * @param string     Method to use. Use the defined constants for this -    * @access public -    */ -    function setMethod($method) -    { -        $this->_method = $method; -    } - -    /** -    * Sets the HTTP version to use, 1.0 or 1.1 -    * -    * @param string     Version to use. Use the defined constants for this -    * @access public -    */ -    function setHttpVer($http) -    { -        $this->_http = $http; -    } - -    /** -    * Adds a request header -    * -    * @param string     Header name -    * @param string     Header value -    * @access public -    */ -    function addHeader($name, $value) -    { -        $this->_requestHeaders[strtolower($name)] = $value; -    } - -    /** -    * Removes a request header -    * -    * @param string     Header name to remove -    * @access public -    */ -    function removeHeader($name) -    { -        if (isset($this->_requestHeaders[strtolower($name)])) { -            unset($this->_requestHeaders[strtolower($name)]); -        } -    } - -    /** -    * Adds a querystring parameter -    * -    * @param string     Querystring parameter name -    * @param string     Querystring parameter value -    * @param bool       Whether the value is already urlencoded or not, default = not -    * @access public -    */ -    function addQueryString($name, $value, $preencoded = false) -    { -        $this->_url->addQueryString($name, $value, $preencoded); -    }     -     -    /** -    * Sets the querystring to literally what you supply -    * -    * @param string     The querystring data. Should be of the format foo=bar&x=y etc -    * @param bool       Whether data is already urlencoded or not, default = already encoded -    * @access public -    */ -    function addRawQueryString($querystring, $preencoded = true) -    { -        $this->_url->addRawQueryString($querystring, $preencoded); -    } - -    /** -    * Adds postdata items -    * -    * @param string     Post data name -    * @param string     Post data value -    * @param bool       Whether data is already urlencoded or not, default = not -    * @access public -    */ -    function addPostData($name, $value, $preencoded = false) -    { -        if ($preencoded) { -            $this->_postData[$name] = $value; -        } else { -            $this->_postData[$name] = $this->_arrayMapRecursive('urlencode', $value); -        } -    } - -   /** -    * Recursively applies the callback function to the value -    *  -    * @param    mixed   Callback function -    * @param    mixed   Value to process -    * @access   private -    * @return   mixed   Processed value -    */ -    function _arrayMapRecursive($callback, $value) -    { -        if (!is_array($value)) { -            return call_user_func($callback, $value); -        } else { -            $map = array(); -            foreach ($value as $k => $v) { -                $map[$k] = $this->_arrayMapRecursive($callback, $v); -            } -            return $map; -        } -    } - -   /** -    * Adds a file to upload -    *  -    * This also changes content-type to 'multipart/form-data' for proper upload -    *  -    * @access public -    * @param  string    name of file-upload field -    * @param  mixed     file name(s) -    * @param  mixed     content-type(s) of file(s) being uploaded -    * @return bool      true on success -    * @throws PEAR_Error -    */ -    function addFile($inputName, $fileName, $contentType = 'application/octet-stream') -    { -        if (!is_array($fileName) && !is_readable($fileName)) { -            return PEAR::raiseError("File '{$fileName}' is not readable", HTTP_REQUEST_ERROR_FILE); -        } elseif (is_array($fileName)) { -            foreach ($fileName as $name) { -                if (!is_readable($name)) { -                    return PEAR::raiseError("File '{$name}' is not readable", HTTP_REQUEST_ERROR_FILE); -                } -            } -        } -        $this->addHeader('Content-Type', 'multipart/form-data'); -        $this->_postFiles[$inputName] = array( -            'name' => $fileName, -            'type' => $contentType -        ); -        return true; -    } - -    /** -    * Adds raw postdata (DEPRECATED) -    * -    * @param string     The data -    * @param bool       Whether data is preencoded or not, default = already encoded -    * @access public -    * @deprecated       deprecated since 1.3.0, method setBody() should be used instead -    */ -    function addRawPostData($postdata, $preencoded = true) -    { -        $this->_body = $preencoded ? $postdata : urlencode($postdata); -    } - -   /** -    * Sets the request body (for POST, PUT and similar requests) -    * -    * @param    string  Request body -    * @access   public -    */ -    function setBody($body) -    { -        $this->_body = $body; -    } - -    /** -    * Clears any postdata that has been added (DEPRECATED).  -    *  -    * Useful for multiple request scenarios. -    * -    * @access public -    * @deprecated deprecated since 1.2 -    */ -    function clearPostData() -    { -        $this->_postData = null; -    } - -    /** -    * Appends a cookie to "Cookie:" header -    *  -    * @param string $name cookie name -    * @param string $value cookie value -    * @access public -    */ -    function addCookie($name, $value) -    { -        $cookies = isset($this->_requestHeaders['cookie']) ? $this->_requestHeaders['cookie']. '; ' : ''; -        $this->addHeader('Cookie', $cookies . $name . '=' . $value); -    } -     -    /** -    * Clears any cookies that have been added (DEPRECATED).  -    *  -    * Useful for multiple request scenarios -    * -    * @access public -    * @deprecated deprecated since 1.2 -    */ -    function clearCookies() -    { -        $this->removeHeader('Cookie'); -    } - -    /** -    * Sends the request -    * -    * @access public -    * @param  bool   Whether to store response body in Response object property, -    *                set this to false if downloading a LARGE file and using a Listener -    * @return mixed  PEAR error on error, true otherwise -    */ -    function sendRequest($saveBody = true) -    { -        if (!is_a($this->_url, 'Net_URL')) { -            return PEAR::raiseError('No URL given', HTTP_REQUEST_ERROR_URL); -        } - -        $host = isset($this->_proxy_host) ? $this->_proxy_host : $this->_url->host; -        $port = isset($this->_proxy_port) ? $this->_proxy_port : $this->_url->port; - -        // 4.3.0 supports SSL connections using OpenSSL. The function test determines -        // we running on at least 4.3.0 -        if (strcasecmp($this->_url->protocol, 'https') == 0 AND function_exists('file_get_contents') AND extension_loaded('openssl')) { -            if (isset($this->_proxy_host)) { -                return PEAR::raiseError('HTTPS proxies are not supported', HTTP_REQUEST_ERROR_PROXY); -            } -            $host = 'ssl://' . $host; -        } - -        // magic quotes may fuck up file uploads and chunked response processing -        $magicQuotes = ini_get('magic_quotes_runtime'); -        ini_set('magic_quotes_runtime', false); - -        // RFC 2068, section 19.7.1: A client MUST NOT send the Keep-Alive  -        // connection token to a proxy server... -        if (isset($this->_proxy_host) && !empty($this->_requestHeaders['connection']) && -            'Keep-Alive' == $this->_requestHeaders['connection']) -        { -            $this->removeHeader('connection'); -        } - -        $keepAlive = (HTTP_REQUEST_HTTP_VER_1_1 == $this->_http && empty($this->_requestHeaders['connection'])) || -                     (!empty($this->_requestHeaders['connection']) && 'Keep-Alive' == $this->_requestHeaders['connection']); -        $sockets   = &PEAR::getStaticProperty('HTTP_Request', 'sockets'); -        $sockKey   = $host . ':' . $port; -        unset($this->_sock); - -        // There is a connected socket in the "static" property? -        if ($keepAlive && !empty($sockets[$sockKey]) && -            !empty($sockets[$sockKey]->fp))  -        { -            $this->_sock =& $sockets[$sockKey]; -            $err = null; -        } else { -            $this->_notify('connect'); -            $this->_sock =& new Net_Socket(); -            $err = $this->_sock->connect($host, $port, null, $this->_timeout, $this->_socketOptions); -        } -        PEAR::isError($err) or $err = $this->_sock->write($this->_buildRequest()); - -        if (!PEAR::isError($err)) { -            if (!empty($this->_readTimeout)) { -                $this->_sock->setTimeout($this->_readTimeout[0], $this->_readTimeout[1]); -            } - -            $this->_notify('sentRequest'); - -            // Read the response -            $this->_response = &new HTTP_Response($this->_sock, $this->_listeners); -            $err = $this->_response->process( -                $this->_saveBody && $saveBody, -                HTTP_REQUEST_METHOD_HEAD != $this->_method -            ); - -            if ($keepAlive) { -                $keepAlive = (isset($this->_response->_headers['content-length']) -                              || (isset($this->_response->_headers['transfer-encoding']) -                                  && strtolower($this->_response->_headers['transfer-encoding']) == 'chunked')); -                if ($keepAlive) { -                    if (isset($this->_response->_headers['connection'])) { -                        $keepAlive = strtolower($this->_response->_headers['connection']) == 'keep-alive'; -                    } else { -                        $keepAlive = 'HTTP/'.HTTP_REQUEST_HTTP_VER_1_1 == $this->_response->_protocol; -                    } -                } -            } -        } - -        ini_set('magic_quotes_runtime', $magicQuotes); - -        if (PEAR::isError($err)) { -            return $err; -        } - -        if (!$keepAlive) { -            $this->disconnect(); -        // Store the connected socket in "static" property -        } elseif (empty($sockets[$sockKey]) || empty($sockets[$sockKey]->fp)) { -            $sockets[$sockKey] =& $this->_sock; -        } - -        // Check for redirection -        if (    $this->_allowRedirects -            AND $this->_redirects <= $this->_maxRedirects -            AND $this->getResponseCode() > 300 -            AND $this->getResponseCode() < 399 -            AND !empty($this->_response->_headers['location'])) { - -             -            $redirect = $this->_response->_headers['location']; - -            // Absolute URL -            if (preg_match('/^https?:\/\//i', $redirect)) { -                $this->_url = &new Net_URL($redirect); -                $this->addHeader('Host', $this->_generateHostHeader()); -            // Absolute path -            } elseif ($redirect{0} == '/') { -                $this->_url->path = $redirect; -             -            // Relative path -            } elseif (substr($redirect, 0, 3) == '../' OR substr($redirect, 0, 2) == './') { -                if (substr($this->_url->path, -1) == '/') { -                    $redirect = $this->_url->path . $redirect; -                } else { -                    $redirect = dirname($this->_url->path) . '/' . $redirect; -                } -                $redirect = Net_URL::resolvePath($redirect); -                $this->_url->path = $redirect; -                 -            // Filename, no path -            } else { -                if (substr($this->_url->path, -1) == '/') { -                    $redirect = $this->_url->path . $redirect; -                } else { -                    $redirect = dirname($this->_url->path) . '/' . $redirect; -                } -                $this->_url->path = $redirect; -            } - -            $this->_redirects++; -            return $this->sendRequest($saveBody); - -        // Too many redirects -        } elseif ($this->_allowRedirects AND $this->_redirects > $this->_maxRedirects) { -            return PEAR::raiseError('Too many redirects', HTTP_REQUEST_ERROR_REDIRECTS); -        } - -        return true; -    } - -    /** -     * Disconnect the socket, if connected. Only useful if using Keep-Alive. -     * -     * @access public -     */ -    function disconnect() -    { -        if (!empty($this->_sock) && !empty($this->_sock->fp)) { -            $this->_notify('disconnect'); -            $this->_sock->disconnect(); -        } -    } - -    /** -    * Returns the response code -    * -    * @access public -    * @return mixed     Response code, false if not set -    */ -    function getResponseCode() -    { -        return isset($this->_response->_code) ? $this->_response->_code : false; -    } - -    /** -    * Returns either the named header or all if no name given -    * -    * @access public -    * @param string     The header name to return, do not set to get all headers -    * @return mixed     either the value of $headername (false if header is not present) -    *                   or an array of all headers -    */ -    function getResponseHeader($headername = null) -    { -        if (!isset($headername)) { -            return isset($this->_response->_headers)? $this->_response->_headers: array(); -        } else { -            $headername = strtolower($headername); -            return isset($this->_response->_headers[$headername]) ? $this->_response->_headers[$headername] : false; -        } -    } - -    /** -    * Returns the body of the response -    * -    * @access public -    * @return mixed     response body, false if not set -    */ -    function getResponseBody() -    { -        return isset($this->_response->_body) ? $this->_response->_body : false; -    } - -    /** -    * Returns cookies set in response -    *  -    * @access public -    * @return mixed     array of response cookies, false if none are present -    */ -    function getResponseCookies() -    { -        return isset($this->_response->_cookies) ? $this->_response->_cookies : false; -    } - -    /** -    * Builds the request string -    * -    * @access private -    * @return string The request string -    */ -    function _buildRequest() -    { -        $separator = ini_get('arg_separator.output'); -        ini_set('arg_separator.output', '&'); -        $querystring = ($querystring = $this->_url->getQueryString()) ? '?' . $querystring : ''; -        ini_set('arg_separator.output', $separator); - -        $host = isset($this->_proxy_host) ? $this->_url->protocol . '://' . $this->_url->host : ''; -        $port = (isset($this->_proxy_host) AND $this->_url->port != 80) ? ':' . $this->_url->port : ''; -        $path = $this->_url->path . $querystring; -        $url  = $host . $port . $path; - -        if (!strlen($url)) { -            $url = '/'; -        } - -        $request = $this->_method . ' ' . $url . ' HTTP/' . $this->_http . "\r\n"; - -        if (in_array($this->_method, $this->_bodyDisallowed) || -            (0 == strlen($this->_body) && (HTTP_REQUEST_METHOD_POST != $this->_method || -             (empty($this->_postData) && empty($this->_postFiles))))) -        { -            $this->removeHeader('Content-Type'); -        } else { -            if (empty($this->_requestHeaders['content-type'])) { -                // Add default content-type -                $this->addHeader('Content-Type', 'application/x-www-form-urlencoded'); -            } elseif ('multipart/form-data' == $this->_requestHeaders['content-type']) { -                $boundary = 'HTTP_Request_' . md5(uniqid('request') . microtime()); -                $this->addHeader('Content-Type', 'multipart/form-data; boundary=' . $boundary); -            } -        } - -        // Request Headers -        if (!empty($this->_requestHeaders)) { -            foreach ($this->_requestHeaders as $name => $value) { -                $canonicalName = implode('-', array_map('ucfirst', explode('-', $name))); -                $request      .= $canonicalName . ': ' . $value . "\r\n"; -            } -        } - -        // No post data or wrong method, so simply add a final CRLF -        if (in_array($this->_method, $this->_bodyDisallowed) ||  -            (HTTP_REQUEST_METHOD_POST != $this->_method && 0 == strlen($this->_body))) { - -            $request .= "\r\n"; - -        // Post data if it's an array -        } elseif (HTTP_REQUEST_METHOD_POST == $this->_method &&  -                  (!empty($this->_postData) || !empty($this->_postFiles))) { - -            // "normal" POST request -            if (!isset($boundary)) { -                $postdata = implode('&', array_map( -                    create_function('$a', 'return $a[0] . \'=\' . $a[1];'),  -                    $this->_flattenArray('', $this->_postData) -                )); - -            // multipart request, probably with file uploads -            } else { -                $postdata = ''; -                if (!empty($this->_postData)) { -                    $flatData = $this->_flattenArray('', $this->_postData); -                    foreach ($flatData as $item) { -                        $postdata .= '--' . $boundary . "\r\n"; -                        $postdata .= 'Content-Disposition: form-data; name="' . $item[0] . '"'; -                        $postdata .= "\r\n\r\n" . urldecode($item[1]) . "\r\n"; -                    } -                } -                foreach ($this->_postFiles as $name => $value) { -                    if (is_array($value['name'])) { -                        $varname       = $name . ($this->_useBrackets? '[]': ''); -                    } else { -                        $varname       = $name; -                        $value['name'] = array($value['name']); -                    } -                    foreach ($value['name'] as $key => $filename) { -                        $fp   = fopen($filename, 'r'); -                        $data = fread($fp, filesize($filename)); -                        fclose($fp); -                        $basename = basename($filename); -                        $type     = is_array($value['type'])? @$value['type'][$key]: $value['type']; - -                        $postdata .= '--' . $boundary . "\r\n"; -                        $postdata .= 'Content-Disposition: form-data; name="' . $varname . '"; filename="' . $basename . '"'; -                        $postdata .= "\r\nContent-Type: " . $type; -                        $postdata .= "\r\n\r\n" . $data . "\r\n"; -                    } -                } -                $postdata .= '--' . $boundary . "--\r\n"; -            } -            $request .= 'Content-Length: ' . -                        (HTTP_REQUEST_MBSTRING? mb_strlen($postdata, 'iso-8859-1'): strlen($postdata)) . -                        "\r\n\r\n"; -            $request .= $postdata; - -        // Explicitly set request body -        } elseif (0 < strlen($this->_body)) { - -            $request .= 'Content-Length: ' . -                        (HTTP_REQUEST_MBSTRING? mb_strlen($this->_body, 'iso-8859-1'): strlen($this->_body)) . -                        "\r\n\r\n"; -            $request .= $this->_body; - -        // Terminate headers with CRLF on POST request with no body, too -        } else { - -            $request .= "\r\n"; -        } -         -        return $request; -    } - -   /** -    * Helper function to change the (probably multidimensional) associative array -    * into the simple one. -    * -    * @param    string  name for item -    * @param    mixed   item's values -    * @return   array   array with the following items: array('item name', 'item value'); -    * @access   private -    */ -    function _flattenArray($name, $values) -    { -        if (!is_array($values)) { -            return array(array($name, $values)); -        } else { -            $ret = array(); -            foreach ($values as $k => $v) { -                if (empty($name)) { -                    $newName = $k; -                } elseif ($this->_useBrackets) { -                    $newName = $name . '[' . $k . ']'; -                } else { -                    $newName = $name; -                } -                $ret = array_merge($ret, $this->_flattenArray($newName, $v)); -            } -            return $ret; -        } -    } - - -   /** -    * Adds a Listener to the list of listeners that are notified of -    * the object's events -    *  -    * Events sent by HTTP_Request object -    * - 'connect': on connection to server -    * - 'sentRequest': after the request was sent -    * - 'disconnect': on disconnection from server -    * -    * Events sent by HTTP_Response object -    * - 'gotHeaders': after receiving response headers (headers are passed in $data) -    * - 'tick': on receiving a part of response body (the part is passed in $data) -    * - 'gzTick': on receiving a gzip-encoded part of response body (ditto) -    * - 'gotBody': after receiving the response body (passes the decoded body in $data if it was gzipped) -    * -    * @param    HTTP_Request_Listener   listener to attach -    * @return   boolean                 whether the listener was successfully attached -    * @access   public -    */ -    function attach(&$listener) -    { -        if (!is_a($listener, 'HTTP_Request_Listener')) { -            return false; -        } -        $this->_listeners[$listener->getId()] =& $listener; -        return true; -    } - - -   /** -    * Removes a Listener from the list of listeners  -    *  -    * @param    HTTP_Request_Listener   listener to detach -    * @return   boolean                 whether the listener was successfully detached -    * @access   public -    */ -    function detach(&$listener) -    { -        if (!is_a($listener, 'HTTP_Request_Listener') ||  -            !isset($this->_listeners[$listener->getId()])) { -            return false; -        } -        unset($this->_listeners[$listener->getId()]); -        return true; -    } - - -   /** -    * Notifies all registered listeners of an event. -    *  -    * @param    string  Event name -    * @param    mixed   Additional data -    * @access   private -    * @see      HTTP_Request::attach() -    */ -    function _notify($event, $data = null) -    { -        foreach (array_keys($this->_listeners) as $id) { -            $this->_listeners[$id]->update($this, $event, $data); -        } -    } -} - - -/** - * Response class to complement the Request class - * - * @category    HTTP - * @package     HTTP_Request - * @author      Richard Heyes <richard@phpguru.org> - * @author      Alexey Borzov <avb@php.net> - * @version     Release: 1.4.2 - */ -class HTTP_Response -{ -    /** -    * Socket object -    * @var Net_Socket -    */ -    var $_sock; - -    /** -    * Protocol -    * @var string -    */ -    var $_protocol; -     -    /** -    * Return code -    * @var string -    */ -    var $_code; -     -    /** -    * Response headers -    * @var array -    */ -    var $_headers; - -    /** -    * Cookies set in response   -    * @var array -    */ -    var $_cookies; - -    /** -    * Response body -    * @var string -    */ -    var $_body = ''; - -   /** -    * Used by _readChunked(): remaining length of the current chunk -    * @var string -    */ -    var $_chunkLength = 0; - -   /** -    * Attached listeners -    * @var array -    */ -    var $_listeners = array(); - -   /** -    * Bytes left to read from message-body -    * @var null|int -    */ -    var $_toRead; - -    /** -    * Constructor -    * -    * @param  Net_Socket    socket to read the response from -    * @param  array         listeners attached to request -    */ -    function HTTP_Response(&$sock, &$listeners) -    { -        $this->_sock      =& $sock; -        $this->_listeners =& $listeners; -    } - - -   /** -    * Processes a HTTP response -    *  -    * This extracts response code, headers, cookies and decodes body if it  -    * was encoded in some way -    * -    * @access public -    * @param  bool      Whether to store response body in object property, set -    *                   this to false if downloading a LARGE file and using a Listener. -    *                   This is assumed to be true if body is gzip-encoded. -    * @param  bool      Whether the response can actually have a message-body. -    *                   Will be set to false for HEAD requests. -    * @throws PEAR_Error -    * @return mixed     true on success, PEAR_Error in case of malformed response -    */ -    function process($saveBody = true, $canHaveBody = true) -    { -        do { -            $line = $this->_sock->readLine(); -            if (sscanf($line, 'HTTP/%s %s', $http_version, $returncode) != 2) { -                return PEAR::raiseError('Malformed response', HTTP_REQUEST_ERROR_RESPONSE); -            } else { -                $this->_protocol = 'HTTP/' . $http_version; -                $this->_code     = intval($returncode); -            } -            while ('' !== ($header = $this->_sock->readLine())) { -                $this->_processHeader($header); -            } -        } while (100 == $this->_code); - -        $this->_notify('gotHeaders', $this->_headers); - -        // RFC 2616, section 4.4: -        // 1. Any response message which "MUST NOT" include a message-body ...  -        // is always terminated by the first empty line after the header fields  -        // 3. ... If a message is received with both a -        // Transfer-Encoding header field and a Content-Length header field, -        // the latter MUST be ignored. -        $canHaveBody = $canHaveBody && $this->_code >= 200 &&  -                       $this->_code != 204 && $this->_code != 304; - -        // If response body is present, read it and decode -        $chunked = isset($this->_headers['transfer-encoding']) && ('chunked' == $this->_headers['transfer-encoding']); -        $gzipped = isset($this->_headers['content-encoding']) && ('gzip' == $this->_headers['content-encoding']); -        $hasBody = false; -        if ($canHaveBody && ($chunked || !isset($this->_headers['content-length']) ||  -                0 != $this->_headers['content-length'])) -        { -            if ($chunked || !isset($this->_headers['content-length'])) { -                $this->_toRead = null; -            } else { -                $this->_toRead = $this->_headers['content-length']; -            } -            while (!$this->_sock->eof() && (is_null($this->_toRead) || 0 < $this->_toRead)) { -                if ($chunked) { -                    $data = $this->_readChunked(); -                } elseif (is_null($this->_toRead)) { -                    $data = $this->_sock->read(4096); -                } else { -                    $data = $this->_sock->read(min(4096, $this->_toRead)); -                    $this->_toRead -= HTTP_REQUEST_MBSTRING? mb_strlen($data, 'iso-8859-1'): strlen($data); -                } -                if ('' == $data) { -                    break; -                } else { -                    $hasBody = true; -                    if ($saveBody || $gzipped) { -                        $this->_body .= $data; -                    } -                    $this->_notify($gzipped? 'gzTick': 'tick', $data); -                } -            } -        } - -        if ($hasBody) { -            // Uncompress the body if needed -            if ($gzipped) { -                $body = $this->_decodeGzip($this->_body); -                if (PEAR::isError($body)) { -                    return $body; -                } -                $this->_body = $body; -                $this->_notify('gotBody', $this->_body); -            } else { -                $this->_notify('gotBody'); -            } -        } -        return true; -    } - - -   /** -    * Processes the response header -    * -    * @access private -    * @param  string    HTTP header -    */ -    function _processHeader($header) -    { -        if (false === strpos($header, ':')) { -            return; -        } -        list($headername, $headervalue) = explode(':', $header, 2); -        $headername  = strtolower($headername); -        $headervalue = ltrim($headervalue); -         -        if ('set-cookie' != $headername) { -            if (isset($this->_headers[$headername])) { -                $this->_headers[$headername] .= ',' . $headervalue; -            } else { -                $this->_headers[$headername]  = $headervalue; -            } -        } else { -            $this->_parseCookie($headervalue); -        } -    } - - -   /** -    * Parse a Set-Cookie header to fill $_cookies array -    * -    * @access private -    * @param  string    value of Set-Cookie header -    */ -    function _parseCookie($headervalue) -    { -        $cookie = array( -            'expires' => null, -            'domain'  => null, -            'path'    => null, -            'secure'  => false -        ); - -        // Only a name=value pair -        if (!strpos($headervalue, ';')) { -            $pos = strpos($headervalue, '='); -            $cookie['name']  = trim(substr($headervalue, 0, $pos)); -            $cookie['value'] = trim(substr($headervalue, $pos + 1)); - -        // Some optional parameters are supplied -        } else { -            $elements = explode(';', $headervalue); -            $pos = strpos($elements[0], '='); -            $cookie['name']  = trim(substr($elements[0], 0, $pos)); -            $cookie['value'] = trim(substr($elements[0], $pos + 1)); - -            for ($i = 1; $i < count($elements); $i++) { -                if (false === strpos($elements[$i], '=')) { -                    $elName  = trim($elements[$i]); -                    $elValue = null; -                } else { -                    list ($elName, $elValue) = array_map('trim', explode('=', $elements[$i])); -                } -                $elName = strtolower($elName); -                if ('secure' == $elName) { -                    $cookie['secure'] = true; -                } elseif ('expires' == $elName) { -                    $cookie['expires'] = str_replace('"', '', $elValue); -                } elseif ('path' == $elName || 'domain' == $elName) { -                    $cookie[$elName] = urldecode($elValue); -                } else { -                    $cookie[$elName] = $elValue; -                } -            } -        } -        $this->_cookies[] = $cookie; -    } - - -   /** -    * Read a part of response body encoded with chunked Transfer-Encoding -    *  -    * @access private -    * @return string -    */ -    function _readChunked() -    { -        // at start of the next chunk? -        if (0 == $this->_chunkLength) { -            $line = $this->_sock->readLine(); -            if (preg_match('/^([0-9a-f]+)/i', $line, $matches)) { -                $this->_chunkLength = hexdec($matches[1]);  -                // Chunk with zero length indicates the end -                if (0 == $this->_chunkLength) { -                    $this->_sock->readLine(); // make this an eof() -                    return ''; -                } -            } else { -                return ''; -            } -        } -        $data = $this->_sock->read($this->_chunkLength); -        $this->_chunkLength -= HTTP_REQUEST_MBSTRING? mb_strlen($data, 'iso-8859-1'): strlen($data); -        if (0 == $this->_chunkLength) { -            $this->_sock->readLine(); // Trailing CRLF -        } -        return $data; -    } - - -   /** -    * Notifies all registered listeners of an event. -    *  -    * @param    string  Event name -    * @param    mixed   Additional data -    * @access   private -    * @see HTTP_Request::_notify() -    */ -    function _notify($event, $data = null) -    { -        foreach (array_keys($this->_listeners) as $id) { -            $this->_listeners[$id]->update($this, $event, $data); -        } -    } - - -   /** -    * Decodes the message-body encoded by gzip -    * -    * The real decoding work is done by gzinflate() built-in function, this -    * method only parses the header and checks data for compliance with -    * RFC 1952   -    * -    * @access   private -    * @param    string  gzip-encoded data -    * @return   string  decoded data -    */ -    function _decodeGzip($data) -    { -        if (HTTP_REQUEST_MBSTRING) { -            $oldEncoding = mb_internal_encoding(); -            mb_internal_encoding('iso-8859-1'); -        } -        $length = strlen($data); -        // If it doesn't look like gzip-encoded data, don't bother -        if (18 > $length || strcmp(substr($data, 0, 2), "\x1f\x8b")) { -            return $data; -        } -        $method = ord(substr($data, 2, 1)); -        if (8 != $method) { -            return PEAR::raiseError('_decodeGzip(): unknown compression method', HTTP_REQUEST_ERROR_GZIP_METHOD); -        } -        $flags = ord(substr($data, 3, 1)); -        if ($flags & 224) { -            return PEAR::raiseError('_decodeGzip(): reserved bits are set', HTTP_REQUEST_ERROR_GZIP_DATA); -        } - -        // header is 10 bytes minimum. may be longer, though. -        $headerLength = 10; -        // extra fields, need to skip 'em -        if ($flags & 4) { -            if ($length - $headerLength - 2 < 8) { -                return PEAR::raiseError('_decodeGzip(): data too short', HTTP_REQUEST_ERROR_GZIP_DATA); -            } -            $extraLength = unpack('v', substr($data, 10, 2)); -            if ($length - $headerLength - 2 - $extraLength[1] < 8) { -                return PEAR::raiseError('_decodeGzip(): data too short', HTTP_REQUEST_ERROR_GZIP_DATA); -            } -            $headerLength += $extraLength[1] + 2; -        } -        // file name, need to skip that -        if ($flags & 8) { -            if ($length - $headerLength - 1 < 8) { -                return PEAR::raiseError('_decodeGzip(): data too short', HTTP_REQUEST_ERROR_GZIP_DATA); -            } -            $filenameLength = strpos(substr($data, $headerLength), chr(0)); -            if (false === $filenameLength || $length - $headerLength - $filenameLength - 1 < 8) { -                return PEAR::raiseError('_decodeGzip(): data too short', HTTP_REQUEST_ERROR_GZIP_DATA); -            } -            $headerLength += $filenameLength + 1; -        } -        // comment, need to skip that also -        if ($flags & 16) { -            if ($length - $headerLength - 1 < 8) { -                return PEAR::raiseError('_decodeGzip(): data too short', HTTP_REQUEST_ERROR_GZIP_DATA); -            } -            $commentLength = strpos(substr($data, $headerLength), chr(0)); -            if (false === $commentLength || $length - $headerLength - $commentLength - 1 < 8) { -                return PEAR::raiseError('_decodeGzip(): data too short', HTTP_REQUEST_ERROR_GZIP_DATA); -            } -            $headerLength += $commentLength + 1; -        } -        // have a CRC for header. let's check -        if ($flags & 1) { -            if ($length - $headerLength - 2 < 8) { -                return PEAR::raiseError('_decodeGzip(): data too short', HTTP_REQUEST_ERROR_GZIP_DATA); -            } -            $crcReal   = 0xffff & crc32(substr($data, 0, $headerLength)); -            $crcStored = unpack('v', substr($data, $headerLength, 2)); -            if ($crcReal != $crcStored[1]) { -                return PEAR::raiseError('_decodeGzip(): header CRC check failed', HTTP_REQUEST_ERROR_GZIP_CRC); -            } -            $headerLength += 2; -        } -        // unpacked data CRC and size at the end of encoded data -        $tmp = unpack('V2', substr($data, -8)); -        $dataCrc  = $tmp[1]; -        $dataSize = $tmp[2]; - -        // finally, call the gzinflate() function -        $unpacked = @gzinflate(substr($data, $headerLength, -8), $dataSize); -        if (false === $unpacked) { -            return PEAR::raiseError('_decodeGzip(): gzinflate() call failed', HTTP_REQUEST_ERROR_GZIP_READ); -        } elseif ($dataSize != strlen($unpacked)) { -            return PEAR::raiseError('_decodeGzip(): data size check failed', HTTP_REQUEST_ERROR_GZIP_READ); -        } elseif ((0xffffffff & $dataCrc) != (0xffffffff & crc32($unpacked))) { -            return PEAR::raiseError('_decodeGzip(): data CRC check failed', HTTP_REQUEST_ERROR_GZIP_CRC); -        } -        if (HTTP_REQUEST_MBSTRING) { -            mb_internal_encoding($oldEncoding); -        } -        return $unpacked; -    } -} // End class HTTP_Response -?> diff --git a/lib/phpFlickr/PEAR/HTTP/Request/Listener.php b/lib/phpFlickr/PEAR/HTTP/Request/Listener.php deleted file mode 100644 index b00514206..000000000 --- a/lib/phpFlickr/PEAR/HTTP/Request/Listener.php +++ /dev/null @@ -1,106 +0,0 @@ -<?php -/** - * Listener for HTTP_Request and HTTP_Response objects - * - * PHP versions 4 and 5 - *  - * LICENSE: - * - * Copyright (c) 2002-2007, Richard Heyes - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * o Redistributions of source code must retain the above copyright - *   notice, this list of conditions and the following disclaimer. - * o Redistributions in binary form must reproduce the above copyright - *   notice, this list of conditions and the following disclaimer in the - *   documentation and/or other materials provided with the distribution. - * o The names of the authors may not be used to endorse or promote - *   products derived from this software without specific prior written - *   permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR - * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT - * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, - * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT - * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, - * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY - * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * @category    HTTP - * @package     HTTP_Request - * @author      Alexey Borzov <avb@php.net> - * @copyright   2002-2007 Richard Heyes - * @license     http://opensource.org/licenses/bsd-license.php New BSD License - * @version     CVS: $Id: Listener.php 127 2008-01-17 20:21:37Z dcoulter $ - * @link        http://pear.php.net/package/HTTP_Request/  - */ - -/** - * Listener for HTTP_Request and HTTP_Response objects - * - * This class implements the Observer part of a Subject-Observer - * design pattern. - * - * @category    HTTP - * @package     HTTP_Request - * @author      Alexey Borzov <avb@php.net> - * @version     Release: 1.4.2 - */ -class HTTP_Request_Listener  -{ -   /** -    * A listener's identifier -    * @var string -    */ -    var $_id; - -   /** -    * Constructor, sets the object's identifier -    * -    * @access public -    */ -    function HTTP_Request_Listener() -    { -        $this->_id = md5(uniqid('http_request_', 1)); -    } - - -   /** -    * Returns the listener's identifier -    * -    * @access public -    * @return string -    */ -    function getId() -    { -        return $this->_id; -    } - - -   /** -    * This method is called when Listener is notified of an event -    * -    * @access   public -    * @param    object  an object the listener is attached to -    * @param    string  Event name -    * @param    mixed   Additional data -    * @abstract -    */ -    function update(&$subject, $event, $data = null) -    { -        echo "Notified of event: '$event'\n"; -        if (null !== $data) { -            echo "Additional data: "; -            var_dump($data); -        } -    } -} -?> diff --git a/lib/phpFlickr/PEAR/Net/Socket.php b/lib/phpFlickr/PEAR/Net/Socket.php deleted file mode 100644 index 96f2c4bf1..000000000 --- a/lib/phpFlickr/PEAR/Net/Socket.php +++ /dev/null @@ -1,528 +0,0 @@ -<?php -// -// +----------------------------------------------------------------------+ -// | PHP Version 4                                                        | -// +----------------------------------------------------------------------+ -// | Copyright (c) 1997-2003 The PHP Group                                | -// +----------------------------------------------------------------------+ -// | This source file is subject to version 2.0 of the PHP license,       | -// | that is bundled with this package in the file LICENSE, and is        | -// | available at through the world-wide-web at                           | -// | http://www.php.net/license/2_02.txt.                                 | -// | If you did not receive a copy of the PHP license and are unable to   | -// | obtain it through the world-wide-web, please send a note to          | -// | license@php.net so we can mail you a copy immediately.               | -// +----------------------------------------------------------------------+ -// | Authors: Stig Bakken <ssb@php.net>                                   | -// |          Chuck Hagenbuch <chuck@horde.org>                           | -// +----------------------------------------------------------------------+ -// -// $Id: Socket.php 32 2005-08-01 06:21:02Z dancoulter $ - -require_once 'PEAR.php'; - -define('NET_SOCKET_READ',  1); -define('NET_SOCKET_WRITE', 2); -define('NET_SOCKET_ERROR', 3); - -/** - * Generalized Socket class. - * - * @version 1.1 - * @author Stig Bakken <ssb@php.net> - * @author Chuck Hagenbuch <chuck@horde.org> - */ -class Net_Socket extends PEAR { - -    /** -     * Socket file pointer. -     * @var resource $fp -     */ -    var $fp = null; - -    /** -     * Whether the socket is blocking. Defaults to true. -     * @var boolean $blocking -     */ -    var $blocking = true; - -    /** -     * Whether the socket is persistent. Defaults to false. -     * @var boolean $persistent -     */ -    var $persistent = false; - -    /** -     * The IP address to connect to. -     * @var string $addr -     */ -    var $addr = ''; - -    /** -     * The port number to connect to. -     * @var integer $port -     */ -    var $port = 0; - -    /** -     * Number of seconds to wait on socket connections before assuming -     * there's no more data. Defaults to no timeout. -     * @var integer $timeout -     */ -    var $timeout = false; - -    /** -     * Number of bytes to read at a time in readLine() and -     * readAll(). Defaults to 2048. -     * @var integer $lineLength -     */ -    var $lineLength = 2048; - -    /** -     * Connect to the specified port. If called when the socket is -     * already connected, it disconnects and connects again. -     * -     * @param string  $addr        IP address or host name. -     * @param integer $port        TCP port number. -     * @param boolean $persistent  (optional) Whether the connection is -     *                             persistent (kept open between requests -     *                             by the web server). -     * @param integer $timeout     (optional) How long to wait for data. -     * @param array   $options     See options for stream_context_create. -     * -     * @access public -     * -     * @return boolean | PEAR_Error  True on success or a PEAR_Error on failure. -     */ -    function connect($addr, $port = 0, $persistent = null, $timeout = null, $options = null) -    { -        if (is_resource($this->fp)) { -            @fclose($this->fp); -            $this->fp = null; -        } - -        if (!$addr) { -            return $this->raiseError('$addr cannot be empty'); -        } elseif (strspn($addr, '.0123456789') == strlen($addr) || -                  strstr($addr, '/') !== false) { -            $this->addr = $addr; -        } else { -            $this->addr = @gethostbyname($addr); -        } - -        $this->port = $port % 65536; - -        if ($persistent !== null) { -            $this->persistent = $persistent; -        } - -        if ($timeout !== null) { -            $this->timeout = $timeout; -        } - -        $openfunc = $this->persistent ? 'pfsockopen' : 'fsockopen'; -        $errno = 0; -        $errstr = ''; -        if ($options && function_exists('stream_context_create')) { -            if ($this->timeout) { -                $timeout = $this->timeout; -            } else { -                $timeout = 0; -            } -            $context = stream_context_create($options); -            $fp = @$openfunc($this->addr, $this->port, $errno, $errstr, $timeout, $context); -        } else { -            if ($this->timeout) { -                $fp = @$openfunc($this->addr, $this->port, $errno, $errstr, $this->timeout); -            } else { -                $fp = @$openfunc($this->addr, $this->port, $errno, $errstr); -            } -        } - -        if (!$fp) { -            return $this->raiseError($errstr, $errno); -        } - -        $this->fp = $fp; - -        return $this->setBlocking($this->blocking); -    } - -    /** -     * Disconnects from the peer, closes the socket. -     * -     * @access public -     * @return mixed true on success or an error object otherwise -     */ -    function disconnect() -    { -        if (!is_resource($this->fp)) { -            return $this->raiseError('not connected'); -        } - -        @fclose($this->fp); -        $this->fp = null; -        return true; -    } - -    /** -     * Find out if the socket is in blocking mode. -     * -     * @access public -     * @return boolean  The current blocking mode. -     */ -    function isBlocking() -    { -        return $this->blocking; -    } - -    /** -     * Sets whether the socket connection should be blocking or -     * not. A read call to a non-blocking socket will return immediately -     * if there is no data available, whereas it will block until there -     * is data for blocking sockets. -     * -     * @param boolean $mode  True for blocking sockets, false for nonblocking. -     * @access public -     * @return mixed true on success or an error object otherwise -     */ -    function setBlocking($mode) -    { -        if (!is_resource($this->fp)) { -            return $this->raiseError('not connected'); -        } - -        $this->blocking = $mode; -        socket_set_blocking($this->fp, $this->blocking); -        return true; -    } - -    /** -     * Sets the timeout value on socket descriptor, -     * expressed in the sum of seconds and microseconds -     * -     * @param integer $seconds  Seconds. -     * @param integer $microseconds  Microseconds. -     * @access public -     * @return mixed true on success or an error object otherwise -     */ -    function setTimeout($seconds, $microseconds) -    { -        if (!is_resource($this->fp)) { -            return $this->raiseError('not connected'); -        } - -        return socket_set_timeout($this->fp, $seconds, $microseconds); -    } - -    /** -     * Returns information about an existing socket resource. -     * Currently returns four entries in the result array: -     * -     * <p> -     * timed_out (bool) - The socket timed out waiting for data<br> -     * blocked (bool) - The socket was blocked<br> -     * eof (bool) - Indicates EOF event<br> -     * unread_bytes (int) - Number of bytes left in the socket buffer<br> -     * </p> -     * -     * @access public -     * @return mixed Array containing information about existing socket resource or an error object otherwise -     */ -    function getStatus() -    { -        if (!is_resource($this->fp)) { -            return $this->raiseError('not connected'); -        } - -        return socket_get_status($this->fp); -    } - -    /** -     * Get a specified line of data -     * -     * @access public -     * @return $size bytes of data from the socket, or a PEAR_Error if -     *         not connected. -     */ -    function gets($size) -    { -        if (!is_resource($this->fp)) { -            return $this->raiseError('not connected'); -        } - -        return @fgets($this->fp, $size); -    } - -    /** -     * Read a specified amount of data. This is guaranteed to return, -     * and has the added benefit of getting everything in one fread() -     * chunk; if you know the size of the data you're getting -     * beforehand, this is definitely the way to go. -     * -     * @param integer $size  The number of bytes to read from the socket. -     * @access public -     * @return $size bytes of data from the socket, or a PEAR_Error if -     *         not connected. -     */ -    function read($size) -    { -        if (!is_resource($this->fp)) { -            return $this->raiseError('not connected'); -        } - -        return @fread($this->fp, $size); -    } - -    /** -     * Write a specified amount of data. -     * -     * @param string  $data       Data to write. -     * @param integer $blocksize  Amount of data to write at once. -     *                            NULL means all at once. -     * -     * @access public -     * @return mixed true on success or an error object otherwise -     */ -    function write($data, $blocksize = null) -    { -        if (!is_resource($this->fp)) { -            return $this->raiseError('not connected'); -        } - -        if (is_null($blocksize) && !OS_WINDOWS) { -            return fwrite($this->fp, $data); -        } else { -            if (is_null($blocksize)) { -                $blocksize = 1024; -            } - -            $pos = 0; -            $size = strlen($data); -            while ($pos < $size) { -                $written = @fwrite($this->fp, substr($data, $pos, $blocksize)); -                if ($written === false) { -                    return false; -                } -                $pos += $written; -            } - -            return $pos; -        } -    } - -    /** -     * Write a line of data to the socket, followed by a trailing "\r\n". -     * -     * @access public -     * @return mixed fputs result, or an error -     */ -    function writeLine($data) -    { -        if (!is_resource($this->fp)) { -            return $this->raiseError('not connected'); -        } - -        return fwrite($this->fp, $data . "\r\n"); -    } - -    /** -     * Tests for end-of-file on a socket descriptor. -     * -     * @access public -     * @return bool -     */ -    function eof() -    { -        return (is_resource($this->fp) && feof($this->fp)); -    } - -    /** -     * Reads a byte of data -     * -     * @access public -     * @return 1 byte of data from the socket, or a PEAR_Error if -     *         not connected. -     */ -    function readByte() -    { -        if (!is_resource($this->fp)) { -            return $this->raiseError('not connected'); -        } - -        return ord(@fread($this->fp, 1)); -    } - -    /** -     * Reads a word of data -     * -     * @access public -     * @return 1 word of data from the socket, or a PEAR_Error if -     *         not connected. -     */ -    function readWord() -    { -        if (!is_resource($this->fp)) { -            return $this->raiseError('not connected'); -        } - -        $buf = @fread($this->fp, 2); -        return (ord($buf[0]) + (ord($buf[1]) << 8)); -    } - -    /** -     * Reads an int of data -     * -     * @access public -     * @return integer  1 int of data from the socket, or a PEAR_Error if -     *                  not connected. -     */ -    function readInt() -    { -        if (!is_resource($this->fp)) { -            return $this->raiseError('not connected'); -        } - -        $buf = @fread($this->fp, 4); -        return (ord($buf[0]) + (ord($buf[1]) << 8) + -                (ord($buf[2]) << 16) + (ord($buf[3]) << 24)); -    } - -    /** -     * Reads a zero-terminated string of data -     * -     * @access public -     * @return string, or a PEAR_Error if -     *         not connected. -     */ -    function readString() -    { -        if (!is_resource($this->fp)) { -            return $this->raiseError('not connected'); -        } - -        $string = ''; -        while (($char = @fread($this->fp, 1)) != "\x00")  { -            $string .= $char; -        } -        return $string; -    } - -    /** -     * Reads an IP Address and returns it in a dot formated string -     * -     * @access public -     * @return Dot formated string, or a PEAR_Error if -     *         not connected. -     */ -    function readIPAddress() -    { -        if (!is_resource($this->fp)) { -            return $this->raiseError('not connected'); -        } - -        $buf = @fread($this->fp, 4); -        return sprintf("%s.%s.%s.%s", ord($buf[0]), ord($buf[1]), -                       ord($buf[2]), ord($buf[3])); -    } - -    /** -     * Read until either the end of the socket or a newline, whichever -     * comes first. Strips the trailing newline from the returned data. -     * -     * @access public -     * @return All available data up to a newline, without that -     *         newline, or until the end of the socket, or a PEAR_Error if -     *         not connected. -     */ -    function readLine() -    { -        if (!is_resource($this->fp)) { -            return $this->raiseError('not connected'); -        } - -        $line = ''; -        $timeout = time() + $this->timeout; -        while (!feof($this->fp) && (!$this->timeout || time() < $timeout)) { -            $line .= @fgets($this->fp, $this->lineLength); -            if (substr($line, -1) == "\n") { -                return rtrim($line, "\r\n"); -            } -        } -        return $line; -    } - -    /** -     * Read until the socket closes, or until there is no more data in -     * the inner PHP buffer. If the inner buffer is empty, in blocking -     * mode we wait for at least 1 byte of data. Therefore, in -     * blocking mode, if there is no data at all to be read, this -     * function will never exit (unless the socket is closed on the -     * remote end). -     * -     * @access public -     * -     * @return string  All data until the socket closes, or a PEAR_Error if -     *                 not connected. -     */ -    function readAll() -    { -        if (!is_resource($this->fp)) { -            return $this->raiseError('not connected'); -        } - -        $data = ''; -        while (!feof($this->fp)) { -            $data .= @fread($this->fp, $this->lineLength); -        } -        return $data; -    } - -    /** -     * Runs the equivalent of the select() system call on the socket -     * with a timeout specified by tv_sec and tv_usec. -     * -     * @param integer $state    Which of read/write/error to check for. -     * @param integer $tv_sec   Number of seconds for timeout. -     * @param integer $tv_usec  Number of microseconds for timeout. -     * -     * @access public -     * @return False if select fails, integer describing which of read/write/error -     *         are ready, or PEAR_Error if not connected. -     */ -    function select($state, $tv_sec, $tv_usec = 0) -    { -        if (!is_resource($this->fp)) { -            return $this->raiseError('not connected'); -        } - -        $read = null; -        $write = null; -        $except = null; -        if ($state & NET_SOCKET_READ) { -            $read[] = $this->fp; -        } -        if ($state & NET_SOCKET_WRITE) { -            $write[] = $this->fp; -        } -        if ($state & NET_SOCKET_ERROR) { -            $except[] = $this->fp; -        } -        if (false === ($sr = stream_select($read, $write, $except, $tv_sec, $tv_usec))) { -            return false; -        } - -        $result = 0; -        if (count($read)) { -            $result |= NET_SOCKET_READ; -        } -        if (count($write)) { -            $result |= NET_SOCKET_WRITE; -        } -        if (count($except)) { -            $result |= NET_SOCKET_ERROR; -        } -        return $result; -    } - -} diff --git a/lib/phpFlickr/PEAR/Net/URL.php b/lib/phpFlickr/PEAR/Net/URL.php deleted file mode 100644 index 38e26fd15..000000000 --- a/lib/phpFlickr/PEAR/Net/URL.php +++ /dev/null @@ -1,410 +0,0 @@ -<?php -// +-----------------------------------------------------------------------+ -// | Copyright (c) 2002-2004, Richard Heyes                                | -// | All rights reserved.                                                  | -// |                                                                       | -// | Redistribution and use in source and binary forms, with or without    | -// | modification, are permitted provided that the following conditions    | -// | are met:                                                              | -// |                                                                       | -// | o Redistributions of source code must retain the above copyright      | -// |   notice, this list of conditions and the following disclaimer.       | -// | o Redistributions in binary form must reproduce the above copyright   | -// |   notice, this list of conditions and the following disclaimer in the | -// |   documentation and/or other materials provided with the distribution.| -// | o The names of the authors may not be used to endorse or promote      | -// |   products derived from this software without specific prior written  | -// |   permission.                                                         | -// |                                                                       | -// | THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS   | -// | "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT     | -// | LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR | -// | A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT  | -// | OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, | -// | SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT      | -// | LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, | -// | DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY | -// | THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT   | -// | (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE | -// | OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.  | -// |                                                                       | -// +-----------------------------------------------------------------------+ -// | Author: Richard Heyes <richard at php net>                            | -// +-----------------------------------------------------------------------+ -// -// $Id: URL.php 32 2005-08-01 06:21:02Z dancoulter $ -// -// Net_URL Class - -class Net_URL -{ -    /** -    * Full url -    * @var string -    */ -    var $url; - -    /** -    * Protocol -    * @var string -    */ -    var $protocol; - -    /** -    * Username -    * @var string -    */ -    var $username; - -    /** -    * Password -    * @var string -    */ -    var $password; - -    /** -    * Host -    * @var string -    */ -    var $host; - -    /** -    * Port -    * @var integer -    */ -    var $port; - -    /** -    * Path -    * @var string -    */ -    var $path; - -    /** -    * Query string -    * @var array -    */ -    var $querystring; - -    /** -    * Anchor -    * @var string -    */ -    var $anchor; - -    /** -    * Whether to use [] -    * @var bool -    */ -    var $useBrackets; - -    /** -    * PHP4 Constructor -    * -    * @see __construct() -    */ -    function Net_URL($url = null, $useBrackets = true) -    { -        $this->__construct($url, $useBrackets); -    } - -    /** -    * PHP5 Constructor -    * -    * Parses the given url and stores the various parts -    * Defaults are used in certain cases -    * -    * @param string $url         Optional URL -    * @param bool   $useBrackets Whether to use square brackets when -    *                            multiple querystrings with the same name -    *                            exist -    */ -    function __construct($url = null, $useBrackets = true) -    { -        $HTTP_SERVER_VARS  = !empty($_SERVER) ? $_SERVER : $GLOBALS['HTTP_SERVER_VARS']; - -        $this->useBrackets = $useBrackets; -        $this->url         = $url; -        $this->user        = ''; -        $this->pass        = ''; -        $this->host        = ''; -        $this->port        = 80; -        $this->path        = ''; -        $this->querystring = array(); -        $this->anchor      = ''; - -        // Only use defaults if not an absolute URL given -        if (!preg_match('/^[a-z0-9]+:\/\//i', $url)) { - -            $this->protocol    = (@$HTTP_SERVER_VARS['HTTPS'] == 'on' ? 'https' : 'http'); - -            /** -            * Figure out host/port -            */ -            if (!empty($HTTP_SERVER_VARS['HTTP_HOST']) AND preg_match('/^(.*)(:([0-9]+))?$/U', $HTTP_SERVER_VARS['HTTP_HOST'], $matches)) { -                $host = $matches[1]; -                if (!empty($matches[3])) { -                    $port = $matches[3]; -                } else { -                    $port = $this->getStandardPort($this->protocol); -                } -            } - -            $this->user        = ''; -            $this->pass        = ''; -            $this->host        = !empty($host) ? $host : (isset($HTTP_SERVER_VARS['SERVER_NAME']) ? $HTTP_SERVER_VARS['SERVER_NAME'] : 'localhost'); -            $this->port        = !empty($port) ? $port : (isset($HTTP_SERVER_VARS['SERVER_PORT']) ? $HTTP_SERVER_VARS['SERVER_PORT'] : $this->getStandardPort($this->protocol)); -            $this->path        = !empty($HTTP_SERVER_VARS['PHP_SELF']) ? $HTTP_SERVER_VARS['PHP_SELF'] : '/'; -            $this->querystring = isset($HTTP_SERVER_VARS['QUERY_STRING']) ? $this->_parseRawQuerystring($HTTP_SERVER_VARS['QUERY_STRING']) : null; -            $this->anchor      = ''; -        } - -        // Parse the url and store the various parts -        if (!empty($url)) { -            $urlinfo = parse_url($url); - -            // Default querystring -            $this->querystring = array(); - -            foreach ($urlinfo as $key => $value) { -                switch ($key) { -                    case 'scheme': -                        $this->protocol = $value; -                        $this->port     = $this->getStandardPort($value); -                        break; - -                    case 'user': -                    case 'pass': -                    case 'host': -                    case 'port': -                        $this->$key = $value; -                        break; - -                    case 'path': -                        if ($value{0} == '/') { -                            $this->path = $value; -                        } else { -                            $path = dirname($this->path) == DIRECTORY_SEPARATOR ? '' : dirname($this->path); -                            $this->path = sprintf('%s/%s', $path, $value); -                        } -                        break; - -                    case 'query': -                        $this->querystring = $this->_parseRawQueryString($value); -                        break; - -                    case 'fragment': -                        $this->anchor = $value; -                        break; -                } -            } -        } -    } - -    /** -    * Returns full url -    * -    * @return string Full url -    * @access public -    */ -    function getURL() -    { -        $querystring = $this->getQueryString(); - -        $this->url = $this->protocol . '://' -                   . $this->user . (!empty($this->pass) ? ':' : '') -                   . $this->pass . (!empty($this->user) ? '@' : '') -                   . $this->host . ($this->port == $this->getStandardPort($this->protocol) ? '' : ':' . $this->port) -                   . $this->path -                   . (!empty($querystring) ? '?' . $querystring : '') -                   . (!empty($this->anchor) ? '#' . $this->anchor : ''); - -        return $this->url; -    } - -    /** -    * Adds a querystring item -    * -    * @param  string $name       Name of item -    * @param  string $value      Value of item -    * @param  bool   $preencoded Whether value is urlencoded or not, default = not -    * @access public -    */ -    function addQueryString($name, $value, $preencoded = false) -    { -        if ($preencoded) { -            $this->querystring[$name] = $value; -        } else { -            $this->querystring[$name] = is_array($value) ? array_map('rawurlencode', $value): rawurlencode($value); -        } -    } - -    /** -    * Removes a querystring item -    * -    * @param  string $name Name of item -    * @access public -    */ -    function removeQueryString($name) -    { -        if (isset($this->querystring[$name])) { -            unset($this->querystring[$name]); -        } -    } - -    /** -    * Sets the querystring to literally what you supply -    * -    * @param  string $querystring The querystring data. Should be of the format foo=bar&x=y etc -    * @access public -    */ -    function addRawQueryString($querystring) -    { -        $this->querystring = $this->_parseRawQueryString($querystring); -    } - -    /** -    * Returns flat querystring -    * -    * @return string Querystring -    * @access public -    */ -    function getQueryString() -    { -        if (!empty($this->querystring)) { -            foreach ($this->querystring as $name => $value) { -                if (is_array($value)) { -                    foreach ($value as $k => $v) { -                        $querystring[] = $this->useBrackets ? sprintf('%s[%s]=%s', $name, $k, $v) : ($name . '=' . $v); -                    } -                } elseif (!is_null($value)) { -                    $querystring[] = $name . '=' . $value; -                } else { -                    $querystring[] = $name; -                } -            } -            $querystring = implode(ini_get('arg_separator.output'), $querystring); -        } else { -            $querystring = ''; -        } - -        return $querystring; -    } - -    /** -    * Parses raw querystring and returns an array of it -    * -    * @param  string  $querystring The querystring to parse -    * @return array                An array of the querystring data -    * @access private -    */ -    function _parseRawQuerystring($querystring) -    { -        $parts  = preg_split('/[' . preg_quote(ini_get('arg_separator.input'), '/') . ']/', $querystring, -1, PREG_SPLIT_NO_EMPTY); -        $return = array(); - -        foreach ($parts as $part) { -            if (strpos($part, '=') !== false) { -                $value = substr($part, strpos($part, '=') + 1); -                $key   = substr($part, 0, strpos($part, '=')); -            } else { -                $value = null; -                $key   = $part; -            } -            if (substr($key, -2) == '[]') { -                $key = substr($key, 0, -2); -                if (@!is_array($return[$key])) { -                    $return[$key]   = array(); -                    $return[$key][] = $value; -                } else { -                    $return[$key][] = $value; -                } -            } elseif (!$this->useBrackets AND !empty($return[$key])) { -                $return[$key]   = (array)$return[$key]; -                $return[$key][] = $value; -            } else { -                $return[$key] = $value; -            } -        } - -        return $return; -    } - -    /** -    * Resolves //, ../ and ./ from a path and returns -    * the result. Eg: -    * -    * /foo/bar/../boo.php    => /foo/boo.php -    * /foo/bar/../../boo.php => /boo.php -    * /foo/bar/.././/boo.php => /foo/boo.php -    * -    * This method can also be called statically. -    * -    * @param  string $url URL path to resolve -    * @return string      The result -    */ -    function resolvePath($path) -    { -        $path = explode('/', str_replace('//', '/', $path)); - -        for ($i=0; $i<count($path); $i++) { -            if ($path[$i] == '.') { -                unset($path[$i]); -                $path = array_values($path); -                $i--; - -            } elseif ($path[$i] == '..' AND ($i > 1 OR ($i == 1 AND $path[0] != '') ) ) { -                unset($path[$i]); -                unset($path[$i-1]); -                $path = array_values($path); -                $i -= 2; - -            } elseif ($path[$i] == '..' AND $i == 1 AND $path[0] == '') { -                unset($path[$i]); -                $path = array_values($path); -                $i--; - -            } else { -                continue; -            } -        } - -        return implode('/', $path); -    } - -    /** -    * Returns the standard port number for a protocol -    * -    * @param  string  $scheme The protocol to lookup -    * @return integer         Port number or NULL if no scheme matches -    * -    * @author Philippe Jausions <Philippe.Jausions@11abacus.com> -    */ -    function getStandardPort($scheme) -    { -        switch (strtolower($scheme)) { -            case 'http':    return 80; -            case 'https':   return 443; -            case 'ftp':     return 21; -            case 'imap':    return 143; -            case 'imaps':   return 993; -            case 'pop3':    return 110; -            case 'pop3s':   return 995; -            default:        return null; -       } -    } - -    /** -    * Forces the URL to a particular protocol -    * -    * @param string  $protocol Protocol to force the URL to -    * @param integer $port     Optional port (standard port is used by default) -    */ -    function setProtocol($protocol, $port = null) -    { -        $this->protocol = $protocol; -        $this->port = is_null($port) ? $this->getStandardPort() : $port; -    } - -} -?> diff --git a/lib/phpFlickr/PEAR/PEAR.php b/lib/phpFlickr/PEAR/PEAR.php deleted file mode 100644 index e442d8c7a..000000000 --- a/lib/phpFlickr/PEAR/PEAR.php +++ /dev/null @@ -1,1108 +0,0 @@ -<?php -/** - * PEAR, the PHP Extension and Application Repository - * - * PEAR class and PEAR_Error class - * - * PHP versions 4 and 5 - * - * LICENSE: This source file is subject to version 3.0 of the PHP license - * that is available through the world-wide-web at the following URI: - * http://www.php.net/license/3_0.txt.  If you did not receive a copy of - * the PHP License and are unable to obtain it through the web, please - * send a note to license@php.net so we can mail you a copy immediately. - * - * @category   pear - * @package    PEAR - * @author     Sterling Hughes <sterling@php.net> - * @author     Stig Bakken <ssb@php.net> - * @author     Tomas V.V.Cox <cox@idecnet.com> - * @author     Greg Beaver <cellog@php.net> - * @copyright  1997-2006 The PHP Group - * @license    http://www.php.net/license/3_0.txt  PHP License 3.0 - * @version    CVS: $Id: PEAR.php 127 2008-01-17 20:21:37Z dcoulter $ - * @link       http://pear.php.net/package/PEAR - * @since      File available since Release 0.1 - */ - -/**#@+ - * ERROR constants - */ -define('PEAR_ERROR_RETURN',     1); -define('PEAR_ERROR_PRINT',      2); -define('PEAR_ERROR_TRIGGER',    4); -define('PEAR_ERROR_DIE',        8); -define('PEAR_ERROR_CALLBACK',  16); -/** - * WARNING: obsolete - * @deprecated - */ -define('PEAR_ERROR_EXCEPTION', 32); -/**#@-*/ -define('PEAR_ZE2', (function_exists('version_compare') && -                    version_compare(zend_version(), "2-dev", "ge"))); - -if (substr(PHP_OS, 0, 3) == 'WIN') { -    define('OS_WINDOWS', true); -    define('OS_UNIX',    false); -    define('PEAR_OS',    'Windows'); -} else { -    define('OS_WINDOWS', false); -    define('OS_UNIX',    true); -    define('PEAR_OS',    'Unix'); // blatant assumption -} - -// instant backwards compatibility -if (!defined('PATH_SEPARATOR')) { -    if (OS_WINDOWS) { -        define('PATH_SEPARATOR', ';'); -    } else { -        define('PATH_SEPARATOR', ':'); -    } -} - -$GLOBALS['_PEAR_default_error_mode']     = PEAR_ERROR_RETURN; -$GLOBALS['_PEAR_default_error_options']  = E_USER_NOTICE; -$GLOBALS['_PEAR_destructor_object_list'] = array(); -$GLOBALS['_PEAR_shutdown_funcs']         = array(); -$GLOBALS['_PEAR_error_handler_stack']    = array(); - -@ini_set('track_errors', true); - -/** - * Base class for other PEAR classes.  Provides rudimentary - * emulation of destructors. - * - * If you want a destructor in your class, inherit PEAR and make a - * destructor method called _yourclassname (same name as the - * constructor, but with a "_" prefix).  Also, in your constructor you - * have to call the PEAR constructor: $this->PEAR();. - * The destructor method will be called without parameters.  Note that - * at in some SAPI implementations (such as Apache), any output during - * the request shutdown (in which destructors are called) seems to be - * discarded.  If you need to get any debug information from your - * destructor, use error_log(), syslog() or something similar. - * - * IMPORTANT! To use the emulated destructors you need to create the - * objects by reference: $obj =& new PEAR_child; - * - * @category   pear - * @package    PEAR - * @author     Stig Bakken <ssb@php.net> - * @author     Tomas V.V. Cox <cox@idecnet.com> - * @author     Greg Beaver <cellog@php.net> - * @copyright  1997-2006 The PHP Group - * @license    http://www.php.net/license/3_0.txt  PHP License 3.0 - * @version    Release: 1.6.2 - * @link       http://pear.php.net/package/PEAR - * @see        PEAR_Error - * @since      Class available since PHP 4.0.2 - * @link        http://pear.php.net/manual/en/core.pear.php#core.pear.pear - */ -class PEAR -{ -    // {{{ properties - -    /** -     * Whether to enable internal debug messages. -     * -     * @var     bool -     * @access  private -     */ -    var $_debug = false; - -    /** -     * Default error mode for this object. -     * -     * @var     int -     * @access  private -     */ -    var $_default_error_mode = null; - -    /** -     * Default error options used for this object when error mode -     * is PEAR_ERROR_TRIGGER. -     * -     * @var     int -     * @access  private -     */ -    var $_default_error_options = null; - -    /** -     * Default error handler (callback) for this object, if error mode is -     * PEAR_ERROR_CALLBACK. -     * -     * @var     string -     * @access  private -     */ -    var $_default_error_handler = ''; - -    /** -     * Which class to use for error objects. -     * -     * @var     string -     * @access  private -     */ -    var $_error_class = 'PEAR_Error'; - -    /** -     * An array of expected errors. -     * -     * @var     array -     * @access  private -     */ -    var $_expected_errors = array(); - -    // }}} - -    // {{{ constructor - -    /** -     * Constructor.  Registers this object in -     * $_PEAR_destructor_object_list for destructor emulation if a -     * destructor object exists. -     * -     * @param string $error_class  (optional) which class to use for -     *        error objects, defaults to PEAR_Error. -     * @access public -     * @return void -     */ -    function PEAR($error_class = null) -    { -        $classname = strtolower(get_class($this)); -        if ($this->_debug) { -            print "PEAR constructor called, class=$classname\n"; -        } -        if ($error_class !== null) { -            $this->_error_class = $error_class; -        } -        while ($classname && strcasecmp($classname, "pear")) { -            $destructor = "_$classname"; -            if (method_exists($this, $destructor)) { -                global $_PEAR_destructor_object_list; -                $_PEAR_destructor_object_list[] = &$this; -                if (!isset($GLOBALS['_PEAR_SHUTDOWN_REGISTERED'])) { -                    register_shutdown_function("_PEAR_call_destructors"); -                    $GLOBALS['_PEAR_SHUTDOWN_REGISTERED'] = true; -                } -                break; -            } else { -                $classname = get_parent_class($classname); -            } -        } -    } - -    // }}} -    // {{{ destructor - -    /** -     * Destructor (the emulated type of...).  Does nothing right now, -     * but is included for forward compatibility, so subclass -     * destructors should always call it. -     * -     * See the note in the class desciption about output from -     * destructors. -     * -     * @access public -     * @return void -     */ -    function _PEAR() { -        if ($this->_debug) { -            printf("PEAR destructor called, class=%s\n", strtolower(get_class($this))); -        } -    } - -    // }}} -    // {{{ getStaticProperty() - -    /** -    * If you have a class that's mostly/entirely static, and you need static -    * properties, you can use this method to simulate them. Eg. in your method(s) -    * do this: $myVar = &PEAR::getStaticProperty('myclass', 'myVar'); -    * You MUST use a reference, or they will not persist! -    * -    * @access public -    * @param  string $class  The calling classname, to prevent clashes -    * @param  string $var    The variable to retrieve. -    * @return mixed   A reference to the variable. If not set it will be -    *                 auto initialised to NULL. -    */ -    function &getStaticProperty($class, $var) -    { -        static $properties; -        if (!isset($properties[$class])) { -            $properties[$class] = array(); -        } -        if (!array_key_exists($var, $properties[$class])) { -            $properties[$class][$var] = null; -        } -        return $properties[$class][$var]; -    } - -    // }}} -    // {{{ registerShutdownFunc() - -    /** -    * Use this function to register a shutdown method for static -    * classes. -    * -    * @access public -    * @param  mixed $func  The function name (or array of class/method) to call -    * @param  mixed $args  The arguments to pass to the function -    * @return void -    */ -    function registerShutdownFunc($func, $args = array()) -    { -        // if we are called statically, there is a potential -        // that no shutdown func is registered.  Bug #6445 -        if (!isset($GLOBALS['_PEAR_SHUTDOWN_REGISTERED'])) { -            register_shutdown_function("_PEAR_call_destructors"); -            $GLOBALS['_PEAR_SHUTDOWN_REGISTERED'] = true; -        } -        $GLOBALS['_PEAR_shutdown_funcs'][] = array($func, $args); -    } - -    // }}} -    // {{{ isError() - -    /** -     * Tell whether a value is a PEAR error. -     * -     * @param   mixed $data   the value to test -     * @param   int   $code   if $data is an error object, return true -     *                        only if $code is a string and -     *                        $obj->getMessage() == $code or -     *                        $code is an integer and $obj->getCode() == $code -     * @access  public -     * @return  bool    true if parameter is an error -     */ -    function isError($data, $code = null) -    { -        if (is_a($data, 'PEAR_Error')) { -            if (is_null($code)) { -                return true; -            } elseif (is_string($code)) { -                return $data->getMessage() == $code; -            } else { -                return $data->getCode() == $code; -            } -        } -        return false; -    } - -    // }}} -    // {{{ setErrorHandling() - -    /** -     * Sets how errors generated by this object should be handled. -     * Can be invoked both in objects and statically.  If called -     * statically, setErrorHandling sets the default behaviour for all -     * PEAR objects.  If called in an object, setErrorHandling sets -     * the default behaviour for that object. -     * -     * @param int $mode -     *        One of PEAR_ERROR_RETURN, PEAR_ERROR_PRINT, -     *        PEAR_ERROR_TRIGGER, PEAR_ERROR_DIE, -     *        PEAR_ERROR_CALLBACK or PEAR_ERROR_EXCEPTION. -     * -     * @param mixed $options -     *        When $mode is PEAR_ERROR_TRIGGER, this is the error level (one -     *        of E_USER_NOTICE, E_USER_WARNING or E_USER_ERROR). -     * -     *        When $mode is PEAR_ERROR_CALLBACK, this parameter is expected -     *        to be the callback function or method.  A callback -     *        function is a string with the name of the function, a -     *        callback method is an array of two elements: the element -     *        at index 0 is the object, and the element at index 1 is -     *        the name of the method to call in the object. -     * -     *        When $mode is PEAR_ERROR_PRINT or PEAR_ERROR_DIE, this is -     *        a printf format string used when printing the error -     *        message. -     * -     * @access public -     * @return void -     * @see PEAR_ERROR_RETURN -     * @see PEAR_ERROR_PRINT -     * @see PEAR_ERROR_TRIGGER -     * @see PEAR_ERROR_DIE -     * @see PEAR_ERROR_CALLBACK -     * @see PEAR_ERROR_EXCEPTION -     * -     * @since PHP 4.0.5 -     */ - -    function setErrorHandling($mode = null, $options = null) -    { -        if (isset($this) && is_a($this, 'PEAR')) { -            $setmode     = &$this->_default_error_mode; -            $setoptions  = &$this->_default_error_options; -        } else { -            $setmode     = &$GLOBALS['_PEAR_default_error_mode']; -            $setoptions  = &$GLOBALS['_PEAR_default_error_options']; -        } - -        switch ($mode) { -            case PEAR_ERROR_EXCEPTION: -            case PEAR_ERROR_RETURN: -            case PEAR_ERROR_PRINT: -            case PEAR_ERROR_TRIGGER: -            case PEAR_ERROR_DIE: -            case null: -                $setmode = $mode; -                $setoptions = $options; -                break; - -            case PEAR_ERROR_CALLBACK: -                $setmode = $mode; -                // class/object method callback -                if (is_callable($options)) { -                    $setoptions = $options; -                } else { -                    trigger_error("invalid error callback", E_USER_WARNING); -                } -                break; - -            default: -                trigger_error("invalid error mode", E_USER_WARNING); -                break; -        } -    } - -    // }}} -    // {{{ expectError() - -    /** -     * This method is used to tell which errors you expect to get. -     * Expected errors are always returned with error mode -     * PEAR_ERROR_RETURN.  Expected error codes are stored in a stack, -     * and this method pushes a new element onto it.  The list of -     * expected errors are in effect until they are popped off the -     * stack with the popExpect() method. -     * -     * Note that this method can not be called statically -     * -     * @param mixed $code a single error code or an array of error codes to expect -     * -     * @return int     the new depth of the "expected errors" stack -     * @access public -     */ -    function expectError($code = '*') -    { -        if (is_array($code)) { -            array_push($this->_expected_errors, $code); -        } else { -            array_push($this->_expected_errors, array($code)); -        } -        return sizeof($this->_expected_errors); -    } - -    // }}} -    // {{{ popExpect() - -    /** -     * This method pops one element off the expected error codes -     * stack. -     * -     * @return array   the list of error codes that were popped -     */ -    function popExpect() -    { -        return array_pop($this->_expected_errors); -    } - -    // }}} -    // {{{ _checkDelExpect() - -    /** -     * This method checks unsets an error code if available -     * -     * @param mixed error code -     * @return bool true if the error code was unset, false otherwise -     * @access private -     * @since PHP 4.3.0 -     */ -    function _checkDelExpect($error_code) -    { -        $deleted = false; - -        foreach ($this->_expected_errors AS $key => $error_array) { -            if (in_array($error_code, $error_array)) { -                unset($this->_expected_errors[$key][array_search($error_code, $error_array)]); -                $deleted = true; -            } - -            // clean up empty arrays -            if (0 == count($this->_expected_errors[$key])) { -                unset($this->_expected_errors[$key]); -            } -        } -        return $deleted; -    } - -    // }}} -    // {{{ delExpect() - -    /** -     * This method deletes all occurences of the specified element from -     * the expected error codes stack. -     * -     * @param  mixed $error_code error code that should be deleted -     * @return mixed list of error codes that were deleted or error -     * @access public -     * @since PHP 4.3.0 -     */ -    function delExpect($error_code) -    { -        $deleted = false; - -        if ((is_array($error_code) && (0 != count($error_code)))) { -            // $error_code is a non-empty array here; -            // we walk through it trying to unset all -            // values -            foreach($error_code as $key => $error) { -                if ($this->_checkDelExpect($error)) { -                    $deleted =  true; -                } else { -                    $deleted = false; -                } -            } -            return $deleted ? true : PEAR::raiseError("The expected error you submitted does not exist"); // IMPROVE ME -        } elseif (!empty($error_code)) { -            // $error_code comes alone, trying to unset it -            if ($this->_checkDelExpect($error_code)) { -                return true; -            } else { -                return PEAR::raiseError("The expected error you submitted does not exist"); // IMPROVE ME -            } -        } else { -            // $error_code is empty -            return PEAR::raiseError("The expected error you submitted is empty"); // IMPROVE ME -        } -    } - -    // }}} -    // {{{ raiseError() - -    /** -     * This method is a wrapper that returns an instance of the -     * configured error class with this object's default error -     * handling applied.  If the $mode and $options parameters are not -     * specified, the object's defaults are used. -     * -     * @param mixed $message a text error message or a PEAR error object -     * -     * @param int $code      a numeric error code (it is up to your class -     *                  to define these if you want to use codes) -     * -     * @param int $mode      One of PEAR_ERROR_RETURN, PEAR_ERROR_PRINT, -     *                  PEAR_ERROR_TRIGGER, PEAR_ERROR_DIE, -     *                  PEAR_ERROR_CALLBACK, PEAR_ERROR_EXCEPTION. -     * -     * @param mixed $options If $mode is PEAR_ERROR_TRIGGER, this parameter -     *                  specifies the PHP-internal error level (one of -     *                  E_USER_NOTICE, E_USER_WARNING or E_USER_ERROR). -     *                  If $mode is PEAR_ERROR_CALLBACK, this -     *                  parameter specifies the callback function or -     *                  method.  In other error modes this parameter -     *                  is ignored. -     * -     * @param string $userinfo If you need to pass along for example debug -     *                  information, this parameter is meant for that. -     * -     * @param string $error_class The returned error object will be -     *                  instantiated from this class, if specified. -     * -     * @param bool $skipmsg If true, raiseError will only pass error codes, -     *                  the error message parameter will be dropped. -     * -     * @access public -     * @return object   a PEAR error object -     * @see PEAR::setErrorHandling -     * @since PHP 4.0.5 -     */ -    function &raiseError($message = null, -                         $code = null, -                         $mode = null, -                         $options = null, -                         $userinfo = null, -                         $error_class = null, -                         $skipmsg = false) -    { -        // The error is yet a PEAR error object -        if (is_object($message)) { -            $code        = $message->getCode(); -            $userinfo    = $message->getUserInfo(); -            $error_class = $message->getType(); -            $message->error_message_prefix = ''; -            $message     = $message->getMessage(); -        } - -        if (isset($this) && isset($this->_expected_errors) && sizeof($this->_expected_errors) > 0 && sizeof($exp = end($this->_expected_errors))) { -            if ($exp[0] == "*" || -                (is_int(reset($exp)) && in_array($code, $exp)) || -                (is_string(reset($exp)) && in_array($message, $exp))) { -                $mode = PEAR_ERROR_RETURN; -            } -        } -        // No mode given, try global ones -        if ($mode === null) { -            // Class error handler -            if (isset($this) && isset($this->_default_error_mode)) { -                $mode    = $this->_default_error_mode; -                $options = $this->_default_error_options; -            // Global error handler -            } elseif (isset($GLOBALS['_PEAR_default_error_mode'])) { -                $mode    = $GLOBALS['_PEAR_default_error_mode']; -                $options = $GLOBALS['_PEAR_default_error_options']; -            } -        } - -        if ($error_class !== null) { -            $ec = $error_class; -        } elseif (isset($this) && isset($this->_error_class)) { -            $ec = $this->_error_class; -        } else { -            $ec = 'PEAR_Error'; -        } -        if ($skipmsg) { -            $a = &new $ec($code, $mode, $options, $userinfo); -            return $a; -        } else { -            $a = &new $ec($message, $code, $mode, $options, $userinfo); -            return $a; -        } -    } - -    // }}} -    // {{{ throwError() - -    /** -     * Simpler form of raiseError with fewer options.  In most cases -     * message, code and userinfo are enough. -     * -     * @param string $message -     * -     */ -    function &throwError($message = null, -                         $code = null, -                         $userinfo = null) -    { -        if (isset($this) && is_a($this, 'PEAR')) { -            $a = &$this->raiseError($message, $code, null, null, $userinfo); -            return $a; -        } else { -            $a = &PEAR::raiseError($message, $code, null, null, $userinfo); -            return $a; -        } -    } - -    // }}} -    function staticPushErrorHandling($mode, $options = null) -    { -        $stack = &$GLOBALS['_PEAR_error_handler_stack']; -        $def_mode    = &$GLOBALS['_PEAR_default_error_mode']; -        $def_options = &$GLOBALS['_PEAR_default_error_options']; -        $stack[] = array($def_mode, $def_options); -        switch ($mode) { -            case PEAR_ERROR_EXCEPTION: -            case PEAR_ERROR_RETURN: -            case PEAR_ERROR_PRINT: -            case PEAR_ERROR_TRIGGER: -            case PEAR_ERROR_DIE: -            case null: -                $def_mode = $mode; -                $def_options = $options; -                break; - -            case PEAR_ERROR_CALLBACK: -                $def_mode = $mode; -                // class/object method callback -                if (is_callable($options)) { -                    $def_options = $options; -                } else { -                    trigger_error("invalid error callback", E_USER_WARNING); -                } -                break; - -            default: -                trigger_error("invalid error mode", E_USER_WARNING); -                break; -        } -        $stack[] = array($mode, $options); -        return true; -    } - -    function staticPopErrorHandling() -    { -        $stack = &$GLOBALS['_PEAR_error_handler_stack']; -        $setmode     = &$GLOBALS['_PEAR_default_error_mode']; -        $setoptions  = &$GLOBALS['_PEAR_default_error_options']; -        array_pop($stack); -        list($mode, $options) = $stack[sizeof($stack) - 1]; -        array_pop($stack); -        switch ($mode) { -            case PEAR_ERROR_EXCEPTION: -            case PEAR_ERROR_RETURN: -            case PEAR_ERROR_PRINT: -            case PEAR_ERROR_TRIGGER: -            case PEAR_ERROR_DIE: -            case null: -                $setmode = $mode; -                $setoptions = $options; -                break; - -            case PEAR_ERROR_CALLBACK: -                $setmode = $mode; -                // class/object method callback -                if (is_callable($options)) { -                    $setoptions = $options; -                } else { -                    trigger_error("invalid error callback", E_USER_WARNING); -                } -                break; - -            default: -                trigger_error("invalid error mode", E_USER_WARNING); -                break; -        } -        return true; -    } - -    // {{{ pushErrorHandling() - -    /** -     * Push a new error handler on top of the error handler options stack. With this -     * you can easily override the actual error handler for some code and restore -     * it later with popErrorHandling. -     * -     * @param mixed $mode (same as setErrorHandling) -     * @param mixed $options (same as setErrorHandling) -     * -     * @return bool Always true -     * -     * @see PEAR::setErrorHandling -     */ -    function pushErrorHandling($mode, $options = null) -    { -        $stack = &$GLOBALS['_PEAR_error_handler_stack']; -        if (isset($this) && is_a($this, 'PEAR')) { -            $def_mode    = &$this->_default_error_mode; -            $def_options = &$this->_default_error_options; -        } else { -            $def_mode    = &$GLOBALS['_PEAR_default_error_mode']; -            $def_options = &$GLOBALS['_PEAR_default_error_options']; -        } -        $stack[] = array($def_mode, $def_options); - -        if (isset($this) && is_a($this, 'PEAR')) { -            $this->setErrorHandling($mode, $options); -        } else { -            PEAR::setErrorHandling($mode, $options); -        } -        $stack[] = array($mode, $options); -        return true; -    } - -    // }}} -    // {{{ popErrorHandling() - -    /** -    * Pop the last error handler used -    * -    * @return bool Always true -    * -    * @see PEAR::pushErrorHandling -    */ -    function popErrorHandling() -    { -        $stack = &$GLOBALS['_PEAR_error_handler_stack']; -        array_pop($stack); -        list($mode, $options) = $stack[sizeof($stack) - 1]; -        array_pop($stack); -        if (isset($this) && is_a($this, 'PEAR')) { -            $this->setErrorHandling($mode, $options); -        } else { -            PEAR::setErrorHandling($mode, $options); -        } -        return true; -    } - -    // }}} -    // {{{ loadExtension() - -    /** -    * OS independant PHP extension load. Remember to take care -    * on the correct extension name for case sensitive OSes. -    * -    * @param string $ext The extension name -    * @return bool Success or not on the dl() call -    */ -    function loadExtension($ext) -    { -        if (!extension_loaded($ext)) { -            // if either returns true dl() will produce a FATAL error, stop that -            if ((ini_get('enable_dl') != 1) || (ini_get('safe_mode') == 1)) { -                return false; -            } -            if (OS_WINDOWS) { -                $suffix = '.dll'; -            } elseif (PHP_OS == 'HP-UX') { -                $suffix = '.sl'; -            } elseif (PHP_OS == 'AIX') { -                $suffix = '.a'; -            } elseif (PHP_OS == 'OSX') { -                $suffix = '.bundle'; -            } else { -                $suffix = '.so'; -            } -            return @dl('php_'.$ext.$suffix) || @dl($ext.$suffix); -        } -        return true; -    } - -    // }}} -} - -// {{{ _PEAR_call_destructors() - -function _PEAR_call_destructors() -{ -    global $_PEAR_destructor_object_list; -    if (is_array($_PEAR_destructor_object_list) && -        sizeof($_PEAR_destructor_object_list)) -    { -        reset($_PEAR_destructor_object_list); -        if (PEAR::getStaticProperty('PEAR', 'destructlifo')) { -            $_PEAR_destructor_object_list = array_reverse($_PEAR_destructor_object_list); -        } -        while (list($k, $objref) = each($_PEAR_destructor_object_list)) { -            $classname = get_class($objref); -            while ($classname) { -                $destructor = "_$classname"; -                if (method_exists($objref, $destructor)) { -                    $objref->$destructor(); -                    break; -                } else { -                    $classname = get_parent_class($classname); -                } -            } -        } -        // Empty the object list to ensure that destructors are -        // not called more than once. -        $_PEAR_destructor_object_list = array(); -    } - -    // Now call the shutdown functions -    if (is_array($GLOBALS['_PEAR_shutdown_funcs']) AND !empty($GLOBALS['_PEAR_shutdown_funcs'])) { -        foreach ($GLOBALS['_PEAR_shutdown_funcs'] as $value) { -            call_user_func_array($value[0], $value[1]); -        } -    } -} - -// }}} -/** - * Standard PEAR error class for PHP 4 - * - * This class is supserseded by {@link PEAR_Exception} in PHP 5 - * - * @category   pear - * @package    PEAR - * @author     Stig Bakken <ssb@php.net> - * @author     Tomas V.V. Cox <cox@idecnet.com> - * @author     Gregory Beaver <cellog@php.net> - * @copyright  1997-2006 The PHP Group - * @license    http://www.php.net/license/3_0.txt  PHP License 3.0 - * @version    Release: 1.6.2 - * @link       http://pear.php.net/manual/en/core.pear.pear-error.php - * @see        PEAR::raiseError(), PEAR::throwError() - * @since      Class available since PHP 4.0.2 - */ -class PEAR_Error -{ -    // {{{ properties - -    var $error_message_prefix = ''; -    var $mode                 = PEAR_ERROR_RETURN; -    var $level                = E_USER_NOTICE; -    var $code                 = -1; -    var $message              = ''; -    var $userinfo             = ''; -    var $backtrace            = null; - -    // }}} -    // {{{ constructor - -    /** -     * PEAR_Error constructor -     * -     * @param string $message  message -     * -     * @param int $code     (optional) error code -     * -     * @param int $mode     (optional) error mode, one of: PEAR_ERROR_RETURN, -     * PEAR_ERROR_PRINT, PEAR_ERROR_DIE, PEAR_ERROR_TRIGGER, -     * PEAR_ERROR_CALLBACK or PEAR_ERROR_EXCEPTION -     * -     * @param mixed $options   (optional) error level, _OR_ in the case of -     * PEAR_ERROR_CALLBACK, the callback function or object/method -     * tuple. -     * -     * @param string $userinfo (optional) additional user/debug info -     * -     * @access public -     * -     */ -    function PEAR_Error($message = 'unknown error', $code = null, -                        $mode = null, $options = null, $userinfo = null) -    { -        if ($mode === null) { -            $mode = PEAR_ERROR_RETURN; -        } -        $this->message   = $message; -        $this->code      = $code; -        $this->mode      = $mode; -        $this->userinfo  = $userinfo; -        if (!PEAR::getStaticProperty('PEAR_Error', 'skiptrace')) { -            $this->backtrace = debug_backtrace(); -            if (isset($this->backtrace[0]) && isset($this->backtrace[0]['object'])) { -                unset($this->backtrace[0]['object']); -            } -        } -        if ($mode & PEAR_ERROR_CALLBACK) { -            $this->level = E_USER_NOTICE; -            $this->callback = $options; -        } else { -            if ($options === null) { -                $options = E_USER_NOTICE; -            } -            $this->level = $options; -            $this->callback = null; -        } -        if ($this->mode & PEAR_ERROR_PRINT) { -            if (is_null($options) || is_int($options)) { -                $format = "%s"; -            } else { -                $format = $options; -            } -            printf($format, $this->getMessage()); -        } -        if ($this->mode & PEAR_ERROR_TRIGGER) { -            trigger_error($this->getMessage(), $this->level); -        } -        if ($this->mode & PEAR_ERROR_DIE) { -            $msg = $this->getMessage(); -            if (is_null($options) || is_int($options)) { -                $format = "%s"; -                if (substr($msg, -1) != "\n") { -                    $msg .= "\n"; -                } -            } else { -                $format = $options; -            } -            die(sprintf($format, $msg)); -        } -        if ($this->mode & PEAR_ERROR_CALLBACK) { -            if (is_callable($this->callback)) { -                call_user_func($this->callback, $this); -            } -        } -        if ($this->mode & PEAR_ERROR_EXCEPTION) { -            trigger_error("PEAR_ERROR_EXCEPTION is obsolete, use class PEAR_Exception for exceptions", E_USER_WARNING); -            eval('$e = new Exception($this->message, $this->code);throw($e);'); -        } -    } - -    // }}} -    // {{{ getMode() - -    /** -     * Get the error mode from an error object. -     * -     * @return int error mode -     * @access public -     */ -    function getMode() { -        return $this->mode; -    } - -    // }}} -    // {{{ getCallback() - -    /** -     * Get the callback function/method from an error object. -     * -     * @return mixed callback function or object/method array -     * @access public -     */ -    function getCallback() { -        return $this->callback; -    } - -    // }}} -    // {{{ getMessage() - - -    /** -     * Get the error message from an error object. -     * -     * @return  string  full error message -     * @access public -     */ -    function getMessage() -    { -        return ($this->error_message_prefix . $this->message); -    } - - -    // }}} -    // {{{ getCode() - -    /** -     * Get error code from an error object -     * -     * @return int error code -     * @access public -     */ -     function getCode() -     { -        return $this->code; -     } - -    // }}} -    // {{{ getType() - -    /** -     * Get the name of this error/exception. -     * -     * @return string error/exception name (type) -     * @access public -     */ -    function getType() -    { -        return get_class($this); -    } - -    // }}} -    // {{{ getUserInfo() - -    /** -     * Get additional user-supplied information. -     * -     * @return string user-supplied information -     * @access public -     */ -    function getUserInfo() -    { -        return $this->userinfo; -    } - -    // }}} -    // {{{ getDebugInfo() - -    /** -     * Get additional debug information supplied by the application. -     * -     * @return string debug information -     * @access public -     */ -    function getDebugInfo() -    { -        return $this->getUserInfo(); -    } - -    // }}} -    // {{{ getBacktrace() - -    /** -     * Get the call backtrace from where the error was generated. -     * Supported with PHP 4.3.0 or newer. -     * -     * @param int $frame (optional) what frame to fetch -     * @return array Backtrace, or NULL if not available. -     * @access public -     */ -    function getBacktrace($frame = null) -    { -        if (defined('PEAR_IGNORE_BACKTRACE')) { -            return null; -        } -        if ($frame === null) { -            return $this->backtrace; -        } -        return $this->backtrace[$frame]; -    } - -    // }}} -    // {{{ addUserInfo() - -    function addUserInfo($info) -    { -        if (empty($this->userinfo)) { -            $this->userinfo = $info; -        } else { -            $this->userinfo .= " ** $info"; -        } -    } - -    // }}} -    // {{{ toString() - -    /** -     * Make a string representation of this object. -     * -     * @return string a string with an object summary -     * @access public -     */ -    function toString() { -        $modes = array(); -        $levels = array(E_USER_NOTICE  => 'notice', -                        E_USER_WARNING => 'warning', -                        E_USER_ERROR   => 'error'); -        if ($this->mode & PEAR_ERROR_CALLBACK) { -            if (is_array($this->callback)) { -                $callback = (is_object($this->callback[0]) ? -                    strtolower(get_class($this->callback[0])) : -                    $this->callback[0]) . '::' . -                    $this->callback[1]; -            } else { -                $callback = $this->callback; -            } -            return sprintf('[%s: message="%s" code=%d mode=callback '. -                           'callback=%s prefix="%s" info="%s"]', -                           strtolower(get_class($this)), $this->message, $this->code, -                           $callback, $this->error_message_prefix, -                           $this->userinfo); -        } -        if ($this->mode & PEAR_ERROR_PRINT) { -            $modes[] = 'print'; -        } -        if ($this->mode & PEAR_ERROR_TRIGGER) { -            $modes[] = 'trigger'; -        } -        if ($this->mode & PEAR_ERROR_DIE) { -            $modes[] = 'die'; -        } -        if ($this->mode & PEAR_ERROR_RETURN) { -            $modes[] = 'return'; -        } -        return sprintf('[%s: message="%s" code=%d mode=%s level=%s '. -                       'prefix="%s" info="%s"]', -                       strtolower(get_class($this)), $this->message, $this->code, -                       implode("|", $modes), $levels[$this->level], -                       $this->error_message_prefix, -                       $this->userinfo); -    } - -    // }}} -} - -/* - * Local Variables: - * mode: php - * tab-width: 4 - * c-basic-offset: 4 - * End: - */ -?> diff --git a/lib/phpFlickr/README.txt b/lib/phpFlickr/README.txt deleted file mode 100644 index df0a56d98..000000000 --- a/lib/phpFlickr/README.txt +++ /dev/null @@ -1,215 +0,0 @@ -phpFlickr Class 2.3.1 -Written by Dan Coulter (dancoulter@users.sourceforge.net) -Project Homepage: http://www.phpflickr.com/ -Google Code Project Page: http://code.google.com/p/phpflickr/ -Released under GNU Lesser General Public License (http://www.gnu.org/copyleft/lgpl.html) -For more information about the class and upcoming tools and applications using it, -visit http://www.phpflickr.com/ or http://code.google.com/p/phpflickr/ - -If you are interested in hiring me for a project (involving phpFlickr -or not), feel free to email me. - -Installation instructions: -1.  Copy the files from the installation package into a folder on your -    server.  They need to be readible by your web server.  You can put  -    them into an include folder defined in your php.ini file, if you  -    like, though it's not required.  -     -2.  All you have to do now is include the file in your PHP scripts and  -    create an instance.  For example: -    $f = new phpFlickr(); - -    The constructor has three arguments: -    A.  $api_key - This is the API key given to you by flickr.com. This  -        argument is required and you can get an API Key at: -        http://www.flickr.com/services/api/key.gne -         -    B.  $secret - The "secret" is optional because is not required to  -        make unauthenticated calls, but is absolutely required for the  -        new authentication API (see Authentication section below).  You  -        will get one assigned alongside your api key. -     -    C.  $die_on_error - This takes a boolean value and determines  -        whether the class will die (aka cease operation) if the API  -        returns an error statement.  It defaults to false.  Every method  -        will return false if the API returns an error.  You can access  -        error messages using the getErrorCode() and getErrorMsg()  -        methods. -         -3.  All of the API methods have been implemented in my class.  You can  -    see a full list and documentation here:  -        http://www.flickr.com/services/api/ -    To call a method, remove the "flickr." part of the name and replace  -    any periods with underscores. For example, instead of  -    flickr.photos.search, you would call $f->photos_search() or instead  -    of flickr.photos.licenses.getInfo, you would call  -    $f->photos_licenses_getInfo() (yes, it is case sensitive). -     -    All functions have their arguments implemented in the list order on  -    their documentation page (a link to which is included with each  -    method in the phpFlickr clasS). The only exceptions to this are  -    photos_search(), photos_getWithoutGeodata() and  -    photos_getWithoutGeodata() which have so many optional arguments -    that it's easier for everyone if you just have to pass an  -    associative array of arguments.  See the comment in the  -    photos_search() definition in phpFlickr.php for more information. -     - -     -Authentication: -    As of this release of the phpFlickr class there is only one authentication method -    available to the API.  This method is somewhat complex, but is far more secure and -    allows your users to feel a little safer authenticating to your application.  You'll -    no longer have to ask for their username and password. -     -    Authentication API - http://www.flickr.com/services/api/auth.spec.html -         -        I know how complicated this API looks at first glance, so I've tried to -        make this as transparent to the coding process.  I'll go through the steps -        you'll need to use this.  Both the auth.php and getToken.php file will -        need your API Key and Secret entered before you can use them. -         -        To have end users authenticate their accounts: -            First, setup a callback script.  I've included a callback script that  -            is pretty flexible.  You'll find it in the package entitled "auth.php".   -            You'll need to go to flickr and point your api key to this file as the  -            callback script.  Once you've done this, on any page that you want to  -            require the end user end user to authenticate their flickr account to  -            your app, just call the phpFlickr::auth() function with whatever  -            permission you need to use. -            For example: -                $f->auth("write"); -            The three permissions are "read", "write" and "delete".  The function -            defaults to "read", if you leave it blank.   -             -            Calling this function will send the user's browser to Flickr's page to  -            authenticate to your app.  Once they have logged in, it will bounce -            them back to your callback script which will redirect back to the -            original page that you called the auth() function from after setting -            a session variable to save their authentication token.  If that session -            variable exists, calling the auth() function will return the permissions -            that the user granted your app on the Flickr page instead of redirecting -            to an external page. -         -        To authenticate the app to your account to show your private pictures (for example) -            This method will allow you to have the app authenticate to one specific -            account, no matter who views your website.  This is useful to display -            private photos or photosets (among other things). -             -            *Note*: The method below is a little hard to understand, so I've setup a tool -            to help you through this: http://www.phpflickr.com/tools/auth/. -                         -            First, you'll have to setup a callback script with Flickr.  Once you've -            done that, edit line 12 of the included getToken.php file to reflect  -            which permissions you'll need for the app.  Then browse to the page. -            Once you've authorized the app with Flickr, it'll send you back to that -            page which will give you a token which will look something like this: -                1234-567890abcdef1234 -            Go to the file where you are creating an instance of phpFlickr (I suggest -            an include file) and after you've created it set the token to use: -                $f->setToken("<token string>"); -            This token never expires, so you don't have to worry about having to -            login periodically. -             - -Using Caching: -    Caching can be very important to a project.  Just a few calls to the Flickr API -    can take long enough to bore your average web user (depending on the calls you -    are making).  I've built in caching that will access either a database or files -    in your filesystem.  To enable caching, use the phpFlickr::enableCache() function. -    This function requires at least two arguments. The first will be the type of -    cache you're using (either "db" or "fs") -     -    1.  If you're using database caching, you'll need to supply a PEAR::DB connection -        string. For example:  -        $flickr->enableCache("db", "mysql://user:password@server/database"); -        The third (optional) argument is expiration of the cache in seconds (defaults  -        to 600).  The fourth (optional) argument is the table where you want to store -        the cache.  This defaults to flickr_cache and will attempt to create the table -        if it does not already exist. -     -    2.  If you're using filesystem caching, you'll need to supply a folder where the -        web server has write access. For example:  -        $flickr->enableCache("fs", "/var/www/phpFlickrCache"); -        The third (optional) argument is, the same as in the Database caching, an -        expiration in seconds for the cache. -        Note: filesystem caching will probably be slower than database caching. I -        haven't done any tests of this, but if you get large amounts of calls, the -        process of cleaning out old calls may get hard on your server. -         -        You may not want to allow the world to view the files that are created during -        caching.  If you want to hide this information, either make sure that your -        permissions are set correctly, or disable the webserver from displaying  -        *.cache files.  In Apache, you can specify this in the configuration files -        or in a .htaccess file with the following directives: -         -        <FilesMatch "\.cache$"> -            Deny from all -        </FilesMatch> -         -        Alternatively, you can specify a directory that is outside of the web server's -        document root. -         -Uploading -    Uploading is pretty simple. Aside from being authenticated (see Authentication  -    section) the very minimum that you'll have to pass is a path to an image file on  -    your php server. You can do either synchronous or asynchronous uploading as follows: -        synchronous:    sync_upload("photo.jpg"); -        asynchronous:   async_upload("photo.jpg"); -     -    The basic difference is that synchronous uploading waits around until Flickr -    processes the photo and returns a PhotoID.  Asynchronous just uploads the -    picture and gets a "ticketid" that you can use to check on the status of your  -    upload. Asynchronous is much faster, though the photoid won't be instantly -    available for you. You can read more about asynchronous uploading here: -        http://www.flickr.com/services/api/upload.async.html -         -    Both of the functions take the same arguments which are: -        Photo: The path of the file to upload. -        Title: The title of the photo. -        Description: A description of the photo. May contain some limited HTML. -        Tags: A space-separated list of tags to apply to the photo. -        is_public: Set to 0 for no, 1 for yes. -        is_friend: Set to 0 for no, 1 for yes. -        is_family: Set to 0 for no, 1 for yes. -         -Replacing Photos -    Flickr has released API support for uploading a replacement photo.  To use this -    new method, just use the "replace" function in phpFlickr.  You'll be required -    to pass the file name and Flickr's photo ID.  You need to authenticate your script -    with "write" permissions before you can replace a photo.  The arguments are: -        Photo: The path of the file to upload. -        Photo ID: The numeric Flickr ID of the photo you want to replace. -        Async (optional): Set to 0 for a synchronous call, 1 for asynchronous. -    If you use the asynchronous call, it will return a ticketid instead -    of photoid. - -Other Notes: -    1.  Many of the methods have optional arguments.  For these, I have implemented  -        them in the same order that the Flickr API documentation lists them. PHP -        allows for optional arguments in function calls, but if you want to use the -        third optional argument, you have to fill in the others to the left first. -        You can use the "NULL" value (without quotes) in the place of an actual -        argument.  For example: -        $f->groups_pools_getPhotos($group_id, NULL, NULL, 10); -        This will get the first ten photos from a specific group's pool.  If you look -        at the documentation, you will see that there is another argument, "page". I've -        left it off because it appears after "per_page". -    2.  Some people will need to ues phpFlickr from behind a proxy server.  I've -        implemented a method that will allow you to use an HTTP proxy for all of your -        traffic.  Let's say that you have a proxy server on your local server running -        at port 8181.  This is the code you would use: -            $f = new phpFlickr("[api key]"); -            $f->setProxy("localhost", "8181"); -        After that, all of your calls will be automatically made through your proxy server. -             - -That's it! Enjoy the class.  Check out the project page (listed above) for updates -and news.  I plan to implement file uploads and functions to aggregate data from -several different methods for easier use in a web application.  Thanks for your -interest in this project! - -    Please email me if you have any questions or problems. You'll find my email -	at the top of this file. - -  diff --git a/lib/phpFlickr/auth.php b/lib/phpFlickr/auth.php deleted file mode 100644 index d272d49bf..000000000 --- a/lib/phpFlickr/auth.php +++ /dev/null @@ -1,37 +0,0 @@ -<?php -    /* Last updated with phpFlickr 1.3.1 -     * -     * Edit these variables to reflect the values you need. $default_redirect  -     * and $permissions are only important if you are linking here instead of -     * using phpFlickr::auth() from another page or if you set the remember_uri -     * argument to false. -     */ -    $api_key                 = "26b2abba37182aca62fe0eb2c7782050"; -    $api_secret              = "475e45cc580334da"; -    $default_redirect        = "/"; -    $permissions             = "read"; -    $path_to_phpFlickr_class = "./"; - -    ob_start(); -    require_once($path_to_phpFlickr_class . "phpFlickr.php"); -    unset($_SESSION['phpFlickr_auth_token']); -      -	if (!empty($_GET['extra'])) { -		$redirect = $_GET['extra']; -	} -     -    $f = new phpFlickr($api_key, $api_secret); -  -    if (empty($_GET['frob'])) { -        $f->auth($permissions, false); -    } else { -        $f->auth_getToken($_GET['frob']); -	} -     -    if (empty($redirect)) { -		header("Location: " . $default_redirect); -    } else { -		header("Location: " . $redirect); -    } -  -?>
\ No newline at end of file diff --git a/lib/phpFlickr/example.php b/lib/phpFlickr/example.php deleted file mode 100644 index 8b409b425..000000000 --- a/lib/phpFlickr/example.php +++ /dev/null @@ -1,30 +0,0 @@ -<?php -/* Last updated with phpFlickr 1.3.2 - * - * This example file shows you how to call the 100 most recent public - * photos.  It parses through them and prints out a link to each of them - * along with the owner's name. - * - * Most of the processing time in this file comes from the 100 calls to - * flickr.people.getInfo.  Enabling caching will help a whole lot with - * this as there are many people who post multiple photos at once. - * - * Obviously, you'll want to replace the "<api key>" with one provided  - * by Flickr: http://www.flickr.com/services/api/key.gne - */ - -require_once("phpFlickr.php"); -$f = new phpFlickr("<api key>"); - -$recent = $f->photos_getRecent(); - -foreach ($recent['photo'] as $photo) { -    $owner = $f->people_getInfo($photo['owner']); -    echo "<a href='http://www.flickr.com/photos/" . $photo['owner'] . "/" . $photo['id'] . "/'>"; -    echo $photo['title']; -    echo "</a> Owner: "; -    echo "<a href='http://www.flickr.com/people/" . $photo['owner'] . "/'>"; -    echo $owner['username']; -    echo "</a><br>"; -} -?> diff --git a/lib/phpFlickr/getToken.php b/lib/phpFlickr/getToken.php deleted file mode 100644 index 55180ea29..000000000 --- a/lib/phpFlickr/getToken.php +++ /dev/null @@ -1,19 +0,0 @@ -<?php -    /* Last updated with phpFlickr 1.4 -     * -     * If you need your app to always login with the same user (to see your private -     * photos or photosets, for example), you can use this file to login and get a -     * token assigned so that you can hard code the token to be used.  To use this -     * use the phpFlickr::setToken() function whenever you create an instance of  -     * the class. -     */ - -    require_once("phpFlickr.php"); -    $f = new phpFlickr("26b2abba37182aca62fe0eb2c7782050", "475e45cc580334da"); -     -    //change this to the permissions you will need -    $f->auth("read"); -     -    echo "Copy this token into your code: " . $_SESSION['phpFlickr_auth_token']; -     -?>
\ No newline at end of file diff --git a/lib/phpFlickr/phpFlickr.php b/lib/phpFlickr/phpFlickr.php deleted file mode 100644 index 8ef65c581..000000000 --- a/lib/phpFlickr/phpFlickr.php +++ /dev/null @@ -1,1453 +0,0 @@ -<?php -/* phpFlickr Class 2.3.1 - * Written by Dan Coulter (dan@dancoulter.com) - * Project Home Page: http://phpflickr.com/ - * Released under GNU Lesser General Public License (http://www.gnu.org/copyleft/lgpl.html) - * For more information about the class and upcoming tools and toys using it, - * visit http://www.phpflickr.com/ - * - *	 For installation instructions, open the README.txt file packaged with this - *	 class. If you don't have a copy, you can see it at: - *	 http://www.phpflickr.com/README.txt - * - *	 Please submit all problems or questions to the Help Forum on my Google Code project page: - *		 http://code.google.com/p/phpflickr/issues/list - * - */  -if (session_id() == "") { -	@session_start(); -} - -// Decides which include path delimiter to use.  Windows should be using a semi-colon -// and everything else should be using a colon.  If this isn't working on your system, -// comment out this if statement and manually set the correct value into $path_delimiter. -if (strpos(__FILE__, ':') !== false) { -	$path_delimiter = ';'; -} else { -	$path_delimiter = ':'; -} - -// This will add the packaged PEAR files into the include path for PHP, allowing you -// to use them transparently.  This will prefer officially installed PEAR files if you -// have them.  If you want to prefer the packaged files (there shouldn't be any reason -// to), swap the two elements around the $path_delimiter variable.  If you don't have -// the PEAR packages installed, you can leave this like it is and move on. - -ini_set('include_path', ini_get('include_path') . $path_delimiter . dirname(__FILE__) . '/PEAR'); - -// If you have problems including the default PEAR install (like if your open_basedir -// setting doesn't allow you to include files outside of your web root), comment out -// the line above and uncomment the next line: - -// ini_set('include_path', dirname(__FILE__) . '/PEAR' . $path_delimiter . ini_get('include_path')); - -class phpFlickr { -	var $api_key; -	var $secret; -	var $REST = 'http://api.flickr.com/services/rest/'; -	var $Upload = 'http://api.flickr.com/services/upload/'; -	var $Replace = 'http://api.flickr.com/services/replace/'; -	var $req; -	var $response; -	var $parsed_response; -	var $cache = false; -	var $cache_db = null; -	var $cache_table = null; -	var $cache_dir = null; -	var $cache_expire = null; -	var $die_on_error; -	var $error_code; -	Var $error_msg; -	var $token; -	var $php_version; - -	/* -	 * When your database cache table hits this many rows, a cleanup -	 * will occur to get rid of all of the old rows and cleanup the -	 * garbage in the table.  For most personal apps, 1000 rows should -	 * be more than enough.  If your site gets hit by a lot of traffic -	 * or you have a lot of disk space to spare, bump this number up. -	 * You should try to set it high enough that the cleanup only -	 * happens every once in a while, so this will depend on the growth -	 * of your table. -	 */ -	var $max_cache_rows = 1000; - -	function phpFlickr ($api_key, $secret = NULL, $die_on_error = false) { -		//The API Key must be set before any calls can be made.  You can -		//get your own at http://www.flickr.com/services/api/misc.api_keys.html -		$this->api_key = $api_key; -		$this->secret = $secret; -		$this->die_on_error = $die_on_error; -		$this->service = "flickr"; - -		//Find the PHP version and store it for future reference -		$this->php_version = explode("-", phpversion()); -		$this->php_version = explode(".", $this->php_version[0]); - -		//All calls to the API are done via the POST method using the PEAR::HTTP_Request package. -		require_once 'HTTP/Request.php'; -		$this->req =& new HTTP_Request(); -		$this->req->setMethod(HTTP_REQUEST_METHOD_POST); -	} - -	function enableCache ($type, $connection, $cache_expire = 600, $table = 'flickr_cache') { -		// Turns on caching.  $type must be either "db" (for database caching) or "fs" (for filesystem). -		// When using db, $connection must be a PEAR::DB connection string. Example: -		//	  "mysql://user:password@server/database" -		// If the $table, doesn't exist, it will attempt to create it. -		// When using file system, caching, the $connection is the folder that the web server has write -		// access to. Use absolute paths for best results.  Relative paths may have unexpected behavior -		// when you include this.  They'll usually work, you'll just want to test them. -		if ($type == 'db') { -			require_once 'DB.php'; -			$db =& DB::connect($connection); -			if (PEAR::isError($db)) { -				die($db->getMessage()); -			} - -			/* -			 * If high performance is crucial, you can easily comment -			 * out this query once you've created your database table. -			 */ - -			$db->query(" -				CREATE TABLE IF NOT EXISTS `$table` ( -					`request` CHAR( 35 ) NOT NULL , -					`response` MEDIUMTEXT NOT NULL , -					`expiration` DATETIME NOT NULL , -					INDEX ( `request` ) -				) TYPE = MYISAM"); - -			if ($db->getOne("SELECT COUNT(*) FROM $table") > $this->max_cache_rows) { -				$db->query("DELETE FROM $table WHERE expiration < DATE_SUB(NOW(), INTERVAL $cache_expire second)"); -				$db->query('OPTIMIZE TABLE ' . $this->cache_table); -			} - -			$this->cache = 'db'; -			$this->cache_db = $db; -			$this->cache_table = $table; -		} elseif ($type == 'fs') { -			$this->cache = 'fs'; -			$connection = realpath($connection); -			$this->cache_dir = $connection; -			if ($dir = opendir($this->cache_dir)) { -				while ($file = readdir($dir)) { -					if (substr($file, -6) == '.cache' && ((filemtime($this->cache_dir . '/' . $file) + $cache_expire) < time()) ) { -						unlink($this->cache_dir . '/' . $file); -					} -				} -			} -		} -		$this->cache_expire = $cache_expire; -	} - -	function getCached ($request) { -		//Checks the database or filesystem for a cached result to the request. -		//If there is no cache result, it returns a value of false. If it finds one, -		//it returns the unparsed XML. -		$reqhash = md5(serialize($request)); -		if ($this->cache == 'db') { -			$result = $this->cache_db->getOne("SELECT response FROM " . $this->cache_table . " WHERE request = ? AND DATE_SUB(NOW(), INTERVAL " . (int) $this->cache_expire . " SECOND) < expiration", $reqhash); -			if (!empty($result)) { -				return $result; -			} -		} elseif ($this->cache == 'fs') { -			$file = $this->cache_dir . '/' . $reqhash . '.cache'; -			if (file_exists($file)) { -				if ($this->php_version[0] > 4 || ($this->php_version[0] == 4 && $this->php_version[1] >= 3)) { -					return file_get_contents($file); -				} else { -					return implode('', file($file)); -				} -			} -		} -		return false; -	} - -	function cache ($request, $response) { -		//Caches the unparsed XML of a request. -		$reqhash = md5(serialize($request)); -		if ($this->cache == 'db') { -			//$this->cache_db->query("DELETE FROM $this->cache_table WHERE request = '$reqhash'"); -			if ($this->cache_db->getOne("SELECT COUNT(*) FROM {$this->cache_table} WHERE request = '$reqhash'")) { -				$sql = "UPDATE " . $this->cache_table . " SET response = ?, expiration = ? WHERE request = ?"; -				$this->cache_db->query($sql, array($response, strftime("%Y-%m-%d %H:%M:%S"), $reqhash)); -			} else { -				$sql = "INSERT INTO " . $this->cache_table . " (request, response, expiration) VALUES ('$reqhash', '" . str_replace("'", "''", $response) . "', '" . strftime("%Y-%m-%d %H:%M:%S") . "')"; -				$this->cache_db->query($sql); -			} -		} elseif ($this->cache == "fs") { -			$file = $this->cache_dir . "/" . $reqhash . ".cache"; -			$fstream = fopen($file, "w"); -			$result = fwrite($fstream,$response); -			fclose($fstream); -			return $result; -		} -		return false; -	} - -	function request ($command, $args = array(), $nocache = false) { -		//Sends a request to Flickr's REST endpoint via POST. -		$this->req->setURL($this->REST); -		$this->req->clearPostData(); -		if (substr($command,0,7) != "flickr.") { -			$command = "flickr." . $command; -		} - -		//Process arguments, including method and login data. -		$args = array_merge(array("method" => $command, "format" => "php_serial", "api_key" => $this->api_key), $args); -		if (!empty($this->token)) { -			$args = array_merge($args, array("auth_token" => $this->token)); -		} elseif (!empty($_SESSION['phpFlickr_auth_token'])) { -			$args = array_merge($args, array("auth_token" => $_SESSION['phpFlickr_auth_token'])); -		} -		ksort($args); -		$auth_sig = ""; -		if (!($this->response = $this->getCached($args)) || $nocache) { -			foreach ($args as $key => $data) { -				$auth_sig .= $key . $data; -				$this->req->addPostData($key, $data); -			} -			if (!empty($this->secret)) { -				$api_sig = md5($this->secret . $auth_sig); -				$this->req->addPostData("api_sig", $api_sig); -			} - -			$this->req->addHeader("Connection", "Keep-Alive"); -			 -			//Send Requests -			if ($this->req->sendRequest()) { -				$this->response = $this->req->getResponseBody(); -				$this->cache($args, $this->response); -			} else { -				die("There has been a problem sending your command to the server."); -			} -		} -		/* -		 * Uncomment this line (and comment out the next one) if you're doing large queries -		 * and you're concerned about time.  This will, however, change the structure of -		 * the result, so be sure that you look at the results. -		 */ -		//$this->parsed_response = unserialize($this->response); -		$this->parsed_response = $this->clean_text_nodes(unserialize($this->response)); -		if ($this->parsed_response['stat'] == 'fail') { -			if ($this->die_on_error) die("The Flickr API returned the following error: #{$this->parsed_response['code']} - {$this->parsed_response['message']}"); -			else { -				$this->error_code = $this->parsed_response['code']; -				$this->error_msg = $this->parsed_response['message']; -				$this->parsed_response = false; -			} -		} else { -			$this->error_code = false; -			$this->error_msg = false; -		} -		return $this->response; -	} - -	function clean_text_nodes ($arr) { -		if (!is_array($arr)) { -			return $arr; -		} elseif (count($arr) == 0) { -			return $arr; -		} elseif (count($arr) == 1 && array_key_exists('_content', $arr)) { -			return $arr['_content']; -		} else { -			foreach ($arr as $key => $element) { -				$arr[$key] = $this->clean_text_nodes($element); -			} -			return($arr); -		} -	} - -	function setToken ($token) { -		// Sets an authentication token to use instead of the session variable -		$this->token = $token; -	} - -	function setProxy ($server, $port) { -		// Sets the proxy for all phpFlickr calls. -		$this->req->setProxy($server, $port); -	} - -	function getErrorCode () { -		// Returns the error code of the last call.  If the last call did not -		// return an error. This will return a false boolean. -		return $this->error_code; -	} - -	function getErrorMsg () { -		// Returns the error message of the last call.  If the last call did not -		// return an error. This will return a false boolean. -		return $this->error_msg; -	} - -	/* These functions are front ends for the flickr calls */ - -	function buildPhotoURL ($photo, $size = "Medium") { -		//receives an array (can use the individual photo data returned -		//from an API call) and returns a URL (doesn't mean that the -		//file size exists) -		$sizes = array( -			"square" => "_s", -			"thumbnail" => "_t", -			"small" => "_m", -			"medium" => "", -			"large" => "_b", -			"original" => "_o" -		); -		 -		$size = strtolower($size); -		if (!array_key_exists($size, $sizes)) { -			$size = "medium"; -		} -		 -		if ($size == "original") { -			$url = "http://farm" . $photo['farm'] . ".static.flickr.com/" . $photo['server'] . "/" . $photo['id'] . "_" . $photo['originalsecret'] . "_o" . "." . $photo['originalformat']; -		} else { -			$url = "http://farm" . $photo['farm'] . ".static.flickr.com/" . $photo['server'] . "/" . $photo['id'] . "_" . $photo['secret'] . $sizes[$size] . ".jpg"; -		} -		return $url; -	} - -	function getFriendlyGeodata ($lat, $lon) { -		/* I've added this method to get the friendly geodata (i.e. 'in New York, NY') that the -		 * website provides, but isn't available in the API. I'm providing this service as long -		 * as it doesn't flood my server with requests and crash it all the time. -		 */ -		return unserialize(file_get_contents('http://phpflickr.com/geodata/?format=php&lat=' . $lat . '&lon=' . $lon)); -	} - -	function sync_upload ($photo, $title = null, $description = null, $tags = null, $is_public = null, $is_friend = null, $is_family = null) { -		$upload_req =& new HTTP_Request(); -		$upload_req->setMethod(HTTP_REQUEST_METHOD_POST); - - -		$upload_req->setURL($this->Upload); -		$upload_req->clearPostData(); - -		//Process arguments, including method and login data. -		$args = array("api_key" => $this->api_key, "title" => $title, "description" => $description, "tags" => $tags, "is_public" => $is_public, "is_friend" => $is_friend, "is_family" => $is_family); -		if (!empty($this->email)) { -			$args = array_merge($args, array("email" => $this->email)); -		} -		if (!empty($this->password)) { -			$args = array_merge($args, array("password" => $this->password)); -		} -		if (!empty($this->token)) { -			$args = array_merge($args, array("auth_token" => $this->token)); -		} elseif (!empty($_SESSION['phpFlickr_auth_token'])) { -			$args = array_merge($args, array("auth_token" => $_SESSION['phpFlickr_auth_token'])); -		} - -		ksort($args); -		$auth_sig = ""; -		foreach ($args as $key => $data) { -			if ($data !== null) { -				$auth_sig .= $key . $data; -				$upload_req->addPostData($key, $data); -			} -		} -		if (!empty($this->secret)) { -			$api_sig = md5($this->secret . $auth_sig); -			$upload_req->addPostData("api_sig", $api_sig); -		} - -		$photo = realpath($photo); - -		$result = $upload_req->addFile("photo", $photo); - -		if (PEAR::isError($result)) { -			die($result->getMessage()); -		} - -		//Send Requests -		if ($upload_req->sendRequest()) { -			$this->response = $upload_req->getResponseBody(); -		} else { -			die("There has been a problem sending your command to the server."); -		} - -		$rsp = explode("\n", $this->response); -		foreach ($rsp as $line) { -			if (ereg('<err code="([0-9]+)" msg="(.*)"', $line, $match)) { -				if ($this->die_on_error) -					die("The Flickr API returned the following error: #{$match[1]} - {$match[2]}"); -				else { -					$this->error_code = $match[1]; -					$this->error_msg = $match[2]; -					$this->parsed_response = false; -					return false; -				} -			} elseif (ereg("<photoid>(.*)</photoid>", $line, $match)) { -				$this->error_code = false; -				$this->error_msg = false; -				return $match[1]; -			} -		} -	} - -	function async_upload ($photo, $title = null, $description = null, $tags = null, $is_public = null, $is_friend = null, $is_family = null) { -		$upload_req =& new HTTP_Request(); -		$upload_req->setMethod(HTTP_REQUEST_METHOD_POST); - -		$upload_req->setURL($this->Upload); -		$upload_req->clearPostData(); - -		//Process arguments, including method and login data. -		$args = array("async" => 1, "api_key" => $this->api_key, "title" => $title, "description" => $description, "tags" => $tags, "is_public" => $is_public, "is_friend" => $is_friend, "is_family" => $is_family); -		if (!empty($this->email)) { -			$args = array_merge($args, array("email" => $this->email)); -		} -		if (!empty($this->password)) { -			$args = array_merge($args, array("password" => $this->password)); -		} -		if (!empty($this->token)) { -			$args = array_merge($args, array("auth_token" => $this->token)); -		} elseif (!empty($_SESSION['phpFlickr_auth_token'])) { -			$args = array_merge($args, array("auth_token" => $_SESSION['phpFlickr_auth_token'])); -		} - -		ksort($args); -		$auth_sig = ""; -		foreach ($args as $key => $data) { -			if ($data !== null) { -				$auth_sig .= $key . $data; -				$upload_req->addPostData($key, $data); -			} -		} -		if (!empty($this->secret)) { -			$api_sig = md5($this->secret . $auth_sig); -			$upload_req->addPostData("api_sig", $api_sig); -		} - -		$photo = realpath($photo); - -		$result = $upload_req->addFile("photo", $photo); - -		if (PEAR::isError($result)) { -			die($result->getMessage()); -		} - -		//Send Requests -		if ($upload_req->sendRequest()) { -			$this->response = $upload_req->getResponseBody(); -		} else { -			die("There has been a problem sending your command to the server."); -		} - -		$rsp = explode("\n", $this->response); -		foreach ($rsp as $line) { -			if (ereg('<err code="([0-9]+)" msg="(.*)"', $line, $match)) { -				if ($this->die_on_error) -					die("The Flickr API returned the following error: #{$match[1]} - {$match[2]}"); -				else { -					$this->error_code = $match[1]; -					$this->error_msg = $match[2]; -					$this->parsed_response = false; -					return false; -				} -			} elseif (ereg("<ticketid>(.*)</", $line, $match)) { -				$this->error_code = false; -				$this->error_msg = false; -				return $match[1]; -			} -		} -	} - -	// Interface for new replace API method. -	function replace ($photo, $photo_id, $async = null) { -		$upload_req =& new HTTP_Request(); -		$upload_req->setMethod(HTTP_REQUEST_METHOD_POST); - -		$upload_req->setURL($this->Replace); -		$upload_req->clearPostData(); - -		//Process arguments, including method and login data. -		$args = array("api_key" => $this->api_key, "photo_id" => $photo_id, "async" => $async); -		if (!empty($this->email)) { -			$args = array_merge($args, array("email" => $this->email)); -		} -		if (!empty($this->password)) { -			$args = array_merge($args, array("password" => $this->password)); -		} -		if (!empty($this->token)) { -			$args = array_merge($args, array("auth_token" => $this->token)); -		} elseif (!empty($_SESSION['phpFlickr_auth_token'])) { -			$args = array_merge($args, array("auth_token" => $_SESSION['phpFlickr_auth_token'])); -		} - -		ksort($args); -		$auth_sig = ""; -		foreach ($args as $key => $data) { -			if ($data !== null) { -				$auth_sig .= $key . $data; -				$upload_req->addPostData($key, $data); -			} -		} -		if (!empty($this->secret)) { -			$api_sig = md5($this->secret . $auth_sig); -			$upload_req->addPostData("api_sig", $api_sig); -		} - -		$photo = realpath($photo); - -		$result = $upload_req->addFile("photo", $photo); - -		if (PEAR::isError($result)) { -			die($result->getMessage()); -		} - -		//Send Requests -		if ($upload_req->sendRequest()) { -			$this->response = $upload_req->getResponseBody(); -		} else { -			die("There has been a problem sending your command to the server."); -		} -		if ($async == 1) -			$find = 'ticketid'; -		 else -			$find = 'photoid'; - -		$rsp = explode("\n", $this->response); -		foreach ($rsp as $line) { -			if (ereg('<err code="([0-9]+)" msg="(.*)"', $line, $match)) { -				if ($this->die_on_error) -					die("The Flickr API returned the following error: #{$match[1]} - {$match[2]}"); -				else { -					$this->error_code = $match[1]; -					$this->error_msg = $match[2]; -					$this->parsed_response = false; -					return false; -				} -			} elseif (ereg("<" . $find . ">(.*)</", $line, $match)) { -				$this->error_code = false; -				$this->error_msg = false; -				return $match[1]; -			} -		} -	} - -	function auth ($perms = "read", $remember_uri = true) { -		// Redirects to Flickr's authentication piece if there is no valid token. -		// If remember_uri is set to false, the callback script (included) will -		// redirect to its default page. - -		if (empty($_SESSION['phpFlickr_auth_token']) && empty($this->token)) { -			if ($remember_uri) { -				$redirect = $_SERVER['REQUEST_URI']; -			} -			$api_sig = md5($this->secret . "api_key" . $this->api_key . "extra" . $redirect . "perms" . $perms); -			if ($this->service == "23") { -				header("Location: http://www.23hq.com/services/auth/?api_key=" . $this->api_key . "&extra=" . $redirect . "&perms=" . $perms . "&api_sig=". $api_sig); -			} else { -				header("Location: http://www.flickr.com/services/auth/?api_key=" . $this->api_key . "&extra=" . $redirect . "&perms=" . $perms . "&api_sig=". $api_sig); -			} -			exit; -		} else { -			$tmp = $this->die_on_error; -			$this->die_on_error = false; -			$rsp = $this->auth_checkToken(); -			if ($this->error_code !== false) { -				unset($_SESSION['phpFlickr_auth_token']); -				$this->auth($perms, $remember_uri); -			} -			$this->die_on_error = $tmp; -			return $rsp['perms']; -		} -	} - -	/******************************* - -	To use the phpFlickr::call method, pass a string containing the API method you want -	to use and an associative array of arguments.  For example: -		$result = $f->call("flickr.photos.comments.getList", array("photo_id"=>'34952612')); -	This method will allow you to make calls to arbitrary methods that haven't been -	implemented in phpFlickr yet. - -	*******************************/ - -	function call ($method, $arguments) { -		foreach ( $arguments as $key => $value ) { -			if ( is_null($value) ) unset($arguments[$key]); -		} -		$this->request($method, $arguments); -		return $this->parsed_response ? $this->parsed_response : false; -	} - -	/* -		These functions are the direct implementations of flickr calls. -		For method documentation, including arguments, visit the address -		included in a comment in the function. -	*/ - -	/* Activity methods */ -	function activity_userComments ($per_page = NULL, $page = NULL) { -		/* http://www.flickr.com/services/api/flickr.activity.userComments.html */ -		$this->request('flickr.activity.userComments', array("per_page" => $per_page, "page" => $page)); -		return $this->parsed_response ? $this->parsed_response['items']['item'] : false; -	} - -	function activity_userPhotos ($timeframe = NULL, $per_page = NULL, $page = NULL) { -		/* http://www.flickr.com/services/api/flickr.activity.userPhotos.html */ -		$this->request('flickr.activity.userPhotos', array("timeframe" => $timeframe, "per_page" => $per_page, "page" => $page)); -		return $this->parsed_response ? $this->parsed_response['items']['item'] : false; -	} - -	/* Authentication methods */ -	function auth_checkToken () { -		/* http://www.flickr.com/services/api/flickr.auth.checkToken.html */ -		$this->request('flickr.auth.checkToken'); -		return $this->parsed_response ? $this->parsed_response['auth'] : false; -	} - -	function auth_getFrob () { -		/* http://www.flickr.com/services/api/flickr.auth.getFrob.html */ -		$this->request('flickr.auth.getFrob'); -		return $this->parsed_response ? $this->parsed_response['frob'] : false; -	} - -	function auth_getFullToken ($mini_token) { -		/* http://www.flickr.com/services/api/flickr.auth.getFullToken.html */ -		$this->request('flickr.auth.getFullToken', array('mini_token'=>$mini_token)); -		return $this->parsed_response ? $this->parsed_response['auth'] : false; -	} - -	function auth_getToken ($frob) { -		/* http://www.flickr.com/services/api/flickr.auth.getToken.html */ -		$this->request('flickr.auth.getToken', array('frob'=>$frob)); -		session_register('phpFlickr_auth_token'); -		$_SESSION['phpFlickr_auth_token'] = $this->parsed_response['auth']['token']; -		return $this->parsed_response ? $this->parsed_response['auth'] : false; -	} - -	/* Blogs methods */ -	function blogs_getList ($service = NULL) { -		/* http://www.flickr.com/services/api/flickr.blogs.getList.html */ -		$rsp = $this->call('flickr.blogs.getList', array('service' => $service)); -		return $rsp['blogs']['blog']; -	} -	 -	function blogs_getServices () { -		/* http://www.flickr.com/services/api/flickr.blogs.getServices.html */ -		return $this->call('flickr.blogs.getServices', array()); -	} - -	function blogs_postPhoto ($blog_id = NULL, $photo_id, $title, $description, $blog_password = NULL, $service = NULL) { -		/* http://www.flickr.com/services/api/flickr.blogs.postPhoto.html */ -		return $this->call('flickr.blogs.postPhoto', array('blog_id' => $blog_id, 'photo_id' => $photo_id, 'title' => $title, 'description' => $description, 'blog_password' => $blog_password, 'service' => $service)); -	} - -	/* Collections Methods */ -	function collections_getInfo ($collection_id) { -		/* http://www.flickr.com/services/api/flickr.collections.getInfo.html */ -		return $this->call('flickr.collections.getInfo', array('collection_id' => $collection_id)); -	} - -	function collections_getTree ($collection_id = NULL, $user_id = NULL) { -		/* http://www.flickr.com/services/api/flickr.collections.getTree.html */ -		return $this->call('flickr.collections.getTree', array('collection_id' => $collection_id, 'user_id' => $user_id)); -	} -	 -	/* Commons Methods */ -	function commons_getInstitutions () { -		/* http://www.flickr.com/services/api/flickr.commons.getInstitutions.html */ -		return $this->call('flickr.commons.getInstitutions', array()); -	} -	 -	/* Contacts Methods */ -	function contacts_getList ($filter = NULL, $page = NULL, $per_page = NULL) { -		/* http://www.flickr.com/services/api/flickr.contacts.getList.html */ -		$this->request('flickr.contacts.getList', array('filter'=>$filter, 'page'=>$page, 'per_page'=>$per_page)); -		return $this->parsed_response ? $this->parsed_response['contacts'] : false; -	} - -	function contacts_getPublicList ($user_id, $page = NULL, $per_page = NULL) { -		/* http://www.flickr.com/services/api/flickr.contacts.getPublicList.html */ -		$this->request('flickr.contacts.getPublicList', array('user_id'=>$user_id, 'page'=>$page, 'per_page'=>$per_page)); -		return $this->parsed_response ? $this->parsed_response['contacts'] : false; -	} -	 -	function contacts_getListRecentlyUploaded ($date_lastupload = NULL, $filter = NULL) { -		/* http://www.flickr.com/services/api/flickr.contacts.getListRecentlyUploaded.html */ -		return $this->call('flickr.contacts.getListRecentlyUploaded', array('date_lastupload' => $date_lastupload, 'filter' => $filter)); -	} - -	/* Favorites Methods */ -	function favorites_add ($photo_id) { -		/* http://www.flickr.com/services/api/flickr.favorites.add.html */ -		$this->request('flickr.favorites.add', array('photo_id'=>$photo_id), TRUE); -		return $this->parsed_response ? true : false; -	} - -	function favorites_getList ($user_id = NULL, $min_fave_date = NULL, $max_fave_date = NULL, $extras = NULL, $per_page = NULL, $page = NULL) { -		/* http://www.flickr.com/services/api/flickr.favorites.getList.html */ -		return $this->call('flickr.favorites.getList', array('user_id' => $user_id, 'min_fave_date' => $min_fave_date, 'max_fave_date' => $max_fave_date, 'extras' => $extras, 'per_page' => $per_page, 'page' => $page)); -	} - -	function favorites_getPublicList ($user_id, $min_fave_date = NULL, $max_fave_date = NULL, $extras = NULL, $per_page = NULL, $page = NULL) { -		/* http://www.flickr.com/services/api/flickr.favorites.getPublicList.html */ -		return $this->call('flickr.favorites.getPublicList', array('user_id' => $user_id, 'min_fave_date' => $min_fave_date, 'max_fave_date' => $max_fave_date, 'extras' => $extras, 'per_page' => $per_page, 'page' => $page)); -	} - -	function favorites_remove ($photo_id) { -		/* http://www.flickr.com/services/api/flickr.favorites.remove.html */ -		$this->request("flickr.favorites.remove", array("photo_id"=>$photo_id), TRUE); -		return $this->parsed_response ? true : false; -	} - -	/* Groups Methods */ -	function groups_browse ($cat_id = NULL) { -		/* http://www.flickr.com/services/api/flickr.groups.browse.html */ -		$this->request("flickr.groups.browse", array("cat_id"=>$cat_id)); -		return $this->parsed_response ? $this->parsed_response['category'] : false; -	} - -	function groups_getInfo ($group_id, $lang = NULL) { -		/* http://www.flickr.com/services/api/flickr.groups.getInfo.html */ -		return $this->call('flickr.groups.getInfo', array('group_id' => $group_id, 'lang' => $lang)); -	} - -	function groups_search ($text, $per_page = NULL, $page = NULL) { -		/* http://www.flickr.com/services/api/flickr.groups.search.html */ -		$this->request("flickr.groups.search", array("text"=>$text,"per_page"=>$per_page,"page"=>$page)); -		return $this->parsed_response ? $this->parsed_response['groups'] : false; -	} - -	/* Groups Members Methods */ -	function groups_members_getList ($group_id, $membertypes = NULL, $per_page = NULL, $page = NULL) { -		/* http://www.flickr.com/services/api/flickr.groups.members.getList.html */ -		return $this->call('flickr.groups.members.getList', array('group_id' => $group_id, 'membertypes' => $membertypes, 'per_page' => $per_page, 'page' => $page)); -	} -	 -	/* Groups Pools Methods */ -	function groups_pools_add ($photo_id, $group_id) { -		/* http://www.flickr.com/services/api/flickr.groups.pools.add.html */ -		$this->request("flickr.groups.pools.add", array("photo_id"=>$photo_id, "group_id"=>$group_id), TRUE); -		return $this->parsed_response ? true : false; -	} - -	function groups_pools_getContext ($photo_id, $group_id) { -		/* http://www.flickr.com/services/api/flickr.groups.pools.getContext.html */ -		$this->request("flickr.groups.pools.getContext", array("photo_id"=>$photo_id, "group_id"=>$group_id)); -		return $this->parsed_response ? $this->parsed_response : false; -	} - -	function groups_pools_getGroups ($page = NULL, $per_page = NULL) { -		/* http://www.flickr.com/services/api/flickr.groups.pools.getGroups.html */ -		$this->request("flickr.groups.pools.getGroups", array('page'=>$page, 'per_page'=>$per_page)); -		return $this->parsed_response ? $this->parsed_response['groups'] : false; -	} - -	function groups_pools_getPhotos ($group_id, $tags = NULL, $user_id = NULL, $extras = NULL, $per_page = NULL, $page = NULL) { -		/* http://www.flickr.com/services/api/flickr.groups.pools.getPhotos.html */ -		if (is_array($extras)) { -			$extras = implode(",", $extras); -		} -		$this->request("flickr.groups.pools.getPhotos", array("group_id"=>$group_id, "tags"=>$tags, "user_id"=>$user_id, "extras"=>$extras, "per_page"=>$per_page, "page"=>$page)); -		return $this->parsed_response ? $this->parsed_response['photos'] : false; -	} - -	function groups_pools_remove ($photo_id, $group_id) { -		/* http://www.flickr.com/services/api/flickr.groups.pools.remove.html */ -		$this->request("flickr.groups.pools.remove", array("photo_id"=>$photo_id, "group_id"=>$group_id), TRUE); -		return $this->parsed_response ? true : false; -	} - -	/* Interestingness methods */ -	function interestingness_getList ($date = NULL, $extras = NULL, $per_page = NULL, $page = NULL) { -		/* http://www.flickr.com/services/api/flickr.interestingness.getList.html */ -		if (is_array($extras)) { -			$extras = implode(",", $extras); -		} - -		$this->request("flickr.interestingness.getList", array("date"=>$date, "extras"=>$extras, "per_page"=>$per_page, "page"=>$page)); -		return $this->parsed_response ? $this->parsed_response['photos'] : false; -	} - -	/* Machine Tag methods */ -	function machinetags_getNamespaces ($predicate = NULL, $per_page = NULL, $page = NULL) { -		/* http://www.flickr.com/services/api/flickr.machinetags.getNamespaces.html */ -		return $this->call('flickr.machinetags.getNamespaces', array('predicate' => $predicate, 'per_page' => $per_page, 'page' => $page)); -	} - -	function machinetags_getPairs ($namespace = NULL, $predicate = NULL, $per_page = NULL, $page = NULL) { -		/* http://www.flickr.com/services/api/flickr.machinetags.getPairs.html */ -		return $this->call('flickr.machinetags.getPairs', array('namespace' => $namespace, 'predicate' => $predicate, 'per_page' => $per_page, 'page' => $page)); -	} - -	function machinetags_getPredicates ($namespace = NULL, $per_page = NULL, $page = NULL) { -		/* http://www.flickr.com/services/api/flickr.machinetags.getPredicates.html */ -		return $this->call('flickr.machinetags.getPredicates', array('namespace' => $namespace, 'per_page' => $per_page, 'page' => $page)); -	} -	 -	function machinetags_getRecentValues ($namespace = NULL, $predicate = NULL, $added_since = NULL) { -		/* http://www.flickr.com/services/api/flickr.machinetags.getRecentValues.html */ -		return $this->call('flickr.machinetags.getRecentValues', array('namespace' => $namespace, 'predicate' => $predicate, 'added_since' => $added_since)); -	} - -	function machinetags_getValues ($namespace, $predicate, $per_page = NULL, $page = NULL) { -		/* http://www.flickr.com/services/api/flickr.machinetags.getValues.html */ -		return $this->call('flickr.machinetags.getValues', array('namespace' => $namespace, 'predicate' => $predicate, 'per_page' => $per_page, 'page' => $page)); -	} - -	/* Panda methods */ -	function panda_getList () { -		/* http://www.flickr.com/services/api/flickr.panda.getList.html */ -		return $this->call('flickr.panda.getList', array()); -	} - -	function panda_getPhotos ($panda_name, $extras = NULL, $per_page = NULL, $page = NULL) { -		/* http://www.flickr.com/services/api/flickr.panda.getPhotos.html */ -		return $this->call('flickr.panda.getPhotos', array('panda_name' => $panda_name, 'extras' => $extras, 'per_page' => $per_page, 'page' => $page)); -	} - -	/* People methods */ -	function people_findByEmail ($find_email) { -		/* http://www.flickr.com/services/api/flickr.people.findByEmail.html */ -		$this->request("flickr.people.findByEmail", array("find_email"=>$find_email)); -		return $this->parsed_response ? $this->parsed_response['user'] : false; -	} - -	function people_findByUsername ($username) { -		/* http://www.flickr.com/services/api/flickr.people.findByUsername.html */ -		$this->request("flickr.people.findByUsername", array("username"=>$username)); -		return $this->parsed_response ? $this->parsed_response['user'] : false; -	} - -	function people_getInfo ($user_id) { -		/* http://www.flickr.com/services/api/flickr.people.getInfo.html */ -		$this->request("flickr.people.getInfo", array("user_id"=>$user_id)); -		return $this->parsed_response ? $this->parsed_response['person'] : false; -	} - -	function people_getPublicGroups ($user_id) { -		/* http://www.flickr.com/services/api/flickr.people.getPublicGroups.html */ -		$this->request("flickr.people.getPublicGroups", array("user_id"=>$user_id)); -		return $this->parsed_response ? $this->parsed_response['groups']['group'] : false; -	} - -	function people_getPublicPhotos ($user_id, $safe_search = NULL, $extras = NULL, $per_page = NULL, $page = NULL) { -		/* http://www.flickr.com/services/api/flickr.people.getPublicPhotos.html */ -		return $this->call('flickr.people.getPublicPhotos', array('user_id' => $user_id, 'safe_search' => $safe_search, 'extras' => $extras, 'per_page' => $per_page, 'page' => $page)); -	} - -	function people_getUploadStatus () { -		/* http://www.flickr.com/services/api/flickr.people.getUploadStatus.html */ -		/* Requires Authentication */ -		$this->request("flickr.people.getUploadStatus"); -		return $this->parsed_response ? $this->parsed_response['user'] : false; -	} - - -	/* Photos Methods */ -	function photos_addTags ($photo_id, $tags) { -		/* http://www.flickr.com/services/api/flickr.photos.addTags.html */ -		$this->request("flickr.photos.addTags", array("photo_id"=>$photo_id, "tags"=>$tags), TRUE); -		return $this->parsed_response ? true : false; -	} - -	function photos_delete ($photo_id) { -		/* http://www.flickr.com/services/api/flickr.photos.delete.html */ -		$this->request("flickr.photos.delete", array("photo_id"=>$photo_id), TRUE); -		return $this->parsed_response ? true : false; -	} - -	function photos_getAllContexts ($photo_id) { -		/* http://www.flickr.com/services/api/flickr.photos.getAllContexts.html */ -		$this->request("flickr.photos.getAllContexts", array("photo_id"=>$photo_id)); -		return $this->parsed_response ? $this->parsed_response : false; -	} - -	function photos_getContactsPhotos ($count = NULL, $just_friends = NULL, $single_photo = NULL, $include_self = NULL, $extras = NULL) { -		/* http://www.flickr.com/services/api/flickr.photos.getContactsPhotos.html */ -		$this->request("flickr.photos.getContactsPhotos", array("count"=>$count, "just_friends"=>$just_friends, "single_photo"=>$single_photo, "include_self"=>$include_self, "extras"=>$extras)); -		return $this->parsed_response ? $this->parsed_response['photos']['photo'] : false; -	} - -	function photos_getContactsPublicPhotos ($user_id, $count = NULL, $just_friends = NULL, $single_photo = NULL, $include_self = NULL, $extras = NULL) { -		/* http://www.flickr.com/services/api/flickr.photos.getContactsPublicPhotos.html */ -		$this->request("flickr.photos.getContactsPublicPhotos", array("user_id"=>$user_id, "count"=>$count, "just_friends"=>$just_friends, "single_photo"=>$single_photo, "include_self"=>$include_self, "extras"=>$extras)); -		return $this->parsed_response ? $this->parsed_response['photos']['photo'] : false; -	} - -	function photos_getContext ($photo_id) { -		/* http://www.flickr.com/services/api/flickr.photos.getContext.html */ -		$this->request("flickr.photos.getContext", array("photo_id"=>$photo_id)); -		return $this->parsed_response ? $this->parsed_response : false; -	} - -	function photos_getCounts ($dates = NULL, $taken_dates = NULL) { -		/* http://www.flickr.com/services/api/flickr.photos.getCounts.html */ -		$this->request("flickr.photos.getCounts", array("dates"=>$dates, "taken_dates"=>$taken_dates)); -		return $this->parsed_response ? $this->parsed_response['photocounts']['photocount'] : false; -	} - -	function photos_getExif ($photo_id, $secret = NULL) { -		/* http://www.flickr.com/services/api/flickr.photos.getExif.html */ -		$this->request("flickr.photos.getExif", array("photo_id"=>$photo_id, "secret"=>$secret)); -		return $this->parsed_response ? $this->parsed_response['photo'] : false; -	} -	 -	function photos_getFavorites ($photo_id, $page = NULL, $per_page = NULL) { -		/* http://www.flickr.com/services/api/flickr.photos.getFavorites.html */ -		$this->request("flickr.photos.getFavorites", array("photo_id"=>$photo_id, "page"=>$page, "per_page"=>$per_page)); -		return $this->parsed_response ? $this->parsed_response['photo'] : false; -	} - -	function photos_getInfo ($photo_id, $secret = NULL) { -		/* http://www.flickr.com/services/api/flickr.photos.getInfo.html */ -		$this->request("flickr.photos.getInfo", array("photo_id"=>$photo_id, "secret"=>$secret)); -		return $this->parsed_response ? $this->parsed_response['photo'] : false; -	} - -	function photos_getNotInSet ($min_upload_date = NULL, $max_upload_date = NULL, $min_taken_date = NULL, $max_taken_date = NULL, $privacy_filter = NULL, $media = NULL, $extras = NULL, $per_page = NULL, $page = NULL) { -		/* http://www.flickr.com/services/api/flickr.photos.getNotInSet.html */ -		return $this->call('flickr.photos.getNotInSet', array('min_upload_date' => $min_upload_date, 'max_upload_date' => $max_upload_date, 'min_taken_date' => $min_taken_date, 'max_taken_date' => $max_taken_date, 'privacy_filter' => $privacy_filter, 'media' => $media, 'extras' => $extras, 'per_page' => $per_page, 'page' => $page)); -	} - -	function photos_getPerms ($photo_id) { -		/* http://www.flickr.com/services/api/flickr.photos.getPerms.html */ -		$this->request("flickr.photos.getPerms", array("photo_id"=>$photo_id)); -		return $this->parsed_response ? $this->parsed_response['perms'] : false; -	} - -	function photos_getRecent ($extras = NULL, $per_page = NULL, $page = NULL) { -		/* http://www.flickr.com/services/api/flickr.photos.getRecent.html */ - -		if (is_array($extras)) { -			$extras = implode(",", $extras); -		} -		$this->request("flickr.photos.getRecent", array("extras"=>$extras, "per_page"=>$per_page, "page"=>$page)); -		return $this->parsed_response ? $this->parsed_response['photos'] : false; -	} - -	function photos_getSizes ($photo_id) { -		/* http://www.flickr.com/services/api/flickr.photos.getSizes.html */ -		$this->request("flickr.photos.getSizes", array("photo_id"=>$photo_id)); -		return $this->parsed_response ? $this->parsed_response['sizes']['size'] : false; -	} - -	function photos_getUntagged ($min_upload_date = NULL, $max_upload_date = NULL, $min_taken_date = NULL, $max_taken_date = NULL, $privacy_filter = NULL, $media = NULL, $extras = NULL, $per_page = NULL, $page = NULL) { -		/* http://www.flickr.com/services/api/flickr.photos.getUntagged.html */ -		return $this->call('flickr.photos.getUntagged', array('min_upload_date' => $min_upload_date, 'max_upload_date' => $max_upload_date, 'min_taken_date' => $min_taken_date, 'max_taken_date' => $max_taken_date, 'privacy_filter' => $privacy_filter, 'media' => $media, 'extras' => $extras, 'per_page' => $per_page, 'page' => $page)); -	} - -	function photos_getWithGeoData ($args = array()) { -		/* See the documentation included with the photos_search() function. -		 * I'm using the same style of arguments for this function. The only -		 * difference here is that this doesn't require any arguments. The -		 * flickr.photos.search method requires at least one search parameter. -		 */ -		/* http://www.flickr.com/services/api/flickr.photos.getWithGeoData.html */ -		$this->request("flickr.photos.getWithGeoData", $args); -		return $this->parsed_response ? $this->parsed_response['photos'] : false; -	} - -	function photos_getWithoutGeoData ($args = array()) { -		/* See the documentation included with the photos_search() function. -		 * I'm using the same style of arguments for this function. The only -		 * difference here is that this doesn't require any arguments. The -		 * flickr.photos.search method requires at least one search parameter. -		 */ -		/* http://www.flickr.com/services/api/flickr.photos.getWithoutGeoData.html */ -		$this->request("flickr.photos.getWithoutGeoData", $args); -		return $this->parsed_response ? $this->parsed_response['photos'] : false; -	} - -	function photos_recentlyUpdated ($min_date, $extras = NULL, $per_page = NULL, $page = NULL) { -		/* http://www.flickr.com/services/api/flickr.photos.recentlyUpdated.html */ -		return $this->call('flickr.photos.recentlyUpdated', array('min_date' => $min_date, 'extras' => $extras, 'per_page' => $per_page, 'page' => $page)); -	} - -	function photos_removeTag ($tag_id) { -		/* http://www.flickr.com/services/api/flickr.photos.removeTag.html */ -		$this->request("flickr.photos.removeTag", array("tag_id"=>$tag_id), TRUE); -		return $this->parsed_response ? true : false; -	} - -	function photos_search ($args = array()) { -		/* This function strays from the method of arguments that I've -		 * used in the other functions for the fact that there are just -		 * so many arguments to this API method. What you'll need to do -		 * is pass an associative array to the function containing the -		 * arguments you want to pass to the API.  For example: -		 *   $photos = $f->photos_search(array("tags"=>"brown,cow", "tag_mode"=>"any")); -		 * This will return photos tagged with either "brown" or "cow" -		 * or both. See the API documentation (link below) for a full -		 * list of arguments. -		 */ - -		/* http://www.flickr.com/services/api/flickr.photos.search.html */ -		$this->request("flickr.photos.search", $args); -		return $this->parsed_response ? $this->parsed_response['photos'] : false; -	} - -	function photos_setContentType ($photo_id, $content_type) { -		/* http://www.flickr.com/services/api/flickr.photos.setContentType.html */ -		return $this->call('flickr.photos.setContentType', array('photo_id' => $photo_id, 'content_type' => $content_type)); -	} -	 -	function photos_setDates ($photo_id, $date_posted = NULL, $date_taken = NULL, $date_taken_granularity = NULL) { -		/* http://www.flickr.com/services/api/flickr.photos.setDates.html */ -		$this->request("flickr.photos.setDates", array("photo_id"=>$photo_id, "date_posted"=>$date_posted, "date_taken"=>$date_taken, "date_taken_granularity"=>$date_taken_granularity), TRUE); -		return $this->parsed_response ? true : false; -	} - -	function photos_setMeta ($photo_id, $title, $description) { -		/* http://www.flickr.com/services/api/flickr.photos.setMeta.html */ -		$this->request("flickr.photos.setMeta", array("photo_id"=>$photo_id, "title"=>$title, "description"=>$description), TRUE); -		return $this->parsed_response ? true : false; -	} - -	function photos_setPerms ($photo_id, $is_public, $is_friend, $is_family, $perm_comment, $perm_addmeta) { -		/* http://www.flickr.com/services/api/flickr.photos.setPerms.html */ -		$this->request("flickr.photos.setPerms", array("photo_id"=>$photo_id, "is_public"=>$is_public, "is_friend"=>$is_friend, "is_family"=>$is_family, "perm_comment"=>$perm_comment, "perm_addmeta"=>$perm_addmeta), TRUE); -		return $this->parsed_response ? true : false; -	} - -	function photos_setSafetyLevel ($photo_id, $safety_level = NULL, $hidden = NULL) { -		/* http://www.flickr.com/services/api/flickr.photos.setSafetyLevel.html */ -		return $this->call('flickr.photos.setSafetyLevel', array('photo_id' => $photo_id, 'safety_level' => $safety_level, 'hidden' => $hidden)); -	} -	 -	function photos_setTags ($photo_id, $tags) { -		/* http://www.flickr.com/services/api/flickr.photos.setTags.html */ -		$this->request("flickr.photos.setTags", array("photo_id"=>$photo_id, "tags"=>$tags), TRUE); -		return $this->parsed_response ? true : false; -	} - -	/* Photos - Comments Methods */ -	function photos_comments_addComment ($photo_id, $comment_text) { -		/* http://www.flickr.com/services/api/flickr.photos.comments.addComment.html */ -		$this->request("flickr.photos.comments.addComment", array("photo_id" => $photo_id, "comment_text"=>$comment_text), TRUE); -		return $this->parsed_response ? $this->parsed_response['comment'] : false; -	} - -	function photos_comments_deleteComment ($comment_id) { -		/* http://www.flickr.com/services/api/flickr.photos.comments.deleteComment.html */ -		$this->request("flickr.photos.comments.deleteComment", array("comment_id" => $comment_id), TRUE); -		return $this->parsed_response ? true : false; -	} - -	function photos_comments_editComment ($comment_id, $comment_text) { -		/* http://www.flickr.com/services/api/flickr.photos.comments.editComment.html */ -		$this->request("flickr.photos.comments.editComment", array("comment_id" => $comment_id, "comment_text"=>$comment_text), TRUE); -		return $this->parsed_response ? true : false; -	} - -	function photos_comments_getList ($photo_id, $min_comment_date = NULL, $max_comment_date = NULL) { -		/* http://www.flickr.com/services/api/flickr.photos.comments.getList.html */ -		return $this->call('flickr.photos.comments.getList', array('photo_id' => $photo_id, 'min_comment_date' => $min_comment_date, 'max_comment_date' => $max_comment_date)); -	} -	 -	function photos_comments_getRecentForContacts ($date_lastcomment = NULL, $contacts_filter = NULL, $extras = NULL, $per_page = NULL, $page = NULL) { -		/* http://www.flickr.com/services/api/flickr.photos.comments.getRecentForContacts.html */ -		return $this->call('flickr.photos.comments.getRecentForContacts', array('date_lastcomment' => $date_lastcomment, 'contacts_filter' => $contacts_filter, 'extras' => $extras, 'per_page' => $per_page, 'page' => $page)); -	} - -	/* Photos - Geo Methods */ -	function photos_geo_batchCorrectLocation ($lat, $lon, $accuracy, $place_id = NULL, $woe_id = NULL) { -		/* http://www.flickr.com/services/api/flickr.photos.geo.batchCorrectLocation.html */ -		return $this->call('flickr.photos.geo.batchCorrectLocation', array('lat' => $lat, 'lon' => $lon, 'accuracy' => $accuracy, 'place_id' => $place_id, 'woe_id' => $woe_id)); -	} - -	function photos_geo_correctLocation ($photo_id, $place_id = NULL, $woe_id = NULL) { -		/* http://www.flickr.com/services/api/flickr.photos.geo.correctLocation.html */ -		return $this->call('flickr.photos.geo.correctLocation', array('photo_id' => $photo_id, 'place_id' => $place_id, 'woe_id' => $woe_id)); -	} - -	function photos_geo_getLocation ($photo_id) { -		/* http://www.flickr.com/services/api/flickr.photos.geo.getLocation.html */ -		$this->request("flickr.photos.geo.getLocation", array("photo_id"=>$photo_id)); -		return $this->parsed_response ? $this->parsed_response['photo'] : false; -	} - -	function photos_geo_getPerms ($photo_id) { -		/* http://www.flickr.com/services/api/flickr.photos.geo.getPerms.html */ -		$this->request("flickr.photos.geo.getPerms", array("photo_id"=>$photo_id)); -		return $this->parsed_response ? $this->parsed_response['perms'] : false; -	} -	 -	function photos_geo_photosForLocation ($lat, $lon, $accuracy = NULL, $extras = NULL, $per_page = NULL, $page = NULL) { -		/* http://www.flickr.com/services/api/flickr.photos.geo.photosForLocation.html */ -		return $this->call('flickr.photos.geo.photosForLocation', array('lat' => $lat, 'lon' => $lon, 'accuracy' => $accuracy, 'extras' => $extras, 'per_page' => $per_page, 'page' => $page)); -	} - -	function photos_geo_removeLocation ($photo_id) { -		/* http://www.flickr.com/services/api/flickr.photos.geo.removeLocation.html */ -		$this->request("flickr.photos.geo.removeLocation", array("photo_id"=>$photo_id), TRUE); -		return $this->parsed_response ? true : false; -	} - -	function photos_geo_setContext ($photo_id, $context) { -		/* http://www.flickr.com/services/api/flickr.photos.geo.setContext.html */ -		return $this->call('flickr.photos.geo.setContext', array('photo_id' => $photo_id, 'context' => $context)); -	} - -	function photos_geo_setLocation ($photo_id, $lat, $lon, $accuracy = NULL, $context = NULL) { -		/* http://www.flickr.com/services/api/flickr.photos.geo.setLocation.html */ -		return $this->call('flickr.photos.geo.setLocation', array('photo_id' => $photo_id, 'lat' => $lat, 'lon' => $lon, 'accuracy' => $accuracy, 'context' => $context)); -	} - -	function photos_geo_setPerms ($is_public, $is_contact, $is_friend, $is_family, $photo_id) { -		/* http://www.flickr.com/services/api/flickr.photos.geo.setPerms.html */ -		return $this->call('flickr.photos.geo.setPerms', array('is_public' => $is_public, 'is_contact' => $is_contact, 'is_friend' => $is_friend, 'is_family' => $is_family, 'photo_id' => $photo_id)); -	} - -	/* Photos - Licenses Methods */ -	function photos_licenses_getInfo () { -		/* http://www.flickr.com/services/api/flickr.photos.licenses.getInfo.html */ -		$this->request("flickr.photos.licenses.getInfo"); -		return $this->parsed_response ? $this->parsed_response['licenses']['license'] : false; -	} - -	function photos_licenses_setLicense ($photo_id, $license_id) { -		/* http://www.flickr.com/services/api/flickr.photos.licenses.setLicense.html */ -		/* Requires Authentication */ -		$this->request("flickr.photos.licenses.setLicense", array("photo_id"=>$photo_id, "license_id"=>$license_id), TRUE); -		return $this->parsed_response ? true : false; -	} - -	/* Photos - Notes Methods */ -	function photos_notes_add ($photo_id, $note_x, $note_y, $note_w, $note_h, $note_text) { -		/* http://www.flickr.com/services/api/flickr.photos.notes.add.html */ -		$this->request("flickr.photos.notes.add", array("photo_id" => $photo_id, "note_x" => $note_x, "note_y" => $note_y, "note_w" => $note_w, "note_h" => $note_h, "note_text" => $note_text), TRUE); -		return $this->parsed_response ? $this->parsed_response['note'] : false; -	} - -	function photos_notes_delete ($note_id) { -		/* http://www.flickr.com/services/api/flickr.photos.notes.delete.html */ -		$this->request("flickr.photos.notes.delete", array("note_id" => $note_id), TRUE); -		return $this->parsed_response ? true : false; -	} - -	function photos_notes_edit ($note_id, $note_x, $note_y, $note_w, $note_h, $note_text) { -		/* http://www.flickr.com/services/api/flickr.photos.notes.edit.html */ -		$this->request("flickr.photos.notes.edit", array("note_id" => $note_id, "note_x" => $note_x, "note_y" => $note_y, "note_w" => $note_w, "note_h" => $note_h, "note_text" => $note_text), TRUE); -		return $this->parsed_response ? true : false; -	} - -	/* Photos - Transform Methods */ -	function photos_transform_rotate ($photo_id, $degrees) { -		/* http://www.flickr.com/services/api/flickr.photos.transform.rotate.html */ -		$this->request("flickr.photos.transform.rotate", array("photo_id" => $photo_id, "degrees" => $degrees), TRUE); -		return $this->parsed_response ? true : false; -	} - -	/* Photos - Upload Methods */ -	function photos_upload_checkTickets ($tickets) { -		/* http://www.flickr.com/services/api/flickr.photos.upload.checkTickets.html */ -		if (is_array($tickets)) { -			$tickets = implode(",", $tickets); -		} -		$this->request("flickr.photos.upload.checkTickets", array("tickets" => $tickets), TRUE); -		return $this->parsed_response ? $this->parsed_response['uploader']['ticket'] : false; -	} - -	/* Photosets Methods */ -	function photosets_addPhoto ($photoset_id, $photo_id) { -		/* http://www.flickr.com/services/api/flickr.photosets.addPhoto.html */ -		$this->request("flickr.photosets.addPhoto", array("photoset_id" => $photoset_id, "photo_id" => $photo_id), TRUE); -		return $this->parsed_response ? true : false; -	} - -	function photosets_create ($title, $description, $primary_photo_id) { -		/* http://www.flickr.com/services/api/flickr.photosets.create.html */ -		$this->request("flickr.photosets.create", array("title" => $title, "primary_photo_id" => $primary_photo_id, "description" => $description), TRUE); -		return $this->parsed_response ? $this->parsed_response['photoset'] : false; -	} - -	function photosets_delete ($photoset_id) { -		/* http://www.flickr.com/services/api/flickr.photosets.delete.html */ -		$this->request("flickr.photosets.delete", array("photoset_id" => $photoset_id), TRUE); -		return $this->parsed_response ? true : false; -	} - -	function photosets_editMeta ($photoset_id, $title, $description = NULL) { -		/* http://www.flickr.com/services/api/flickr.photosets.editMeta.html */ -		$this->request("flickr.photosets.editMeta", array("photoset_id" => $photoset_id, "title" => $title, "description" => $description), TRUE); -		return $this->parsed_response ? true : false; -	} - -	function photosets_editPhotos ($photoset_id, $primary_photo_id, $photo_ids) { -		/* http://www.flickr.com/services/api/flickr.photosets.editPhotos.html */ -		$this->request("flickr.photosets.editPhotos", array("photoset_id" => $photoset_id, "primary_photo_id" => $primary_photo_id, "photo_ids" => $photo_ids), TRUE); -		return $this->parsed_response ? true : false; -	} - -	function photosets_getContext ($photo_id, $photoset_id) { -		/* http://www.flickr.com/services/api/flickr.photosets.getContext.html */ -		$this->request("flickr.photosets.getContext", array("photo_id" => $photo_id, "photoset_id" => $photoset_id)); -		return $this->parsed_response ? $this->parsed_response : false; -	} - -	function photosets_getInfo ($photoset_id) { -		/* http://www.flickr.com/services/api/flickr.photosets.getInfo.html */ -		$this->request("flickr.photosets.getInfo", array("photoset_id" => $photoset_id)); -		return $this->parsed_response ? $this->parsed_response['photoset'] : false; -	} - -	function photosets_getList ($user_id = NULL) { -		/* http://www.flickr.com/services/api/flickr.photosets.getList.html */ -		$this->request("flickr.photosets.getList", array("user_id" => $user_id)); -		return $this->parsed_response ? $this->parsed_response['photosets'] : false; -	} - -	function photosets_getPhotos ($photoset_id, $extras = NULL, $privacy_filter = NULL, $per_page = NULL, $page = NULL, $media = NULL) { -		/* http://www.flickr.com/services/api/flickr.photosets.getPhotos.html */ -		return $this->call('flickr.photosets.getPhotos', array('photoset_id' => $photoset_id, 'extras' => $extras, 'privacy_filter' => $privacy_filter, 'per_page' => $per_page, 'page' => $page, 'media' => $media)); -	} - -	function photosets_orderSets ($photoset_ids) { -		/* http://www.flickr.com/services/api/flickr.photosets.orderSets.html */ -		if (is_array($photoset_ids)) { -			$photoset_ids = implode(",", $photoset_ids); -		} -		$this->request("flickr.photosets.orderSets", array("photoset_ids" => $photoset_ids), TRUE); -		return $this->parsed_response ? true : false; -	} - -	function photosets_removePhoto ($photoset_id, $photo_id) { -		/* http://www.flickr.com/services/api/flickr.photosets.removePhoto.html */ -		$this->request("flickr.photosets.removePhoto", array("photoset_id" => $photoset_id, "photo_id" => $photo_id), TRUE); -		return $this->parsed_response ? true : false; -	} - -	/* Photosets Comments Methods */ -	function photosets_comments_addComment ($photoset_id, $comment_text) { -		/* http://www.flickr.com/services/api/flickr.photosets.comments.addComment.html */ -		$this->request("flickr.photosets.comments.addComment", array("photoset_id" => $photoset_id, "comment_text"=>$comment_text), TRUE); -		return $this->parsed_response ? $this->parsed_response['comment'] : false; -	} - -	function photosets_comments_deleteComment ($comment_id) { -		/* http://www.flickr.com/services/api/flickr.photosets.comments.deleteComment.html */ -		$this->request("flickr.photosets.comments.deleteComment", array("comment_id" => $comment_id), TRUE); -		return $this->parsed_response ? true : false; -	} - -	function photosets_comments_editComment ($comment_id, $comment_text) { -		/* http://www.flickr.com/services/api/flickr.photosets.comments.editComment.html */ -		$this->request("flickr.photosets.comments.editComment", array("comment_id" => $comment_id, "comment_text"=>$comment_text), TRUE); -		return $this->parsed_response ? true : false; -	} - -	function photosets_comments_getList ($photoset_id) { -		/* http://www.flickr.com/services/api/flickr.photosets.comments.getList.html */ -		$this->request("flickr.photosets.comments.getList", array("photoset_id"=>$photoset_id)); -		return $this->parsed_response ? $this->parsed_response['comments'] : false; -	} -	 -	/* Places Methods */ -	function places_find ($query) { -		/* http://www.flickr.com/services/api/flickr.places.find.html */ -		return $this->call('flickr.places.find', array('query' => $query)); -	} - -	function places_findByLatLon ($lat, $lon, $accuracy = NULL) { -		/* http://www.flickr.com/services/api/flickr.places.findByLatLon.html */ -		return $this->call('flickr.places.findByLatLon', array('lat' => $lat, 'lon' => $lon, 'accuracy' => $accuracy)); -	} - -	function places_getChildrenWithPhotosPublic ($place_id = NULL, $woe_id = NULL) { -		/* http://www.flickr.com/services/api/flickr.places.getChildrenWithPhotosPublic.html */ -		return $this->call('flickr.places.getChildrenWithPhotosPublic', array('place_id' => $place_id, 'woe_id' => $woe_id)); -	} - -	function places_getInfo ($place_id = NULL, $woe_id = NULL) { -		/* http://www.flickr.com/services/api/flickr.places.getInfo.html */ -		return $this->call('flickr.places.getInfo', array('place_id' => $place_id, 'woe_id' => $woe_id)); -	} - -	function places_getInfoByUrl ($url) { -		/* http://www.flickr.com/services/api/flickr.places.getInfoByUrl.html */ -		return $this->call('flickr.places.getInfoByUrl', array('url' => $url)); -	} -	 -	function places_getPlaceTypes () { -		/* http://www.flickr.com/services/api/flickr.places.getPlaceTypes.html */ -		return $this->call('flickr.places.getPlaceTypes', array()); -	} -	 -	function places_getShapeHistory ($place_id = NULL, $woe_id = NULL) { -		/* http://www.flickr.com/services/api/flickr.places.getShapeHistory.html */ -		return $this->call('flickr.places.getShapeHistory', array('place_id' => $place_id, 'woe_id' => $woe_id)); -	} - -	function places_getTopPlacesList ($place_type_id, $date = NULL, $woe_id = NULL, $place_id = NULL) { -		/* http://www.flickr.com/services/api/flickr.places.getTopPlacesList.html */ -		return $this->call('flickr.places.getTopPlacesList', array('place_type_id' => $place_type_id, 'date' => $date, 'woe_id' => $woe_id, 'place_id' => $place_id)); -	} -	 -	function places_placesForBoundingBox ($bbox, $place_type = NULL, $place_type_id = NULL) { -		/* http://www.flickr.com/services/api/flickr.places.placesForBoundingBox.html */ -		return $this->call('flickr.places.placesForBoundingBox', array('bbox' => $bbox, 'place_type' => $place_type, 'place_type_id' => $place_type_id)); -	} - -	function places_placesForContacts ($place_type = NULL, $place_type_id = NULL, $woe_id = NULL, $place_id = NULL, $threshold = NULL, $contacts = NULL, $min_upload_date = NULL, $max_upload_date = NULL, $min_taken_date = NULL, $max_taken_date = NULL) { -		/* http://www.flickr.com/services/api/flickr.places.placesForContacts.html */ -		return $this->call('flickr.places.placesForContacts', array('place_type' => $place_type, 'place_type_id' => $place_type_id, 'woe_id' => $woe_id, 'place_id' => $place_id, 'threshold' => $threshold, 'contacts' => $contacts, 'min_upload_date' => $min_upload_date, 'max_upload_date' => $max_upload_date, 'min_taken_date' => $min_taken_date, 'max_taken_date' => $max_taken_date)); -	} - -	function places_placesForTags ($place_type_id, $woe_id = NULL, $place_id = NULL, $threshold = NULL, $tags = NULL, $tag_mode = NULL, $machine_tags = NULL, $machine_tag_mode = NULL, $min_upload_date = NULL, $max_upload_date = NULL, $min_taken_date = NULL, $max_taken_date = NULL) { -		/* http://www.flickr.com/services/api/flickr.places.placesForTags.html */ -		return $this->call('flickr.places.placesForTags', array('place_type_id' => $place_type_id, 'woe_id' => $woe_id, 'place_id' => $place_id, 'threshold' => $threshold, 'tags' => $tags, 'tag_mode' => $tag_mode, 'machine_tags' => $machine_tags, 'machine_tag_mode' => $machine_tag_mode, 'min_upload_date' => $min_upload_date, 'max_upload_date' => $max_upload_date, 'min_taken_date' => $min_taken_date, 'max_taken_date' => $max_taken_date)); -	} - -	function places_placesForUser ($place_type_id = NULL, $place_type = NULL, $woe_id = NULL, $place_id = NULL, $threshold = NULL, $min_upload_date = NULL, $max_upload_date = NULL, $min_taken_date = NULL, $max_taken_date = NULL) { -		/* http://www.flickr.com/services/api/flickr.places.placesForUser.html */ -		return $this->call('flickr.places.placesForUser', array('place_type_id' => $place_type_id, 'place_type' => $place_type, 'woe_id' => $woe_id, 'place_id' => $place_id, 'threshold' => $threshold, 'min_upload_date' => $min_upload_date, 'max_upload_date' => $max_upload_date, 'min_taken_date' => $min_taken_date, 'max_taken_date' => $max_taken_date)); -	} -	 -	function places_resolvePlaceId ($place_id) { -		/* http://www.flickr.com/services/api/flickr.places.resolvePlaceId.html */ -		$rsp = $this->call('flickr.places.resolvePlaceId', array('place_id' => $place_id)); -		return $rsp ? $rsp['location'] : $rsp; -	} -	 -	function places_resolvePlaceURL ($url) { -		/* http://www.flickr.com/services/api/flickr.places.resolvePlaceURL.html */ -		$rsp = $this->call('flickr.places.resolvePlaceURL', array('url' => $url)); -		return $rsp ? $rsp['location'] : $rsp; -	} -	 -	function places_tagsForPlace ($woe_id = NULL, $place_id = NULL, $min_upload_date = NULL, $max_upload_date = NULL, $min_taken_date = NULL, $max_taken_date = NULL) { -		/* http://www.flickr.com/services/api/flickr.places.tagsForPlace.html */ -		return $this->call('flickr.places.tagsForPlace', array('woe_id' => $woe_id, 'place_id' => $place_id, 'min_upload_date' => $min_upload_date, 'max_upload_date' => $max_upload_date, 'min_taken_date' => $min_taken_date, 'max_taken_date' => $max_taken_date)); -	} - -	/* Prefs Methods */ -	function prefs_getContentType () { -		/* http://www.flickr.com/services/api/flickr.prefs.getContentType.html */ -		$rsp = $this->call('flickr.prefs.getContentType', array()); -		return $rsp ? $rsp['person'] : $rsp; -	} -	 -	function prefs_getGeoPerms () { -		/* http://www.flickr.com/services/api/flickr.prefs.getGeoPerms.html */ -		return $this->call('flickr.prefs.getGeoPerms', array()); -	} -	 -	function prefs_getHidden () { -		/* http://www.flickr.com/services/api/flickr.prefs.getHidden.html */ -		$rsp = $this->call('flickr.prefs.getHidden', array()); -		return $rsp ? $rsp['person'] : $rsp; -	} -	 -	function prefs_getPrivacy () { -		/* http://www.flickr.com/services/api/flickr.prefs.getPrivacy.html */ -		$rsp = $this->call('flickr.prefs.getPrivacy', array()); -		return $rsp ? $rsp['person'] : $rsp; -	} -	 -	function prefs_getSafetyLevel () { -		/* http://www.flickr.com/services/api/flickr.prefs.getSafetyLevel.html */ -		$rsp = $this->call('flickr.prefs.getSafetyLevel', array()); -		return $rsp ? $rsp['person'] : $rsp; -	} - -	/* Reflection Methods */ -	function reflection_getMethodInfo ($method_name) { -		/* http://www.flickr.com/services/api/flickr.reflection.getMethodInfo.html */ -		$this->request("flickr.reflection.getMethodInfo", array("method_name" => $method_name)); -		return $this->parsed_response ? $this->parsed_response : false; -	} - -	function reflection_getMethods () { -		/* http://www.flickr.com/services/api/flickr.reflection.getMethods.html */ -		$this->request("flickr.reflection.getMethods"); -		return $this->parsed_response ? $this->parsed_response['methods']['method'] : false; -	} - -	/* Tags Methods */ -	function tags_getClusterPhotos ($tag, $cluster_id) { -		/* http://www.flickr.com/services/api/flickr.tags.getClusterPhotos.html */ -		return $this->call('flickr.tags.getClusterPhotos', array('tag' => $tag, 'cluster_id' => $cluster_id)); -	} - -	function tags_getClusters ($tag) { -		/* http://www.flickr.com/services/api/flickr.tags.getClusters.html */ -		return $this->call('flickr.tags.getClusters', array('tag' => $tag)); -	} - -	function tags_getHotList ($period = NULL, $count = NULL) { -		/* http://www.flickr.com/services/api/flickr.tags.getHotList.html */ -		$this->request("flickr.tags.getHotList", array("period" => $period, "count" => $count)); -		return $this->parsed_response ? $this->parsed_response['hottags'] : false; -	} - -	function tags_getListPhoto ($photo_id) { -		/* http://www.flickr.com/services/api/flickr.tags.getListPhoto.html */ -		$this->request("flickr.tags.getListPhoto", array("photo_id" => $photo_id)); -		return $this->parsed_response ? $this->parsed_response['photo']['tags']['tag'] : false; -	} - -	function tags_getListUser ($user_id = NULL) { -		/* http://www.flickr.com/services/api/flickr.tags.getListUser.html */ -		$this->request("flickr.tags.getListUser", array("user_id" => $user_id)); -		return $this->parsed_response ? $this->parsed_response['who']['tags']['tag'] : false; -	} - -	function tags_getListUserPopular ($user_id = NULL, $count = NULL) { -		/* http://www.flickr.com/services/api/flickr.tags.getListUserPopular.html */ -		$this->request("flickr.tags.getListUserPopular", array("user_id" => $user_id, "count" => $count)); -		return $this->parsed_response ? $this->parsed_response['who']['tags']['tag'] : false; -	} - -	function tags_getListUserRaw ($tag = NULL) { -		/* http://www.flickr.com/services/api/flickr.tags.getListUserRaw.html */ -		return $this->call('flickr.tags.getListUserRaw', array('tag' => $tag)); -	} -	 -	function tags_getRelated ($tag) { -		/* http://www.flickr.com/services/api/flickr.tags.getRelated.html */ -		$this->request("flickr.tags.getRelated", array("tag" => $tag)); -		return $this->parsed_response ? $this->parsed_response['tags'] : false; -	} - -	function test_echo ($args = array()) { -		/* http://www.flickr.com/services/api/flickr.test.echo.html */ -		$this->request("flickr.test.echo", $args); -		return $this->parsed_response ? $this->parsed_response : false; -	} - -	function test_login () { -		/* http://www.flickr.com/services/api/flickr.test.login.html */ -		$this->request("flickr.test.login"); -		return $this->parsed_response ? $this->parsed_response['user'] : false; -	} - -	function urls_getGroup ($group_id) { -		/* http://www.flickr.com/services/api/flickr.urls.getGroup.html */ -		$this->request("flickr.urls.getGroup", array("group_id"=>$group_id)); -		return $this->parsed_response ? $this->parsed_response['group']['url'] : false; -	} - -	function urls_getUserPhotos ($user_id = NULL) { -		/* http://www.flickr.com/services/api/flickr.urls.getUserPhotos.html */ -		$this->request("flickr.urls.getUserPhotos", array("user_id"=>$user_id)); -		return $this->parsed_response ? $this->parsed_response['user']['url'] : false; -	} - -	function urls_getUserProfile ($user_id = NULL) { -		/* http://www.flickr.com/services/api/flickr.urls.getUserProfile.html */ -		$this->request("flickr.urls.getUserProfile", array("user_id"=>$user_id)); -		return $this->parsed_response ? $this->parsed_response['user']['url'] : false; -	} - -	function urls_lookupGroup ($url) { -		/* http://www.flickr.com/services/api/flickr.urls.lookupGroup.html */ -		$this->request("flickr.urls.lookupGroup", array("url"=>$url)); -		return $this->parsed_response ? $this->parsed_response['group'] : false; -	} - -	function urls_lookupUser ($url) { -		/* http://www.flickr.com/services/api/flickr.photos.notes.edit.html */ -		$this->request("flickr.urls.lookupUser", array("url"=>$url)); -		return $this->parsed_response ? $this->parsed_response['user'] : false; -	} -} - - -?>  | 
