Merge branch 'master' into oc_error

This commit is contained in:
Georg Ehrke 2012-05-13 19:13:31 +02:00
commit a5f0ac811f
1509 changed files with 139776 additions and 68000 deletions

2
.gitignore vendored
View File

@ -2,6 +2,8 @@
data data
owncloud owncloud
config/config.php config/config.php
config/mount.php
apps/inc.php
# just sane ignores # just sane ignores
.*.sw[po] .*.sw[po]

View File

@ -1,5 +1,9 @@
ErrorDocument 403 /core/templates/403.php ErrorDocument 403 /core/templates/403.php
ErrorDocument 404 /core/templates/404.php ErrorDocument 404 /core/templates/404.php
Redirect 301 /apps/calendar/caldav.php /remote.php/caldav/
Redirect 301 /apps/contacts/carddav.php /remote.php/carddav/
Redirect 301 /apps/files/webdav.php /remote.php/webdav/
Redirect 301 /files/webdav.php /remote.php/webdav/
<IfModule mod_php5.c> <IfModule mod_php5.c>
php_value upload_max_filesize 512M php_value upload_max_filesize 512M
php_value post_max_size 512M php_value post_max_size 512M
@ -10,8 +14,11 @@ php_value memory_limit 512M
</IfModule> </IfModule>
<IfModule mod_rewrite.c> <IfModule mod_rewrite.c>
RewriteEngine on RewriteEngine on
RewriteRule .* - [env=HTTP_AUTHORIZATION:%{HTTP:Authorization},last] RewriteRule .* - [env=HTTP_AUTHORIZATION:%{HTTP:Authorization}]
RewriteRule ^.well-known/carddav /apps/contacts/carddav.php [R] RewriteRule ^.well-known/host-meta /public.php?service=host-meta [QSA,L]
RewriteRule ^.well-known/caldav /apps/calendar/caldav.php [R] RewriteRule ^.well-known/carddav /remote.php/carddav/ [R]
RewriteRule ^.well-known/caldav /remote.php/caldav/ [R]
RewriteRule ^apps/([^/]*)/(.*\.(css|php))$ index.php?app=$1&getfile=$2 [QSA,L]
RewriteRule ^remote/(.*) remote.php [QSA,L]
</IfModule> </IfModule>
Options -Indexes Options -Indexes

298
3rdparty/MDB2.php vendored
View File

@ -43,7 +43,7 @@
// | Author: Lukas Smith <smith@pooteeweet.org> | // | Author: Lukas Smith <smith@pooteeweet.org> |
// +----------------------------------------------------------------------+ // +----------------------------------------------------------------------+
// //
// $Id: MDB2.php,v 1.335 2008/11/29 14:57:01 afz Exp $ // $Id: MDB2.php 295587 2010-02-28 17:16:38Z quipo $
// //
/** /**
@ -52,7 +52,7 @@
* @author Lukas Smith <smith@pooteeweet.org> * @author Lukas Smith <smith@pooteeweet.org>
*/ */
require_once('PEAR.php'); require_once 'PEAR.php';
// {{{ Error constants // {{{ Error constants
@ -267,7 +267,7 @@ $GLOBALS['_MDB2_dsninfo_default'] = array(
*/ */
class MDB2 class MDB2
{ {
// {{{ function setOptions(&$db, $options) // {{{ function setOptions($db, $options)
/** /**
* set option array in an exiting database object * set option array in an exiting database object
@ -279,7 +279,7 @@ class MDB2
* *
* @access public * @access public
*/ */
static function setOptions(&$db, $options) static function setOptions($db, $options)
{ {
if (is_array($options)) { if (is_array($options)) {
foreach ($options as $option => $value) { foreach ($options as $option => $value) {
@ -306,10 +306,7 @@ class MDB2
*/ */
static function classExists($classname) static function classExists($classname)
{ {
if (version_compare(phpversion(), "5.0", ">=")) { return class_exists($classname, false);
return class_exists($classname, false);
}
return class_exists($classname);
} }
// }}} // }}}
@ -332,7 +329,7 @@ class MDB2
if ($debug) { if ($debug) {
$include = include_once($file_name); $include = include_once($file_name);
} else { } else {
$include = include_once($file_name); $include = @include_once($file_name);
} }
if (!$include) { if (!$include) {
if (!MDB2::fileExists($file_name)) { if (!MDB2::fileExists($file_name)) {
@ -340,7 +337,12 @@ class MDB2
} else { } else {
$msg = "unable to load class '$class_name' from file '$file_name'"; $msg = "unable to load class '$class_name' from file '$file_name'";
} }
$err =MDB2::raiseErrorStatic(MDB2_ERROR_NOT_FOUND, null, null, $msg); $err = MDB2::raiseError(MDB2_ERROR_NOT_FOUND, null, null, $msg);
return $err;
}
if (!MDB2::classExists($class_name)) {
$msg = "unable to load class '$class_name' from file '$file_name'";
$err = MDB2::raiseError(MDB2_ERROR_NOT_FOUND, null, null, $msg);
return $err; return $err;
} }
} }
@ -348,21 +350,11 @@ class MDB2
} }
// }}} // }}}
// {{{ function &factory($dsn, $options = false) // {{{ function factory($dsn, $options = false)
/** /**
* Create a new MDB2 object for the specified database type * Create a new MDB2 object for the specified database type
* *
* IMPORTANT: In order for MDB2 to work properly it is necessary that
* you make sure that you work with a reference of the original
* object instead of a copy (this is a PHP4 quirk).
*
* For example:
* $db =& MDB2::factory($dsn);
* ^^
* And not:
* $db = MDB2::factory($dsn);
*
* @param mixed 'data source name', see the MDB2::parseDSN * @param mixed 'data source name', see the MDB2::parseDSN
* method for a description of the dsn format. * method for a description of the dsn format.
* Can also be specified as an array of the * Can also be specified as an array of the
@ -378,7 +370,7 @@ class MDB2
{ {
$dsninfo = MDB2::parseDSN($dsn); $dsninfo = MDB2::parseDSN($dsn);
if (empty($dsninfo['phptype'])) { if (empty($dsninfo['phptype'])) {
$err =MDB2::raiseErrorStatic(MDB2_ERROR_NOT_FOUND, $err = MDB2::raiseError(MDB2_ERROR_NOT_FOUND,
null, null, 'no RDBMS driver specified'); null, null, 'no RDBMS driver specified');
return $err; return $err;
} }
@ -390,7 +382,7 @@ class MDB2
return $err; return $err;
} }
$db =new $class_name(); $db = new $class_name();
$db->setDSN($dsninfo); $db->setDSN($dsninfo);
$err = MDB2::setOptions($db, $options); $err = MDB2::setOptions($db, $options);
if (PEAR::isError($err)) { if (PEAR::isError($err)) {
@ -401,23 +393,12 @@ class MDB2
} }
// }}} // }}}
// {{{ function &connect($dsn, $options = false) // {{{ function connect($dsn, $options = false)
/** /**
* Create a new MDB2_Driver_* connection object and connect to the specified * Create a new MDB2_Driver_* connection object and connect to the specified
* database * database
* *
* IMPORTANT: In order for MDB2 to work properly it is necessary that
* you make sure that you work with a reference of the original
* object instead of a copy (this is a PHP4 quirk).
*
* For example:
* $db =& MDB2::connect($dsn);
* ^^
* And not:
* $db = MDB2::connect($dsn);
* ^^
*
* @param mixed $dsn 'data source name', see the MDB2::parseDSN * @param mixed $dsn 'data source name', see the MDB2::parseDSN
* method for a description of the dsn format. * method for a description of the dsn format.
* Can also be specified as an array of the * Can also be specified as an array of the
@ -431,9 +412,9 @@ class MDB2
* @access public * @access public
* @see MDB2::parseDSN * @see MDB2::parseDSN
*/ */
function &connect($dsn, $options = false) static function connect($dsn, $options = false)
{ {
$db =MDB2::factory($dsn, $options); $db = MDB2::factory($dsn, $options);
if (PEAR::isError($db)) { if (PEAR::isError($db)) {
return $db; return $db;
} }
@ -450,24 +431,13 @@ class MDB2
} }
// }}} // }}}
// {{{ function &singleton($dsn = null, $options = false) // {{{ function singleton($dsn = null, $options = false)
/** /**
* Returns a MDB2 connection with the requested DSN. * Returns a MDB2 connection with the requested DSN.
* A new MDB2 connection object is only created if no object with the * A new MDB2 connection object is only created if no object with the
* requested DSN exists yet. * requested DSN exists yet.
* *
* IMPORTANT: In order for MDB2 to work properly it is necessary that
* you make sure that you work with a reference of the original
* object instead of a copy (this is a PHP4 quirk).
*
* For example:
* $db =& MDB2::singleton($dsn);
* ^^
* And not:
* $db = MDB2::singleton($dsn);
* ^^
*
* @param mixed 'data source name', see the MDB2::parseDSN * @param mixed 'data source name', see the MDB2::parseDSN
* method for a description of the dsn format. * method for a description of the dsn format.
* Can also be specified as an array of the * Can also be specified as an array of the
@ -481,7 +451,7 @@ class MDB2
* @access public * @access public
* @see MDB2::parseDSN * @see MDB2::parseDSN
*/ */
function &singleton($dsn = null, $options = false) static function singleton($dsn = null, $options = false)
{ {
if ($dsn) { if ($dsn) {
$dsninfo = MDB2::parseDSN($dsn); $dsninfo = MDB2::parseDSN($dsn);
@ -497,10 +467,9 @@ class MDB2
} }
} }
} elseif (is_array($GLOBALS['_MDB2_databases']) && reset($GLOBALS['_MDB2_databases'])) { } elseif (is_array($GLOBALS['_MDB2_databases']) && reset($GLOBALS['_MDB2_databases'])) {
$db =$GLOBALS['_MDB2_databases'][key($GLOBALS['_MDB2_databases'])]; return $GLOBALS['_MDB2_databases'][key($GLOBALS['_MDB2_databases'])];
return $db;
} }
$db =MDB2::factory($dsn, $options); $db = MDB2::factory($dsn, $options);
return $db; return $db;
} }
@ -535,21 +504,21 @@ class MDB2
/** /**
* load a file (like 'Date') * load a file (like 'Date')
* *
* @param string name of the file in the MDB2 directory (without '.php') * @param string $file name of the file in the MDB2 directory (without '.php')
* *
* @return string name of the file that was included * @return string name of the file that was included
* *
* @access public * @access public
*/ */
function loadFile($file) static function loadFile($file)
{ {
$file_name = 'MDB2'.DIRECTORY_SEPARATOR.$file.'.php'; $file_name = 'MDB2'.DIRECTORY_SEPARATOR.$file.'.php';
if (!MDB2::fileExists($file_name)) { if (!MDB2::fileExists($file_name)) {
return $this->raiseError(MDB2_ERROR_NOT_FOUND, null, null, return MDB2::raiseError(MDB2_ERROR_NOT_FOUND, null, null,
'unable to find: '.$file_name); 'unable to find: '.$file_name);
} }
if (!include_once($file_name)) { if (!include_once($file_name)) {
return $this->raiseError(MDB2_ERROR_NOT_FOUND, null, null, return MDB2::raiseError(MDB2_ERROR_NOT_FOUND, null, null,
'unable to load driver class: '.$file_name); 'unable to load driver class: '.$file_name);
} }
return $file_name; return $file_name;
@ -567,7 +536,7 @@ class MDB2
*/ */
function apiVersion() function apiVersion()
{ {
return '2.5.0b2'; return '2.5.0b3';
} }
// }}} // }}}
@ -597,7 +566,7 @@ class MDB2
* @access private * @access private
* @see PEAR_Error * @see PEAR_Error
*/ */
function raiseError($code = null, function &raiseError($code = null,
$mode = null, $mode = null,
$options = null, $options = null,
$userinfo = null, $userinfo = null,
@ -605,19 +574,7 @@ class MDB2
$dummy2 = null, $dummy2 = null,
$dummy3 = false) $dummy3 = false)
{ {
$err =PEAR::raiseError(null, $code, $mode, $options, $userinfo, 'MDB2_Error', true); $err =& PEAR::raiseError(null, $code, $mode, $options, $userinfo, 'MDB2_Error', true);
return $err;
}
static function raiseErrorStatic($code = null,
$mode = null,
$options = null,
$userinfo = null,
$dummy1 = null,
$dummy2 = null,
$dummy3 = false)
{
$pear=new PEAR();
$err =$pear->raiseError(null, $code, $mode, $options, $userinfo, 'MDB2_Error', true);
return $err; return $err;
} }
@ -640,14 +597,13 @@ class MDB2
static function isError($data, $code = null) static function isError($data, $code = null)
{ {
if ($data instanceof MDB2_Error) { if ($data instanceof MDB2_Error) {
if (is_null($code)) { if (null === $code) {
return true; return true;
} elseif (is_string($code)) {
return $data->getMessage() === $code;
} else {
$code = (array)$code;
return in_array($data->getCode(), $code);
} }
if (is_string($code)) {
return $data->getMessage() === $code;
}
return in_array($data->getCode(), (array)$code);
} }
return false; return false;
} }
@ -661,10 +617,9 @@ class MDB2
* @param mixed value to test * @param mixed value to test
* *
* @return bool whether $value is a MDB2 connection * @return bool whether $value is a MDB2 connection
*
* @access public * @access public
*/ */
static function isConnection($value) function isConnection($value)
{ {
return ($value instanceof MDB2_Driver_Common); return ($value instanceof MDB2_Driver_Common);
} }
@ -675,15 +630,15 @@ class MDB2
/** /**
* Tell whether a value is a MDB2 result * Tell whether a value is a MDB2 result
* *
* @param mixed value to test * @param mixed $value value to test
* *
* @return bool whether $value is a MDB2 result * @return bool whether $value is a MDB2 result
* *
* @access public * @access public
*/ */
static function isResult($value) function isResult($value)
{ {
return $value instanceof MDB2_Result; return ($value instanceof MDB2_Result);
} }
// }}} // }}}
@ -692,9 +647,9 @@ class MDB2
/** /**
* Tell whether a value is a MDB2 result implementing the common interface * Tell whether a value is a MDB2 result implementing the common interface
* *
* @param mixed value to test * @param mixed $value value to test
* *
* @return bool whether $value is a MDB2 result implementing the common interface * @return bool whether $value is a MDB2 result implementing the common interface
* *
* @access public * @access public
*/ */
@ -715,9 +670,9 @@ class MDB2
* *
* @access public * @access public
*/ */
static function isStatement($value) function isStatement($value)
{ {
return $value instanceof MDB2_Statement_Common; return ($value instanceof MDB2_Statement_Common);
} }
// }}} // }}}
@ -735,7 +690,7 @@ class MDB2
* *
* @access public * @access public
*/ */
static function errorMessage($value = null) function errorMessage($value = null)
{ {
static $errorMessages; static $errorMessages;
@ -784,7 +739,7 @@ class MDB2
); );
} }
if (is_null($value)) { if (null === $value) {
return $errorMessages; return $errorMessages;
} }
@ -905,7 +860,9 @@ class MDB2
//"username/password@[//]host[:port][/service_name]" //"username/password@[//]host[:port][/service_name]"
//e.g. "scott/tiger@//mymachine:1521/oracle" //e.g. "scott/tiger@//mymachine:1521/oracle"
$proto_opts = $dsn; $proto_opts = $dsn;
$dsn = substr($proto_opts, strrpos($proto_opts, '/') + 1); $pos = strrpos($proto_opts, '/');
$dsn = substr($proto_opts, $pos + 1);
$proto_opts = substr($proto_opts, 0, $pos);
} elseif (strpos($dsn, '/') !== false) { } elseif (strpos($dsn, '/') !== false) {
list($proto_opts, $dsn) = explode('/', $dsn, 2); list($proto_opts, $dsn) = explode('/', $dsn, 2);
} else { } else {
@ -943,7 +900,7 @@ class MDB2
} }
foreach ($opts as $opt) { foreach ($opts as $opt) {
list($key, $value) = explode('=', $opt); list($key, $value) = explode('=', $opt);
if (!isset($parsed[$key])) { if (!array_key_exists($key, $parsed) || false === $parsed[$key]) {
// don't allow params overwrite // don't allow params overwrite
$parsed[$key] = rawurldecode($value); $parsed[$key] = rawurldecode($value);
} }
@ -971,9 +928,6 @@ class MDB2
// safe_mode does notwork with is_readable() // safe_mode does notwork with is_readable()
if (!@ini_get('safe_mode')) { if (!@ini_get('safe_mode')) {
$dirs = explode(PATH_SEPARATOR, ini_get('include_path')); $dirs = explode(PATH_SEPARATOR, ini_get('include_path'));
array_unshift($dirs,OC::$SERVERROOT);
array_unshift($dirs,OC::$SERVERROOT. DIRECTORY_SEPARATOR .'inc');
// print_r($dirs);die();
foreach ($dirs as $dir) { foreach ($dirs as $dir) {
if (is_readable($dir . DIRECTORY_SEPARATOR . $file)) { if (is_readable($dir . DIRECTORY_SEPARATOR . $file)) {
return true; return true;
@ -1011,13 +965,13 @@ class MDB2_Error extends PEAR_Error
* *
* @param mixed MDB2 error code, or string with error message. * @param mixed MDB2 error code, or string with error message.
* @param int what 'error mode' to operate in * @param int what 'error mode' to operate in
* @param int what error level to use for $mode raPEAR_ERROR_TRIGGER * @param int what error level to use for $mode & PEAR_ERROR_TRIGGER
* @param mixed additional debug info, such as the last query * @param mixed additional debug info, such as the last query
*/ */
function MDB2_Error($code = MDB2_ERROR, $mode = PEAR_ERROR_RETURN, function __construct($code = MDB2_ERROR, $mode = PEAR_ERROR_RETURN,
$level = E_USER_NOTICE, $debuginfo = null, $dummy = null) $level = E_USER_NOTICE, $debuginfo = null, $dummy = null)
{ {
if (is_null($code)) { if (null === $code) {
$code = MDB2_ERROR; $code = MDB2_ERROR;
} }
$this->PEAR_Error('MDB2 Error: '.MDB2::errorMessage($code), $code, $this->PEAR_Error('MDB2 Error: '.MDB2::errorMessage($code), $code,
@ -1363,7 +1317,6 @@ class MDB2_Driver_Common extends PEAR
$this->db_index = $db_index; $this->db_index = $db_index;
} }
// }}} // }}}
// {{{ destructor: function __destruct() // {{{ destructor: function __destruct()
@ -1457,7 +1410,7 @@ class MDB2_Driver_Common extends PEAR
* @access public * @access public
* @see PEAR_Error * @see PEAR_Error
*/ */
function raiseError($code = null, function &raiseError($code = null,
$mode = null, $mode = null,
$options = null, $options = null,
$userinfo = null, $userinfo = null,
@ -1470,11 +1423,11 @@ class MDB2_Driver_Common extends PEAR
if (PEAR::isError($code)) { if (PEAR::isError($code)) {
// because we use the static PEAR::raiseError, our global // because we use the static PEAR::raiseError, our global
// handler should be used if it is set // handler should be used if it is set
if (is_null($mode) && !empty($this->_default_error_mode)) { if ((null === $mode) && !empty($this->_default_error_mode)) {
$mode = $this->_default_error_mode; $mode = $this->_default_error_mode;
$options = $this->_default_error_options; $options = $this->_default_error_options;
} }
if (is_null($userinfo)) { if (null === $userinfo) {
$userinfo = $code->getUserinfo(); $userinfo = $code->getUserinfo();
} }
$code = $code->getCode(); $code = $code->getCode();
@ -1487,14 +1440,13 @@ class MDB2_Driver_Common extends PEAR
} }
$native_errno = $native_msg = null; $native_errno = $native_msg = null;
list($code, $native_errno, $native_msg) = $this->errorInfo($code); list($code, $native_errno, $native_msg) = $this->errorInfo($code);
if (!is_null($native_errno) && $native_errno !== '') { if ((null !== $native_errno) && $native_errno !== '') {
$userinfo.= "[Native code: $native_errno]\n"; $userinfo.= "[Native code: $native_errno]\n";
} }
if (!is_null($native_msg) && $native_msg !== '') { if ((null !== $native_msg) && $native_msg !== '') {
$userinfo.= "[Native message: ". strip_tags($native_msg) ."]\n"; $userinfo.= "[Native message: ". strip_tags($native_msg) ."]\n";
} }
echo $userinfo; if (null !== $method) {
if (!is_null($method)) {
$userinfo = $method.': '.$userinfo; $userinfo = $method.': '.$userinfo;
} }
} }
@ -1502,7 +1454,7 @@ class MDB2_Driver_Common extends PEAR
$err = PEAR::raiseError(null, $code, $mode, $options, $userinfo, 'MDB2_Error', true); $err = PEAR::raiseError(null, $code, $mode, $options, $userinfo, 'MDB2_Error', true);
if ($err->getMode() !== PEAR_ERROR_RETURN if ($err->getMode() !== PEAR_ERROR_RETURN
&& isset($this->nested_transaction_counter) && !$this->has_transaction_error) { && isset($this->nested_transaction_counter) && !$this->has_transaction_error) {
$this->has_transaction_error =$err; $this->has_transaction_error = $err;
} }
return $err; return $err;
} }
@ -1883,7 +1835,7 @@ class MDB2_Driver_Common extends PEAR
} }
// }}} // }}}
// {{{ function &loadModule($module, $property = null, $phptype_specific = null) // {{{ function loadModule($module, $property = null, $phptype_specific = null)
/** /**
* loads a module * loads a module
@ -1899,7 +1851,7 @@ class MDB2_Driver_Common extends PEAR
* *
* @access public * @access public
*/ */
function &loadModule($module, $property = null, $phptype_specific = null) function loadModule($module, $property = null, $phptype_specific = null)
{ {
if (!$property) { if (!$property) {
$property = strtolower($module); $property = strtolower($module);
@ -1924,6 +1876,7 @@ class MDB2_Driver_Common extends PEAR
if (PEAR::isError($err)) { if (PEAR::isError($err)) {
return $err; return $err;
} }
// load module in a specific version // load module in a specific version
if ($version) { if ($version) {
if (method_exists($class_name, 'getClassName')) { if (method_exists($class_name, 'getClassName')) {
@ -1939,12 +1892,12 @@ class MDB2_Driver_Common extends PEAR
} }
if (!MDB2::classExists($class_name)) { if (!MDB2::classExists($class_name)) {
$err =$this->raiseError(MDB2_ERROR_LOADMODULE, null, null, $err = $this->raiseError(MDB2_ERROR_LOADMODULE, null, null,
"unable to load module '$module' into property '$property'", __FUNCTION__); "unable to load module '$module' into property '$property'", __FUNCTION__);
return $err; return $err;
} }
$this->{$property} = new $class_name($this->db_index); $this->{$property} = new $class_name($this->db_index);
$this->modules[$module] =$this->{$property}; $this->modules[$module] = $this->{$property};
if ($version) { if ($version) {
// this will be used in the connect method to determine if the module // this will be used in the connect method to determine if the module
// needs to be loaded with a different version if the server // needs to be loaded with a different version if the server
@ -1976,7 +1929,7 @@ class MDB2_Driver_Common extends PEAR
$module = $this->options['modules'][$match[1]]; $module = $this->options['modules'][$match[1]];
$method = strtolower($match[2]).$match[3]; $method = strtolower($match[2]).$match[3];
if (!isset($this->modules[$module]) || !is_object($this->modules[$module])) { if (!isset($this->modules[$module]) || !is_object($this->modules[$module])) {
$result =& $this->loadModule($module); $result = $this->loadModule($module);
if (PEAR::isError($result)) { if (PEAR::isError($result)) {
return $result; return $result;
} }
@ -1991,7 +1944,7 @@ class MDB2_Driver_Common extends PEAR
} }
} }
} }
if (!is_null($module)) { if (null !== $module) {
return call_user_func_array(array(&$this->modules[$module], $method), $params); return call_user_func_array(array(&$this->modules[$module], $method), $params);
} }
trigger_error(sprintf('Call to undefined function: %s::%s().', get_class($this), $method), E_USER_ERROR); trigger_error(sprintf('Call to undefined function: %s::%s().', get_class($this), $method), E_USER_ERROR);
@ -2098,7 +2051,7 @@ class MDB2_Driver_Common extends PEAR
* @access public * @access public
* @since 2.1.1 * @since 2.1.1
*/ */
static function setTransactionIsolation($isolation, $options = array()) function setTransactionIsolation($isolation, $options = array())
{ {
$this->debug('Setting transaction isolation level', __FUNCTION__, array('is_manip' => true)); $this->debug('Setting transaction isolation level', __FUNCTION__, array('is_manip' => true));
return $this->raiseError(MDB2_ERROR_UNSUPPORTED, null, null, return $this->raiseError(MDB2_ERROR_UNSUPPORTED, null, null,
@ -2201,7 +2154,7 @@ class MDB2_Driver_Common extends PEAR
*/ */
function failNestedTransaction($error = null, $immediately = false) function failNestedTransaction($error = null, $immediately = false)
{ {
if (is_null($error)) { if (null !== $error) {
$error = $this->has_transaction_error ? $this->has_transaction_error : true; $error = $this->has_transaction_error ? $this->has_transaction_error : true;
} elseif (!$error) { } elseif (!$error) {
$error = true; $error = true;
@ -2436,7 +2389,7 @@ class MDB2_Driver_Common extends PEAR
* *
* @access public * @access public
*/ */
function &standaloneQuery($query, $types = null, $is_manip = false) function standaloneQuery($query, $types = null, $is_manip = false)
{ {
$offset = $this->offset; $offset = $this->offset;
$limit = $this->limit; $limit = $this->limit;
@ -2448,7 +2401,7 @@ class MDB2_Driver_Common extends PEAR
return $connection; return $connection;
} }
$result =$this->_doQuery($query, $is_manip, $connection, false); $result = $this->_doQuery($query, $is_manip, $connection, false);
if (PEAR::isError($result)) { if (PEAR::isError($result)) {
return $result; return $result;
} }
@ -2457,7 +2410,7 @@ class MDB2_Driver_Common extends PEAR
$affected_rows = $this->_affectedRows($connection, $result); $affected_rows = $this->_affectedRows($connection, $result);
return $affected_rows; return $affected_rows;
} }
$result =$this->_wrapResult($result, $types, true, false, $limit, $offset); $result = $this->_wrapResult($result, $types, true, false, $limit, $offset);
return $result; return $result;
} }
@ -2495,7 +2448,7 @@ class MDB2_Driver_Common extends PEAR
* *
* @access protected * @access protected
*/ */
function &_doQuery($query, $is_manip = false, $connection = null, $database_name = null) function _doQuery($query, $is_manip = false, $connection = null, $database_name = null)
{ {
$this->last_query = $query; $this->last_query = $query;
$result = $this->debug($query, 'query', array('is_manip' => $is_manip, 'when' => 'pre')); $result = $this->debug($query, 'query', array('is_manip' => $is_manip, 'when' => 'pre'));
@ -2505,7 +2458,7 @@ class MDB2_Driver_Common extends PEAR
} }
$query = $result; $query = $result;
} }
$err =$this->raiseError(MDB2_ERROR_UNSUPPORTED, null, null, $err = $this->raiseError(MDB2_ERROR_UNSUPPORTED, null, null,
'method not implemented', __FUNCTION__); 'method not implemented', __FUNCTION__);
return $err; return $err;
} }
@ -2541,7 +2494,7 @@ class MDB2_Driver_Common extends PEAR
* *
* @access public * @access public
*/ */
function &exec($query) function exec($query)
{ {
$offset = $this->offset; $offset = $this->offset;
$limit = $this->limit; $limit = $this->limit;
@ -2553,7 +2506,7 @@ class MDB2_Driver_Common extends PEAR
return $connection; return $connection;
} }
$result =$this->_doQuery($query, true, $connection, $this->database_name); $result = $this->_doQuery($query, true, $connection, $this->database_name);
if (PEAR::isError($result)) { if (PEAR::isError($result)) {
return $result; return $result;
} }
@ -2578,7 +2531,7 @@ class MDB2_Driver_Common extends PEAR
* *
* @access public * @access public
*/ */
function &query($query, $types = null, $result_class = true, $result_wrap_class = false) function query($query, $types = null, $result_class = true, $result_wrap_class = false)
{ {
$offset = $this->offset; $offset = $this->offset;
$limit = $this->limit; $limit = $this->limit;
@ -2590,17 +2543,17 @@ class MDB2_Driver_Common extends PEAR
return $connection; return $connection;
} }
$result =$this->_doQuery($query, false, $connection, $this->database_name); $result = $this->_doQuery($query, false, $connection, $this->database_name);
if (PEAR::isError($result)) { if (PEAR::isError($result)) {
return $result; return $result;
} }
$result =$this->_wrapResult($result, $types, $result_class, $result_wrap_class, $limit, $offset); $result = $this->_wrapResult($result, $types, $result_class, $result_wrap_class, $limit, $offset);
return $result; return $result;
} }
// }}} // }}}
// {{{ function &_wrapResult($result, $types = array(), $result_class = true, $result_wrap_class = false, $limit = null, $offset = null) // {{{ function _wrapResult($result_resource, $types = array(), $result_class = true, $result_wrap_class = false, $limit = null, $offset = null)
/** /**
* wrap a result set into the correct class * wrap a result set into the correct class
@ -2617,13 +2570,13 @@ class MDB2_Driver_Common extends PEAR
* *
* @access protected * @access protected
*/ */
function &_wrapResult($result, $types = array(), $result_class = true, function _wrapResult($result_resource, $types = array(), $result_class = true,
$result_wrap_class = false, $limit = null, $offset = null) $result_wrap_class = false, $limit = null, $offset = null)
{ {
if ($types === true) { if ($types === true) {
if ($this->supports('result_introspection')) { if ($this->supports('result_introspection')) {
$this->loadModule('Reverse', null, true); $this->loadModule('Reverse', null, true);
$tableInfo = $this->reverse->tableInfo($result); $tableInfo = $this->reverse->tableInfo($result_resource);
if (PEAR::isError($tableInfo)) { if (PEAR::isError($tableInfo)) {
return $tableInfo; return $tableInfo;
} }
@ -2644,13 +2597,13 @@ class MDB2_Driver_Common extends PEAR
if ($result_class) { if ($result_class) {
$class_name = sprintf($result_class, $this->phptype); $class_name = sprintf($result_class, $this->phptype);
if (!MDB2::classExists($class_name)) { if (!MDB2::classExists($class_name)) {
$err =$this->raiseError(MDB2_ERROR_NOT_FOUND, null, null, $err = $this->raiseError(MDB2_ERROR_NOT_FOUND, null, null,
'result class does not exist '.$class_name, __FUNCTION__); 'result class does not exist '.$class_name, __FUNCTION__);
return $err; return $err;
} }
$result =new $class_name($this, $result, $limit, $offset); $result = new $class_name($this, $result_resource, $limit, $offset);
if (!MDB2::isResultCommon($result)) { if (!MDB2::isResultCommon($result)) {
$err =$this->raiseError(MDB2_ERROR_NOT_FOUND, null, null, $err = $this->raiseError(MDB2_ERROR_NOT_FOUND, null, null,
'result class is not extended from MDB2_Result_Common', __FUNCTION__); 'result class is not extended from MDB2_Result_Common', __FUNCTION__);
return $err; return $err;
} }
@ -2667,11 +2620,11 @@ class MDB2_Driver_Common extends PEAR
} }
if ($result_wrap_class) { if ($result_wrap_class) {
if (!MDB2::classExists($result_wrap_class)) { if (!MDB2::classExists($result_wrap_class)) {
$err =$this->raiseError(MDB2_ERROR_NOT_FOUND, null, null, $err = $this->raiseError(MDB2_ERROR_NOT_FOUND, null, null,
'result wrap class does not exist '.$result_wrap_class, __FUNCTION__); 'result wrap class does not exist '.$result_wrap_class, __FUNCTION__);
return $err; return $err;
} }
$result = new $result_wrap_class($result, $this->fetchmode); $result = new $result_wrap_class($result_resource, $this->fetchmode);
} }
return $result; return $result;
} }
@ -2719,7 +2672,7 @@ class MDB2_Driver_Common extends PEAR
'it was not specified a valid selected range row limit', __FUNCTION__); 'it was not specified a valid selected range row limit', __FUNCTION__);
} }
$this->limit = $limit; $this->limit = $limit;
if (!is_null($offset)) { if (null !== $offset) {
$offset = (int)$offset; $offset = (int)$offset;
if ($offset < 0) { if ($offset < 0) {
return $this->raiseError(MDB2_ERROR_SYNTAX, null, null, return $this->raiseError(MDB2_ERROR_SYNTAX, null, null,
@ -2878,7 +2831,7 @@ class MDB2_Driver_Common extends PEAR
$condition = ' WHERE '.implode(' AND ', $condition); $condition = ' WHERE '.implode(' AND ', $condition);
$query = 'DELETE FROM ' . $this->quoteIdentifier($table, true) . $condition; $query = 'DELETE FROM ' . $this->quoteIdentifier($table, true) . $condition;
$result =$this->_doQuery($query, true, $connection); $result = $this->_doQuery($query, true, $connection);
if (!PEAR::isError($result)) { if (!PEAR::isError($result)) {
$affected_rows = $this->_affectedRows($connection, $result); $affected_rows = $this->_affectedRows($connection, $result);
$insert = ''; $insert = '';
@ -2887,7 +2840,7 @@ class MDB2_Driver_Common extends PEAR
} }
$values = implode(', ', $values); $values = implode(', ', $values);
$query = 'INSERT INTO '. $this->quoteIdentifier($table, true) . "($insert) VALUES ($values)"; $query = 'INSERT INTO '. $this->quoteIdentifier($table, true) . "($insert) VALUES ($values)";
$result =$this->_doQuery($query, true, $connection); $result = $this->_doQuery($query, true, $connection);
if (!PEAR::isError($result)) { if (!PEAR::isError($result)) {
$affected_rows += $this->_affectedRows($connection, $result);; $affected_rows += $this->_affectedRows($connection, $result);;
} }
@ -2934,7 +2887,7 @@ class MDB2_Driver_Common extends PEAR
* @access public * @access public
* @see bindParam, execute * @see bindParam, execute
*/ */
function &prepare($query, $types = null, $result_types = null, $lobs = array()) function prepare($query, $types = null, $result_types = null, $lobs = array())
{ {
$is_manip = ($result_types === MDB2_PREPARE_MANIP); $is_manip = ($result_types === MDB2_PREPARE_MANIP);
$offset = $this->offset; $offset = $this->offset;
@ -2964,7 +2917,7 @@ class MDB2_Driver_Common extends PEAR
} else { } else {
break; break;
} }
if (is_null($placeholder_type)) { if (null === $placeholder_type) {
$placeholder_type_guess = $query[$p_position]; $placeholder_type_guess = $query[$p_position];
} }
@ -2978,7 +2931,7 @@ class MDB2_Driver_Common extends PEAR
} }
if ($query[$position] == $placeholder_type_guess) { if ($query[$position] == $placeholder_type_guess) {
if (is_null($placeholder_type)) { if (null === $placeholder_type) {
$placeholder_type = $query[$p_position]; $placeholder_type = $query[$p_position];
$question = $colon = $placeholder_type; $question = $colon = $placeholder_type;
if (!empty($types) && is_array($types)) { if (!empty($types) && is_array($types)) {
@ -2997,7 +2950,7 @@ class MDB2_Driver_Common extends PEAR
$regexp = '/^.{'.($position+1).'}('.$this->options['bindname_format'].').*$/s'; $regexp = '/^.{'.($position+1).'}('.$this->options['bindname_format'].').*$/s';
$parameter = preg_replace($regexp, '\\1', $query); $parameter = preg_replace($regexp, '\\1', $query);
if ($parameter === '') { if ($parameter === '') {
$err =$this->raiseError(MDB2_ERROR_SYNTAX, null, null, $err = $this->raiseError(MDB2_ERROR_SYNTAX, null, null,
'named parameter name must match "bindname_format" option', __FUNCTION__); 'named parameter name must match "bindname_format" option', __FUNCTION__);
return $err; return $err;
} }
@ -3042,7 +2995,8 @@ class MDB2_Driver_Common extends PEAR
*/ */
function _skipDelimitedStrings($query, $position, $p_position) function _skipDelimitedStrings($query, $position, $p_position)
{ {
$ignores = $this->string_quoting; $ignores = array();
$ignores[] = $this->string_quoting;
$ignores[] = $this->identifier_quoting; $ignores[] = $this->identifier_quoting;
$ignores = array_merge($ignores, $this->sql_comments); $ignores = array_merge($ignores, $this->sql_comments);
@ -3055,7 +3009,7 @@ class MDB2_Driver_Common extends PEAR
if ($ignore['end'] === "\n") { if ($ignore['end'] === "\n") {
$end_quote = strlen($query) - 1; $end_quote = strlen($query) - 1;
} else { } else {
$err =$this->raiseError(MDB2_ERROR_SYNTAX, null, null, $err = $this->raiseError(MDB2_ERROR_SYNTAX, null, null,
'query with an unterminated text string specified', __FUNCTION__); 'query with an unterminated text string specified', __FUNCTION__);
return $err; return $err;
} }
@ -3440,20 +3394,19 @@ class MDB2_Result_Common extends MDB2_Result
var $column_names; var $column_names;
// }}} // }}}
// {{{ constructor: function __construct(&$db, &$result, $limit = 0, $offset = 0) // {{{ constructor: function __construct($db, &$result, $limit = 0, $offset = 0)
/** /**
* Constructor * Constructor
*/ */
function __construct(&$db, &$result, $limit = 0, $offset = 0) function __construct($db, &$result, $limit = 0, $offset = 0)
{ {
$this->db =$db; $this->db = $db;
$this->result =$result; $this->result = $result;
$this->offset = $offset; $this->offset = $offset;
$this->limit = max(0, $limit - 1); $this->limit = max(0, $limit - 1);
} }
// }}} // }}}
// {{{ function setResultTypes($types) // {{{ function setResultTypes($types)
@ -3530,9 +3483,9 @@ class MDB2_Result_Common extends MDB2_Result
* *
* @access public * @access public
*/ */
function &fetchRow($fetchmode = MDB2_FETCHMODE_DEFAULT, $rownum = null) function fetchRow($fetchmode = MDB2_FETCHMODE_DEFAULT, $rownum = null)
{ {
$err =$this->db->raiseError(MDB2_ERROR_UNSUPPORTED, null, null, $err = $this->db->raiseError(MDB2_ERROR_UNSUPPORTED, null, null,
'method not implemented', __FUNCTION__); 'method not implemented', __FUNCTION__);
return $err; return $err;
} }
@ -3632,7 +3585,7 @@ class MDB2_Result_Common extends MDB2_Result
} }
$shift_array = $rekey ? false : null; $shift_array = $rekey ? false : null;
if (!is_null($shift_array)) { if (null !== $shift_array) {
if (is_object($row)) { if (is_object($row)) {
$colnum = count(get_object_vars($row)); $colnum = count(get_object_vars($row));
} else { } else {
@ -3837,8 +3790,8 @@ class MDB2_Result_Common extends MDB2_Result
} }
$column = $column_names[$column]; $column = $column_names[$column];
} }
$this->values[$column] =$value; $this->values[$column] =& $value;
if (!is_null($type)) { if (null !== $type) {
$this->types[$column] = $type; $this->types[$column] = $type;
} }
return MDB2_OK; return MDB2_OK;
@ -3911,6 +3864,8 @@ class MDB2_Row
$this->$key = &$row[$key]; $this->$key = &$row[$key];
} }
} }
// }}}
} }
// }}} // }}}
@ -3938,15 +3893,15 @@ class MDB2_Statement_Common
var $is_manip; var $is_manip;
// }}} // }}}
// {{{ constructor: function __construct(&$db, &$statement, $positions, $query, $types, $result_types, $is_manip = false, $limit = null, $offset = null) // {{{ constructor: function __construct($db, $statement, $positions, $query, $types, $result_types, $is_manip = false, $limit = null, $offset = null)
/** /**
* Constructor * Constructor
*/ */
function __construct(&$db, &$statement, $positions, $query, $types, $result_types, $is_manip = false, $limit = null, $offset = null) function __construct($db, $statement, $positions, $query, $types, $result_types, $is_manip = false, $limit = null, $offset = null)
{ {
$this->db =$db; $this->db = $db;
$this->statement =$statement; $this->statement = $statement;
$this->positions = $positions; $this->positions = $positions;
$this->query = $query; $this->query = $query;
$this->types = (array)$types; $this->types = (array)$types;
@ -3956,7 +3911,6 @@ class MDB2_Statement_Common
$this->offset = $offset; $this->offset = $offset;
} }
// }}} // }}}
// {{{ function bindValue($parameter, &$value, $type = null) // {{{ function bindValue($parameter, &$value, $type = null)
@ -3983,7 +3937,7 @@ class MDB2_Statement_Common
'Unable to bind to missing placeholder: '.$parameter, __FUNCTION__); 'Unable to bind to missing placeholder: '.$parameter, __FUNCTION__);
} }
$this->values[$parameter] = $value; $this->values[$parameter] = $value;
if (!is_null($type)) { if (null !== $type) {
$this->types[$parameter] = $type; $this->types[$parameter] = $type;
} }
return MDB2_OK; return MDB2_OK;
@ -4051,8 +4005,8 @@ class MDB2_Statement_Common
return $this->db->raiseError(MDB2_ERROR_NOT_FOUND, null, null, return $this->db->raiseError(MDB2_ERROR_NOT_FOUND, null, null,
'Unable to bind to missing placeholder: '.$parameter, __FUNCTION__); 'Unable to bind to missing placeholder: '.$parameter, __FUNCTION__);
} }
$this->values[$parameter] =$value; $this->values[$parameter] =& $value;
if (!is_null($type)) { if (null !== $type) {
$this->types[$parameter] = $type; $this->types[$parameter] = $type;
} }
return MDB2_OK; return MDB2_OK;
@ -4103,9 +4057,9 @@ class MDB2_Statement_Common
* a MDB2 error on failure * a MDB2 error on failure
* @access public * @access public
*/ */
function &execute($values = null, $result_class = true, $result_wrap_class = false) function execute($values = null, $result_class = true, $result_wrap_class = false)
{ {
if (is_null($this->positions)) { if (null === $this->positions) {
return $this->db->raiseError(MDB2_ERROR, null, null, return $this->db->raiseError(MDB2_ERROR, null, null,
'Prepared statement has already been freed', __FUNCTION__); 'Prepared statement has already been freed', __FUNCTION__);
} }
@ -4118,12 +4072,12 @@ class MDB2_Statement_Common
'Binding Values failed with message: ' . $err->getMessage(), __FUNCTION__); 'Binding Values failed with message: ' . $err->getMessage(), __FUNCTION__);
} }
} }
$result =$this->_execute($result_class, $result_wrap_class); $result = $this->_execute($result_class, $result_wrap_class);
return $result; return $result;
} }
// }}} // }}}
// {{{ function &_execute($result_class = true, $result_wrap_class = false) // {{{ function _execute($result_class = true, $result_wrap_class = false)
/** /**
* Execute a prepared query statement helper method. * Execute a prepared query statement helper method.
@ -4135,7 +4089,7 @@ class MDB2_Statement_Common
* a MDB2 error on failure * a MDB2 error on failure
* @access private * @access private
*/ */
function &_execute($result_class = true, $result_wrap_class = false) function _execute($result_class = true, $result_wrap_class = false)
{ {
$this->last_query = $this->query; $this->last_query = $this->query;
$query = ''; $query = '';
@ -4166,7 +4120,7 @@ class MDB2_Statement_Common
if ($this->is_manip) { if ($this->is_manip) {
$result = $this->db->exec($query); $result = $this->db->exec($query);
} else { } else {
$result =$this->db->query($query, $this->result_types, $result_class, $result_wrap_class); $result = $this->db->query($query, $this->result_types, $result_class, $result_wrap_class);
} }
return $result; return $result;
} }
@ -4183,7 +4137,7 @@ class MDB2_Statement_Common
*/ */
function free() function free()
{ {
if (is_null($this->positions)) { if (null === $this->positions) {
return $this->db->raiseError(MDB2_ERROR, null, null, return $this->db->raiseError(MDB2_ERROR, null, null,
'Prepared statement has already been freed', __FUNCTION__); 'Prepared statement has already been freed', __FUNCTION__);
} }
@ -4239,7 +4193,7 @@ class MDB2_Module_Common
} }
// }}} // }}}
// {{{ function &getDBInstance() // {{{ function getDBInstance()
/** /**
* Get the instance of MDB2 associated with the module instance * Get the instance of MDB2 associated with the module instance
@ -4251,9 +4205,9 @@ class MDB2_Module_Common
function getDBInstance() function getDBInstance()
{ {
if (isset($GLOBALS['_MDB2_databases'][$this->db_index])) { if (isset($GLOBALS['_MDB2_databases'][$this->db_index])) {
$result =$GLOBALS['_MDB2_databases'][$this->db_index]; $result = $GLOBALS['_MDB2_databases'][$this->db_index];
} else { } else {
$result =$this->raiseError(MDB2_ERROR_NOT_FOUND, null, null, $result = MDB2::raiseError(MDB2_ERROR_NOT_FOUND, null, null,
'could not find MDB2 instance'); 'could not find MDB2 instance');
} }
return $result; return $result;

View File

@ -42,7 +42,7 @@
// | Author: Lukas Smith <smith@pooteeweet.org> | // | Author: Lukas Smith <smith@pooteeweet.org> |
// +----------------------------------------------------------------------+ // +----------------------------------------------------------------------+
// //
// $Id: Date.php,v 1.10 2006/03/01 12:15:32 lsmith Exp $ // $Id: Date.php 208329 2006-03-01 12:15:38Z lsmith $
// //
/** /**

View File

@ -42,9 +42,9 @@
// | Author: Lukas Smith <smith@pooteeweet.org> | // | Author: Lukas Smith <smith@pooteeweet.org> |
// +----------------------------------------------------------------------+ // +----------------------------------------------------------------------+
// //
// $Id: Common.php,v 1.139 2008/12/04 11:50:42 afz Exp $ // $Id: Common.php 300551 2010-06-17 21:54:16Z quipo $
require_once('MDB2/LOB.php'); require_once 'MDB2/LOB.php';
/** /**
* @package MDB2 * @package MDB2
@ -100,7 +100,7 @@ class MDB2_Driver_Datatype_Common extends MDB2_Module_Common
function getValidTypes() function getValidTypes()
{ {
$types = $this->valid_default_values; $types = $this->valid_default_values;
$db =$this->getDBInstance(); $db = $this->getDBInstance();
if (PEAR::isError($db)) { if (PEAR::isError($db)) {
return $db; return $db;
} }
@ -145,7 +145,7 @@ class MDB2_Driver_Datatype_Common extends MDB2_Module_Common
$types = is_array($types) ? $types : array($types); $types = is_array($types) ? $types : array($types);
foreach ($types as $key => $type) { foreach ($types as $key => $type) {
if (!isset($this->valid_default_values[$type])) { if (!isset($this->valid_default_values[$type])) {
$db =$this->getDBInstance(); $db = $this->getDBInstance();
if (PEAR::isError($db)) { if (PEAR::isError($db)) {
return $db; return $db;
} }
@ -209,7 +209,7 @@ class MDB2_Driver_Datatype_Common extends MDB2_Module_Common
return fopen('MDB2LOB://'.$lob_index.'@'.$this->db_index, 'r+'); return fopen('MDB2LOB://'.$lob_index.'@'.$this->db_index, 'r+');
} }
$db =$this->getDBInstance(); $db = $this->getDBInstance();
if (PEAR::isError($db)) { if (PEAR::isError($db)) {
return $db; return $db;
} }
@ -232,10 +232,10 @@ class MDB2_Driver_Datatype_Common extends MDB2_Module_Common
*/ */
function convertResult($value, $type, $rtrim = true) function convertResult($value, $type, $rtrim = true)
{ {
if (is_null($value)) { if (null === $value) {
return null; return null;
} }
$db =$this->getDBInstance(); $db = $this->getDBInstance();
if (PEAR::isError($db)) { if (PEAR::isError($db)) {
return $db; return $db;
} }
@ -313,7 +313,7 @@ class MDB2_Driver_Datatype_Common extends MDB2_Module_Common
if (count($types)) { if (count($types)) {
reset($types); reset($types);
foreach (array_keys($sorted_types) as $k) { foreach (array_keys($sorted_types) as $k) {
if (is_null($sorted_types[$k])) { if (null === $sorted_types[$k]) {
$sorted_types[$k] = current($types); $sorted_types[$k] = current($types);
next($types); next($types);
} }
@ -338,7 +338,7 @@ class MDB2_Driver_Datatype_Common extends MDB2_Module_Common
*/ */
function getDeclaration($type, $name, $field) function getDeclaration($type, $name, $field)
{ {
$db =$this->getDBInstance(); $db = $this->getDBInstance();
if (PEAR::isError($db)) { if (PEAR::isError($db)) {
return $db; return $db;
} }
@ -387,7 +387,7 @@ class MDB2_Driver_Datatype_Common extends MDB2_Module_Common
*/ */
function getTypeDeclaration($field) function getTypeDeclaration($field)
{ {
$db =$this->getDBInstance(); $db = $this->getDBInstance();
if (PEAR::isError($db)) { if (PEAR::isError($db)) {
return $db; return $db;
} }
@ -453,7 +453,7 @@ class MDB2_Driver_Datatype_Common extends MDB2_Module_Common
*/ */
function _getDeclaration($name, $field) function _getDeclaration($name, $field)
{ {
$db =$this->getDBInstance(); $db = $this->getDBInstance();
if (PEAR::isError($db)) { if (PEAR::isError($db)) {
return $db; return $db;
} }
@ -501,20 +501,23 @@ class MDB2_Driver_Datatype_Common extends MDB2_Module_Common
$default = ''; $default = '';
if (array_key_exists('default', $field)) { if (array_key_exists('default', $field)) {
if ($field['default'] === '') { if ($field['default'] === '') {
$db =$this->getDBInstance(); $db = $this->getDBInstance();
if (PEAR::isError($db)) { if (PEAR::isError($db)) {
return $db; return $db;
} }
$valid_default_values = $this->getValidTypes(); $valid_default_values = $this->getValidTypes();
$field['default'] = $valid_default_values[$field['type']]; $field['default'] = $valid_default_values[$field['type']];
if ($field['default'] === ''&& ($db->options['portability'] & MDB2_PORTABILITY_EMPTY_TO_NULL)) { if ($field['default'] === '' && ($db->options['portability'] & MDB2_PORTABILITY_EMPTY_TO_NULL)) {
$field['default'] = ' '; $field['default'] = ' ';
} }
} }
if (!is_null($field['default'])) { if (null !== $field['default']) {
$default = ' DEFAULT ' . $this->quote($field['default'], $field['type']); $default = ' DEFAULT ' . $this->quote($field['default'], $field['type']);
} }
} }
if (empty($default) && empty($notnull)) {
$default = ' DEFAULT NULL';
}
$collation = empty($field['collation']) ? '' : $collation = empty($field['collation']) ? '' :
' '.$this->_getCollationFieldDeclaration($field['collation']); ' '.$this->_getCollationFieldDeclaration($field['collation']);
@ -583,7 +586,7 @@ class MDB2_Driver_Datatype_Common extends MDB2_Module_Common
function _getIntegerDeclaration($name, $field) function _getIntegerDeclaration($name, $field)
{ {
if (!empty($field['unsigned'])) { if (!empty($field['unsigned'])) {
$db =$this->getDBInstance(); $db = $this->getDBInstance();
if (PEAR::isError($db)) { if (PEAR::isError($db)) {
return $db; return $db;
} }
@ -651,7 +654,7 @@ class MDB2_Driver_Datatype_Common extends MDB2_Module_Common
*/ */
function _getCLOBDeclaration($name, $field) function _getCLOBDeclaration($name, $field)
{ {
$db =$this->getDBInstance(); $db = $this->getDBInstance();
if (PEAR::isError($db)) { if (PEAR::isError($db)) {
return $db; return $db;
} }
@ -687,7 +690,7 @@ class MDB2_Driver_Datatype_Common extends MDB2_Module_Common
*/ */
function _getBLOBDeclaration($name, $field) function _getBLOBDeclaration($name, $field)
{ {
$db =$this->getDBInstance(); $db = $this->getDBInstance();
if (PEAR::isError($db)) { if (PEAR::isError($db)) {
return $db; return $db;
} }
@ -875,7 +878,7 @@ class MDB2_Driver_Datatype_Common extends MDB2_Module_Common
$type = !empty($current['type']) ? $current['type'] : null; $type = !empty($current['type']) ? $current['type'] : null;
if (!method_exists($this, "_compare{$type}Definition")) { if (!method_exists($this, "_compare{$type}Definition")) {
$db =$this->getDBInstance(); $db = $this->getDBInstance();
if (PEAR::isError($db)) { if (PEAR::isError($db)) {
return $db; return $db;
} }
@ -1114,12 +1117,12 @@ class MDB2_Driver_Datatype_Common extends MDB2_Module_Common
*/ */
function quote($value, $type = null, $quote = true, $escape_wildcards = false) function quote($value, $type = null, $quote = true, $escape_wildcards = false)
{ {
$db =$this->getDBInstance(); $db = $this->getDBInstance();
if (PEAR::isError($db)) { if (PEAR::isError($db)) {
return $db; return $db;
} }
if (is_null($value) if ((null === $value)
|| ($value === '' && $db->options['portability'] & MDB2_PORTABILITY_EMPTY_TO_NULL) || ($value === '' && $db->options['portability'] & MDB2_PORTABILITY_EMPTY_TO_NULL)
) { ) {
if (!$quote) { if (!$quote) {
@ -1128,7 +1131,7 @@ class MDB2_Driver_Datatype_Common extends MDB2_Module_Common
return 'NULL'; return 'NULL';
} }
if (is_null($type)) { if (null === $type) {
switch (gettype($value)) { switch (gettype($value)) {
case 'integer': case 'integer':
$type = 'integer'; $type = 'integer';
@ -1218,7 +1221,7 @@ class MDB2_Driver_Datatype_Common extends MDB2_Module_Common
return $value; return $value;
} }
$db =$this->getDBInstance(); $db = $this->getDBInstance();
if (PEAR::isError($db)) { if (PEAR::isError($db)) {
return $db; return $db;
} }
@ -1247,14 +1250,14 @@ class MDB2_Driver_Datatype_Common extends MDB2_Module_Common
$close = false; $close = false;
if (preg_match('/^(\w+:\/\/)(.*)$/', $value, $match)) { if (preg_match('/^(\w+:\/\/)(.*)$/', $value, $match)) {
$close = true; $close = true;
if ($match[1] == 'file://') { if (strtolower($match[1]) == 'file://') {
$value = $match[2]; $value = $match[2];
} }
$value = @fopen($value, 'r'); $value = @fopen($value, 'r');
} }
if (is_resource($value)) { if (is_resource($value)) {
$db =$this->getDBInstance(); $db = $this->getDBInstance();
if (PEAR::isError($db)) { if (PEAR::isError($db)) {
return $db; return $db;
} }
@ -1288,9 +1291,15 @@ class MDB2_Driver_Datatype_Common extends MDB2_Module_Common
*/ */
function _quoteLOB($value, $quote, $escape_wildcards) function _quoteLOB($value, $quote, $escape_wildcards)
{ {
$value = $this->_readFile($value); $db = $this->getDBInstance();
if (PEAR::isError($value)) { if (PEAR::isError($db)) {
return $value; return $db;
}
if ($db->options['lob_allow_url_include']) {
$value = $this->_readFile($value);
if (PEAR::isError($value)) {
return $value;
}
} }
return $this->_quoteText($value, $quote, $escape_wildcards); return $this->_quoteText($value, $quote, $escape_wildcards);
} }
@ -1369,7 +1378,7 @@ class MDB2_Driver_Datatype_Common extends MDB2_Module_Common
function _quoteDate($value, $quote, $escape_wildcards) function _quoteDate($value, $quote, $escape_wildcards)
{ {
if ($value === 'CURRENT_DATE') { if ($value === 'CURRENT_DATE') {
$db =$this->getDBInstance(); $db = $this->getDBInstance();
if (PEAR::isError($db)) { if (PEAR::isError($db)) {
return $db; return $db;
} }
@ -1398,7 +1407,7 @@ class MDB2_Driver_Datatype_Common extends MDB2_Module_Common
function _quoteTimestamp($value, $quote, $escape_wildcards) function _quoteTimestamp($value, $quote, $escape_wildcards)
{ {
if ($value === 'CURRENT_TIMESTAMP') { if ($value === 'CURRENT_TIMESTAMP') {
$db =$this->getDBInstance(); $db = $this->getDBInstance();
if (PEAR::isError($db)) { if (PEAR::isError($db)) {
return $db; return $db;
} }
@ -1427,7 +1436,7 @@ class MDB2_Driver_Datatype_Common extends MDB2_Module_Common
function _quoteTime($value, $quote, $escape_wildcards) function _quoteTime($value, $quote, $escape_wildcards)
{ {
if ($value === 'CURRENT_TIME') { if ($value === 'CURRENT_TIME') {
$db =$this->getDBInstance(); $db = $this->getDBInstance();
if (PEAR::isError($db)) { if (PEAR::isError($db)) {
return $db; return $db;
} }
@ -1517,7 +1526,7 @@ class MDB2_Driver_Datatype_Common extends MDB2_Module_Common
*/ */
function writeLOBToFile($lob, $file) function writeLOBToFile($lob, $file)
{ {
$db =$this->getDBInstance(); $db = $this->getDBInstance();
if (PEAR::isError($db)) { if (PEAR::isError($db)) {
return $db; return $db;
} }
@ -1554,7 +1563,7 @@ class MDB2_Driver_Datatype_Common extends MDB2_Module_Common
*/ */
function _retrieveLOB(&$lob) function _retrieveLOB(&$lob)
{ {
if (is_null($lob['value'])) { if (null === $lob['value']) {
$lob['value'] = $lob['resource']; $lob['value'] = $lob['resource'];
} }
$lob['loaded'] = true; $lob['loaded'] = true;
@ -1681,27 +1690,38 @@ class MDB2_Driver_Datatype_Common extends MDB2_Module_Common
*/ */
function matchPattern($pattern, $operator = null, $field = null) function matchPattern($pattern, $operator = null, $field = null)
{ {
$db =$this->getDBInstance(); $db = $this->getDBInstance();
if (PEAR::isError($db)) { if (PEAR::isError($db)) {
return $db; return $db;
} }
$match = ''; $match = '';
if (!is_null($operator)) { if (null !== $operator) {
$operator = strtoupper($operator); $operator = strtoupper($operator);
switch ($operator) { switch ($operator) {
// case insensitive // case insensitive
case 'ILIKE': case 'ILIKE':
if (is_null($field)) { if (null === $field) {
return $db->raiseError(MDB2_ERROR_UNSUPPORTED, null, null, return $db->raiseError(MDB2_ERROR_UNSUPPORTED, null, null,
'case insensitive LIKE matching requires passing the field name', __FUNCTION__); 'case insensitive LIKE matching requires passing the field name', __FUNCTION__);
} }
$db->loadModule('Function', null, true); $db->loadModule('Function', null, true);
$match = $db->function->lower($field).' LIKE '; $match = $db->function->lower($field).' LIKE ';
break; break;
case 'NOT ILIKE':
if (null === $field) {
return $db->raiseError(MDB2_ERROR_UNSUPPORTED, null, null,
'case insensitive NOT ILIKE matching requires passing the field name', __FUNCTION__);
}
$db->loadModule('Function', null, true);
$match = $db->function->lower($field).' NOT LIKE ';
break;
// case sensitive // case sensitive
case 'LIKE': case 'LIKE':
$match = is_null($field) ? 'LIKE ' : $field.' LIKE '; $match = (null === $field) ? 'LIKE ' : ($field.' LIKE ');
break;
case 'NOT LIKE':
$match = (null === $field) ? 'NOT LIKE ' : ($field.' NOT LIKE ');
break; break;
default: default:
return $db->raiseError(MDB2_ERROR_UNSUPPORTED, null, null, return $db->raiseError(MDB2_ERROR_UNSUPPORTED, null, null,
@ -1713,9 +1733,6 @@ class MDB2_Driver_Datatype_Common extends MDB2_Module_Common
if ($key % 2) { if ($key % 2) {
$match.= $value; $match.= $value;
} else { } else {
if ($operator === 'ILIKE') {
$value = strtolower($value);
}
$escaped = $db->escape($value); $escaped = $db->escape($value);
if (PEAR::isError($escaped)) { if (PEAR::isError($escaped)) {
return $escaped; return $escaped;
@ -1755,7 +1772,7 @@ class MDB2_Driver_Datatype_Common extends MDB2_Module_Common
*/ */
function mapNativeDatatype($field) function mapNativeDatatype($field)
{ {
$db =$this->getDBInstance(); $db = $this->getDBInstance();
if (PEAR::isError($db)) { if (PEAR::isError($db)) {
return $db; return $db;
} }
@ -1784,7 +1801,7 @@ class MDB2_Driver_Datatype_Common extends MDB2_Module_Common
*/ */
function _mapNativeDatatype($field) function _mapNativeDatatype($field)
{ {
$db =$this->getDBInstance(); $db = $this->getDBInstance();
if (PEAR::isError($db)) { if (PEAR::isError($db)) {
return $db; return $db;
} }
@ -1805,7 +1822,7 @@ class MDB2_Driver_Datatype_Common extends MDB2_Module_Common
*/ */
function mapPrepareDatatype($type) function mapPrepareDatatype($type)
{ {
$db =$this->getDBInstance(); $db = $this->getDBInstance();
if (PEAR::isError($db)) { if (PEAR::isError($db)) {
return $db; return $db;
} }

View File

@ -43,10 +43,10 @@
// | Author: Lukas Smith <smith@pooteeweet.org> | // | Author: Lukas Smith <smith@pooteeweet.org> |
// +----------------------------------------------------------------------+ // +----------------------------------------------------------------------+
// //
// $Id: mysql.php,v 1.65 2008/02/22 19:23:49 quipo Exp $ // $Id: mysql.php 295587 2010-02-28 17:16:38Z quipo $
// //
require_once('MDB2/Driver/Datatype/Common.php'); require_once 'MDB2/Driver/Datatype/Common.php';
/** /**
* MDB2 MySQL driver * MDB2 MySQL driver
@ -116,7 +116,7 @@ class MDB2_Driver_Datatype_mysql extends MDB2_Driver_Datatype_Common
*/ */
function getTypeDeclaration($field) function getTypeDeclaration($field)
{ {
$db =$this->getDBInstance(); $db = $this->getDBInstance();
if (PEAR::isError($db)) { if (PEAR::isError($db)) {
return $db; return $db;
} }
@ -219,7 +219,7 @@ class MDB2_Driver_Datatype_mysql extends MDB2_Driver_Datatype_Common
*/ */
function _getIntegerDeclaration($name, $field) function _getIntegerDeclaration($name, $field)
{ {
$db =$this->getDBInstance(); $db = $this->getDBInstance();
if (PEAR::isError($db)) { if (PEAR::isError($db)) {
return $db; return $db;
} }
@ -236,6 +236,9 @@ class MDB2_Driver_Datatype_mysql extends MDB2_Driver_Datatype_Common
$notnull = empty($field['notnull']) ? '' : ' NOT NULL'; $notnull = empty($field['notnull']) ? '' : ' NOT NULL';
$unsigned = empty($field['unsigned']) ? '' : ' UNSIGNED'; $unsigned = empty($field['unsigned']) ? '' : ' UNSIGNED';
if (empty($default) && empty($notnull)) {
$default = ' DEFAULT NULL';
}
$name = $db->quoteIdentifier($name, true); $name = $db->quoteIdentifier($name, true);
return $name.' '.$this->getTypeDeclaration($field).$unsigned.$default.$notnull.$autoinc; return $name.' '.$this->getTypeDeclaration($field).$unsigned.$default.$notnull.$autoinc;
} }
@ -308,7 +311,7 @@ class MDB2_Driver_Datatype_mysql extends MDB2_Driver_Datatype_Common
*/ */
function _getDecimalDeclaration($name, $field) function _getDecimalDeclaration($name, $field)
{ {
$db =$this->getDBInstance(); $db = $this->getDBInstance();
if (PEAR::isError($db)) { if (PEAR::isError($db)) {
return $db; return $db;
} }
@ -346,24 +349,30 @@ class MDB2_Driver_Datatype_mysql extends MDB2_Driver_Datatype_Common
*/ */
function matchPattern($pattern, $operator = null, $field = null) function matchPattern($pattern, $operator = null, $field = null)
{ {
$db =$this->getDBInstance(); $db = $this->getDBInstance();
if (PEAR::isError($db)) { if (PEAR::isError($db)) {
return $db; return $db;
} }
$match = ''; $match = '';
if (!is_null($operator)) { if (null !== $operator) {
$field = is_null($field) ? '' : $field.' '; $field = (null === $field) ? '' : $field.' ';
$operator = strtoupper($operator); $operator = strtoupper($operator);
switch ($operator) { switch ($operator) {
// case insensitive // case insensitive
case 'ILIKE': case 'ILIKE':
$match = $field.'LIKE '; $match = $field.'LIKE ';
break; break;
case 'NOT ILIKE':
$match = $field.'NOT LIKE ';
break;
// case sensitive // case sensitive
case 'LIKE': case 'LIKE':
$match = $field.'LIKE BINARY '; $match = $field.'LIKE BINARY ';
break; break;
case 'NOT LIKE':
$match = $field.'NOT LIKE BINARY ';
break;
default: default:
return $db->raiseError(MDB2_ERROR_UNSUPPORTED, null, null, return $db->raiseError(MDB2_ERROR_UNSUPPORTED, null, null,
'not a supported operator type:'. $operator, __FUNCTION__); 'not a supported operator type:'. $operator, __FUNCTION__);
@ -531,7 +540,7 @@ class MDB2_Driver_Datatype_mysql extends MDB2_Driver_Datatype_Common
$length = null; $length = null;
break; break;
default: default:
$db =$this->getDBInstance(); $db = $this->getDBInstance();
if (PEAR::isError($db)) { if (PEAR::isError($db)) {
return $db; return $db;
} }

View File

@ -42,9 +42,9 @@
// | Author: Paul Cooper <pgc@ucecom.com> | // | Author: Paul Cooper <pgc@ucecom.com> |
// +----------------------------------------------------------------------+ // +----------------------------------------------------------------------+
// //
// $Id: pgsql.php,v 1.93 2008/08/28 20:32:57 afz Exp $ // $Id: pgsql.php 298763 2010-04-29 08:49:41Z afz $
require_once('MDB2/Driver/Datatype/Common.php'); require_once 'MDB2/Driver/Datatype/Common.php';
/** /**
* MDB2 PostGreSQL driver * MDB2 PostGreSQL driver
@ -68,7 +68,7 @@ class MDB2_Driver_Datatype_pgsql extends MDB2_Driver_Datatype_Common
*/ */
function _baseConvertResult($value, $type, $rtrim = true) function _baseConvertResult($value, $type, $rtrim = true)
{ {
if (is_null($value)) { if (null === $value) {
return null; return null;
} }
switch ($type) { switch ($type) {
@ -117,7 +117,7 @@ class MDB2_Driver_Datatype_pgsql extends MDB2_Driver_Datatype_Common
*/ */
function getTypeDeclaration($field) function getTypeDeclaration($field)
{ {
$db =$this->getDBInstance(); $db = $this->getDBInstance();
if (PEAR::isError($db)) { if (PEAR::isError($db)) {
return $db; return $db;
} }
@ -198,7 +198,7 @@ class MDB2_Driver_Datatype_pgsql extends MDB2_Driver_Datatype_Common
*/ */
function _getIntegerDeclaration($name, $field) function _getIntegerDeclaration($name, $field)
{ {
$db =$this->getDBInstance(); $db = $this->getDBInstance();
if (PEAR::isError($db)) { if (PEAR::isError($db)) {
return $db; return $db;
} }
@ -219,6 +219,9 @@ class MDB2_Driver_Datatype_pgsql extends MDB2_Driver_Datatype_Common
} }
$notnull = empty($field['notnull']) ? '' : ' NOT NULL'; $notnull = empty($field['notnull']) ? '' : ' NOT NULL';
if (empty($default) && empty($notnull)) {
$default = ' DEFAULT NULL';
}
$name = $db->quoteIdentifier($name, true); $name = $db->quoteIdentifier($name, true);
return $name.' '.$this->getTypeDeclaration($field).$default.$notnull; return $name.' '.$this->getTypeDeclaration($field).$default.$notnull;
} }
@ -239,6 +242,14 @@ class MDB2_Driver_Datatype_pgsql extends MDB2_Driver_Datatype_Common
*/ */
function _quoteCLOB($value, $quote, $escape_wildcards) function _quoteCLOB($value, $quote, $escape_wildcards)
{ {
$db = $this->getDBInstance();
if (PEAR::isError($db)) {
return $db;
}
$value = $this->_readFile($value, $db->options['lob_allow_url_include']);
if (PEAR::isError($value)) {
return $value;
}
return $this->_quoteText($value, $quote, $escape_wildcards); return $this->_quoteText($value, $quote, $escape_wildcards);
} }
@ -261,11 +272,15 @@ class MDB2_Driver_Datatype_pgsql extends MDB2_Driver_Datatype_Common
if (!$quote) { if (!$quote) {
return $value; return $value;
} }
$db = $this->getDBInstance();
if (PEAR::isError($db)) {
return $db;
}
$value = $this->_readFile($value, $db->options['lob_allow_url_include']);
if (PEAR::isError($value)) {
return $value;
}
if (version_compare(PHP_VERSION, '5.2.0RC6', '>=')) { if (version_compare(PHP_VERSION, '5.2.0RC6', '>=')) {
$db =$this->getDBInstance();
if (PEAR::isError($db)) {
return $db;
}
$connection = $db->getConnection(); $connection = $db->getConnection();
if (PEAR::isError($connection)) { if (PEAR::isError($connection)) {
return $connection; return $connection;
@ -317,24 +332,30 @@ class MDB2_Driver_Datatype_pgsql extends MDB2_Driver_Datatype_Common
*/ */
function matchPattern($pattern, $operator = null, $field = null) function matchPattern($pattern, $operator = null, $field = null)
{ {
$db =$this->getDBInstance(); $db = $this->getDBInstance();
if (PEAR::isError($db)) { if (PEAR::isError($db)) {
return $db; return $db;
} }
$match = ''; $match = '';
if (!is_null($operator)) { if (null !== $operator) {
$field = is_null($field) ? '' : $field.' '; $field = (null === $field) ? '' : $field.' ';
$operator = strtoupper($operator); $operator = strtoupper($operator);
switch ($operator) { switch ($operator) {
// case insensitive // case insensitive
case 'ILIKE': case 'ILIKE':
$match = $field.'ILIKE '; $match = $field.'ILIKE ';
break; break;
case 'NOT ILIKE':
$match = $field.'NOT ILIKE ';
break;
// case sensitive // case sensitive
case 'LIKE': case 'LIKE':
$match = $field.'LIKE '; $match = $field.'LIKE ';
break; break;
case 'NOT LIKE':
$match = $field.'NOT LIKE ';
break;
default: default:
return $db->raiseError(MDB2_ERROR_UNSUPPORTED, null, null, return $db->raiseError(MDB2_ERROR_UNSUPPORTED, null, null,
'not a supported operator type:'. $operator, __FUNCTION__); 'not a supported operator type:'. $operator, __FUNCTION__);
@ -366,7 +387,7 @@ class MDB2_Driver_Datatype_pgsql extends MDB2_Driver_Datatype_Common
*/ */
function patternEscapeString() function patternEscapeString()
{ {
$db =$this->getDBInstance(); $db = $this->getDBInstance();
if (PEAR::isError($db)) { if (PEAR::isError($db)) {
return $db; return $db;
} }
@ -492,7 +513,7 @@ class MDB2_Driver_Datatype_pgsql extends MDB2_Driver_Datatype_Common
$length = null; $length = null;
break; break;
default: default:
$db =$this->getDBInstance(); $db = $this->getDBInstance();
if (PEAR::isError($db)) { if (PEAR::isError($db)) {
return $db; return $db;
} }
@ -519,7 +540,7 @@ class MDB2_Driver_Datatype_pgsql extends MDB2_Driver_Datatype_Common
*/ */
function mapPrepareDatatype($type) function mapPrepareDatatype($type)
{ {
$db =$this->getDBInstance(); $db = $this->getDBInstance();
if (PEAR::isError($db)) { if (PEAR::isError($db)) {
return $db; return $db;
} }

View File

@ -43,10 +43,10 @@
// | Author: Lukas Smith <smith@pooteeweet.org> | // | Author: Lukas Smith <smith@pooteeweet.org> |
// +----------------------------------------------------------------------+ // +----------------------------------------------------------------------+
// //
// $Id: sqlite.php,v 1.67 2008/02/22 19:58:06 quipo Exp $ // $Id: sqlite.php 295587 2010-02-28 17:16:38Z quipo $
// //
require_once('MDB2/Driver/Datatype/Common.php'); require_once 'MDB2/Driver/Datatype/Common.php';
/** /**
* MDB2 SQLite driver * MDB2 SQLite driver
@ -101,7 +101,7 @@ class MDB2_Driver_Datatype_sqlite extends MDB2_Driver_Datatype_Common
*/ */
function getTypeDeclaration($field) function getTypeDeclaration($field)
{ {
$db =$this->getDBInstance(); $db = $this->getDBInstance();
if (PEAR::isError($db)) { if (PEAR::isError($db)) {
return $db; return $db;
} }
@ -199,7 +199,7 @@ class MDB2_Driver_Datatype_sqlite extends MDB2_Driver_Datatype_Common
*/ */
function _getIntegerDeclaration($name, $field) function _getIntegerDeclaration($name, $field)
{ {
$db =$this->getDBInstance(); $db = $this->getDBInstance();
if (PEAR::isError($db)) { if (PEAR::isError($db)) {
return $db; return $db;
} }
@ -216,6 +216,9 @@ class MDB2_Driver_Datatype_sqlite extends MDB2_Driver_Datatype_Common
$notnull = empty($field['notnull']) ? '' : ' NOT NULL'; $notnull = empty($field['notnull']) ? '' : ' NOT NULL';
$unsigned = empty($field['unsigned']) ? '' : ' UNSIGNED'; $unsigned = empty($field['unsigned']) ? '' : ' UNSIGNED';
if (empty($default) && empty($notnull)) {
$default = ' DEFAULT NULL';
}
$name = $db->quoteIdentifier($name, true); $name = $db->quoteIdentifier($name, true);
return $name.' '.$this->getTypeDeclaration($field).$unsigned.$default.$notnull.$autoinc; return $name.' '.$this->getTypeDeclaration($field).$unsigned.$default.$notnull.$autoinc;
} }
@ -237,24 +240,30 @@ class MDB2_Driver_Datatype_sqlite extends MDB2_Driver_Datatype_Common
*/ */
function matchPattern($pattern, $operator = null, $field = null) function matchPattern($pattern, $operator = null, $field = null)
{ {
$db =$this->getDBInstance(); $db = $this->getDBInstance();
if (PEAR::isError($db)) { if (PEAR::isError($db)) {
return $db; return $db;
} }
$match = ''; $match = '';
if (!is_null($operator)) { if (null !== $operator) {
$field = is_null($field) ? '' : $field.' '; $field = (null === $field) ? '' : $field.' ';
$operator = strtoupper($operator); $operator = strtoupper($operator);
switch ($operator) { switch ($operator) {
// case insensitive // case insensitive
case 'ILIKE': case 'ILIKE':
$match = $field.'LIKE '; $match = $field.'LIKE ';
break; break;
case 'NOT ILIKE':
$match = $field.'NOT LIKE ';
break;
// case sensitive // case sensitive
case 'LIKE': case 'LIKE':
$match = $field.'LIKE '; $match = $field.'LIKE ';
break; break;
case 'NOT LIKE':
$match = $field.'NOT LIKE ';
break;
default: default:
return $db->raiseError(MDB2_ERROR_UNSUPPORTED, null, null, return $db->raiseError(MDB2_ERROR_UNSUPPORTED, null, null,
'not a supported operator type:'. $operator, __FUNCTION__); 'not a supported operator type:'. $operator, __FUNCTION__);
@ -388,7 +397,7 @@ class MDB2_Driver_Datatype_sqlite extends MDB2_Driver_Datatype_Common
$length = null; $length = null;
break; break;
default: default:
$db =$this->getDBInstance(); $db = $this->getDBInstance();
if (PEAR::isError($db)) { if (PEAR::isError($db)) {
return $db; return $db;
} }

View File

@ -42,7 +42,7 @@
// | Author: Lukas Smith <smith@pooteeweet.org> | // | Author: Lukas Smith <smith@pooteeweet.org> |
// +----------------------------------------------------------------------+ // +----------------------------------------------------------------------+
// //
// $Id: Common.php,v 1.21 2008/02/17 18:51:39 quipo Exp $ // $Id: Common.php 295587 2010-02-28 17:16:38Z quipo $
// //
/** /**
@ -78,14 +78,14 @@ class MDB2_Driver_Function_Common extends MDB2_Module_Common
* @return mixed a result handle or MDB2_OK on success, a MDB2 error on failure * @return mixed a result handle or MDB2_OK on success, a MDB2 error on failure
* @access public * @access public
*/ */
function &executeStoredProc($name, $params = null, $types = null, $result_class = true, $result_wrap_class = false) function executeStoredProc($name, $params = null, $types = null, $result_class = true, $result_wrap_class = false)
{ {
$db =& $this->getDBInstance(); $db = $this->getDBInstance();
if (PEAR::isError($db)) { if (PEAR::isError($db)) {
return $db; return $db;
} }
$error =& $db->raiseError(MDB2_ERROR_UNSUPPORTED, null, null, $error = $db->raiseError(MDB2_ERROR_UNSUPPORTED, null, null,
'method not implemented', __FUNCTION__); 'method not implemented', __FUNCTION__);
return $error; return $error;
} }
@ -145,12 +145,12 @@ class MDB2_Driver_Function_Common extends MDB2_Module_Common
*/ */
function unixtimestamp($expression) function unixtimestamp($expression)
{ {
$db =& $this->getDBInstance(); $db = $this->getDBInstance();
if (PEAR::isError($db)) { if (PEAR::isError($db)) {
return $db; return $db;
} }
$error =& $db->raiseError(MDB2_ERROR_UNSUPPORTED, null, null, $error = $db->raiseError(MDB2_ERROR_UNSUPPORTED, null, null,
'method not implemented', __FUNCTION__); 'method not implemented', __FUNCTION__);
return $error; return $error;
} }
@ -166,7 +166,7 @@ class MDB2_Driver_Function_Common extends MDB2_Module_Common
*/ */
function substring($value, $position = 1, $length = null) function substring($value, $position = 1, $length = null)
{ {
if (!is_null($length)) { if (null !== $length) {
return "SUBSTRING($value FROM $position FOR $length)"; return "SUBSTRING($value FROM $position FOR $length)";
} }
return "SUBSTRING($value FROM $position)"; return "SUBSTRING($value FROM $position)";
@ -278,12 +278,12 @@ class MDB2_Driver_Function_Common extends MDB2_Module_Common
*/ */
function guid() function guid()
{ {
$db =& $this->getDBInstance(); $db = $this->getDBInstance();
if (PEAR::isError($db)) { if (PEAR::isError($db)) {
return $db; return $db;
} }
$error =& $db->raiseError(MDB2_ERROR_UNSUPPORTED, null, null, $error = $db->raiseError(MDB2_ERROR_UNSUPPORTED, null, null,
'method not implemented', __FUNCTION__); 'method not implemented', __FUNCTION__);
return $error; return $error;
} }

View File

@ -42,10 +42,10 @@
// | Author: Lukas Smith <smith@pooteeweet.org> | // | Author: Lukas Smith <smith@pooteeweet.org> |
// +----------------------------------------------------------------------+ // +----------------------------------------------------------------------+
// //
// $Id: mysql.php,v 1.12 2008/02/17 18:54:08 quipo Exp $ // $Id: mysql.php 295587 2010-02-28 17:16:38Z quipo $
// //
require_once('MDB2/Driver/Function/Common.php'); require_once 'MDB2/Driver/Function/Common.php';
/** /**
* MDB2 MySQL driver for the function modules * MDB2 MySQL driver for the function modules
@ -71,9 +71,9 @@ class MDB2_Driver_Function_mysql extends MDB2_Driver_Function_Common
* @return mixed a result handle or MDB2_OK on success, a MDB2 error on failure * @return mixed a result handle or MDB2_OK on success, a MDB2 error on failure
* @access public * @access public
*/ */
function &executeStoredProc($name, $params = null, $types = null, $result_class = true, $result_wrap_class = false) function executeStoredProc($name, $params = null, $types = null, $result_class = true, $result_wrap_class = false)
{ {
$db =& $this->getDBInstance(); $db = $this->getDBInstance();
if (PEAR::isError($db)) { if (PEAR::isError($db)) {
return $db; return $db;
} }

View File

@ -42,9 +42,9 @@
// | Author: Paul Cooper <pgc@ucecom.com> | // | Author: Paul Cooper <pgc@ucecom.com> |
// +----------------------------------------------------------------------+ // +----------------------------------------------------------------------+
// //
// $Id: pgsql.php,v 1.11 2008/11/09 19:46:50 quipo Exp $ // $Id: pgsql.php 296139 2010-03-13 04:15:22Z afz $
require_once('MDB2/Driver/Function/Common.php'); require_once 'MDB2/Driver/Function/Common.php';
/** /**
* MDB2 MySQL driver for the function modules * MDB2 MySQL driver for the function modules
@ -69,9 +69,9 @@ class MDB2_Driver_Function_pgsql extends MDB2_Driver_Function_Common
* @return mixed a result handle or MDB2_OK on success, a MDB2 error on failure * @return mixed a result handle or MDB2_OK on success, a MDB2 error on failure
* @access public * @access public
*/ */
function &executeStoredProc($name, $params = null, $types = null, $result_class = true, $result_wrap_class = false) function executeStoredProc($name, $params = null, $types = null, $result_class = true, $result_wrap_class = false)
{ {
$db =& $this->getDBInstance(); $db = $this->getDBInstance();
if (PEAR::isError($db)) { if (PEAR::isError($db)) {
return $db; return $db;
} }
@ -96,6 +96,23 @@ class MDB2_Driver_Function_pgsql extends MDB2_Driver_Function_Common
return 'EXTRACT(EPOCH FROM DATE_TRUNC(\'seconds\', CAST ((' . $expression . ') AS TIMESTAMP)))'; return 'EXTRACT(EPOCH FROM DATE_TRUNC(\'seconds\', CAST ((' . $expression . ') AS TIMESTAMP)))';
} }
// }}}
// {{{ substring()
/**
* return string to call a function to get a substring inside an SQL statement
*
* @return string to call a function to get a substring
* @access public
*/
function substring($value, $position = 1, $length = null)
{
if (null !== $length) {
return "SUBSTRING(CAST($value AS VARCHAR) FROM $position FOR $length)";
}
return "SUBSTRING(CAST($value AS VARCHAR) FROM $position)";
}
// }}} // }}}
// {{{ random() // {{{ random()

View File

@ -42,10 +42,10 @@
// | Author: Lukas Smith <smith@pooteeweet.org> | // | Author: Lukas Smith <smith@pooteeweet.org> |
// +----------------------------------------------------------------------+ // +----------------------------------------------------------------------+
// //
// $Id: sqlite.php,v 1.10 2008/02/17 18:54:08 quipo Exp $ // $Id: sqlite.php 295587 2010-02-28 17:16:38Z quipo $
// //
require_once('MDB2/Driver/Function/Common.php'); require_once 'MDB2/Driver/Function/Common.php';
/** /**
* MDB2 SQLite driver for the function modules * MDB2 SQLite driver for the function modules
@ -116,10 +116,10 @@ class MDB2_Driver_Function_sqlite extends MDB2_Driver_Function_Common
*/ */
function substring($value, $position = 1, $length = null) function substring($value, $position = 1, $length = null)
{ {
if (!is_null($length)) { if (null !== $length) {
return "substr($value,$position,$length)"; return "substr($value, $position, $length)";
} }
return "substr($value,$position,length($value))"; return "substr($value, $position, length($value))";
} }
// }}} // }}}
@ -147,12 +147,12 @@ class MDB2_Driver_Function_sqlite extends MDB2_Driver_Function_Common
*/ */
function replace($str, $from_str, $to_str) function replace($str, $from_str, $to_str)
{ {
$db =& $this->getDBInstance(); $db = $this->getDBInstance();
if (PEAR::isError($db)) { if (PEAR::isError($db)) {
return $db; return $db;
} }
$error =& $db->raiseError(MDB2_ERROR_UNSUPPORTED, null, null, $error = $db->raiseError(MDB2_ERROR_UNSUPPORTED, null, null,
'method not implemented', __FUNCTION__); 'method not implemented', __FUNCTION__);
return $error; return $error;
} }

View File

@ -43,7 +43,7 @@
// | Lorenzo Alberton <l.alberton@quipo.it> | // | Lorenzo Alberton <l.alberton@quipo.it> |
// +----------------------------------------------------------------------+ // +----------------------------------------------------------------------+
// //
// $Id: Common.php,v 1.72 2009/01/14 15:00:40 quipo Exp $ // $Id: Common.php 295587 2010-02-28 17:16:38Z quipo $
// //
/** /**
@ -108,7 +108,7 @@ class MDB2_Driver_Manager_Common extends MDB2_Module_Common
*/ */
function getFieldDeclarationList($fields) function getFieldDeclarationList($fields)
{ {
$db =$this->getDBInstance(); $db = $this->getDBInstance();
if (PEAR::isError($db)) { if (PEAR::isError($db)) {
return $db; return $db;
} }
@ -140,7 +140,7 @@ class MDB2_Driver_Manager_Common extends MDB2_Module_Common
*/ */
function _fixSequenceName($sqn, $check = false) function _fixSequenceName($sqn, $check = false)
{ {
$db =$this->getDBInstance(); $db = $this->getDBInstance();
if (PEAR::isError($db)) { if (PEAR::isError($db)) {
return $db; return $db;
} }
@ -168,7 +168,7 @@ class MDB2_Driver_Manager_Common extends MDB2_Module_Common
*/ */
function _fixIndexName($idx) function _fixIndexName($idx)
{ {
$db =$this->getDBInstance(); $db = $this->getDBInstance();
if (PEAR::isError($db)) { if (PEAR::isError($db)) {
return $db; return $db;
} }
@ -195,7 +195,7 @@ class MDB2_Driver_Manager_Common extends MDB2_Module_Common
*/ */
function createDatabase($database, $options = array()) function createDatabase($database, $options = array())
{ {
$db =$this->getDBInstance(); $db = $this->getDBInstance();
if (PEAR::isError($db)) { if (PEAR::isError($db)) {
return $db; return $db;
} }
@ -218,7 +218,7 @@ class MDB2_Driver_Manager_Common extends MDB2_Module_Common
*/ */
function alterDatabase($database, $options = array()) function alterDatabase($database, $options = array())
{ {
$db =$this->getDBInstance(); $db = $this->getDBInstance();
if (PEAR::isError($db)) { if (PEAR::isError($db)) {
return $db; return $db;
} }
@ -239,7 +239,7 @@ class MDB2_Driver_Manager_Common extends MDB2_Module_Common
*/ */
function dropDatabase($database) function dropDatabase($database)
{ {
$db =$this->getDBInstance(); $db = $this->getDBInstance();
if (PEAR::isError($db)) { if (PEAR::isError($db)) {
return $db; return $db;
} }
@ -263,7 +263,7 @@ class MDB2_Driver_Manager_Common extends MDB2_Module_Common
*/ */
function _getCreateTableQuery($name, $fields, $options = array()) function _getCreateTableQuery($name, $fields, $options = array())
{ {
$db =$this->getDBInstance(); $db = $this->getDBInstance();
if (PEAR::isError($db)) { if (PEAR::isError($db)) {
return $db; return $db;
} }
@ -356,7 +356,7 @@ class MDB2_Driver_Manager_Common extends MDB2_Module_Common
if (PEAR::isError($query)) { if (PEAR::isError($query)) {
return $query; return $query;
} }
$db =$this->getDBInstance(); $db = $this->getDBInstance();
if (PEAR::isError($db)) { if (PEAR::isError($db)) {
return $db; return $db;
} }
@ -379,7 +379,7 @@ class MDB2_Driver_Manager_Common extends MDB2_Module_Common
*/ */
function dropTable($name) function dropTable($name)
{ {
$db =$this->getDBInstance(); $db = $this->getDBInstance();
if (PEAR::isError($db)) { if (PEAR::isError($db)) {
return $db; return $db;
} }
@ -401,7 +401,7 @@ class MDB2_Driver_Manager_Common extends MDB2_Module_Common
*/ */
function truncateTable($name) function truncateTable($name)
{ {
$db =$this->getDBInstance(); $db = $this->getDBInstance();
if (PEAR::isError($db)) { if (PEAR::isError($db)) {
return $db; return $db;
} }
@ -429,7 +429,7 @@ class MDB2_Driver_Manager_Common extends MDB2_Module_Common
*/ */
function vacuum($table = null, $options = array()) function vacuum($table = null, $options = array())
{ {
$db =$this->getDBInstance(); $db = $this->getDBInstance();
if (PEAR::isError($db)) { if (PEAR::isError($db)) {
return $db; return $db;
} }
@ -533,7 +533,7 @@ class MDB2_Driver_Manager_Common extends MDB2_Module_Common
*/ */
function alterTable($name, $changes, $check) function alterTable($name, $changes, $check)
{ {
$db =$this->getDBInstance(); $db = $this->getDBInstance();
if (PEAR::isError($db)) { if (PEAR::isError($db)) {
return $db; return $db;
} }
@ -553,7 +553,7 @@ class MDB2_Driver_Manager_Common extends MDB2_Module_Common
*/ */
function listDatabases() function listDatabases()
{ {
$db =$this->getDBInstance(); $db = $this->getDBInstance();
if (PEAR::isError($db)) { if (PEAR::isError($db)) {
return $db; return $db;
} }
@ -573,7 +573,7 @@ class MDB2_Driver_Manager_Common extends MDB2_Module_Common
*/ */
function listUsers() function listUsers()
{ {
$db =$this->getDBInstance(); $db = $this->getDBInstance();
if (PEAR::isError($db)) { if (PEAR::isError($db)) {
return $db; return $db;
} }
@ -596,7 +596,7 @@ class MDB2_Driver_Manager_Common extends MDB2_Module_Common
*/ */
function listViews($database = null) function listViews($database = null)
{ {
$db =$this->getDBInstance(); $db = $this->getDBInstance();
if (PEAR::isError($db)) { if (PEAR::isError($db)) {
return $db; return $db;
} }
@ -617,7 +617,7 @@ class MDB2_Driver_Manager_Common extends MDB2_Module_Common
*/ */
function listTableViews($table) function listTableViews($table)
{ {
$db =$this->getDBInstance(); $db = $this->getDBInstance();
if (PEAR::isError($db)) { if (PEAR::isError($db)) {
return $db; return $db;
} }
@ -638,7 +638,7 @@ class MDB2_Driver_Manager_Common extends MDB2_Module_Common
*/ */
function listTableTriggers($table = null) function listTableTriggers($table = null)
{ {
$db =$this->getDBInstance(); $db = $this->getDBInstance();
if (PEAR::isError($db)) { if (PEAR::isError($db)) {
return $db; return $db;
} }
@ -658,7 +658,7 @@ class MDB2_Driver_Manager_Common extends MDB2_Module_Common
*/ */
function listFunctions() function listFunctions()
{ {
$db =$this->getDBInstance(); $db = $this->getDBInstance();
if (PEAR::isError($db)) { if (PEAR::isError($db)) {
return $db; return $db;
} }
@ -681,7 +681,7 @@ class MDB2_Driver_Manager_Common extends MDB2_Module_Common
*/ */
function listTables($database = null) function listTables($database = null)
{ {
$db =$this->getDBInstance(); $db = $this->getDBInstance();
if (PEAR::isError($db)) { if (PEAR::isError($db)) {
return $db; return $db;
} }
@ -702,7 +702,7 @@ class MDB2_Driver_Manager_Common extends MDB2_Module_Common
*/ */
function listTableFields($table) function listTableFields($table)
{ {
$db =$this->getDBInstance(); $db = $this->getDBInstance();
if (PEAR::isError($db)) { if (PEAR::isError($db)) {
return $db; return $db;
} }
@ -748,7 +748,7 @@ class MDB2_Driver_Manager_Common extends MDB2_Module_Common
*/ */
function createIndex($table, $name, $definition) function createIndex($table, $name, $definition)
{ {
$db =$this->getDBInstance(); $db = $this->getDBInstance();
if (PEAR::isError($db)) { if (PEAR::isError($db)) {
return $db; return $db;
} }
@ -777,7 +777,7 @@ class MDB2_Driver_Manager_Common extends MDB2_Module_Common
*/ */
function dropIndex($table, $name) function dropIndex($table, $name)
{ {
$db =$this->getDBInstance(); $db = $this->getDBInstance();
if (PEAR::isError($db)) { if (PEAR::isError($db)) {
return $db; return $db;
} }
@ -798,7 +798,7 @@ class MDB2_Driver_Manager_Common extends MDB2_Module_Common
*/ */
function listTableIndexes($table) function listTableIndexes($table)
{ {
$db =$this->getDBInstance(); $db = $this->getDBInstance();
if (PEAR::isError($db)) { if (PEAR::isError($db)) {
return $db; return $db;
} }
@ -867,7 +867,7 @@ class MDB2_Driver_Manager_Common extends MDB2_Module_Common
*/ */
function createConstraint($table, $name, $definition) function createConstraint($table, $name, $definition)
{ {
$db =$this->getDBInstance(); $db = $this->getDBInstance();
if (PEAR::isError($db)) { if (PEAR::isError($db)) {
return $db; return $db;
} }
@ -912,7 +912,7 @@ class MDB2_Driver_Manager_Common extends MDB2_Module_Common
*/ */
function dropConstraint($table, $name, $primary = false) function dropConstraint($table, $name, $primary = false)
{ {
$db =$this->getDBInstance(); $db = $this->getDBInstance();
if (PEAR::isError($db)) { if (PEAR::isError($db)) {
return $db; return $db;
} }
@ -934,7 +934,7 @@ class MDB2_Driver_Manager_Common extends MDB2_Module_Common
*/ */
function listTableConstraints($table) function listTableConstraints($table)
{ {
$db =$this->getDBInstance(); $db = $this->getDBInstance();
if (PEAR::isError($db)) { if (PEAR::isError($db)) {
return $db; return $db;
} }
@ -956,7 +956,7 @@ class MDB2_Driver_Manager_Common extends MDB2_Module_Common
*/ */
function createSequence($seq_name, $start = 1) function createSequence($seq_name, $start = 1)
{ {
$db =$this->getDBInstance(); $db = $this->getDBInstance();
if (PEAR::isError($db)) { if (PEAR::isError($db)) {
return $db; return $db;
} }
@ -977,7 +977,7 @@ class MDB2_Driver_Manager_Common extends MDB2_Module_Common
*/ */
function dropSequence($name) function dropSequence($name)
{ {
$db =$this->getDBInstance(); $db = $this->getDBInstance();
if (PEAR::isError($db)) { if (PEAR::isError($db)) {
return $db; return $db;
} }
@ -1000,7 +1000,7 @@ class MDB2_Driver_Manager_Common extends MDB2_Module_Common
*/ */
function listSequences($database = null) function listSequences($database = null)
{ {
$db =$this->getDBInstance(); $db = $this->getDBInstance();
if (PEAR::isError($db)) { if (PEAR::isError($db)) {
return $db; return $db;
} }

View File

@ -42,10 +42,10 @@
// | Author: Lukas Smith <smith@pooteeweet.org> | // | Author: Lukas Smith <smith@pooteeweet.org> |
// +----------------------------------------------------------------------+ // +----------------------------------------------------------------------+
// //
// $Id: mysql.php,v 1.113 2008/11/23 20:30:29 quipo Exp $ // $Id: mysql.php 302865 2010-08-29 10:30:55Z quipo $
// //
require_once('MDB2/Driver/Manager/Common.php'); require_once 'MDB2/Driver/Manager/Common.php';
/** /**
* MDB2 MySQL driver for the management modules * MDB2 MySQL driver for the management modules
@ -71,7 +71,7 @@ class MDB2_Driver_Manager_mysql extends MDB2_Driver_Manager_Common
*/ */
function createDatabase($name, $options = array()) function createDatabase($name, $options = array())
{ {
$db =$this->getDBInstance(); $db = $this->getDBInstance();
if (PEAR::isError($db)) { if (PEAR::isError($db)) {
return $db; return $db;
} }
@ -101,7 +101,7 @@ class MDB2_Driver_Manager_mysql extends MDB2_Driver_Manager_Common
*/ */
function alterDatabase($name, $options = array()) function alterDatabase($name, $options = array())
{ {
$db =$this->getDBInstance(); $db = $this->getDBInstance();
if (PEAR::isError($db)) { if (PEAR::isError($db)) {
return $db; return $db;
} }
@ -128,7 +128,7 @@ class MDB2_Driver_Manager_mysql extends MDB2_Driver_Manager_Common
*/ */
function dropDatabase($name) function dropDatabase($name)
{ {
$db =$this->getDBInstance(); $db = $this->getDBInstance();
if (PEAR::isError($db)) { if (PEAR::isError($db)) {
return $db; return $db;
} }
@ -204,7 +204,7 @@ class MDB2_Driver_Manager_mysql extends MDB2_Driver_Manager_Common
*/ */
function createTable($name, $fields, $options = array()) function createTable($name, $fields, $options = array())
{ {
$db =$this->getDBInstance(); $db = $this->getDBInstance();
if (PEAR::isError($db)) { if (PEAR::isError($db)) {
return $db; return $db;
} }
@ -222,7 +222,7 @@ class MDB2_Driver_Manager_mysql extends MDB2_Driver_Manager_Common
$autoincrement = $fieldname; $autoincrement = $fieldname;
} }
} }
if (!is_null($autoincrement) && count($pk_fields) > 1) { if ((null !== $autoincrement) && count($pk_fields) > 1) {
$options['primary'] = $pk_fields; $options['primary'] = $pk_fields;
} else { } else {
// the PK constraint is on max one field => OK // the PK constraint is on max one field => OK
@ -235,7 +235,7 @@ class MDB2_Driver_Manager_mysql extends MDB2_Driver_Manager_Common
return $query; return $query;
} }
if (!is_null($autoincrement)) { if (null !== $autoincrement) {
// we have to remove the PK clause added by _getIntegerDeclaration() // we have to remove the PK clause added by _getIntegerDeclaration()
$query = str_replace('AUTO_INCREMENT PRIMARY KEY', 'AUTO_INCREMENT', $query); $query = str_replace('AUTO_INCREMENT PRIMARY KEY', 'AUTO_INCREMENT', $query);
} }
@ -285,7 +285,7 @@ class MDB2_Driver_Manager_mysql extends MDB2_Driver_Manager_Common
*/ */
function dropTable($name) function dropTable($name)
{ {
$db =$this->getDBInstance(); $db = $this->getDBInstance();
if (PEAR::isError($db)) { if (PEAR::isError($db)) {
return $db; return $db;
} }
@ -321,7 +321,7 @@ class MDB2_Driver_Manager_mysql extends MDB2_Driver_Manager_Common
*/ */
function truncateTable($name) function truncateTable($name)
{ {
$db =$this->getDBInstance(); $db = $this->getDBInstance();
if (PEAR::isError($db)) { if (PEAR::isError($db)) {
return $db; return $db;
} }
@ -349,7 +349,7 @@ class MDB2_Driver_Manager_mysql extends MDB2_Driver_Manager_Common
*/ */
function vacuum($table = null, $options = array()) function vacuum($table = null, $options = array())
{ {
$db =$this->getDBInstance(); $db = $this->getDBInstance();
if (PEAR::isError($db)) { if (PEAR::isError($db)) {
return $db; return $db;
} }
@ -474,7 +474,7 @@ class MDB2_Driver_Manager_mysql extends MDB2_Driver_Manager_Common
*/ */
function alterTable($name, $changes, $check) function alterTable($name, $changes, $check)
{ {
$db =$this->getDBInstance(); $db = $this->getDBInstance();
if (PEAR::isError($db)) { if (PEAR::isError($db)) {
return $db; return $db;
} }
@ -575,7 +575,7 @@ class MDB2_Driver_Manager_mysql extends MDB2_Driver_Manager_Common
*/ */
function listDatabases() function listDatabases()
{ {
$db =$this->getDBInstance(); $db = $this->getDBInstance();
if (PEAR::isError($db)) { if (PEAR::isError($db)) {
return $db; return $db;
} }
@ -601,7 +601,7 @@ class MDB2_Driver_Manager_mysql extends MDB2_Driver_Manager_Common
*/ */
function listUsers() function listUsers()
{ {
$db =$this->getDBInstance(); $db = $this->getDBInstance();
if (PEAR::isError($db)) { if (PEAR::isError($db)) {
return $db; return $db;
} }
@ -620,7 +620,7 @@ class MDB2_Driver_Manager_mysql extends MDB2_Driver_Manager_Common
*/ */
function listFunctions() function listFunctions()
{ {
$db =$this->getDBInstance(); $db = $this->getDBInstance();
if (PEAR::isError($db)) { if (PEAR::isError($db)) {
return $db; return $db;
} }
@ -653,13 +653,13 @@ class MDB2_Driver_Manager_mysql extends MDB2_Driver_Manager_Common
*/ */
function listTableTriggers($table = null) function listTableTriggers($table = null)
{ {
$db =$this->getDBInstance(); $db = $this->getDBInstance();
if (PEAR::isError($db)) { if (PEAR::isError($db)) {
return $db; return $db;
} }
$query = 'SHOW TRIGGERS'; $query = 'SHOW TRIGGERS';
if (!is_null($table)) { if (null !== $table) {
$table = $db->quote($table, 'text'); $table = $db->quote($table, 'text');
$query .= " LIKE $table"; $query .= " LIKE $table";
} }
@ -685,13 +685,13 @@ class MDB2_Driver_Manager_mysql extends MDB2_Driver_Manager_Common
*/ */
function listTables($database = null) function listTables($database = null)
{ {
$db =$this->getDBInstance(); $db = $this->getDBInstance();
if (PEAR::isError($db)) { if (PEAR::isError($db)) {
return $db; return $db;
} }
$query = "SHOW /*!50002 FULL*/ TABLES"; $query = "SHOW /*!50002 FULL*/ TABLES";
if (!is_null($database)) { if (null !== $database) {
$query .= " FROM $database"; $query .= " FROM $database";
} }
$query.= "/*!50002 WHERE Table_type = 'BASE TABLE'*/"; $query.= "/*!50002 WHERE Table_type = 'BASE TABLE'*/";
@ -725,13 +725,13 @@ class MDB2_Driver_Manager_mysql extends MDB2_Driver_Manager_Common
*/ */
function listViews($database = null) function listViews($database = null)
{ {
$db =$this->getDBInstance(); $db = $this->getDBInstance();
if (PEAR::isError($db)) { if (PEAR::isError($db)) {
return $db; return $db;
} }
$query = 'SHOW FULL TABLES'; $query = 'SHOW FULL TABLES';
if (!is_null($database)) { if (null !== $database) {
$query.= " FROM $database"; $query.= " FROM $database";
} }
$query.= " WHERE Table_type = 'VIEW'"; $query.= " WHERE Table_type = 'VIEW'";
@ -759,7 +759,7 @@ class MDB2_Driver_Manager_mysql extends MDB2_Driver_Manager_Common
*/ */
function listTableFields($table) function listTableFields($table)
{ {
$db =$this->getDBInstance(); $db = $this->getDBInstance();
if (PEAR::isError($db)) { if (PEAR::isError($db)) {
return $db; return $db;
} }
@ -815,7 +815,7 @@ class MDB2_Driver_Manager_mysql extends MDB2_Driver_Manager_Common
*/ */
function createIndex($table, $name, $definition) function createIndex($table, $name, $definition)
{ {
$db =$this->getDBInstance(); $db = $this->getDBInstance();
if (PEAR::isError($db)) { if (PEAR::isError($db)) {
return $db; return $db;
} }
@ -848,7 +848,7 @@ class MDB2_Driver_Manager_mysql extends MDB2_Driver_Manager_Common
*/ */
function dropIndex($table, $name) function dropIndex($table, $name)
{ {
$db =$this->getDBInstance(); $db = $this->getDBInstance();
if (PEAR::isError($db)) { if (PEAR::isError($db)) {
return $db; return $db;
} }
@ -870,7 +870,7 @@ class MDB2_Driver_Manager_mysql extends MDB2_Driver_Manager_Common
*/ */
function listTableIndexes($table) function listTableIndexes($table)
{ {
$db =$this->getDBInstance(); $db = $this->getDBInstance();
if (PEAR::isError($db)) { if (PEAR::isError($db)) {
return $db; return $db;
} }
@ -934,7 +934,7 @@ class MDB2_Driver_Manager_mysql extends MDB2_Driver_Manager_Common
*/ */
function createConstraint($table, $name, $definition) function createConstraint($table, $name, $definition)
{ {
$db =$this->getDBInstance(); $db = $this->getDBInstance();
if (PEAR::isError($db)) { if (PEAR::isError($db)) {
return $db; return $db;
} }
@ -1008,7 +1008,7 @@ class MDB2_Driver_Manager_mysql extends MDB2_Driver_Manager_Common
*/ */
function dropConstraint($table, $name, $primary = false) function dropConstraint($table, $name, $primary = false)
{ {
$db =$this->getDBInstance(); $db = $this->getDBInstance();
if (PEAR::isError($db)) { if (PEAR::isError($db)) {
return $db; return $db;
} }
@ -1058,7 +1058,7 @@ class MDB2_Driver_Manager_mysql extends MDB2_Driver_Manager_Common
*/ */
function _createFKTriggers($table, $foreign_keys) function _createFKTriggers($table, $foreign_keys)
{ {
$db =$this->getDBInstance(); $db = $this->getDBInstance();
if (PEAR::isError($db)) { if (PEAR::isError($db)) {
return $db; return $db;
} }
@ -1103,10 +1103,14 @@ class MDB2_Driver_Manager_mysql extends MDB2_Driver_Manager_Common
for ($i=0; $i<count($referenced_fields); $i++) { for ($i=0; $i<count($referenced_fields); $i++) {
$conditions2[] = 'NEW.'.$referenced_fields[$i] .' <> OLD.'.$referenced_fields[$i]; $conditions2[] = 'NEW.'.$referenced_fields[$i] .' <> OLD.'.$referenced_fields[$i];
} }
$restrict_action .= implode(' AND ', $conditions).') IS NOT NULL'
.' AND (' .implode(' OR ', $conditions2) .')' $restrict_action .= implode(' AND ', $conditions).') IS NOT NULL';
.' THEN CALL %s_ON_TABLE_'.$table.'_VIOLATES_FOREIGN_KEY_CONSTRAINT();' $restrict_action2 = empty($conditions2) ? '' : ' AND (' .implode(' OR ', $conditions2) .')';
.' END IF;'; $restrict_action3 = ' THEN CALL %s_ON_TABLE_'.$table.'_VIOLATES_FOREIGN_KEY_CONSTRAINT();'
.' END IF;';
$restrict_action_update = $restrict_action . $restrict_action2 . $restrict_action3;
$restrict_action_delete = $restrict_action . $restrict_action3; // There is no NEW row in on DELETE trigger
$cascade_action_update = 'UPDATE '.$table_quoted.' SET '.implode(', ', $new_values) .' WHERE '.implode(' AND ', $conditions). ';'; $cascade_action_update = 'UPDATE '.$table_quoted.' SET '.implode(', ', $new_values) .' WHERE '.implode(' AND ', $conditions). ';';
$cascade_action_delete = 'DELETE FROM '.$table_quoted.' WHERE '.implode(' AND ', $conditions). ';'; $cascade_action_delete = 'DELETE FROM '.$table_quoted.' WHERE '.implode(' AND ', $conditions). ';';
@ -1137,9 +1141,9 @@ class MDB2_Driver_Manager_mysql extends MDB2_Driver_Manager_Common
} elseif ('SET DEFAULT' == $fkdef['onupdate']) { } elseif ('SET DEFAULT' == $fkdef['onupdate']) {
$sql_update = sprintf($query, $trigger_names['pk_update'], 'BEFORE UPDATE', 'update') . $setdefault_action; $sql_update = sprintf($query, $trigger_names['pk_update'], 'BEFORE UPDATE', 'update') . $setdefault_action;
} elseif ('NO ACTION' == $fkdef['onupdate']) { } elseif ('NO ACTION' == $fkdef['onupdate']) {
$sql_update = sprintf($query.$restrict_action, $trigger_names['pk_update'], 'AFTER UPDATE', 'update'); $sql_update = sprintf($query.$restrict_action_update, $trigger_names['pk_update'], 'AFTER UPDATE', 'update');
} elseif ('RESTRICT' == $fkdef['onupdate']) { } elseif ('RESTRICT' == $fkdef['onupdate']) {
$sql_update = sprintf($query.$restrict_action, $trigger_names['pk_update'], 'BEFORE UPDATE', 'update'); $sql_update = sprintf($query.$restrict_action_update, $trigger_names['pk_update'], 'BEFORE UPDATE', 'update');
} }
if ('CASCADE' == $fkdef['ondelete']) { if ('CASCADE' == $fkdef['ondelete']) {
$sql_delete = sprintf($query, $trigger_names['pk_delete'], 'BEFORE DELETE', 'delete') . $cascade_action_delete; $sql_delete = sprintf($query, $trigger_names['pk_delete'], 'BEFORE DELETE', 'delete') . $cascade_action_delete;
@ -1148,9 +1152,9 @@ class MDB2_Driver_Manager_mysql extends MDB2_Driver_Manager_Common
} elseif ('SET DEFAULT' == $fkdef['ondelete']) { } elseif ('SET DEFAULT' == $fkdef['ondelete']) {
$sql_delete = sprintf($query, $trigger_names['pk_delete'], 'BEFORE DELETE', 'delete') . $setdefault_action; $sql_delete = sprintf($query, $trigger_names['pk_delete'], 'BEFORE DELETE', 'delete') . $setdefault_action;
} elseif ('NO ACTION' == $fkdef['ondelete']) { } elseif ('NO ACTION' == $fkdef['ondelete']) {
$sql_delete = sprintf($query.$restrict_action, $trigger_names['pk_delete'], 'AFTER DELETE', 'delete'); $sql_delete = sprintf($query.$restrict_action_delete, $trigger_names['pk_delete'], 'AFTER DELETE', 'delete');
} elseif ('RESTRICT' == $fkdef['ondelete']) { } elseif ('RESTRICT' == $fkdef['ondelete']) {
$sql_delete = sprintf($query.$restrict_action, $trigger_names['pk_delete'], 'BEFORE DELETE', 'delete'); $sql_delete = sprintf($query.$restrict_action_delete, $trigger_names['pk_delete'], 'BEFORE DELETE', 'delete');
} }
$sql_update .= ' SET FOREIGN_KEY_CHECKS = 1; END;'; $sql_update .= ' SET FOREIGN_KEY_CHECKS = 1; END;';
$sql_delete .= ' SET FOREIGN_KEY_CHECKS = 1; END;'; $sql_delete .= ' SET FOREIGN_KEY_CHECKS = 1; END;';
@ -1198,7 +1202,7 @@ class MDB2_Driver_Manager_mysql extends MDB2_Driver_Manager_Common
*/ */
function _dropFKTriggers($table, $fkname, $referenced_table) function _dropFKTriggers($table, $fkname, $referenced_table)
{ {
$db =$this->getDBInstance(); $db = $this->getDBInstance();
if (PEAR::isError($db)) { if (PEAR::isError($db)) {
return $db; return $db;
} }
@ -1232,7 +1236,7 @@ class MDB2_Driver_Manager_mysql extends MDB2_Driver_Manager_Common
*/ */
function listTableConstraints($table) function listTableConstraints($table)
{ {
$db =$this->getDBInstance(); $db = $this->getDBInstance();
if (PEAR::isError($db)) { if (PEAR::isError($db)) {
return $db; return $db;
} }
@ -1307,7 +1311,7 @@ class MDB2_Driver_Manager_mysql extends MDB2_Driver_Manager_Common
*/ */
function createSequence($seq_name, $start = 1, $options = array()) function createSequence($seq_name, $start = 1, $options = array())
{ {
$db =$this->getDBInstance(); $db = $this->getDBInstance();
if (PEAR::isError($db)) { if (PEAR::isError($db)) {
return $db; return $db;
} }
@ -1380,7 +1384,7 @@ class MDB2_Driver_Manager_mysql extends MDB2_Driver_Manager_Common
*/ */
function dropSequence($seq_name) function dropSequence($seq_name)
{ {
$db =$this->getDBInstance(); $db = $this->getDBInstance();
if (PEAR::isError($db)) { if (PEAR::isError($db)) {
return $db; return $db;
} }
@ -1401,13 +1405,13 @@ class MDB2_Driver_Manager_mysql extends MDB2_Driver_Manager_Common
*/ */
function listSequences($database = null) function listSequences($database = null)
{ {
$db =$this->getDBInstance(); $db = $this->getDBInstance();
if (PEAR::isError($db)) { if (PEAR::isError($db)) {
return $db; return $db;
} }
$query = "SHOW TABLES"; $query = "SHOW TABLES";
if (!is_null($database)) { if (null !== $database) {
$query .= " FROM $database"; $query .= " FROM $database";
} }
$table_names = $db->queryCol($query); $table_names = $db->queryCol($query);

View File

@ -42,9 +42,9 @@
// | Author: Paul Cooper <pgc@ucecom.com> | // | Author: Paul Cooper <pgc@ucecom.com> |
// +----------------------------------------------------------------------+ // +----------------------------------------------------------------------+
// //
// $Id: pgsql.php,v 1.87 2008/11/29 14:09:59 afz Exp $ // $Id: pgsql.php 299393 2010-05-14 17:49:49Z afz $
require_once('MDB2/Driver/Manager/Common.php'); require_once 'MDB2/Driver/Manager/Common.php';
/** /**
* MDB2 MySQL driver for the management modules * MDB2 MySQL driver for the management modules
@ -68,7 +68,7 @@ class MDB2_Driver_Manager_pgsql extends MDB2_Driver_Manager_Common
*/ */
function createDatabase($name, $options = array()) function createDatabase($name, $options = array())
{ {
$db =$this->getDBInstance(); $db = $this->getDBInstance();
if (PEAR::isError($db)) { if (PEAR::isError($db)) {
return $db; return $db;
} }
@ -95,18 +95,24 @@ class MDB2_Driver_Manager_pgsql extends MDB2_Driver_Manager_Common
*/ */
function alterDatabase($name, $options = array()) function alterDatabase($name, $options = array())
{ {
$db =$this->getDBInstance(); $db = $this->getDBInstance();
if (PEAR::isError($db)) { if (PEAR::isError($db)) {
return $db; return $db;
} }
$query = 'ALTER DATABASE '. $db->quoteIdentifier($name, true); $query = '';
if (!empty($options['name'])) { if (!empty($options['name'])) {
$query .= ' RENAME TO ' . $options['name']; $query .= ' RENAME TO ' . $options['name'];
} }
if (!empty($options['owner'])) { if (!empty($options['owner'])) {
$query .= ' OWNER TO ' . $options['owner']; $query .= ' OWNER TO ' . $options['owner'];
} }
if (empty($query)) {
return MDB2_OK;
}
$query = 'ALTER DATABASE '. $db->quoteIdentifier($name, true) . $query;
return $db->standaloneQuery($query, null, true); return $db->standaloneQuery($query, null, true);
} }
@ -122,7 +128,7 @@ class MDB2_Driver_Manager_pgsql extends MDB2_Driver_Manager_Common
*/ */
function dropDatabase($name) function dropDatabase($name)
{ {
$db =$this->getDBInstance(); $db = $this->getDBInstance();
if (PEAR::isError($db)) { if (PEAR::isError($db)) {
return $db; return $db;
} }
@ -181,7 +187,7 @@ class MDB2_Driver_Manager_pgsql extends MDB2_Driver_Manager_Common
*/ */
function truncateTable($name) function truncateTable($name)
{ {
$db =$this->getDBInstance(); $db = $this->getDBInstance();
if (PEAR::isError($db)) { if (PEAR::isError($db)) {
return $db; return $db;
} }
@ -209,7 +215,7 @@ class MDB2_Driver_Manager_pgsql extends MDB2_Driver_Manager_Common
*/ */
function vacuum($table = null, $options = array()) function vacuum($table = null, $options = array())
{ {
$db =$this->getDBInstance(); $db = $this->getDBInstance();
if (PEAR::isError($db)) { if (PEAR::isError($db)) {
return $db; return $db;
} }
@ -326,7 +332,7 @@ class MDB2_Driver_Manager_pgsql extends MDB2_Driver_Manager_Common
*/ */
function alterTable($name, $changes, $check) function alterTable($name, $changes, $check)
{ {
$db =$this->getDBInstance(); $db = $this->getDBInstance();
if (PEAR::isError($db)) { if (PEAR::isError($db)) {
return $db; return $db;
} }
@ -396,9 +402,6 @@ class MDB2_Driver_Manager_pgsql extends MDB2_Driver_Manager_Common
} }
$db->loadModule('Datatype', null, true); $db->loadModule('Datatype', null, true);
$type = $db->datatype->getTypeDeclaration($field['definition']); $type = $db->datatype->getTypeDeclaration($field['definition']);
if($type=='SERIAL PRIMARY KEY'){//not correct when altering a table, since serials arent a real type
$type='INTEGER';//use integer instead
}
$query = "ALTER $field_name TYPE $type USING CAST($field_name AS $type)"; $query = "ALTER $field_name TYPE $type USING CAST($field_name AS $type)";
$result = $db->exec("ALTER TABLE $name $query"); $result = $db->exec("ALTER TABLE $name $query");
if (PEAR::isError($result)) { if (PEAR::isError($result)) {
@ -412,7 +415,7 @@ class MDB2_Driver_Manager_pgsql extends MDB2_Driver_Manager_Common
return $result; return $result;
} }
} }
if (!empty($field['definition']['notnull'])) { if (array_key_exists('notnull', $field['definition'])) {
$query = "ALTER $field_name ".($field['definition']['notnull'] ? 'SET' : 'DROP').' NOT NULL'; $query = "ALTER $field_name ".($field['definition']['notnull'] ? 'SET' : 'DROP').' NOT NULL';
$result = $db->exec("ALTER TABLE $name $query"); $result = $db->exec("ALTER TABLE $name $query");
if (PEAR::isError($result)) { if (PEAR::isError($result)) {
@ -444,7 +447,7 @@ class MDB2_Driver_Manager_pgsql extends MDB2_Driver_Manager_Common
*/ */
function listDatabases() function listDatabases()
{ {
$db =$this->getDBInstance(); $db = $this->getDBInstance();
if (PEAR::isError($db)) { if (PEAR::isError($db)) {
return $db; return $db;
} }
@ -477,7 +480,7 @@ class MDB2_Driver_Manager_pgsql extends MDB2_Driver_Manager_Common
*/ */
function listUsers() function listUsers()
{ {
$db =$this->getDBInstance(); $db = $this->getDBInstance();
if (PEAR::isError($db)) { if (PEAR::isError($db)) {
return $db; return $db;
} }
@ -502,9 +505,9 @@ class MDB2_Driver_Manager_pgsql extends MDB2_Driver_Manager_Common
* @return mixed array of view names on success, a MDB2 error on failure * @return mixed array of view names on success, a MDB2 error on failure
* @access public * @access public
*/ */
function listViews($database = null) function listViews()
{ {
$db =$this->getDBInstance(); $db = $this->getDBInstance();
if (PEAR::isError($db)) { if (PEAR::isError($db)) {
return $db; return $db;
} }
@ -535,7 +538,7 @@ class MDB2_Driver_Manager_pgsql extends MDB2_Driver_Manager_Common
*/ */
function listTableViews($table) function listTableViews($table)
{ {
$db =& $this->getDBInstance(); $db = $this->getDBInstance();
if (PEAR::isError($db)) { if (PEAR::isError($db)) {
return $db; return $db;
} }
@ -563,7 +566,7 @@ class MDB2_Driver_Manager_pgsql extends MDB2_Driver_Manager_Common
*/ */
function listFunctions() function listFunctions()
{ {
$db =& $this->getDBInstance(); $db = $this->getDBInstance();
if (PEAR::isError($db)) { if (PEAR::isError($db)) {
return $db; return $db;
} }
@ -602,7 +605,7 @@ class MDB2_Driver_Manager_pgsql extends MDB2_Driver_Manager_Common
*/ */
function listTableTriggers($table = null) function listTableTriggers($table = null)
{ {
$db =& $this->getDBInstance(); $db = $this->getDBInstance();
if (PEAR::isError($db)) { if (PEAR::isError($db)) {
return $db; return $db;
} }
@ -611,9 +614,9 @@ class MDB2_Driver_Manager_pgsql extends MDB2_Driver_Manager_Common
FROM pg_trigger trg, FROM pg_trigger trg,
pg_class tbl pg_class tbl
WHERE trg.tgrelid = tbl.oid'; WHERE trg.tgrelid = tbl.oid';
if (!is_null($table)) { if (null !== $table) {
$table = $db->quote(strtoupper($table), 'text'); $table = $db->quote(strtoupper($table), 'text');
$query .= " AND tbl.relname = $table"; $query .= " AND UPPER(tbl.relname) = $table";
} }
$result = $db->queryCol($query); $result = $db->queryCol($query);
if (PEAR::isError($result)) { if (PEAR::isError($result)) {
@ -634,9 +637,9 @@ class MDB2_Driver_Manager_pgsql extends MDB2_Driver_Manager_Common
* @return mixed array of table names on success, a MDB2 error on failure * @return mixed array of table names on success, a MDB2 error on failure
* @access public * @access public
*/ */
function listTables($database = null) function listTables()
{ {
$db =$this->getDBInstance(); $db = $this->getDBInstance();
if (PEAR::isError($db)) { if (PEAR::isError($db)) {
return $db; return $db;
} }
@ -683,7 +686,7 @@ class MDB2_Driver_Manager_pgsql extends MDB2_Driver_Manager_Common
*/ */
function listTableFields($table) function listTableFields($table)
{ {
$db =$this->getDBInstance(); $db = $this->getDBInstance();
if (PEAR::isError($db)) { if (PEAR::isError($db)) {
return $db; return $db;
} }
@ -695,7 +698,7 @@ class MDB2_Driver_Manager_pgsql extends MDB2_Driver_Manager_Common
$table = $db->quoteIdentifier($schema, true) . '.' .$table; $table = $db->quoteIdentifier($schema, true) . '.' .$table;
} }
$db->setLimit(1); $db->setLimit(1);
$result2 = $db->query("SELECT * FROM $table LIMIT 1"); $result2 = $db->query("SELECT * FROM $table");
if (PEAR::isError($result2)) { if (PEAR::isError($result2)) {
return $result2; return $result2;
} }
@ -719,7 +722,7 @@ class MDB2_Driver_Manager_pgsql extends MDB2_Driver_Manager_Common
*/ */
function listTableIndexes($table) function listTableIndexes($table)
{ {
$db =$this->getDBInstance(); $db = $this->getDBInstance();
if (PEAR::isError($db)) { if (PEAR::isError($db)) {
return $db; return $db;
} }
@ -772,7 +775,7 @@ class MDB2_Driver_Manager_pgsql extends MDB2_Driver_Manager_Common
*/ */
function dropConstraint($table, $name, $primary = false) function dropConstraint($table, $name, $primary = false)
{ {
$db =$this->getDBInstance(); $db = $this->getDBInstance();
if (PEAR::isError($db)) { if (PEAR::isError($db)) {
return $db; return $db;
} }
@ -820,7 +823,7 @@ class MDB2_Driver_Manager_pgsql extends MDB2_Driver_Manager_Common
*/ */
function listTableConstraints($table) function listTableConstraints($table)
{ {
$db =$this->getDBInstance(); $db = $this->getDBInstance();
if (PEAR::isError($db)) { if (PEAR::isError($db)) {
return $db; return $db;
} }
@ -885,7 +888,7 @@ class MDB2_Driver_Manager_pgsql extends MDB2_Driver_Manager_Common
*/ */
function createSequence($seq_name, $start = 1) function createSequence($seq_name, $start = 1)
{ {
$db =$this->getDBInstance(); $db = $this->getDBInstance();
if (PEAR::isError($db)) { if (PEAR::isError($db)) {
return $db; return $db;
} }
@ -907,7 +910,7 @@ class MDB2_Driver_Manager_pgsql extends MDB2_Driver_Manager_Common
*/ */
function dropSequence($seq_name) function dropSequence($seq_name)
{ {
$db =$this->getDBInstance(); $db = $this->getDBInstance();
if (PEAR::isError($db)) { if (PEAR::isError($db)) {
return $db; return $db;
} }
@ -925,9 +928,9 @@ class MDB2_Driver_Manager_pgsql extends MDB2_Driver_Manager_Common
* @return mixed array of sequence names on success, a MDB2 error on failure * @return mixed array of sequence names on success, a MDB2 error on failure
* @access public * @access public
*/ */
function listSequences($database = null) function listSequences()
{ {
$db =$this->getDBInstance(); $db = $this->getDBInstance();
if (PEAR::isError($db)) { if (PEAR::isError($db)) {
return $db; return $db;
} }

View File

@ -43,10 +43,10 @@
// | Lorenzo Alberton <l.alberton@quipo.it> | // | Lorenzo Alberton <l.alberton@quipo.it> |
// +----------------------------------------------------------------------+ // +----------------------------------------------------------------------+
// //
// $Id: sqlite.php,v 1.76 2008/05/31 11:48:48 quipo Exp $ // $Id: sqlite.php 295587 2010-02-28 17:16:38Z quipo $
// //
require_once('MDB2/Driver/Manager/Common.php'); require_once 'MDB2/Driver/Manager/Common.php';
/** /**
* MDB2 SQLite driver for the management modules * MDB2 SQLite driver for the management modules
@ -71,8 +71,7 @@ class MDB2_Driver_Manager_sqlite extends MDB2_Driver_Manager_Common
*/ */
function createDatabase($name, $options = array()) function createDatabase($name, $options = array())
{ {
$datadir=OC_Config::getValue( "datadirectory", OC::$SERVERROOT."/data" ); $db = $this->getDBInstance();
$db =$this->getDBInstance();
if (PEAR::isError($db)) { if (PEAR::isError($db)) {
return $db; return $db;
} }
@ -83,8 +82,7 @@ class MDB2_Driver_Manager_sqlite extends MDB2_Driver_Manager_Common
'database already exists', __FUNCTION__); 'database already exists', __FUNCTION__);
} }
$php_errormsg = ''; $php_errormsg = '';
$database_file="$datadir/$database_file.db"; $handle = @sqlite_open($database_file, $db->dsn['mode'], $php_errormsg);
$handle = sqlite_open($database_file, $db->dsn['mode'], $php_errormsg);
if (!$handle) { if (!$handle) {
return $db->raiseError(MDB2_ERROR_CANNOT_CREATE, null, null, return $db->raiseError(MDB2_ERROR_CANNOT_CREATE, null, null,
(isset($php_errormsg) ? $php_errormsg : 'could not create the database file'), __FUNCTION__); (isset($php_errormsg) ? $php_errormsg : 'could not create the database file'), __FUNCTION__);
@ -109,7 +107,7 @@ class MDB2_Driver_Manager_sqlite extends MDB2_Driver_Manager_Common
*/ */
function dropDatabase($name) function dropDatabase($name)
{ {
$db =$this->getDBInstance(); $db = $this->getDBInstance();
if (PEAR::isError($db)) { if (PEAR::isError($db)) {
return $db; return $db;
} }
@ -176,7 +174,7 @@ class MDB2_Driver_Manager_sqlite extends MDB2_Driver_Manager_Common
*/ */
function _getCreateTableQuery($name, $fields, $options = array()) function _getCreateTableQuery($name, $fields, $options = array())
{ {
$db =$this->getDBInstance(); $db = $this->getDBInstance();
if (PEAR::isError($db)) { if (PEAR::isError($db)) {
return $db; return $db;
} }
@ -238,7 +236,7 @@ class MDB2_Driver_Manager_sqlite extends MDB2_Driver_Manager_Common
} }
// create triggers to enforce FOREIGN KEY constraints // create triggers to enforce FOREIGN KEY constraints
if (!empty($options['foreign_keys'])) { if (!empty($options['foreign_keys'])) {
$db =$this->getDBInstance(); $db = $this->getDBInstance();
if (PEAR::isError($db)) { if (PEAR::isError($db)) {
return $db; return $db;
} }
@ -386,7 +384,7 @@ class MDB2_Driver_Manager_sqlite extends MDB2_Driver_Manager_Common
*/ */
function dropTable($name) function dropTable($name)
{ {
$db =$this->getDBInstance(); $db = $this->getDBInstance();
if (PEAR::isError($db)) { if (PEAR::isError($db)) {
return $db; return $db;
} }
@ -429,7 +427,7 @@ class MDB2_Driver_Manager_sqlite extends MDB2_Driver_Manager_Common
*/ */
function vacuum($table = null, $options = array()) function vacuum($table = null, $options = array())
{ {
$db =$this->getDBInstance(); $db = $this->getDBInstance();
if (PEAR::isError($db)) { if (PEAR::isError($db)) {
return $db; return $db;
} }
@ -536,7 +534,7 @@ class MDB2_Driver_Manager_sqlite extends MDB2_Driver_Manager_Common
*/ */
function alterTable($name, $changes, $check, $options = array()) function alterTable($name, $changes, $check, $options = array())
{ {
$db =$this->getDBInstance(); $db = $this->getDBInstance();
if (PEAR::isError($db)) { if (PEAR::isError($db)) {
return $db; return $db;
} }
@ -600,7 +598,7 @@ class MDB2_Driver_Manager_sqlite extends MDB2_Driver_Manager_Common
} }
$constraints = array_flip($constraints); $constraints = array_flip($constraints);
foreach ($constraints as $constraint => $value) { foreach ($constraints as $constraint => $value) {
if (!empty($definition['primary'])) { if (!empty($definition['primary'])) {
if (!array_key_exists('primary', $options)) { if (!array_key_exists('primary', $options)) {
$options['primary'] = $definition['fields']; $options['primary'] = $definition['fields'];
//remove from the $constraint array, it's already handled by createTable() //remove from the $constraint array, it's already handled by createTable()
@ -682,16 +680,14 @@ class MDB2_Driver_Manager_sqlite extends MDB2_Driver_Manager_Common
} }
foreach ($constraints as $constraint => $definition) { foreach ($constraints as $constraint => $definition) {
if(empty($definition['primary']) and empty($definition['foreign'])){ $this->createConstraint($name_new, $constraint, $definition);
$this->createConstraint($name_new, $constraint, $definition);
}
} }
if (!empty($select_fields) && !empty($data)) { if (!empty($select_fields) && !empty($data)) {
$query = 'INSERT INTO '.$db->quoteIdentifier($name_new, true); $query = 'INSERT INTO '.$db->quoteIdentifier($name_new, true);
$query.= '('.implode(', ', array_slice(array_keys($fields), 0, count($select_fields))).')'; $query.= '('.implode(', ', array_slice(array_keys($fields), 0, count($select_fields))).')';
$query.=' VALUES (?'.str_repeat(', ?', (count($select_fields) - 1)).')'; $query.=' VALUES (?'.str_repeat(', ?', (count($select_fields) - 1)).')';
$stmt =$db->prepare($query, null, MDB2_PREPARE_MANIP); $stmt = $db->prepare($query, null, MDB2_PREPARE_MANIP);
if (PEAR::isError($stmt)) { if (PEAR::isError($stmt)) {
return $stmt; return $stmt;
} }
@ -716,7 +712,7 @@ class MDB2_Driver_Manager_sqlite extends MDB2_Driver_Manager_Common
*/ */
function listDatabases() function listDatabases()
{ {
$db =$this->getDBInstance(); $db = $this->getDBInstance();
if (PEAR::isError($db)) { if (PEAR::isError($db)) {
return $db; return $db;
} }
@ -736,7 +732,7 @@ class MDB2_Driver_Manager_sqlite extends MDB2_Driver_Manager_Common
*/ */
function listUsers() function listUsers()
{ {
$db =$this->getDBInstance(); $db = $this->getDBInstance();
if (PEAR::isError($db)) { if (PEAR::isError($db)) {
return $db; return $db;
} }
@ -754,9 +750,9 @@ class MDB2_Driver_Manager_sqlite extends MDB2_Driver_Manager_Common
* @return mixed array of view names on success, a MDB2 error on failure * @return mixed array of view names on success, a MDB2 error on failure
* @access public * @access public
*/ */
function listViews($dummy=null) function listViews()
{ {
$db =$this->getDBInstance(); $db = $this->getDBInstance();
if (PEAR::isError($db)) { if (PEAR::isError($db)) {
return $db; return $db;
} }
@ -784,7 +780,7 @@ class MDB2_Driver_Manager_sqlite extends MDB2_Driver_Manager_Common
*/ */
function listTableViews($table) function listTableViews($table)
{ {
$db =$this->getDBInstance(); $db = $this->getDBInstance();
if (PEAR::isError($db)) { if (PEAR::isError($db)) {
return $db; return $db;
} }
@ -818,9 +814,9 @@ class MDB2_Driver_Manager_sqlite extends MDB2_Driver_Manager_Common
* @return mixed array of table names on success, a MDB2 error on failure * @return mixed array of table names on success, a MDB2 error on failure
* @access public * @access public
*/ */
function listTables($dummy=null) function listTables()
{ {
$db =$this->getDBInstance(); $db = $this->getDBInstance();
if (PEAR::isError($db)) { if (PEAR::isError($db)) {
return $db; return $db;
} }
@ -854,7 +850,7 @@ class MDB2_Driver_Manager_sqlite extends MDB2_Driver_Manager_Common
*/ */
function listTableFields($table) function listTableFields($table)
{ {
$db =$this->getDBInstance(); $db = $this->getDBInstance();
if (PEAR::isError($db)) { if (PEAR::isError($db)) {
return $db; return $db;
} }
@ -902,13 +898,13 @@ class MDB2_Driver_Manager_sqlite extends MDB2_Driver_Manager_Common
*/ */
function listTableTriggers($table = null) function listTableTriggers($table = null)
{ {
$db =$this->getDBInstance(); $db = $this->getDBInstance();
if (PEAR::isError($db)) { if (PEAR::isError($db)) {
return $db; return $db;
} }
$query = "SELECT name FROM sqlite_master WHERE type='trigger' AND sql NOT NULL"; $query = "SELECT name FROM sqlite_master WHERE type='trigger' AND sql NOT NULL";
if (!is_null($table)) { if (null !== $table) {
if ($db->options['portability'] & MDB2_PORTABILITY_FIX_CASE) { if ($db->options['portability'] & MDB2_PORTABILITY_FIX_CASE) {
$query.= ' AND LOWER(tbl_name)='.$db->quote(strtolower($table), 'text'); $query.= ' AND LOWER(tbl_name)='.$db->quote(strtolower($table), 'text');
} else { } else {
@ -962,7 +958,7 @@ class MDB2_Driver_Manager_sqlite extends MDB2_Driver_Manager_Common
*/ */
function createIndex($table, $name, $definition) function createIndex($table, $name, $definition)
{ {
$db =$this->getDBInstance(); $db = $this->getDBInstance();
if (PEAR::isError($db)) { if (PEAR::isError($db)) {
return $db; return $db;
} }
@ -1002,7 +998,7 @@ class MDB2_Driver_Manager_sqlite extends MDB2_Driver_Manager_Common
*/ */
function dropIndex($table, $name) function dropIndex($table, $name)
{ {
$db =$this->getDBInstance(); $db = $this->getDBInstance();
if (PEAR::isError($db)) { if (PEAR::isError($db)) {
return $db; return $db;
} }
@ -1023,7 +1019,7 @@ class MDB2_Driver_Manager_sqlite extends MDB2_Driver_Manager_Common
*/ */
function listTableIndexes($table) function listTableIndexes($table)
{ {
$db =$this->getDBInstance(); $db = $this->getDBInstance();
if (PEAR::isError($db)) { if (PEAR::isError($db)) {
return $db; return $db;
} }
@ -1084,7 +1080,7 @@ class MDB2_Driver_Manager_sqlite extends MDB2_Driver_Manager_Common
*/ */
function createConstraint($table, $name, $definition) function createConstraint($table, $name, $definition)
{ {
$db =$this->getDBInstance(); $db = $this->getDBInstance();
if (PEAR::isError($db)) { if (PEAR::isError($db)) {
return $db; return $db;
} }
@ -1137,7 +1133,7 @@ class MDB2_Driver_Manager_sqlite extends MDB2_Driver_Manager_Common
return $this->alterTable($table, array(), false, array('primary' => null)); return $this->alterTable($table, array(), false, array('primary' => null));
} }
$db =$this->getDBInstance(); $db = $this->getDBInstance();
if (PEAR::isError($db)) { if (PEAR::isError($db)) {
return $db; return $db;
} }
@ -1174,7 +1170,7 @@ class MDB2_Driver_Manager_sqlite extends MDB2_Driver_Manager_Common
*/ */
function _dropFKTriggers($table, $fkname, $referenced_table) function _dropFKTriggers($table, $fkname, $referenced_table)
{ {
$db =$this->getDBInstance(); $db = $this->getDBInstance();
if (PEAR::isError($db)) { if (PEAR::isError($db)) {
return $db; return $db;
} }
@ -1208,7 +1204,7 @@ class MDB2_Driver_Manager_sqlite extends MDB2_Driver_Manager_Common
*/ */
function listTableConstraints($table) function listTableConstraints($table)
{ {
$db =$this->getDBInstance(); $db = $this->getDBInstance();
if (PEAR::isError($db)) { if (PEAR::isError($db)) {
return $db; return $db;
} }
@ -1278,7 +1274,7 @@ class MDB2_Driver_Manager_sqlite extends MDB2_Driver_Manager_Common
*/ */
function createSequence($seq_name, $start = 1) function createSequence($seq_name, $start = 1)
{ {
$db =$this->getDBInstance(); $db = $this->getDBInstance();
if (PEAR::isError($db)) { if (PEAR::isError($db)) {
return $db; return $db;
} }
@ -1319,7 +1315,7 @@ class MDB2_Driver_Manager_sqlite extends MDB2_Driver_Manager_Common
*/ */
function dropSequence($seq_name) function dropSequence($seq_name)
{ {
$db =$this->getDBInstance(); $db = $this->getDBInstance();
if (PEAR::isError($db)) { if (PEAR::isError($db)) {
return $db; return $db;
} }
@ -1337,9 +1333,9 @@ class MDB2_Driver_Manager_sqlite extends MDB2_Driver_Manager_Common
* @return mixed array of sequence names on success, a MDB2 error on failure * @return mixed array of sequence names on success, a MDB2 error on failure
* @access public * @access public
*/ */
function listSequences($dummy=null) function listSequences()
{ {
$db =$this->getDBInstance(); $db = $this->getDBInstance();
if (PEAR::isError($db)) { if (PEAR::isError($db)) {
return $db; return $db;
} }

View File

@ -42,7 +42,7 @@
// | Author: Lukas Smith <smith@pooteeweet.org> | // | Author: Lukas Smith <smith@pooteeweet.org> |
// +----------------------------------------------------------------------+ // +----------------------------------------------------------------------+
// //
// $Id: Common.php,v 1.2 2007/09/09 13:47:36 quipo Exp $ // $Id: Common.php 242348 2007-09-09 13:47:36Z quipo $
// //
/** /**

View File

@ -42,7 +42,7 @@
// | Author: Lukas Smith <smith@pooteeweet.org> | // | Author: Lukas Smith <smith@pooteeweet.org> |
// +----------------------------------------------------------------------+ // +----------------------------------------------------------------------+
// //
// $Id: mysql.php,v 1.9 2006/06/18 21:59:05 lsmith Exp $ // $Id: mysql.php 215004 2006-06-18 21:59:05Z lsmith $
// //
require_once 'MDB2/Driver/Native/Common.php'; require_once 'MDB2/Driver/Native/Common.php';

View File

@ -42,7 +42,7 @@
// | Author: Paul Cooper <pgc@ucecom.com> | // | Author: Paul Cooper <pgc@ucecom.com> |
// +----------------------------------------------------------------------+ // +----------------------------------------------------------------------+
// //
// $Id: pgsql.php,v 1.12 2006/07/15 13:07:15 lsmith Exp $ // $Id: pgsql.php 295587 2010-02-28 17:16:38Z quipo $
require_once 'MDB2/Driver/Native/Common.php'; require_once 'MDB2/Driver/Native/Common.php';
@ -67,7 +67,7 @@ class MDB2_Driver_Native_pgsql extends MDB2_Driver_Native_Common
*/ */
function deleteOID($OID) function deleteOID($OID)
{ {
$db =& $this->getDBInstance(); $db = $this->getDBInstance();
if (PEAR::isError($db)) { if (PEAR::isError($db)) {
return $db; return $db;
} }

View File

@ -42,7 +42,7 @@
// | Author: Lukas Smith <smith@pooteeweet.org> | // | Author: Lukas Smith <smith@pooteeweet.org> |
// +----------------------------------------------------------------------+ // +----------------------------------------------------------------------+
// //
// $Id: sqlite.php,v 1.9 2006/06/18 21:59:05 lsmith Exp $ // $Id: sqlite.php 215004 2006-06-18 21:59:05Z lsmith $
// //
require_once 'MDB2/Driver/Native/Common.php'; require_once 'MDB2/Driver/Native/Common.php';

View File

@ -42,7 +42,7 @@
// | Author: Lukas Smith <smith@pooteeweet.org> | // | Author: Lukas Smith <smith@pooteeweet.org> |
// +----------------------------------------------------------------------+ // +----------------------------------------------------------------------+
// //
// $Id: Common.php,v 1.43 2009/01/14 15:01:21 quipo Exp $ // $Id: Common.php 295587 2010-02-28 17:16:38Z quipo $
// //
/** /**
@ -107,7 +107,7 @@ class MDB2_Driver_Reverse_Common extends MDB2_Module_Common
*/ */
function getTableFieldDefinition($table, $field) function getTableFieldDefinition($table, $field)
{ {
$db =$this->getDBInstance(); $db = $this->getDBInstance();
if (PEAR::isError($db)) { if (PEAR::isError($db)) {
return $db; return $db;
} }
@ -141,7 +141,7 @@ class MDB2_Driver_Reverse_Common extends MDB2_Module_Common
*/ */
function getTableIndexDefinition($table, $index) function getTableIndexDefinition($table, $index)
{ {
$db =$this->getDBInstance(); $db = $this->getDBInstance();
if (PEAR::isError($db)) { if (PEAR::isError($db)) {
return $db; return $db;
} }
@ -193,7 +193,7 @@ class MDB2_Driver_Reverse_Common extends MDB2_Module_Common
*/ */
function getTableConstraintDefinition($table, $index) function getTableConstraintDefinition($table, $index)
{ {
$db =$this->getDBInstance(); $db = $this->getDBInstance();
if (PEAR::isError($db)) { if (PEAR::isError($db)) {
return $db; return $db;
} }
@ -220,7 +220,7 @@ class MDB2_Driver_Reverse_Common extends MDB2_Module_Common
*/ */
function getSequenceDefinition($sequence) function getSequenceDefinition($sequence)
{ {
$db =$this->getDBInstance(); $db = $this->getDBInstance();
if (PEAR::isError($db)) { if (PEAR::isError($db)) {
return $db; return $db;
} }
@ -273,7 +273,7 @@ class MDB2_Driver_Reverse_Common extends MDB2_Module_Common
*/ */
function getTriggerDefinition($trigger) function getTriggerDefinition($trigger)
{ {
$db =$this->getDBInstance(); $db = $this->getDBInstance();
if (PEAR::isError($db)) { if (PEAR::isError($db)) {
return $db; return $db;
} }
@ -407,7 +407,7 @@ class MDB2_Driver_Reverse_Common extends MDB2_Module_Common
*/ */
function tableInfo($result, $mode = null) function tableInfo($result, $mode = null)
{ {
$db =$this->getDBInstance(); $db = $this->getDBInstance();
if (PEAR::isError($db)) { if (PEAR::isError($db)) {
return $db; return $db;
} }

View File

@ -42,10 +42,10 @@
// | Author: Lukas Smith <smith@pooteeweet.org> | // | Author: Lukas Smith <smith@pooteeweet.org> |
// +----------------------------------------------------------------------+ // +----------------------------------------------------------------------+
// //
// $Id: mysql.php,v 1.80 2008/03/26 21:15:37 quipo Exp $ // $Id: mysql.php 295587 2010-02-28 17:16:38Z quipo $
// //
require_once('MDB2/Driver/Reverse/Common.php'); require_once 'MDB2/Driver/Reverse/Common.php';
/** /**
* MDB2 MySQL driver for the schema reverse engineering module * MDB2 MySQL driver for the schema reverse engineering module
@ -69,7 +69,7 @@ class MDB2_Driver_Reverse_mysql extends MDB2_Driver_Reverse_Common
*/ */
function getTableFieldDefinition($table_name, $field_name) function getTableFieldDefinition($table_name, $field_name)
{ {
$db =$this->getDBInstance(); $db = $this->getDBInstance();
if (PEAR::isError($db)) { if (PEAR::isError($db)) {
return $db; return $db;
} }
@ -113,13 +113,21 @@ class MDB2_Driver_Reverse_mysql extends MDB2_Driver_Reverse_Common
$default = false; $default = false;
if (array_key_exists('default', $column)) { if (array_key_exists('default', $column)) {
$default = $column['default']; $default = $column['default'];
if (is_null($default) && $notnull) { if ((null === $default) && $notnull) {
$default = ''; $default = '';
} }
} }
$definition[0] = array(
'notnull' => $notnull,
'nativetype' => preg_replace('/^([a-z]+)[^a-z].*/i', '\\1', $column['type'])
);
$autoincrement = false; $autoincrement = false;
if (!empty($column['extra']) && $column['extra'] == 'auto_increment') { if (!empty($column['extra'])) {
$autoincrement = true; if ($column['extra'] == 'auto_increment') {
$autoincrement = true;
} else {
$definition[0]['extra'] = $column['extra'];
}
} }
$collate = null; $collate = null;
if (!empty($column['collation'])) { if (!empty($column['collation'])) {
@ -127,17 +135,13 @@ class MDB2_Driver_Reverse_mysql extends MDB2_Driver_Reverse_Common
$charset = preg_replace('/(.+?)(_.+)?/', '$1', $collate); $charset = preg_replace('/(.+?)(_.+)?/', '$1', $collate);
} }
$definition[0] = array( if (null !== $length) {
'notnull' => $notnull,
'nativetype' => preg_replace('/^([a-z]+)[^a-z].*/i', '\\1', $column['type'])
);
if (!is_null($length)) {
$definition[0]['length'] = $length; $definition[0]['length'] = $length;
} }
if (!is_null($unsigned)) { if (null !== $unsigned) {
$definition[0]['unsigned'] = $unsigned; $definition[0]['unsigned'] = $unsigned;
} }
if (!is_null($fixed)) { if (null !== $fixed) {
$definition[0]['fixed'] = $fixed; $definition[0]['fixed'] = $fixed;
} }
if ($default !== false) { if ($default !== false) {
@ -146,7 +150,7 @@ class MDB2_Driver_Reverse_mysql extends MDB2_Driver_Reverse_Common
if ($autoincrement !== false) { if ($autoincrement !== false) {
$definition[0]['autoincrement'] = $autoincrement; $definition[0]['autoincrement'] = $autoincrement;
} }
if (!is_null($collate)) { if (null !== $collate) {
$definition[0]['collate'] = $collate; $definition[0]['collate'] = $collate;
$definition[0]['charset'] = $charset; $definition[0]['charset'] = $charset;
} }
@ -181,7 +185,7 @@ class MDB2_Driver_Reverse_mysql extends MDB2_Driver_Reverse_Common
*/ */
function getTableIndexDefinition($table_name, $index_name) function getTableIndexDefinition($table_name, $index_name)
{ {
$db =$this->getDBInstance(); $db = $this->getDBInstance();
if (PEAR::isError($db)) { if (PEAR::isError($db)) {
return $db; return $db;
} }
@ -192,7 +196,7 @@ class MDB2_Driver_Reverse_mysql extends MDB2_Driver_Reverse_Common
$query = "SHOW INDEX FROM $table /*!50002 WHERE Key_name = %s */"; $query = "SHOW INDEX FROM $table /*!50002 WHERE Key_name = %s */";
$index_name_mdb2 = $db->getIndexName($index_name); $index_name_mdb2 = $db->getIndexName($index_name);
$result = $db->queryRow(sprintf($query, $db->quote($index_name_mdb2))); $result = $db->queryRow(sprintf($query, $db->quote($index_name_mdb2)));
if (!PEAR::isError($result) && !is_null($result)) { if (!PEAR::isError($result) && (null !== $result)) {
// apply 'idxname_format' only if the query succeeded, otherwise // apply 'idxname_format' only if the query succeeded, otherwise
// fallback to the given $index_name, without transformation // fallback to the given $index_name, without transformation
$index_name = $index_name_mdb2; $index_name = $index_name_mdb2;
@ -256,7 +260,7 @@ class MDB2_Driver_Reverse_mysql extends MDB2_Driver_Reverse_Common
*/ */
function getTableConstraintDefinition($table_name, $constraint_name) function getTableConstraintDefinition($table_name, $constraint_name)
{ {
$db =$this->getDBInstance(); $db = $this->getDBInstance();
if (PEAR::isError($db)) { if (PEAR::isError($db)) {
return $db; return $db;
} }
@ -269,7 +273,7 @@ class MDB2_Driver_Reverse_mysql extends MDB2_Driver_Reverse_Common
if (strtolower($constraint_name) != 'primary') { if (strtolower($constraint_name) != 'primary') {
$constraint_name_mdb2 = $db->getIndexName($constraint_name); $constraint_name_mdb2 = $db->getIndexName($constraint_name);
$result = $db->queryRow(sprintf($query, $db->quote($constraint_name_mdb2))); $result = $db->queryRow(sprintf($query, $db->quote($constraint_name_mdb2)));
if (!PEAR::isError($result) && !is_null($result)) { if (!PEAR::isError($result) && (null !== $result)) {
// apply 'idxname_format' only if the query succeeded, otherwise // apply 'idxname_format' only if the query succeeded, otherwise
// fallback to the given $index_name, without transformation // fallback to the given $index_name, without transformation
$constraint_name = $constraint_name_mdb2; $constraint_name = $constraint_name_mdb2;
@ -356,10 +360,16 @@ class MDB2_Driver_Reverse_mysql extends MDB2_Driver_Reverse_Common
*/ */
function _getTableFKConstraintDefinition($table, $constraint_name, $definition) function _getTableFKConstraintDefinition($table, $constraint_name, $definition)
{ {
$db =$this->getDBInstance(); $db = $this->getDBInstance();
if (PEAR::isError($db)) { if (PEAR::isError($db)) {
return $db; return $db;
} }
//Use INFORMATION_SCHEMA instead?
//SELECT *
// FROM INFORMATION_SCHEMA.REFERENTIAL_CONSTRAINTS
// WHERE CONSTRAINT_SCHEMA = '$dbname'
// AND TABLE_NAME = '$table'
// AND CONSTRAINT_NAME = '$constraint_name';
$query = 'SHOW CREATE TABLE '. $db->escape($table); $query = 'SHOW CREATE TABLE '. $db->escape($table);
$constraint = $db->queryOne($query, 'text', 1); $constraint = $db->queryOne($query, 'text', 1);
if (!PEAR::isError($constraint) && !empty($constraint)) { if (!PEAR::isError($constraint) && !empty($constraint)) {
@ -372,10 +382,10 @@ class MDB2_Driver_Reverse_mysql extends MDB2_Driver_Reverse_Common
} }
$constraint_name_original = $constraint_name; $constraint_name_original = $constraint_name;
$constraint_name = $db->getIndexName($constraint_name); $constraint_name = $db->getIndexName($constraint_name);
$pattern = '/\bCONSTRAINT\s+'.$constraint_name.'\s+FOREIGN KEY\s+\(([^\)]+)\) \bREFERENCES\b ([^ ]+) \(([^\)]+)\)/i'; $pattern = '/\bCONSTRAINT\s+'.$constraint_name.'\s+FOREIGN KEY\s+\(([^\)]+)\) \bREFERENCES\b ([^\s]+) \(([^\)]+)\)(?: ON DELETE ([^\s]+))?(?: ON UPDATE ([^\s]+))?/i';
if (!preg_match($pattern, str_replace('`', '', $constraint), $matches)) { if (!preg_match($pattern, str_replace('`', '', $constraint), $matches)) {
//fallback to original constraint name //fallback to original constraint name
$pattern = '/\bCONSTRAINT\s+'.$constraint_name_original.'\s+FOREIGN KEY\s+\(([^\)]+)\) \bREFERENCES\b ([^ ]+) \(([^\)]+)\)/i'; $pattern = '/\bCONSTRAINT\s+'.$constraint_name_original.'\s+FOREIGN KEY\s+\(([^\)]+)\) \bREFERENCES\b ([^\s]+) \(([^\)]+)\)(?: ON DELETE ([^\s]+))?(?: ON UPDATE ([^\s]+))?/i';
} }
if (preg_match($pattern, str_replace('`', '', $constraint), $matches)) { if (preg_match($pattern, str_replace('`', '', $constraint), $matches)) {
$definition['foreign'] = true; $definition['foreign'] = true;
@ -397,8 +407,8 @@ class MDB2_Driver_Reverse_mysql extends MDB2_Driver_Reverse_Common
'position' => $colpos++ 'position' => $colpos++
); );
} }
$definition['onupdate'] = 'NO ACTION'; $definition['ondelete'] = empty($matches[4]) ? 'RESTRICT' : strtoupper($matches[4]);
$definition['ondelete'] = 'NO ACTION'; $definition['onupdate'] = empty($matches[5]) ? 'RESTRICT' : strtoupper($matches[5]);
$definition['match'] = 'SIMPLE'; $definition['match'] = 'SIMPLE';
return $definition; return $definition;
} }
@ -424,7 +434,7 @@ class MDB2_Driver_Reverse_mysql extends MDB2_Driver_Reverse_Common
*/ */
function getTriggerDefinition($trigger) function getTriggerDefinition($trigger)
{ {
$db =$this->getDBInstance(); $db = $this->getDBInstance();
if (PEAR::isError($db)) { if (PEAR::isError($db)) {
return $db; return $db;
} }
@ -476,7 +486,7 @@ class MDB2_Driver_Reverse_mysql extends MDB2_Driver_Reverse_Common
return parent::tableInfo($result, $mode); return parent::tableInfo($result, $mode);
} }
$db =$this->getDBInstance(); $db = $this->getDBInstance();
if (PEAR::isError($db)) { if (PEAR::isError($db)) {
return $db; return $db;
} }
@ -506,11 +516,11 @@ class MDB2_Driver_Reverse_mysql extends MDB2_Driver_Reverse_Common
$db->loadModule('Datatype', null, true); $db->loadModule('Datatype', null, true);
for ($i = 0; $i < $count; $i++) { for ($i = 0; $i < $count; $i++) {
$res[$i] = array( $res[$i] = array(
'table' => $case_func(@mysql_field_table($resource, $i)), 'table' => $case_func(@mysql_field_table($resource, $i)),
'name' => $case_func(@mysql_field_name($resource, $i)), 'name' => $case_func(@mysql_field_name($resource, $i)),
'type' => @mysql_field_type($resource, $i), 'type' => @mysql_field_type($resource, $i),
'length' => @mysql_field_len($resource, $i), 'length' => @mysql_field_len($resource, $i),
'flags' => @mysql_field_flags($resource, $i), 'flags' => @mysql_field_flags($resource, $i),
); );
if ($res[$i]['type'] == 'string') { if ($res[$i]['type'] == 'string') {
$res[$i]['type'] = 'char'; $res[$i]['type'] = 'char';

View File

@ -43,9 +43,9 @@
// | Lorenzo Alberton <l.alberton@quipo.it> | // | Lorenzo Alberton <l.alberton@quipo.it> |
// +----------------------------------------------------------------------+ // +----------------------------------------------------------------------+
// //
// $Id: pgsql.php,v 1.75 2008/08/22 16:36:20 quipo Exp $ // $Id: pgsql.php 295587 2010-02-28 17:16:38Z quipo $
require_once('MDB2/Driver/Reverse/Common.php'); require_once 'MDB2/Driver/Reverse/Common.php';
/** /**
* MDB2 PostGreSQL driver for the schema reverse engineering module * MDB2 PostGreSQL driver for the schema reverse engineering module
@ -69,7 +69,7 @@ class MDB2_Driver_Reverse_pgsql extends MDB2_Driver_Reverse_Common
*/ */
function getTableFieldDefinition($table_name, $field_name) function getTableFieldDefinition($table_name, $field_name)
{ {
$db =$this->getDBInstance(); $db = $this->getDBInstance();
if (PEAR::isError($db)) { if (PEAR::isError($db)) {
return $db; return $db;
} }
@ -143,11 +143,12 @@ class MDB2_Driver_Reverse_pgsql extends MDB2_Driver_Reverse_Common
} }
$default = null; $default = null;
if ($column['atthasdef'] === 't' if ($column['atthasdef'] === 't'
&& strpos($column['default'], 'NULL') !== 0
&& !preg_match("/nextval\('([^']+)'/", $column['default']) && !preg_match("/nextval\('([^']+)'/", $column['default'])
) { ) {
$pattern = '/^\'(.*)\'::[\w ]+$/i'; $pattern = '/^\'(.*)\'::[\w ]+$/i';
$default = $column['default'];#substr($column['adsrc'], 1, -1); $default = $column['default'];#substr($column['adsrc'], 1, -1);
if (is_null($default) && $notnull) { if ((null === $default) && $notnull) {
$default = ''; $default = '';
} elseif (!empty($default) && preg_match($pattern, $default)) { } elseif (!empty($default) && preg_match($pattern, $default)) {
//remove data type cast //remove data type cast
@ -159,13 +160,13 @@ class MDB2_Driver_Reverse_pgsql extends MDB2_Driver_Reverse_Common
$autoincrement = true; $autoincrement = true;
} }
$definition[0] = array('notnull' => $notnull, 'nativetype' => $column['type']); $definition[0] = array('notnull' => $notnull, 'nativetype' => $column['type']);
if (!is_null($length)) { if (null !== $length) {
$definition[0]['length'] = $length; $definition[0]['length'] = $length;
} }
if (!is_null($unsigned)) { if (null !== $unsigned) {
$definition[0]['unsigned'] = $unsigned; $definition[0]['unsigned'] = $unsigned;
} }
if (!is_null($fixed)) { if (null !== $fixed) {
$definition[0]['fixed'] = $fixed; $definition[0]['fixed'] = $fixed;
} }
if ($default !== false) { if ($default !== false) {
@ -198,7 +199,7 @@ class MDB2_Driver_Reverse_pgsql extends MDB2_Driver_Reverse_Common
*/ */
function getTableIndexDefinition($table_name, $index_name) function getTableIndexDefinition($table_name, $index_name)
{ {
$db =$this->getDBInstance(); $db = $this->getDBInstance();
if (PEAR::isError($db)) { if (PEAR::isError($db)) {
return $db; return $db;
} }
@ -256,7 +257,7 @@ class MDB2_Driver_Reverse_pgsql extends MDB2_Driver_Reverse_Common
*/ */
function getTableConstraintDefinition($table_name, $constraint_name) function getTableConstraintDefinition($table_name, $constraint_name)
{ {
$db =$this->getDBInstance(); $db = $this->getDBInstance();
if (PEAR::isError($db)) { if (PEAR::isError($db)) {
return $db; return $db;
} }
@ -443,7 +444,7 @@ class MDB2_Driver_Reverse_pgsql extends MDB2_Driver_Reverse_Common
*/ */
function getTriggerDefinition($trigger) function getTriggerDefinition($trigger)
{ {
$db =$this->getDBInstance(); $db = $this->getDBInstance();
if (PEAR::isError($db)) { if (PEAR::isError($db)) {
return $db; return $db;
} }
@ -517,7 +518,7 @@ class MDB2_Driver_Reverse_pgsql extends MDB2_Driver_Reverse_Common
return parent::tableInfo($result, $mode); return parent::tableInfo($result, $mode);
} }
$db =$this->getDBInstance(); $db = $this->getDBInstance();
if (PEAR::isError($db)) { if (PEAR::isError($db)) {
return $db; return $db;
} }

View File

@ -43,10 +43,10 @@
// | Lorenzo Alberton <l.alberton@quipo.it> | // | Lorenzo Alberton <l.alberton@quipo.it> |
// +----------------------------------------------------------------------+ // +----------------------------------------------------------------------+
// //
// $Id: sqlite.php,v 1.80 2008/05/03 10:30:14 quipo Exp $ // $Id: sqlite.php 295587 2010-02-28 17:16:38Z quipo $
// //
require_once('MDB2/Driver/Reverse/Common.php'); require_once 'MDB2/Driver/Reverse/Common.php';
/** /**
* MDB2 SQlite driver for the schema reverse engineering module * MDB2 SQlite driver for the schema reverse engineering module
@ -78,7 +78,7 @@ class MDB2_Driver_Reverse_sqlite extends MDB2_Driver_Reverse_Common
*/ */
function _getTableColumns($sql) function _getTableColumns($sql)
{ {
$db =$this->getDBInstance(); $db = $this->getDBInstance();
if (PEAR::isError($db)) { if (PEAR::isError($db)) {
return $db; return $db;
} }
@ -156,7 +156,7 @@ class MDB2_Driver_Reverse_sqlite extends MDB2_Driver_Reverse_Common
*/ */
function getTableFieldDefinition($table_name, $field_name) function getTableFieldDefinition($table_name, $field_name)
{ {
$db =$this->getDBInstance(); $db = $this->getDBInstance();
if (PEAR::isError($db)) { if (PEAR::isError($db)) {
return $db; return $db;
} }
@ -201,7 +201,7 @@ class MDB2_Driver_Reverse_sqlite extends MDB2_Driver_Reverse_Common
$default = false; $default = false;
if (array_key_exists('default', $column)) { if (array_key_exists('default', $column)) {
$default = $column['default']; $default = $column['default'];
if (is_null($default) && $notnull) { if ((null === $default) && $notnull) {
$default = ''; $default = '';
} }
} }
@ -214,13 +214,13 @@ class MDB2_Driver_Reverse_sqlite extends MDB2_Driver_Reverse_Common
'notnull' => $notnull, 'notnull' => $notnull,
'nativetype' => preg_replace('/^([a-z]+)[^a-z].*/i', '\\1', $column['type']) 'nativetype' => preg_replace('/^([a-z]+)[^a-z].*/i', '\\1', $column['type'])
); );
if (!is_null($length)) { if (null !== $length) {
$definition[0]['length'] = $length; $definition[0]['length'] = $length;
} }
if (!is_null($unsigned)) { if (null !== $unsigned) {
$definition[0]['unsigned'] = $unsigned; $definition[0]['unsigned'] = $unsigned;
} }
if (!is_null($fixed)) { if (null !== $fixed) {
$definition[0]['fixed'] = $fixed; $definition[0]['fixed'] = $fixed;
} }
if ($default !== false) { if ($default !== false) {
@ -258,7 +258,7 @@ class MDB2_Driver_Reverse_sqlite extends MDB2_Driver_Reverse_Common
*/ */
function getTableIndexDefinition($table_name, $index_name) function getTableIndexDefinition($table_name, $index_name)
{ {
$db =$this->getDBInstance(); $db = $this->getDBInstance();
if (PEAR::isError($db)) { if (PEAR::isError($db)) {
return $db; return $db;
} }
@ -341,7 +341,7 @@ class MDB2_Driver_Reverse_sqlite extends MDB2_Driver_Reverse_Common
*/ */
function getTableConstraintDefinition($table_name, $constraint_name) function getTableConstraintDefinition($table_name, $constraint_name)
{ {
$db =$this->getDBInstance(); $db = $this->getDBInstance();
if (PEAR::isError($db)) { if (PEAR::isError($db)) {
return $db; return $db;
} }
@ -532,7 +532,7 @@ class MDB2_Driver_Reverse_sqlite extends MDB2_Driver_Reverse_Common
*/ */
function getTriggerDefinition($trigger) function getTriggerDefinition($trigger)
{ {
$db =$this->getDBInstance(); $db = $this->getDBInstance();
if (PEAR::isError($db)) { if (PEAR::isError($db)) {
return $db; return $db;
} }
@ -596,7 +596,7 @@ class MDB2_Driver_Reverse_sqlite extends MDB2_Driver_Reverse_Common
return parent::tableInfo($result, $mode); return parent::tableInfo($result, $mode);
} }
$db =$this->getDBInstance(); $db = $this->getDBInstance();
if (PEAR::isError($db)) { if (PEAR::isError($db)) {
return $db; return $db;
} }

View File

@ -43,7 +43,7 @@
// | Author: Lukas Smith <smith@pooteeweet.org> | // | Author: Lukas Smith <smith@pooteeweet.org> |
// +----------------------------------------------------------------------+ // +----------------------------------------------------------------------+
// //
// $Id: mysql.php,v 1.214 2008/11/16 21:45:08 quipo Exp $ // $Id: mysql.php 302867 2010-08-29 11:22:07Z quipo $
// //
/** /**
@ -338,7 +338,7 @@ class MDB2_Driver_mysql extends MDB2_Driver_Common
register_shutdown_function('MDB2_closeOpenTransactions'); register_shutdown_function('MDB2_closeOpenTransactions');
} }
$query = $this->start_transaction ? 'START TRANSACTION' : 'SET AUTOCOMMIT = 0'; $query = $this->start_transaction ? 'START TRANSACTION' : 'SET AUTOCOMMIT = 0';
$result =& $this->_doQuery($query, true); $result = $this->_doQuery($query, true);
if (PEAR::isError($result)) { if (PEAR::isError($result)) {
return $result; return $result;
} }
@ -385,13 +385,13 @@ class MDB2_Driver_mysql extends MDB2_Driver_Common
'transactions are not supported', __FUNCTION__); 'transactions are not supported', __FUNCTION__);
} }
$result =& $this->_doQuery('COMMIT', true); $result = $this->_doQuery('COMMIT', true);
if (PEAR::isError($result)) { if (PEAR::isError($result)) {
return $result; return $result;
} }
if (!$this->start_transaction) { if (!$this->start_transaction) {
$query = 'SET AUTOCOMMIT = 1'; $query = 'SET AUTOCOMMIT = 1';
$result =& $this->_doQuery($query, true); $result = $this->_doQuery($query, true);
if (PEAR::isError($result)) { if (PEAR::isError($result)) {
return $result; return $result;
} }
@ -431,13 +431,13 @@ class MDB2_Driver_mysql extends MDB2_Driver_Common
} }
$query = 'ROLLBACK'; $query = 'ROLLBACK';
$result =& $this->_doQuery($query, true); $result = $this->_doQuery($query, true);
if (PEAR::isError($result)) { if (PEAR::isError($result)) {
return $result; return $result;
} }
if (!$this->start_transaction) { if (!$this->start_transaction) {
$query = 'SET AUTOCOMMIT = 1'; $query = 'SET AUTOCOMMIT = 1';
$result =& $this->_doQuery($query, true); $result = $this->_doQuery($query, true);
if (PEAR::isError($result)) { if (PEAR::isError($result)) {
return $result; return $result;
} }
@ -457,12 +457,16 @@ class MDB2_Driver_mysql extends MDB2_Driver_Common
* READ COMMITTED (prevents dirty reads) * READ COMMITTED (prevents dirty reads)
* REPEATABLE READ (prevents nonrepeatable reads) * REPEATABLE READ (prevents nonrepeatable reads)
* SERIALIZABLE (prevents phantom reads) * SERIALIZABLE (prevents phantom reads)
* @param array some transaction options:
* 'wait' => 'WAIT' | 'NO WAIT'
* 'rw' => 'READ WRITE' | 'READ ONLY'
*
* @return mixed MDB2_OK on success, a MDB2 error on failure * @return mixed MDB2_OK on success, a MDB2 error on failure
* *
* @access public * @access public
* @since 2.1.1 * @since 2.1.1
*/ */
static function setTransactionIsolation($isolation, $options = array()) function setTransactionIsolation($isolation, $options = array())
{ {
$this->debug('Setting transaction isolation level', __FUNCTION__, array('is_manip' => true)); $this->debug('Setting transaction isolation level', __FUNCTION__, array('is_manip' => true));
if (!$this->supports('transactions')) { if (!$this->supports('transactions')) {
@ -501,14 +505,14 @@ class MDB2_Driver_mysql extends MDB2_Driver_Common
} }
$params = array(); $params = array();
if ($this->dsn['protocol'] && $this->dsn['protocol'] == 'unix') { $unix = ($this->dsn['protocol'] && $this->dsn['protocol'] == 'unix');
$params[0] = ':' . $this->dsn['socket']; if (empty($this->dsn['hostspec'])) {
$this->dsn['hostspec'] = $unix ? '' : 'localhost';
}
if ($this->dsn['hostspec']) {
$params[0] = $this->dsn['hostspec'] . ($this->dsn['port'] ? ':' . $this->dsn['port'] : '');
} else { } else {
$params[0] = $this->dsn['hostspec'] ? $this->dsn['hostspec'] $params[0] = ':' . $this->dsn['socket'];
: 'localhost';
if ($this->dsn['port']) {
$params[0].= ':' . $this->dsn['port'];
}
} }
$params[] = $username ? $username : null; $params[] = $username ? $username : null;
$params[] = $password ? $password : null; $params[] = $password ? $password : null;
@ -626,7 +630,7 @@ class MDB2_Driver_mysql extends MDB2_Driver_Common
$client_info = mysql_get_client_info(); $client_info = mysql_get_client_info();
if (function_exists('mysql_set_charset') && version_compare($client_info, '5.0.6')) { if (function_exists('mysql_set_charset') && version_compare($client_info, '5.0.6')) {
if (!$result = mysql_set_charset($charset, $connection)) { if (!$result = mysql_set_charset($charset, $connection)) {
$err =& $this->raiseError(null, null, null, $err = $this->raiseError(null, null, null,
'Could not set client character set', __FUNCTION__); 'Could not set client character set', __FUNCTION__);
return $err; return $err;
} }
@ -634,7 +638,7 @@ class MDB2_Driver_mysql extends MDB2_Driver_Common
} }
$query = "SET NAMES '".mysql_real_escape_string($charset, $connection)."'"; $query = "SET NAMES '".mysql_real_escape_string($charset, $connection)."'";
if (!is_null($collation)) { if (!is_null($collation)) {
$query .= " COLLATE '".mysqli_real_escape_string($connection, $collation)."'"; $query .= " COLLATE '".mysql_real_escape_string($collation, $connection)."'";
} }
return $this->_doQuery($query, true, $connection); return $this->_doQuery($query, true, $connection);
} }
@ -709,7 +713,7 @@ class MDB2_Driver_mysql extends MDB2_Driver_Common
// }}} // }}}
// {{{ standaloneQuery() // {{{ standaloneQuery()
/** /**
* execute a query as DBA * execute a query as DBA
* *
* @param string $query the SQL query * @param string $query the SQL query
@ -719,7 +723,7 @@ class MDB2_Driver_mysql extends MDB2_Driver_Common
* @return mixed MDB2_OK on success, a MDB2 error on failure * @return mixed MDB2_OK on success, a MDB2 error on failure
* @access public * @access public
*/ */
function &standaloneQuery($query, $types = null, $is_manip = false) function standaloneQuery($query, $types = null, $is_manip = false)
{ {
$user = $this->options['DBA_username']? $this->options['DBA_username'] : $this->dsn['username']; $user = $this->options['DBA_username']? $this->options['DBA_username'] : $this->dsn['username'];
$pass = $this->options['DBA_password']? $this->options['DBA_password'] : $this->dsn['password']; $pass = $this->options['DBA_password']? $this->options['DBA_password'] : $this->dsn['password'];
@ -733,7 +737,7 @@ class MDB2_Driver_mysql extends MDB2_Driver_Common
$this->offset = $this->limit = 0; $this->offset = $this->limit = 0;
$query = $this->_modifyQuery($query, $is_manip, $limit, $offset); $query = $this->_modifyQuery($query, $is_manip, $limit, $offset);
$result =& $this->_doQuery($query, $is_manip, $connection, $this->database_name); $result = $this->_doQuery($query, $is_manip, $connection, $this->database_name);
if (!PEAR::isError($result)) { if (!PEAR::isError($result)) {
$result = $this->_affectedRows($connection, $result); $result = $this->_affectedRows($connection, $result);
} }
@ -754,7 +758,7 @@ class MDB2_Driver_mysql extends MDB2_Driver_Common
* @return result or error object * @return result or error object
* @access protected * @access protected
*/ */
function &_doQuery($query, $is_manip = false, $connection = null, $database_name = null) function _doQuery($query, $is_manip = false, $connection = null, $database_name = null)
{ {
$this->last_query = $query; $this->last_query = $query;
$result = $this->debug($query, 'query', array('is_manip' => $is_manip, 'when' => 'pre')); $result = $this->debug($query, 'query', array('is_manip' => $is_manip, 'when' => 'pre'));
@ -793,8 +797,8 @@ class MDB2_Driver_mysql extends MDB2_Driver_Common
$function = $this->options['result_buffering'] $function = $this->options['result_buffering']
? 'mysql_query' : 'mysql_unbuffered_query'; ? 'mysql_query' : 'mysql_unbuffered_query';
$result = @$function($query, $connection); $result = @$function($query, $connection);
if (!$result) { if (!$result && 0 !== mysql_errno($connection)) {
$err =$this->raiseError(null, null, null, $err = $this->raiseError(null, null, null,
'Could not execute statement', __FUNCTION__); 'Could not execute statement', __FUNCTION__);
return $err; return $err;
} }
@ -1032,13 +1036,18 @@ class MDB2_Driver_mysql extends MDB2_Driver_Common
* @access public * @access public
* @see bindParam, execute * @see bindParam, execute
*/ */
function &prepare($query, $types = null, $result_types = null, $lobs = array()) function prepare($query, $types = null, $result_types = null, $lobs = array())
{ {
// connect to get server capabilities (http://pear.php.net/bugs/16147)
$connection = $this->getConnection();
if (PEAR::isError($connection)) {
return $connection;
}
if ($this->options['emulate_prepared'] if ($this->options['emulate_prepared']
|| $this->supported['prepared_statements'] !== true || $this->supported['prepared_statements'] !== true
) { ) {
$obj =& parent::prepare($query, $types, $result_types, $lobs); return parent::prepare($query, $types, $result_types, $lobs);
return $obj;
} }
$is_manip = ($result_types === MDB2_PREPARE_MANIP); $is_manip = ($result_types === MDB2_PREPARE_MANIP);
$offset = $this->offset; $offset = $this->offset;
@ -1098,7 +1107,7 @@ class MDB2_Driver_mysql extends MDB2_Driver_Common
$regexp = '/^.{'.($position+1).'}('.$this->options['bindname_format'].').*$/s'; $regexp = '/^.{'.($position+1).'}('.$this->options['bindname_format'].').*$/s';
$parameter = preg_replace($regexp, '\\1', $query); $parameter = preg_replace($regexp, '\\1', $query);
if ($parameter === '') { if ($parameter === '') {
$err =& $this->raiseError(MDB2_ERROR_SYNTAX, null, null, $err = $this->raiseError(MDB2_ERROR_SYNTAX, null, null,
'named parameter name must match "bindname_format" option', __FUNCTION__); 'named parameter name must match "bindname_format" option', __FUNCTION__);
return $err; return $err;
} }
@ -1112,15 +1121,12 @@ class MDB2_Driver_mysql extends MDB2_Driver_Common
$position = $p_position; $position = $p_position;
} }
} }
$connection = $this->getConnection();
if (PEAR::isError($connection)) {
return $connection;
}
static $prep_statement_counter = 1; static $prep_statement_counter = 1;
$statement_name = sprintf($this->options['statement_format'], $this->phptype, $prep_statement_counter++ . sha1(microtime() + mt_rand())); $statement_name = sprintf($this->options['statement_format'], $this->phptype, $prep_statement_counter++ . sha1(microtime() + mt_rand()));
$statement_name = substr(strtolower($statement_name), 0, $this->options['max_identifiers_length']); $statement_name = substr(strtolower($statement_name), 0, $this->options['max_identifiers_length']);
$query = "PREPARE $statement_name FROM ".$this->quote($query, 'text'); $query = "PREPARE $statement_name FROM ".$this->quote($query, 'text');
$statement =& $this->_doQuery($query, true, $connection); $statement = $this->_doQuery($query, true, $connection);
if (PEAR::isError($statement)) { if (PEAR::isError($statement)) {
return $statement; return $statement;
} }
@ -1240,7 +1246,7 @@ class MDB2_Driver_mysql extends MDB2_Driver_Common
$table = $this->quoteIdentifier($table, true); $table = $this->quoteIdentifier($table, true);
$query = "REPLACE INTO $table ($query) VALUES ($values)"; $query = "REPLACE INTO $table ($query) VALUES ($values)";
$result =& $this->_doQuery($query, true, $connection); $result = $this->_doQuery($query, true, $connection);
if (PEAR::isError($result)) { if (PEAR::isError($result)) {
return $result; return $result;
} }
@ -1268,7 +1274,7 @@ class MDB2_Driver_mysql extends MDB2_Driver_Common
$query = "INSERT INTO $sequence_name ($seqcol_name) VALUES (NULL)"; $query = "INSERT INTO $sequence_name ($seqcol_name) VALUES (NULL)";
$this->pushErrorHandling(PEAR_ERROR_RETURN); $this->pushErrorHandling(PEAR_ERROR_RETURN);
$this->expectError(MDB2_ERROR_NOSUCHTABLE); $this->expectError(MDB2_ERROR_NOSUCHTABLE);
$result =& $this->_doQuery($query, true); $result = $this->_doQuery($query, true);
$this->popExpect(); $this->popExpect();
$this->popErrorHandling(); $this->popErrorHandling();
if (PEAR::isError($result)) { if (PEAR::isError($result)) {
@ -1287,7 +1293,7 @@ class MDB2_Driver_mysql extends MDB2_Driver_Common
$value = $this->lastInsertID(); $value = $this->lastInsertID();
if (is_numeric($value)) { if (is_numeric($value)) {
$query = "DELETE FROM $sequence_name WHERE $seqcol_name < $value"; $query = "DELETE FROM $sequence_name WHERE $seqcol_name < $value";
$result =& $this->_doQuery($query, true); $result = $this->_doQuery($query, true);
if (PEAR::isError($result)) { if (PEAR::isError($result)) {
$this->warnings[] = 'nextID: could not delete previous sequence table values from '.$seq_name; $this->warnings[] = 'nextID: could not delete previous sequence table values from '.$seq_name;
} }
@ -1310,7 +1316,8 @@ class MDB2_Driver_mysql extends MDB2_Driver_Common
function lastInsertID($table = null, $field = null) function lastInsertID($table = null, $field = null)
{ {
// not using mysql_insert_id() due to http://pear.php.net/bugs/bug.php?id=8051 // not using mysql_insert_id() due to http://pear.php.net/bugs/bug.php?id=8051
return $this->queryOne('SELECT LAST_INSERT_ID()', 'integer'); // not casting to integer to handle BIGINT http://pear.php.net/bugs/bug.php?id=17650
return $this->queryOne('SELECT LAST_INSERT_ID()');
} }
// }}} // }}}
@ -1352,7 +1359,7 @@ class MDB2_Result_mysql extends MDB2_Result_Common
* @return int data array on success, a MDB2 error on failure * @return int data array on success, a MDB2 error on failure
* @access public * @access public
*/ */
function &fetchRow($fetchmode = MDB2_FETCHMODE_DEFAULT, $rownum = null) function fetchRow($fetchmode = MDB2_FETCHMODE_DEFAULT, $rownum = null)
{ {
if (!is_null($rownum)) { if (!is_null($rownum)) {
$seek = $this->seek($rownum); $seek = $this->seek($rownum);
@ -1376,12 +1383,11 @@ class MDB2_Result_mysql extends MDB2_Result_Common
if (!$row) { if (!$row) {
if ($this->result === false) { if ($this->result === false) {
$err =& $this->db->raiseError(MDB2_ERROR_NEED_MORE_DATA, null, null, $err = $this->db->raiseError(MDB2_ERROR_NEED_MORE_DATA, null, null,
'resultset has already been freed', __FUNCTION__); 'resultset has already been freed', __FUNCTION__);
return $err; return $err;
} }
$null = null; return null;
return $null;
} }
$mode = $this->db->options['portability'] & MDB2_PORTABILITY_EMPTY_TO_NULL; $mode = $this->db->options['portability'] & MDB2_PORTABILITY_EMPTY_TO_NULL;
$rtrim = false; $rtrim = false;
@ -1406,7 +1412,8 @@ class MDB2_Result_mysql extends MDB2_Result_Common
if ($object_class == 'stdClass') { if ($object_class == 'stdClass') {
$row = (object) $row; $row = (object) $row;
} else { } else {
$row = new $object_class($row); $rowObj = new $object_class($row);
$row = $rowObj;
} }
} }
++$this->rownum; ++$this->rownum;
@ -1568,6 +1575,8 @@ class MDB2_BufferedResult_mysql extends MDB2_Result_mysql
} }
return $rows; return $rows;
} }
// }}}
} }
/** /**
@ -1591,10 +1600,10 @@ class MDB2_Statement_mysql extends MDB2_Statement_Common
* a MDB2 error on failure * a MDB2 error on failure
* @access private * @access private
*/ */
function &_execute($result_class = true, $result_wrap_class = false) function _execute($result_class = true, $result_wrap_class = false)
{ {
if (is_null($this->statement)) { if (is_null($this->statement)) {
$result =& parent::_execute($result_class, $result_wrap_class); $result = parent::_execute($result_class, $result_wrap_class);
return $result; return $result;
} }
$this->db->last_query = $this->query; $this->db->last_query = $this->query;
@ -1617,6 +1626,7 @@ class MDB2_Statement_mysql extends MDB2_Statement_Common
return $this->db->raiseError(MDB2_ERROR_NOT_FOUND, null, null, return $this->db->raiseError(MDB2_ERROR_NOT_FOUND, null, null,
'Unable to bind to missing placeholder: '.$parameter, __FUNCTION__); 'Unable to bind to missing placeholder: '.$parameter, __FUNCTION__);
} }
$close = false;
$value = $this->values[$parameter]; $value = $this->values[$parameter];
$type = array_key_exists($parameter, $this->types) ? $this->types[$parameter] : null; $type = array_key_exists($parameter, $this->types) ? $this->types[$parameter] : null;
if (is_resource($value) || $type == 'clob' || $type == 'blob' && $this->db->options['lob_allow_url_include']) { if (is_resource($value) || $type == 'clob' || $type == 'blob' && $this->db->options['lob_allow_url_include']) {
@ -1661,7 +1671,7 @@ class MDB2_Statement_mysql extends MDB2_Statement_Common
return $affected_rows; return $affected_rows;
} }
$result =& $this->db->_wrapResult($result, $this->result_types, $result = $this->db->_wrapResult($result, $this->result_types,
$result_class, $result_wrap_class, $this->limit, $this->offset); $result_class, $result_wrap_class, $this->limit, $this->offset);
$this->db->debug($this->query, 'execute', array('is_manip' => $this->is_manip, 'when' => 'post', 'result' => $result)); $this->db->debug($this->query, 'execute', array('is_manip' => $this->is_manip, 'when' => 'post', 'result' => $result));
return $result; return $result;

View File

@ -43,7 +43,7 @@
// | Author: Paul Cooper <pgc@ucecom.com> | // | Author: Paul Cooper <pgc@ucecom.com> |
// +----------------------------------------------------------------------+ // +----------------------------------------------------------------------+
// //
// $Id: pgsql.php,v 1.203 2008/11/29 14:04:46 afz Exp $ // $Id: pgsql.php 295587 2010-02-28 17:16:38Z quipo $
/** /**
* MDB2 PostGreSQL driver * MDB2 PostGreSQL driver
@ -236,21 +236,22 @@ class MDB2_Driver_pgsql extends MDB2_Driver_Common
function beginTransaction($savepoint = null) function beginTransaction($savepoint = null)
{ {
$this->debug('Starting transaction/savepoint', __FUNCTION__, array('is_manip' => true, 'savepoint' => $savepoint)); $this->debug('Starting transaction/savepoint', __FUNCTION__, array('is_manip' => true, 'savepoint' => $savepoint));
if (!is_null($savepoint)) { if (null !== $savepoint) {
if (!$this->in_transaction) { if (!$this->in_transaction) {
return $this->raiseError(MDB2_ERROR_INVALID, null, null, return $this->raiseError(MDB2_ERROR_INVALID, null, null,
'savepoint cannot be released when changes are auto committed', __FUNCTION__); 'savepoint cannot be released when changes are auto committed', __FUNCTION__);
} }
$query = 'SAVEPOINT '.$savepoint; $query = 'SAVEPOINT '.$savepoint;
return $this->_doQuery($query, true); return $this->_doQuery($query, true);
} elseif ($this->in_transaction) { }
if ($this->in_transaction) {
return MDB2_OK; //nothing to do return MDB2_OK; //nothing to do
} }
if (!$this->destructor_registered && $this->opened_persistent) { if (!$this->destructor_registered && $this->opened_persistent) {
$this->destructor_registered = true; $this->destructor_registered = true;
register_shutdown_function('MDB2_closeOpenTransactions'); register_shutdown_function('MDB2_closeOpenTransactions');
} }
$result =& $this->_doQuery('BEGIN', true); $result = $this->_doQuery('BEGIN', true);
if (PEAR::isError($result)) { if (PEAR::isError($result)) {
return $result; return $result;
} }
@ -279,12 +280,12 @@ class MDB2_Driver_pgsql extends MDB2_Driver_Common
return $this->raiseError(MDB2_ERROR_INVALID, null, null, return $this->raiseError(MDB2_ERROR_INVALID, null, null,
'commit/release savepoint cannot be done changes are auto committed', __FUNCTION__); 'commit/release savepoint cannot be done changes are auto committed', __FUNCTION__);
} }
if (!is_null($savepoint)) { if (null !== $savepoint) {
$query = 'RELEASE SAVEPOINT '.$savepoint; $query = 'RELEASE SAVEPOINT '.$savepoint;
return $this->_doQuery($query, true); return $this->_doQuery($query, true);
} }
$result =& $this->_doQuery('COMMIT', true); $result = $this->_doQuery('COMMIT', true);
if (PEAR::isError($result)) { if (PEAR::isError($result)) {
return $result; return $result;
} }
@ -313,13 +314,13 @@ class MDB2_Driver_pgsql extends MDB2_Driver_Common
return $this->raiseError(MDB2_ERROR_INVALID, null, null, return $this->raiseError(MDB2_ERROR_INVALID, null, null,
'rollback cannot be done changes are auto committed', __FUNCTION__); 'rollback cannot be done changes are auto committed', __FUNCTION__);
} }
if (!is_null($savepoint)) { if (null !== $savepoint) {
$query = 'ROLLBACK TO SAVEPOINT '.$savepoint; $query = 'ROLLBACK TO SAVEPOINT '.$savepoint;
return $this->_doQuery($query, true); return $this->_doQuery($query, true);
} }
$query = 'ROLLBACK'; $query = 'ROLLBACK';
$result =& $this->_doQuery($query, true); $result = $this->_doQuery($query, true);
if (PEAR::isError($result)) { if (PEAR::isError($result)) {
return $result; return $result;
} }
@ -338,12 +339,16 @@ class MDB2_Driver_pgsql extends MDB2_Driver_Common
* READ COMMITTED (prevents dirty reads) * READ COMMITTED (prevents dirty reads)
* REPEATABLE READ (prevents nonrepeatable reads) * REPEATABLE READ (prevents nonrepeatable reads)
* SERIALIZABLE (prevents phantom reads) * SERIALIZABLE (prevents phantom reads)
* @param array some transaction options:
* 'wait' => 'WAIT' | 'NO WAIT'
* 'rw' => 'READ WRITE' | 'READ ONLY'
*
* @return mixed MDB2_OK on success, a MDB2 error on failure * @return mixed MDB2_OK on success, a MDB2 error on failure
* *
* @access public * @access public
* @since 2.1.1 * @since 2.1.1
*/ */
static function setTransactionIsolation($isolation, $options = array()) function setTransactionIsolation($isolation, $options = array())
{ {
$this->debug('Setting transaction isolation level', __FUNCTION__, array('is_manip' => true)); $this->debug('Setting transaction isolation level', __FUNCTION__, array('is_manip' => true));
switch ($isolation) { switch ($isolation) {
@ -452,6 +457,29 @@ class MDB2_Driver_pgsql extends MDB2_Driver_Common
} }
} }
// Enable extra compatibility settings on 8.2 and later
if (function_exists('pg_parameter_status')) {
$version = pg_parameter_status($connection, 'server_version');
if ($version == false) {
return $this->raiseError(null, null, null,
'Unable to retrieve server version', __FUNCTION__);
}
$version = explode ('.', $version);
if ( $version['0'] > 8
|| ($version['0'] == 8 && $version['1'] >= 2)
) {
if (!@pg_query($connection, "SET SESSION STANDARD_CONFORMING_STRINGS = OFF")) {
return $this->raiseError(null, null, null,
'Unable to set standard_conforming_strings to off', __FUNCTION__);
}
if (!@pg_query($connection, "SET SESSION ESCAPE_STRING_WARNING = OFF")) {
return $this->raiseError(null, null, null,
'Unable to set escape_string_warning to off', __FUNCTION__);
}
}
}
return $connection; return $connection;
} }
@ -509,7 +537,7 @@ class MDB2_Driver_pgsql extends MDB2_Driver_Common
*/ */
function setCharset($charset, $connection = null) function setCharset($charset, $connection = null)
{ {
if (is_null($connection)) { if (null === $connection) {
$connection = $this->getConnection(); $connection = $this->getConnection();
if (PEAR::isError($connection)) { if (PEAR::isError($connection)) {
return $connection; return $connection;
@ -595,7 +623,7 @@ class MDB2_Driver_pgsql extends MDB2_Driver_Common
// }}} // }}}
// {{{ standaloneQuery() // {{{ standaloneQuery()
/** /**
* execute a query as DBA * execute a query as DBA
* *
* @param string $query the SQL query * @param string $query the SQL query
@ -605,7 +633,7 @@ class MDB2_Driver_pgsql extends MDB2_Driver_Common
* @return mixed MDB2_OK on success, a MDB2 error on failure * @return mixed MDB2_OK on success, a MDB2 error on failure
* @access public * @access public
*/ */
function &standaloneQuery($query, $types = null, $is_manip = false) function standaloneQuery($query, $types = null, $is_manip = false)
{ {
$user = $this->options['DBA_username']? $this->options['DBA_username'] : $this->dsn['username']; $user = $this->options['DBA_username']? $this->options['DBA_username'] : $this->dsn['username'];
$pass = $this->options['DBA_password']? $this->options['DBA_password'] : $this->dsn['password']; $pass = $this->options['DBA_password']? $this->options['DBA_password'] : $this->dsn['password'];
@ -619,7 +647,7 @@ class MDB2_Driver_pgsql extends MDB2_Driver_Common
$this->offset = $this->limit = 0; $this->offset = $this->limit = 0;
$query = $this->_modifyQuery($query, $is_manip, $limit, $offset); $query = $this->_modifyQuery($query, $is_manip, $limit, $offset);
$result =& $this->_doQuery($query, $is_manip, $connection, $this->database_name); $result = $this->_doQuery($query, $is_manip, $connection, $this->database_name);
if (!PEAR::isError($result)) { if (!PEAR::isError($result)) {
if ($is_manip) { if ($is_manip) {
$result = $this->_affectedRows($connection, $result); $result = $this->_affectedRows($connection, $result);
@ -644,7 +672,7 @@ class MDB2_Driver_pgsql extends MDB2_Driver_Common
* @return result or error object * @return result or error object
* @access protected * @access protected
*/ */
function &_doQuery($query, $is_manip = false, $connection = null, $database_name = null) function _doQuery($query, $is_manip = false, $connection = null, $database_name = null)
{ {
$this->last_query = $query; $this->last_query = $query;
$result = $this->debug($query, 'query', array('is_manip' => $is_manip, 'when' => 'pre')); $result = $this->debug($query, 'query', array('is_manip' => $is_manip, 'when' => 'pre'));
@ -659,7 +687,7 @@ class MDB2_Driver_pgsql extends MDB2_Driver_Common
return $result; return $result;
} }
if (is_null($connection)) { if (null === $connection) {
$connection = $this->getConnection(); $connection = $this->getConnection();
if (PEAR::isError($connection)) { if (PEAR::isError($connection)) {
return $connection; return $connection;
@ -669,12 +697,12 @@ class MDB2_Driver_pgsql extends MDB2_Driver_Common
$function = $this->options['multi_query'] ? 'pg_send_query' : 'pg_query'; $function = $this->options['multi_query'] ? 'pg_send_query' : 'pg_query';
$result = @$function($connection, $query); $result = @$function($connection, $query);
if (!$result) { if (!$result) {
$err =& $this->raiseError(null, null, null, $err = $this->raiseError(null, null, null,
'Could not execute statement', __FUNCTION__); 'Could not execute statement', __FUNCTION__);
return $err; return $err;
} elseif ($this->options['multi_query']) { } elseif ($this->options['multi_query']) {
if (!($result = @pg_get_result($connection))) { if (!($result = @pg_get_result($connection))) {
$err =& $this->raiseError(null, null, null, $err = $this->raiseError(null, null, null,
'Could not get the first result from a multi query', __FUNCTION__); 'Could not get the first result from a multi query', __FUNCTION__);
return $err; return $err;
} }
@ -697,7 +725,7 @@ class MDB2_Driver_pgsql extends MDB2_Driver_Common
*/ */
function _affectedRows($connection, $result = null) function _affectedRows($connection, $result = null)
{ {
if (is_null($connection)) { if (null === $connection) {
$connection = $this->getConnection(); $connection = $this->getConnection();
if (PEAR::isError($connection)) { if (PEAR::isError($connection)) {
return $connection; return $connection;
@ -841,11 +869,10 @@ class MDB2_Driver_pgsql extends MDB2_Driver_Common
* @access public * @access public
* @see bindParam, execute * @see bindParam, execute
*/ */
function &prepare($query, $types = null, $result_types = null, $lobs = array()) function prepare($query, $types = null, $result_types = null, $lobs = array())
{ {
if ($this->options['emulate_prepared']) { if ($this->options['emulate_prepared']) {
$obj =& parent::prepare($query, $types, $result_types, $lobs); return parent::prepare($query, $types, $result_types, $lobs);
return $obj;
} }
$is_manip = ($result_types === MDB2_PREPARE_MANIP); $is_manip = ($result_types === MDB2_PREPARE_MANIP);
$offset = $this->offset; $offset = $this->offset;
@ -885,7 +912,7 @@ class MDB2_Driver_pgsql extends MDB2_Driver_Common
} else { } else {
break; break;
} }
if (is_null($placeholder_type)) { if (null === $placeholder_type) {
$placeholder_type_guess = $query[$p_position]; $placeholder_type_guess = $query[$p_position];
} }
@ -899,7 +926,7 @@ class MDB2_Driver_pgsql extends MDB2_Driver_Common
} }
if ($query[$position] == $placeholder_type_guess) { if ($query[$position] == $placeholder_type_guess) {
if (is_null($placeholder_type)) { if (null === $placeholder_type) {
$placeholder_type = $query[$p_position]; $placeholder_type = $query[$p_position];
$question = $colon = $placeholder_type; $question = $colon = $placeholder_type;
if (!empty($types) && is_array($types)) { if (!empty($types) && is_array($types)) {
@ -916,7 +943,7 @@ class MDB2_Driver_pgsql extends MDB2_Driver_Common
$regexp = '/^.{'.($position+1).'}('.$this->options['bindname_format'].').*$/s'; $regexp = '/^.{'.($position+1).'}('.$this->options['bindname_format'].').*$/s';
$param = preg_replace($regexp, '\\1', $query); $param = preg_replace($regexp, '\\1', $query);
if ($param === '') { if ($param === '') {
$err =& $this->raiseError(MDB2_ERROR_SYNTAX, null, null, $err = $this->raiseError(MDB2_ERROR_SYNTAX, null, null,
'named parameter name must match "bindname_format" option', __FUNCTION__); 'named parameter name must match "bindname_format" option', __FUNCTION__);
return $err; return $err;
} }
@ -958,10 +985,10 @@ class MDB2_Driver_pgsql extends MDB2_Driver_Common
static $prep_statement_counter = 1; static $prep_statement_counter = 1;
$statement_name = sprintf($this->options['statement_format'], $this->phptype, $prep_statement_counter++ . sha1(microtime() + mt_rand())); $statement_name = sprintf($this->options['statement_format'], $this->phptype, $prep_statement_counter++ . sha1(microtime() + mt_rand()));
$statement_name = substr(strtolower($statement_name), 0, $this->options['max_identifiers_length']); $statement_name = substr(strtolower($statement_name), 0, $this->options['max_identifiers_length']);
if ($pgtypes === false) { if (false === $pgtypes) {
$result = @pg_prepare($connection, $statement_name, $query); $result = @pg_prepare($connection, $statement_name, $query);
if (!$result) { if (!$result) {
$err =& $this->raiseError(null, null, null, $err = $this->raiseError(null, null, null,
'Unable to create prepared statement handle', __FUNCTION__); 'Unable to create prepared statement handle', __FUNCTION__);
return $err; return $err;
} }
@ -971,7 +998,7 @@ class MDB2_Driver_pgsql extends MDB2_Driver_Common
$types_string = ' ('.implode(', ', $pgtypes).') '; $types_string = ' ('.implode(', ', $pgtypes).') ';
} }
$query = 'PREPARE '.$statement_name.$types_string.' AS '.$query; $query = 'PREPARE '.$statement_name.$types_string.' AS '.$query;
$statement =& $this->_doQuery($query, true, $connection); $statement = $this->_doQuery($query, true, $connection);
if (PEAR::isError($statement)) { if (PEAR::isError($statement)) {
return $statement; return $statement;
} }
@ -1140,9 +1167,9 @@ class MDB2_Result_pgsql extends MDB2_Result_Common
* @return int data array on success, a MDB2 error on failure * @return int data array on success, a MDB2 error on failure
* @access public * @access public
*/ */
function &fetchRow($fetchmode = MDB2_FETCHMODE_DEFAULT, $rownum = null) function fetchRow($fetchmode = MDB2_FETCHMODE_DEFAULT, $rownum = null)
{ {
if (!is_null($rownum)) { if (null !== $rownum) {
$seek = $this->seek($rownum); $seek = $this->seek($rownum);
if (PEAR::isError($seek)) { if (PEAR::isError($seek)) {
return $seek; return $seek;
@ -1162,13 +1189,12 @@ class MDB2_Result_pgsql extends MDB2_Result_Common
$row = @pg_fetch_row($this->result); $row = @pg_fetch_row($this->result);
} }
if (!$row) { if (!$row) {
if ($this->result === false) { if (false === $this->result) {
$err =& $this->db->raiseError(MDB2_ERROR_NEED_MORE_DATA, null, null, $err = $this->db->raiseError(MDB2_ERROR_NEED_MORE_DATA, null, null,
'resultset has already been freed', __FUNCTION__); 'resultset has already been freed', __FUNCTION__);
return $err; return $err;
} }
$null = null; return null;
return $null;
} }
$mode = $this->db->options['portability'] & MDB2_PORTABILITY_EMPTY_TO_NULL; $mode = $this->db->options['portability'] & MDB2_PORTABILITY_EMPTY_TO_NULL;
$rtrim = false; $rtrim = false;
@ -1193,7 +1219,8 @@ class MDB2_Result_pgsql extends MDB2_Result_Common
if ($object_class == 'stdClass') { if ($object_class == 'stdClass') {
$row = (object) $row; $row = (object) $row;
} else { } else {
$row = new $object_class($row); $rowObj = new $object_class($row);
$row = $rowObj;
} }
} }
++$this->rownum; ++$this->rownum;
@ -1242,11 +1269,12 @@ class MDB2_Result_pgsql extends MDB2_Result_Common
function numCols() function numCols()
{ {
$cols = @pg_num_fields($this->result); $cols = @pg_num_fields($this->result);
if (is_null($cols)) { if (null === $cols) {
if ($this->result === false) { if (false === $this->result) {
return $this->db->raiseError(MDB2_ERROR_NEED_MORE_DATA, null, null, return $this->db->raiseError(MDB2_ERROR_NEED_MORE_DATA, null, null,
'resultset has already been freed', __FUNCTION__); 'resultset has already been freed', __FUNCTION__);
} elseif (is_null($this->result)) { }
if (null === $this->result) {
return count($this->types); return count($this->types);
} }
return $this->db->raiseError(null, null, null, return $this->db->raiseError(null, null, null,
@ -1290,7 +1318,7 @@ class MDB2_Result_pgsql extends MDB2_Result_Common
{ {
if (is_resource($this->result) && $this->db->connection) { if (is_resource($this->result) && $this->db->connection) {
$free = @pg_free_result($this->result); $free = @pg_free_result($this->result);
if ($free === false) { if (false === $free) {
return $this->db->raiseError(null, null, null, return $this->db->raiseError(null, null, null,
'Could not free result', __FUNCTION__); 'Could not free result', __FUNCTION__);
} }
@ -1321,10 +1349,11 @@ class MDB2_BufferedResult_pgsql extends MDB2_Result_pgsql
function seek($rownum = 0) function seek($rownum = 0)
{ {
if ($this->rownum != ($rownum - 1) && !@pg_result_seek($this->result, $rownum)) { if ($this->rownum != ($rownum - 1) && !@pg_result_seek($this->result, $rownum)) {
if ($this->result === false) { if (false === $this->result) {
return $this->db->raiseError(MDB2_ERROR_NEED_MORE_DATA, null, null, return $this->db->raiseError(MDB2_ERROR_NEED_MORE_DATA, null, null,
'resultset has already been freed', __FUNCTION__); 'resultset has already been freed', __FUNCTION__);
} elseif (is_null($this->result)) { }
if (null === $this->result) {
return MDB2_OK; return MDB2_OK;
} }
return $this->db->raiseError(MDB2_ERROR_INVALID, null, null, return $this->db->raiseError(MDB2_ERROR_INVALID, null, null,
@ -1364,11 +1393,12 @@ class MDB2_BufferedResult_pgsql extends MDB2_Result_pgsql
function numRows() function numRows()
{ {
$rows = @pg_num_rows($this->result); $rows = @pg_num_rows($this->result);
if (is_null($rows)) { if (null === $rows) {
if ($this->result === false) { if (false === $this->result) {
return $this->db->raiseError(MDB2_ERROR_NEED_MORE_DATA, null, null, return $this->db->raiseError(MDB2_ERROR_NEED_MORE_DATA, null, null,
'resultset has already been freed', __FUNCTION__); 'resultset has already been freed', __FUNCTION__);
} elseif (is_null($this->result)) { }
if (null === $this->result) {
return 0; return 0;
} }
return $this->db->raiseError(null, null, null, return $this->db->raiseError(null, null, null,
@ -1399,11 +1429,10 @@ class MDB2_Statement_pgsql extends MDB2_Statement_Common
* a MDB2 error on failure * a MDB2 error on failure
* @access private * @access private
*/ */
function &_execute($result_class = true, $result_wrap_class = false) function _execute($result_class = true, $result_wrap_class = false)
{ {
if (is_null($this->statement)) { if (null === $this->statement) {
$result =& parent::_execute($result_class, $result_wrap_class); return parent::_execute($result_class, $result_wrap_class);
return $result;
} }
$this->db->last_query = $this->query; $this->db->last_query = $this->query;
$this->db->debug($this->query, 'execute', array('is_manip' => $this->is_manip, 'when' => 'pre', 'parameters' => $this->values)); $this->db->debug($this->query, 'execute', array('is_manip' => $this->is_manip, 'when' => 'pre', 'parameters' => $this->values));
@ -1464,7 +1493,7 @@ class MDB2_Statement_pgsql extends MDB2_Statement_Common
if (!$query) { if (!$query) {
$result = @pg_execute($connection, $this->statement, $parameters); $result = @pg_execute($connection, $this->statement, $parameters);
if (!$result) { if (!$result) {
$err =& $this->db->raiseError(null, null, null, $err = $this->db->raiseError(null, null, null,
'Unable to execute statement', __FUNCTION__); 'Unable to execute statement', __FUNCTION__);
return $err; return $err;
} }
@ -1480,7 +1509,7 @@ class MDB2_Statement_pgsql extends MDB2_Statement_Common
return $affected_rows; return $affected_rows;
} }
$result =& $this->db->_wrapResult($result, $this->result_types, $result = $this->db->_wrapResult($result, $this->result_types,
$result_class, $result_wrap_class, $this->limit, $this->offset); $result_class, $result_wrap_class, $this->limit, $this->offset);
$this->db->debug($this->query, 'execute', array('is_manip' => $this->is_manip, 'when' => 'post', 'result' => $result)); $this->db->debug($this->query, 'execute', array('is_manip' => $this->is_manip, 'when' => 'post', 'result' => $result));
return $result; return $result;
@ -1497,13 +1526,13 @@ class MDB2_Statement_pgsql extends MDB2_Statement_Common
*/ */
function free() function free()
{ {
if (is_null($this->positions)) { if (null === $this->positions) {
return $this->db->raiseError(MDB2_ERROR, null, null, return $this->db->raiseError(MDB2_ERROR, null, null,
'Prepared statement has already been freed', __FUNCTION__); 'Prepared statement has already been freed', __FUNCTION__);
} }
$result = MDB2_OK; $result = MDB2_OK;
if (!is_null($this->statement)) { if (null !== $this->statement) {
$connection = $this->db->getConnection(); $connection = $this->db->getConnection();
if (PEAR::isError($connection)) { if (PEAR::isError($connection)) {
return $connection; return $connection;

View File

@ -43,7 +43,7 @@
// | Author: Lukas Smith <smith@pooteeweet.org> | // | Author: Lukas Smith <smith@pooteeweet.org> |
// +----------------------------------------------------------------------+ // +----------------------------------------------------------------------+
// //
// $Id: sqlite.php,v 1.165 2008/11/30 14:28:01 afz Exp $ // $Id: sqlite.php 295587 2010-02-28 17:16:38Z quipo $
// //
/** /**
@ -131,7 +131,7 @@ class MDB2_Driver_sqlite extends MDB2_Driver_Common
// this hack to work around it, per bug #9599. // this hack to work around it, per bug #9599.
$native_msg = preg_replace('/^sqlite[a-z_]+\(\)[^:]*: /', '', $native_msg); $native_msg = preg_replace('/^sqlite[a-z_]+\(\)[^:]*: /', '', $native_msg);
if (is_null($error)) { if (null === $error) {
static $error_regexps; static $error_regexps;
if (empty($error_regexps)) { if (empty($error_regexps)) {
$error_regexps = array( $error_regexps = array(
@ -194,10 +194,11 @@ class MDB2_Driver_sqlite extends MDB2_Driver_Common
function beginTransaction($savepoint = null) function beginTransaction($savepoint = null)
{ {
$this->debug('Starting transaction/savepoint', __FUNCTION__, array('is_manip' => true, 'savepoint' => $savepoint)); $this->debug('Starting transaction/savepoint', __FUNCTION__, array('is_manip' => true, 'savepoint' => $savepoint));
if (!is_null($savepoint)) { if (null !== $savepoint) {
return $this->raiseError(MDB2_ERROR_UNSUPPORTED, null, null, return $this->raiseError(MDB2_ERROR_UNSUPPORTED, null, null,
'savepoints are not supported', __FUNCTION__); 'savepoints are not supported', __FUNCTION__);
} elseif ($this->in_transaction) { }
if ($this->in_transaction) {
return MDB2_OK; //nothing to do return MDB2_OK; //nothing to do
} }
if (!$this->destructor_registered && $this->opened_persistent) { if (!$this->destructor_registered && $this->opened_persistent) {
@ -205,7 +206,7 @@ class MDB2_Driver_sqlite extends MDB2_Driver_Common
register_shutdown_function('MDB2_closeOpenTransactions'); register_shutdown_function('MDB2_closeOpenTransactions');
} }
$query = 'BEGIN TRANSACTION '.$this->options['base_transaction_name']; $query = 'BEGIN TRANSACTION '.$this->options['base_transaction_name'];
$result =$this->_doQuery($query, true); $result = $this->_doQuery($query, true);
if (PEAR::isError($result)) { if (PEAR::isError($result)) {
return $result; return $result;
} }
@ -234,13 +235,13 @@ class MDB2_Driver_sqlite extends MDB2_Driver_Common
return $this->raiseError(MDB2_ERROR_INVALID, null, null, return $this->raiseError(MDB2_ERROR_INVALID, null, null,
'commit/release savepoint cannot be done changes are auto committed', __FUNCTION__); 'commit/release savepoint cannot be done changes are auto committed', __FUNCTION__);
} }
if (!is_null($savepoint)) { if (null !== $savepoint) {
return $this->raiseError(MDB2_ERROR_UNSUPPORTED, null, null, return $this->raiseError(MDB2_ERROR_UNSUPPORTED, null, null,
'savepoints are not supported', __FUNCTION__); 'savepoints are not supported', __FUNCTION__);
} }
$query = 'COMMIT TRANSACTION '.$this->options['base_transaction_name']; $query = 'COMMIT TRANSACTION '.$this->options['base_transaction_name'];
$result =$this->_doQuery($query, true); $result = $this->_doQuery($query, true);
if (PEAR::isError($result)) { if (PEAR::isError($result)) {
return $result; return $result;
} }
@ -269,13 +270,13 @@ class MDB2_Driver_sqlite extends MDB2_Driver_Common
return $this->raiseError(MDB2_ERROR_INVALID, null, null, return $this->raiseError(MDB2_ERROR_INVALID, null, null,
'rollback cannot be done changes are auto committed', __FUNCTION__); 'rollback cannot be done changes are auto committed', __FUNCTION__);
} }
if (!is_null($savepoint)) { if (null !== $savepoint) {
return $this->raiseError(MDB2_ERROR_UNSUPPORTED, null, null, return $this->raiseError(MDB2_ERROR_UNSUPPORTED, null, null,
'savepoints are not supported', __FUNCTION__); 'savepoints are not supported', __FUNCTION__);
} }
$query = 'ROLLBACK TRANSACTION '.$this->options['base_transaction_name']; $query = 'ROLLBACK TRANSACTION '.$this->options['base_transaction_name'];
$result =$this->_doQuery($query, true); $result = $this->_doQuery($query, true);
if (PEAR::isError($result)) { if (PEAR::isError($result)) {
return $result; return $result;
} }
@ -294,12 +295,16 @@ class MDB2_Driver_sqlite extends MDB2_Driver_Common
* READ COMMITTED (prevents dirty reads) * READ COMMITTED (prevents dirty reads)
* REPEATABLE READ (prevents nonrepeatable reads) * REPEATABLE READ (prevents nonrepeatable reads)
* SERIALIZABLE (prevents phantom reads) * SERIALIZABLE (prevents phantom reads)
* @param array some transaction options:
* 'wait' => 'WAIT' | 'NO WAIT'
* 'rw' => 'READ WRITE' | 'READ ONLY'
*
* @return mixed MDB2_OK on success, a MDB2 error on failure * @return mixed MDB2_OK on success, a MDB2 error on failure
* *
* @access public * @access public
* @since 2.1.1 * @since 2.1.1
*/ */
static function setTransactionIsolation($isolation,$options=array()) function setTransactionIsolation($isolation, $options = array())
{ {
$this->debug('Setting transaction isolation level', __FUNCTION__, array('is_manip' => true)); $this->debug('Setting transaction isolation level', __FUNCTION__, array('is_manip' => true));
switch ($isolation) { switch ($isolation) {
@ -347,7 +352,6 @@ class MDB2_Driver_sqlite extends MDB2_Driver_Common
**/ **/
function connect() function connect()
{ {
$datadir=OC_Config::getValue( "datadirectory", OC::$SERVERROOT."/data" );
$database_file = $this->_getDatabaseFile($this->database_name); $database_file = $this->_getDatabaseFile($this->database_name);
if (is_resource($this->connection)) { if (is_resource($this->connection)) {
//if (count(array_diff($this->connected_dsn, $this->dsn)) == 0 //if (count(array_diff($this->connected_dsn, $this->dsn)) == 0
@ -371,9 +375,6 @@ class MDB2_Driver_sqlite extends MDB2_Driver_Common
} }
if ($database_file !== ':memory:') { if ($database_file !== ':memory:') {
if(!strpos($database_file,'.db')){
$database_file="$datadir/$database_file.db";
}
if (!file_exists($database_file)) { if (!file_exists($database_file)) {
if (!touch($database_file)) { if (!touch($database_file)) {
return $this->raiseError(MDB2_ERROR_NOT_FOUND, null, null, return $this->raiseError(MDB2_ERROR_NOT_FOUND, null, null,
@ -409,9 +410,7 @@ class MDB2_Driver_sqlite extends MDB2_Driver_Common
$php_errormsg = ''; $php_errormsg = '';
if (version_compare('5.1.0', PHP_VERSION, '>')) { if (version_compare('5.1.0', PHP_VERSION, '>')) {
@ini_set('track_errors', true); @ini_set('track_errors', true);
echo 1;
$connection = @$connect_function($database_file); $connection = @$connect_function($database_file);
echo 2;
@ini_restore('track_errors'); @ini_restore('track_errors');
} else { } else {
$connection = @$connect_function($database_file, 0666, $php_errormsg); $connection = @$connect_function($database_file, 0666, $php_errormsg);
@ -505,7 +504,7 @@ class MDB2_Driver_sqlite extends MDB2_Driver_Common
* @return result or error object * @return result or error object
* @access protected * @access protected
*/ */
function &_doQuery($query, $is_manip = false, $connection = null, $database_name = null) function _doQuery($query, $is_manip = false, $connection = null, $database_name = null)
{ {
$this->last_query = $query; $this->last_query = $query;
$result = $this->debug($query, 'query', array('is_manip' => $is_manip, 'when' => 'pre')); $result = $this->debug($query, 'query', array('is_manip' => $is_manip, 'when' => 'pre'));
@ -520,7 +519,7 @@ class MDB2_Driver_sqlite extends MDB2_Driver_Common
return $result; return $result;
} }
if (is_null($connection)) { if (null === $connection) {
$connection = $this->getConnection(); $connection = $this->getConnection();
if (PEAR::isError($connection)) { if (PEAR::isError($connection)) {
return $connection; return $connection;
@ -544,7 +543,11 @@ class MDB2_Driver_sqlite extends MDB2_Driver_Common
$this->_lasterror = $php_errormsg; $this->_lasterror = $php_errormsg;
if (!$result) { if (!$result) {
$err =$this->raiseError(null, null, null, $code = null;
if (0 === strpos($this->_lasterror, 'no such table')) {
$code = MDB2_ERROR_NOSUCHTABLE;
}
$err = $this->raiseError($code, null, null,
'Could not execute statement', __FUNCTION__); 'Could not execute statement', __FUNCTION__);
return $err; return $err;
} }
@ -566,7 +569,7 @@ class MDB2_Driver_sqlite extends MDB2_Driver_Common
*/ */
function _affectedRows($connection, $result = null) function _affectedRows($connection, $result = null)
{ {
if (is_null($connection)) { if (null === $connection) {
$connection = $this->getConnection(); $connection = $this->getConnection();
if (PEAR::isError($connection)) { if (PEAR::isError($connection)) {
return $connection; return $connection;
@ -759,7 +762,7 @@ class MDB2_Driver_sqlite extends MDB2_Driver_Common
$table = $this->quoteIdentifier($table, true); $table = $this->quoteIdentifier($table, true);
$query = "REPLACE INTO $table ($query) VALUES ($values)"; $query = "REPLACE INTO $table ($query) VALUES ($values)";
$result =$this->_doQuery($query, true, $connection); $result = $this->_doQuery($query, true, $connection);
if (PEAR::isError($result)) { if (PEAR::isError($result)) {
return $result; return $result;
} }
@ -787,7 +790,7 @@ class MDB2_Driver_sqlite extends MDB2_Driver_Common
$query = "INSERT INTO $sequence_name ($seqcol_name) VALUES (NULL)"; $query = "INSERT INTO $sequence_name ($seqcol_name) VALUES (NULL)";
$this->pushErrorHandling(PEAR_ERROR_RETURN); $this->pushErrorHandling(PEAR_ERROR_RETURN);
$this->expectError(MDB2_ERROR_NOSUCHTABLE); $this->expectError(MDB2_ERROR_NOSUCHTABLE);
$result =$this->_doQuery($query, true); $result = $this->_doQuery($query, true);
$this->popExpect(); $this->popExpect();
$this->popErrorHandling(); $this->popErrorHandling();
if (PEAR::isError($result)) { if (PEAR::isError($result)) {
@ -806,7 +809,7 @@ class MDB2_Driver_sqlite extends MDB2_Driver_Common
$value = $this->lastInsertID(); $value = $this->lastInsertID();
if (is_numeric($value)) { if (is_numeric($value)) {
$query = "DELETE FROM $sequence_name WHERE $seqcol_name < $value"; $query = "DELETE FROM $sequence_name WHERE $seqcol_name < $value";
$result =$this->_doQuery($query, true); $result = $this->_doQuery($query, true);
if (PEAR::isError($result)) { if (PEAR::isError($result)) {
$this->warnings[] = 'nextID: could not delete previous sequence table values from '.$seq_name; $this->warnings[] = 'nextID: could not delete previous sequence table values from '.$seq_name;
} }
@ -879,9 +882,9 @@ class MDB2_Result_sqlite extends MDB2_Result_Common
* @return int data array on success, a MDB2 error on failure * @return int data array on success, a MDB2 error on failure
* @access public * @access public
*/ */
function &fetchRow($fetchmode = MDB2_FETCHMODE_DEFAULT, $rownum = null) function fetchRow($fetchmode = MDB2_FETCHMODE_DEFAULT, $rownum = null)
{ {
if (!is_null($rownum)) { if (null !== $rownum) {
$seek = $this->seek($rownum); $seek = $this->seek($rownum);
if (PEAR::isError($seek)) { if (PEAR::isError($seek)) {
return $seek; return $seek;
@ -901,13 +904,12 @@ class MDB2_Result_sqlite extends MDB2_Result_Common
$row = @sqlite_fetch_array($this->result, SQLITE_NUM); $row = @sqlite_fetch_array($this->result, SQLITE_NUM);
} }
if (!$row) { if (!$row) {
if ($this->result === false) { if (false === $this->result) {
$err =$this->db->raiseError(MDB2_ERROR_NEED_MORE_DATA, null, null, $err = $this->db->raiseError(MDB2_ERROR_NEED_MORE_DATA, null, null,
'resultset has already been freed', __FUNCTION__); 'resultset has already been freed', __FUNCTION__);
return $err; return $err;
} }
$null = null; return null;
return $null;
} }
$mode = $this->db->options['portability'] & MDB2_PORTABILITY_EMPTY_TO_NULL; $mode = $this->db->options['portability'] & MDB2_PORTABILITY_EMPTY_TO_NULL;
$rtrim = false; $rtrim = false;
@ -932,7 +934,8 @@ class MDB2_Result_sqlite extends MDB2_Result_Common
if ($object_class == 'stdClass') { if ($object_class == 'stdClass') {
$row = (object) $row; $row = (object) $row;
} else { } else {
$row = new $object_class($row); $rowObj = new $object_class($row);
$row = $rowObj;
} }
} }
++$this->rownum; ++$this->rownum;
@ -981,11 +984,12 @@ class MDB2_Result_sqlite extends MDB2_Result_Common
function numCols() function numCols()
{ {
$cols = @sqlite_num_fields($this->result); $cols = @sqlite_num_fields($this->result);
if (is_null($cols)) { if (null === $cols) {
if ($this->result === false) { if (false === $this->result) {
return $this->db->raiseError(MDB2_ERROR_NEED_MORE_DATA, null, null, return $this->db->raiseError(MDB2_ERROR_NEED_MORE_DATA, null, null,
'resultset has already been freed', __FUNCTION__); 'resultset has already been freed', __FUNCTION__);
} elseif (is_null($this->result)) { }
if (null === $this->result) {
return count($this->types); return count($this->types);
} }
return $this->db->raiseError(null, null, null, return $this->db->raiseError(null, null, null,
@ -1016,10 +1020,11 @@ class MDB2_BufferedResult_sqlite extends MDB2_Result_sqlite
function seek($rownum = 0) function seek($rownum = 0)
{ {
if (!@sqlite_seek($this->result, $rownum)) { if (!@sqlite_seek($this->result, $rownum)) {
if ($this->result === false) { if (false === $this->result) {
return $this->db->raiseError(MDB2_ERROR_NEED_MORE_DATA, null, null, return $this->db->raiseError(MDB2_ERROR_NEED_MORE_DATA, null, null,
'resultset has already been freed', __FUNCTION__); 'resultset has already been freed', __FUNCTION__);
} elseif (is_null($this->result)) { }
if (null === $this->result) {
return MDB2_OK; return MDB2_OK;
} }
return $this->db->raiseError(MDB2_ERROR_INVALID, null, null, return $this->db->raiseError(MDB2_ERROR_INVALID, null, null,
@ -1059,11 +1064,12 @@ class MDB2_BufferedResult_sqlite extends MDB2_Result_sqlite
function numRows() function numRows()
{ {
$rows = @sqlite_num_rows($this->result); $rows = @sqlite_num_rows($this->result);
if (is_null($rows)) { if (null === $rows) {
if ($this->result === false) { if (false === $this->result) {
return $this->db->raiseError(MDB2_ERROR_NEED_MORE_DATA, null, null, return $this->db->raiseError(MDB2_ERROR_NEED_MORE_DATA, null, null,
'resultset has already been freed', __FUNCTION__); 'resultset has already been freed', __FUNCTION__);
} elseif (is_null($this->result)) { }
if (null === $this->result) {
return 0; return 0;
} }
return $this->db->raiseError(null, null, null, return $this->db->raiseError(null, null, null,
@ -1084,5 +1090,4 @@ class MDB2_Statement_sqlite extends MDB2_Statement_Common
{ {
} }
?> ?>

View File

@ -42,7 +42,7 @@
// | Author: Lukas Smith <smith@pooteeweet.org> | // | Author: Lukas Smith <smith@pooteeweet.org> |
// +----------------------------------------------------------------------+ // +----------------------------------------------------------------------+
// //
// $Id: Extended.php,v 1.60 2007/11/28 19:49:34 quipo Exp $ // $Id: Extended.php 302784 2010-08-25 23:29:16Z quipo $
/** /**
* @package MDB2 * @package MDB2
@ -96,7 +96,7 @@ class MDB2_Extended extends MDB2_Module_Common
if (PEAR::isError($query)) { if (PEAR::isError($query)) {
return $query; return $query;
} }
$db =& $this->getDBInstance(); $db = $this->getDBInstance();
if (PEAR::isError($db)) { if (PEAR::isError($db)) {
return $db; return $db;
} }
@ -134,7 +134,7 @@ class MDB2_Extended extends MDB2_Module_Common
* @see autoPrepare * @see autoPrepare
* @access public * @access public
*/ */
function &autoExecute($table, $fields_values, $mode = MDB2_AUTOQUERY_INSERT, function autoExecute($table, $fields_values, $mode = MDB2_AUTOQUERY_INSERT,
$where = false, $types = null, $result_class = true, $result_types = MDB2_PREPARE_MANIP) $where = false, $types = null, $result_class = true, $result_types = MDB2_PREPARE_MANIP)
{ {
$fields_values = (array)$fields_values; $fields_values = (array)$fields_values;
@ -153,12 +153,12 @@ class MDB2_Extended extends MDB2_Module_Common
if (empty($params)) { if (empty($params)) {
$query = $this->buildManipSQL($table, $keys, $mode, $where); $query = $this->buildManipSQL($table, $keys, $mode, $where);
$db =& $this->getDBInstance(); $db = $this->getDBInstance();
if (PEAR::isError($db)) { if (PEAR::isError($db)) {
return $db; return $db;
} }
if ($mode == MDB2_AUTOQUERY_SELECT) { if ($mode == MDB2_AUTOQUERY_SELECT) {
$result =& $db->query($query, $result_types, $result_class); $result = $db->query($query, $result_types, $result_class);
} else { } else {
$result = $db->exec($query); $result = $db->exec($query);
} }
@ -167,7 +167,7 @@ class MDB2_Extended extends MDB2_Module_Common
if (PEAR::isError($stmt)) { if (PEAR::isError($stmt)) {
return $stmt; return $stmt;
} }
$result =& $stmt->execute($params, $result_class); $result = $stmt->execute($params, $result_class);
$stmt->free(); $stmt->free();
} }
return $result; return $result;
@ -199,7 +199,7 @@ class MDB2_Extended extends MDB2_Module_Common
*/ */
function buildManipSQL($table, $table_fields, $mode, $where = false) function buildManipSQL($table, $table_fields, $mode, $where = false)
{ {
$db =& $this->getDBInstance(); $db = $this->getDBInstance();
if (PEAR::isError($db)) { if (PEAR::isError($db)) {
return $db; return $db;
} }
@ -214,7 +214,7 @@ class MDB2_Extended extends MDB2_Module_Common
} }
} }
if ($where !== false && !is_null($where)) { if ((false !== $where) && (null !== $where)) {
if (is_array($where)) { if (is_array($where)) {
$where = implode(' AND ', $where); $where = implode(' AND ', $where);
} }
@ -270,10 +270,10 @@ class MDB2_Extended extends MDB2_Module_Common
* @return MDB2_Result|MDB2_Error result set on success, a MDB2 error on failure * @return MDB2_Result|MDB2_Error result set on success, a MDB2 error on failure
* @access public * @access public
*/ */
function &limitQuery($query, $types, $limit, $offset = 0, $result_class = true, function limitQuery($query, $types, $limit, $offset = 0, $result_class = true,
$result_wrap_class = false) $result_wrap_class = false)
{ {
$db =& $this->getDBInstance(); $db = $this->getDBInstance();
if (PEAR::isError($db)) { if (PEAR::isError($db)) {
return $db; return $db;
} }
@ -282,8 +282,7 @@ class MDB2_Extended extends MDB2_Module_Common
if (PEAR::isError($result)) { if (PEAR::isError($result)) {
return $result; return $result;
} }
$result =& $db->query($query, $types, $result_class, $result_wrap_class); return $db->query($query, $types, $result_class, $result_wrap_class);
return $result;
} }
// }}} // }}}
@ -302,7 +301,7 @@ class MDB2_Extended extends MDB2_Module_Common
*/ */
function execParam($query, $params = array(), $param_types = null) function execParam($query, $params = array(), $param_types = null)
{ {
$db =& $this->getDBInstance(); $db = $this->getDBInstance();
if (PEAR::isError($db)) { if (PEAR::isError($db)) {
return $db; return $db;
} }
@ -346,7 +345,7 @@ class MDB2_Extended extends MDB2_Module_Common
function getOne($query, $type = null, $params = array(), function getOne($query, $type = null, $params = array(),
$param_types = null, $colnum = 0) $param_types = null, $colnum = 0)
{ {
$db =& $this->getDBInstance(); $db = $this->getDBInstance();
if (PEAR::isError($db)) { if (PEAR::isError($db)) {
return $db; return $db;
} }
@ -393,7 +392,7 @@ class MDB2_Extended extends MDB2_Module_Common
function getRow($query, $types = null, $params = array(), function getRow($query, $types = null, $params = array(),
$param_types = null, $fetchmode = MDB2_FETCHMODE_DEFAULT) $param_types = null, $fetchmode = MDB2_FETCHMODE_DEFAULT)
{ {
$db =& $this->getDBInstance(); $db = $this->getDBInstance();
if (PEAR::isError($db)) { if (PEAR::isError($db)) {
return $db; return $db;
} }
@ -439,7 +438,7 @@ class MDB2_Extended extends MDB2_Module_Common
function getCol($query, $type = null, $params = array(), function getCol($query, $type = null, $params = array(),
$param_types = null, $colnum = 0) $param_types = null, $colnum = 0)
{ {
$db =& $this->getDBInstance(); $db = $this->getDBInstance();
if (PEAR::isError($db)) { if (PEAR::isError($db)) {
return $db; return $db;
} }
@ -495,7 +494,7 @@ class MDB2_Extended extends MDB2_Module_Common
$param_types = null, $fetchmode = MDB2_FETCHMODE_DEFAULT, $param_types = null, $fetchmode = MDB2_FETCHMODE_DEFAULT,
$rekey = false, $force_array = false, $group = false) $rekey = false, $force_array = false, $group = false)
{ {
$db =& $this->getDBInstance(); $db = $this->getDBInstance();
if (PEAR::isError($db)) { if (PEAR::isError($db)) {
return $db; return $db;
} }
@ -600,7 +599,7 @@ class MDB2_Extended extends MDB2_Module_Common
function getAssoc($query, $types = null, $params = array(), $param_types = null, function getAssoc($query, $types = null, $params = array(), $param_types = null,
$fetchmode = MDB2_FETCHMODE_DEFAULT, $force_array = false, $group = false) $fetchmode = MDB2_FETCHMODE_DEFAULT, $force_array = false, $group = false)
{ {
$db =& $this->getDBInstance(); $db = $this->getDBInstance();
if (PEAR::isError($db)) { if (PEAR::isError($db)) {
return $db; return $db;
} }
@ -644,7 +643,7 @@ class MDB2_Extended extends MDB2_Module_Common
* @access public * @access public
* @see prepare(), execute() * @see prepare(), execute()
*/ */
function executeMultiple(&$stmt, $params = null) function executeMultiple($stmt, $params = null)
{ {
for ($i = 0, $j = count($params); $i < $j; $i++) { for ($i = 0, $j = count($params); $i < $j; $i++) {
$result = $stmt->execute($params[$i]); $result = $stmt->execute($params[$i]);
@ -672,7 +671,7 @@ class MDB2_Extended extends MDB2_Module_Common
*/ */
function getBeforeID($table, $field = null, $ondemand = true, $quote = true) function getBeforeID($table, $field = null, $ondemand = true, $quote = true)
{ {
$db =& $this->getDBInstance(); $db = $this->getDBInstance();
if (PEAR::isError($db)) { if (PEAR::isError($db)) {
return $db; return $db;
} }
@ -705,7 +704,7 @@ class MDB2_Extended extends MDB2_Module_Common
*/ */
function getAfterID($id, $table, $field = null) function getAfterID($id, $table, $field = null)
{ {
$db =& $this->getDBInstance(); $db = $this->getDBInstance();
if (PEAR::isError($db)) { if (PEAR::isError($db)) {
return $db; return $db;
} }

View File

@ -42,7 +42,7 @@
// | Author: Lukas Smith <smith@pooteeweet.org> | // | Author: Lukas Smith <smith@pooteeweet.org> |
// +----------------------------------------------------------------------+ // +----------------------------------------------------------------------+
// //
// $Id: Iterator.php,v 1.22 2006/05/06 14:03:41 lsmith Exp $ // $Id: Iterator.php 295586 2010-02-28 17:04:17Z quipo $
/** /**
* PHP5 Iterator * PHP5 Iterator
@ -112,7 +112,7 @@ class MDB2_Iterator implements Iterator
*/ */
public function current() public function current()
{ {
if (is_null($this->row)) { if (null === $this->row) {
$row = $this->result->fetchRow($this->fetchmode); $row = $this->result->fetchRow($this->fetchmode);
if (PEAR::isError($row)) { if (PEAR::isError($row)) {
$row = false; $row = false;

View File

@ -42,7 +42,7 @@
// | Author: Lukas Smith <smith@pooteeweet.org> | // | Author: Lukas Smith <smith@pooteeweet.org> |
// +----------------------------------------------------------------------+ // +----------------------------------------------------------------------+
// //
// $Id: LOB.php,v 1.34 2006/10/25 11:52:21 lsmith Exp $ // $Id: LOB.php 222350 2006-10-25 11:52:21Z lsmith $
/** /**
* @package MDB2 * @package MDB2
@ -50,7 +50,7 @@
* @author Lukas Smith <smith@pooteeweet.org> * @author Lukas Smith <smith@pooteeweet.org>
*/ */
require_once('MDB2.php'); require_once 'MDB2.php';
/** /**
* MDB2_LOB: user land stream wrapper implementation for LOB support * MDB2_LOB: user land stream wrapper implementation for LOB support

View File

@ -51,7 +51,7 @@
* @link http://pear.php.net/packages/MDB2_Schema * @link http://pear.php.net/packages/MDB2_Schema
*/ */
// require_once('MDB2.php'); require_once 'MDB2.php';
define('MDB2_SCHEMA_DUMP_ALL', 0); define('MDB2_SCHEMA_DUMP_ALL', 0);
define('MDB2_SCHEMA_DUMP_STRUCTURE', 1); define('MDB2_SCHEMA_DUMP_STRUCTURE', 1);
@ -237,9 +237,10 @@ class MDB2_Schema extends PEAR
* @access public * @access public
* @see MDB2::parseDSN * @see MDB2::parseDSN
*/ */
static function factory(&$db, $options = array()) function &factory(&$db, $options = array())
{ {
$obj =new MDB2_Schema(); $obj =& new MDB2_Schema();
$result = $obj->connect($db, $options); $result = $obj->connect($db, $options);
if (PEAR::isError($result)) { if (PEAR::isError($result)) {
return $result; return $result;
@ -280,14 +281,16 @@ class MDB2_Schema extends PEAR
} }
} }
} }
$this->disconnect(); $this->disconnect();
if (!MDB2::isConnection($db)) { if (!MDB2::isConnection($db)) {
$db =MDB2::factory($db, $db_options); $db =& MDB2::factory($db, $db_options);
} }
if (PEAR::isError($db)) { if (PEAR::isError($db)) {
return $db; return $db;
} }
$this->db =& $db; $this->db =& $db;
$this->db->loadModule('Datatype'); $this->db->loadModule('Datatype');
$this->db->loadModule('Manager'); $this->db->loadModule('Manager');
@ -377,7 +380,7 @@ class MDB2_Schema extends PEAR
$dtd_file = $this->options['dtd_file']; $dtd_file = $this->options['dtd_file'];
if ($dtd_file) { if ($dtd_file) {
include_once 'XML/DTD/XmlValidator.php'; include_once 'XML/DTD/XmlValidator.php';
$dtd =new XML_DTD_XmlValidator; $dtd =& new XML_DTD_XmlValidator;
if (!$dtd->isValid($dtd_file, $input_file)) { if (!$dtd->isValid($dtd_file, $input_file)) {
return $this->raiseError(MDB2_SCHEMA_ERROR_PARSE, null, null, $dtd->getMessage()); return $this->raiseError(MDB2_SCHEMA_ERROR_PARSE, null, null, $dtd->getMessage());
} }
@ -390,7 +393,7 @@ class MDB2_Schema extends PEAR
return $result; return $result;
} }
$parser =new $class_name($variables, $fail_on_invalid_names, $structure, $this->options['valid_types'], $this->options['force_defaults']); $parser =& new $class_name($variables, $fail_on_invalid_names, $structure, $this->options['valid_types'], $this->options['force_defaults']);
$result = $parser->setInputFile($input_file); $result = $parser->setInputFile($input_file);
if (PEAR::isError($result)) { if (PEAR::isError($result)) {
return $result; return $result;
@ -425,6 +428,7 @@ class MDB2_Schema extends PEAR
return $this->raiseError(MDB2_SCHEMA_ERROR_INVALID, null, null, return $this->raiseError(MDB2_SCHEMA_ERROR_INVALID, null, null,
'it was not specified a valid database name'); 'it was not specified a valid database name');
} }
$class_name = $this->options['validate']; $class_name = $this->options['validate'];
$result = MDB2::loadClass($class_name, $this->db->getOption('debug')); $result = MDB2::loadClass($class_name, $this->db->getOption('debug'));
@ -432,7 +436,7 @@ class MDB2_Schema extends PEAR
return $result; return $result;
} }
$val =new $class_name($this->options['fail_on_invalid_names'], $this->options['valid_types'], $this->options['force_defaults']); $val =& new $class_name($this->options['fail_on_invalid_names'], $this->options['valid_types'], $this->options['force_defaults']);
$database_definition = array( $database_definition = array(
'name' => $database, 'name' => $database,
@ -1338,15 +1342,15 @@ class MDB2_Schema extends PEAR
if ($dbExists) { if ($dbExists) {
$this->db->debug('Database already exists: ' . $db_name, __FUNCTION__); $this->db->debug('Database already exists: ' . $db_name, __FUNCTION__);
// if (!empty($dbOptions)) { if (!empty($dbOptions)) {
// $errorcodes = array(MDB2_ERROR_UNSUPPORTED, MDB2_ERROR_NO_PERMISSION); $errorcodes = array(MDB2_ERROR_UNSUPPORTED, MDB2_ERROR_NO_PERMISSION);
// $this->db->expectError($errorcodes); $this->db->expectError($errorcodes);
// $result = $this->db->manager->alterDatabase($db_name, $dbOptions); $result = $this->db->manager->alterDatabase($db_name, $dbOptions);
// $this->db->popExpect(); $this->db->popExpect();
// if (PEAR::isError($result) && !MDB2::isError($result, $errorcodes)) { if (PEAR::isError($result) && !MDB2::isError($result, $errorcodes)) {
// return $result; return $result;
// } }
// } }
$create = false; $create = false;
} else { } else {
$this->db->expectError(MDB2_ERROR_UNSUPPORTED); $this->db->expectError(MDB2_ERROR_UNSUPPORTED);
@ -2444,7 +2448,7 @@ class MDB2_Schema extends PEAR
} }
} }
$writer = new $class_name($this->options['valid_types']); $writer =& new $class_name($this->options['valid_types']);
return $writer->dumpDatabase($database_definition, $arguments, $dump); return $writer->dumpDatabase($database_definition, $arguments, $dump);
} }
@ -2692,9 +2696,9 @@ class MDB2_Schema extends PEAR
* @access public * @access public
* @see PEAR_Error * @see PEAR_Error
*/ */
function raiseError($code = null, $mode = null, $options = null, $userinfo = null,$a=null,$b=null,$c=null) function &raiseError($code = null, $mode = null, $options = null, $userinfo = null)
{ {
$err =PEAR::raiseError(null, $code, $mode, $options, $err =& PEAR::raiseError(null, $code, $mode, $options,
$userinfo, 'MDB2_Schema_Error', true); $userinfo, 'MDB2_Schema_Error', true);
return $err; return $err;
} }
@ -2713,7 +2717,7 @@ class MDB2_Schema extends PEAR
* @return bool true if parameter is an error * @return bool true if parameter is an error
* @access public * @access public
*/ */
static function isError($data, $code = null) function isError($data, $code = null)
{ {
if (is_a($data, 'MDB2_Schema_Error')) { if (is_a($data, 'MDB2_Schema_Error')) {
if (is_null($code)) { if (is_null($code)) {

View File

@ -54,8 +54,8 @@
*/ */
require_once('XML/Parser.php'); require_once 'XML/Parser.php';
require_once('MDB2/Schema/Validate.php'); require_once 'MDB2/Schema/Validate.php';
/** /**
* Parses an XML schema file * Parses an XML schema file
@ -120,11 +120,18 @@ class MDB2_Schema_Parser extends XML_Parser
{ {
// force ISO-8859-1 due to different defaults for PHP4 and PHP5 // force ISO-8859-1 due to different defaults for PHP4 and PHP5
// todo: this probably needs to be investigated some more andcleaned up // todo: this probably needs to be investigated some more andcleaned up
parent::__construct('ISO-8859-1'); parent::XML_Parser('ISO-8859-1');
$this->variables = $variables; $this->variables = $variables;
$this->structure = $structure; $this->structure = $structure;
$this->val =new MDB2_Schema_Validate($fail_on_invalid_names, $valid_types, $force_defaults); $this->val =& new MDB2_Schema_Validate($fail_on_invalid_names, $valid_types, $force_defaults);
}
function MDB2_Schema_Parser($variables, $fail_on_invalid_names = true,
$structure = false, $valid_types = array(),
$force_defaults = true)
{
$this->__construct($variables, $fail_on_invalid_names, $structure, $valid_types, $force_defaults);
} }
function startHandler($xp, $element, $attribs) function startHandler($xp, $element, $attribs)
@ -496,7 +503,7 @@ class MDB2_Schema_Parser extends XML_Parser
$this->element = implode('-', $this->elements); $this->element = implode('-', $this->elements);
} }
function raiseError($msg = null, $xmlecode = 0, $xp = null, $ecode = MDB2_SCHEMA_ERROR_PARSE,$a=null,$b=null,$c=null) function &raiseError($msg = null, $xmlecode = 0, $xp = null, $ecode = MDB2_SCHEMA_ERROR_PARSE)
{ {
if (is_null($this->error)) { if (is_null($this->error)) {
$error = ''; $error = '';

View File

@ -91,6 +91,11 @@ class MDB2_Schema_Validate
$this->force_defaults = $force_defaults; $this->force_defaults = $force_defaults;
} }
function MDB2_Schema_Validate($fail_on_invalid_names = true, $valid_types = array(), $force_defaults = true)
{
$this->__construct($fail_on_invalid_names, $valid_types, $force_defaults);
}
// }}} // }}}
// {{{ raiseError() // {{{ raiseError()

338
3rdparty/OS/Guess.php vendored Normal file
View File

@ -0,0 +1,338 @@
<?php
/**
* The OS_Guess class
*
* PHP versions 4 and 5
*
* @category pear
* @package PEAR
* @author Stig Bakken <ssb@php.net>
* @author Gregory Beaver <cellog@php.net>
* @copyright 1997-2009 The Authors
* @license http://opensource.org/licenses/bsd-license.php New BSD License
* @version CVS: $Id: Guess.php 313023 2011-07-06 19:17:11Z dufuz $
* @link http://pear.php.net/package/PEAR
* @since File available since PEAR 0.1
*/
// {{{ uname examples
// php_uname() without args returns the same as 'uname -a', or a PHP-custom
// string for Windows.
// PHP versions prior to 4.3 return the uname of the host where PHP was built,
// as of 4.3 it returns the uname of the host running the PHP code.
//
// PC RedHat Linux 7.1:
// Linux host.example.com 2.4.2-2 #1 Sun Apr 8 20:41:30 EDT 2001 i686 unknown
//
// PC Debian Potato:
// Linux host 2.4.17 #2 SMP Tue Feb 12 15:10:04 CET 2002 i686 unknown
//
// PC FreeBSD 3.3:
// FreeBSD host.example.com 3.3-STABLE FreeBSD 3.3-STABLE #0: Mon Feb 21 00:42:31 CET 2000 root@example.com:/usr/src/sys/compile/CONFIG i386
//
// PC FreeBSD 4.3:
// FreeBSD host.example.com 4.3-RELEASE FreeBSD 4.3-RELEASE #1: Mon Jun 25 11:19:43 EDT 2001 root@example.com:/usr/src/sys/compile/CONFIG i386
//
// PC FreeBSD 4.5:
// FreeBSD host.example.com 4.5-STABLE FreeBSD 4.5-STABLE #0: Wed Feb 6 23:59:23 CET 2002 root@example.com:/usr/src/sys/compile/CONFIG i386
//
// PC FreeBSD 4.5 w/uname from GNU shellutils:
// FreeBSD host.example.com 4.5-STABLE FreeBSD 4.5-STABLE #0: Wed Feb i386 unknown
//
// HP 9000/712 HP-UX 10:
// HP-UX iq B.10.10 A 9000/712 2008429113 two-user license
//
// HP 9000/712 HP-UX 10 w/uname from GNU shellutils:
// HP-UX host B.10.10 A 9000/712 unknown
//
// IBM RS6000/550 AIX 4.3:
// AIX host 3 4 000003531C00
//
// AIX 4.3 w/uname from GNU shellutils:
// AIX host 3 4 000003531C00 unknown
//
// SGI Onyx IRIX 6.5 w/uname from GNU shellutils:
// IRIX64 host 6.5 01091820 IP19 mips
//
// SGI Onyx IRIX 6.5:
// IRIX64 host 6.5 01091820 IP19
//
// SparcStation 20 Solaris 8 w/uname from GNU shellutils:
// SunOS host.example.com 5.8 Generic_108528-12 sun4m sparc
//
// SparcStation 20 Solaris 8:
// SunOS host.example.com 5.8 Generic_108528-12 sun4m sparc SUNW,SPARCstation-20
//
// Mac OS X (Darwin)
// Darwin home-eden.local 7.5.0 Darwin Kernel Version 7.5.0: Thu Aug 5 19:26:16 PDT 2004; root:xnu/xnu-517.7.21.obj~3/RELEASE_PPC Power Macintosh
//
// Mac OS X early versions
//
// }}}
/* TODO:
* - define endianness, to allow matchSignature("bigend") etc.
*/
/**
* Retrieves information about the current operating system
*
* This class uses php_uname() to grok information about the current OS
*
* @category pear
* @package PEAR
* @author Stig Bakken <ssb@php.net>
* @author Gregory Beaver <cellog@php.net>
* @copyright 1997-2009 The Authors
* @license http://opensource.org/licenses/bsd-license.php New BSD License
* @version Release: 1.9.4
* @link http://pear.php.net/package/PEAR
* @since Class available since Release 0.1
*/
class OS_Guess
{
var $sysname;
var $nodename;
var $cpu;
var $release;
var $extra;
function OS_Guess($uname = null)
{
list($this->sysname,
$this->release,
$this->cpu,
$this->extra,
$this->nodename) = $this->parseSignature($uname);
}
function parseSignature($uname = null)
{
static $sysmap = array(
'HP-UX' => 'hpux',
'IRIX64' => 'irix',
);
static $cpumap = array(
'i586' => 'i386',
'i686' => 'i386',
'ppc' => 'powerpc',
);
if ($uname === null) {
$uname = php_uname();
}
$parts = preg_split('/\s+/', trim($uname));
$n = count($parts);
$release = $machine = $cpu = '';
$sysname = $parts[0];
$nodename = $parts[1];
$cpu = $parts[$n-1];
$extra = '';
if ($cpu == 'unknown') {
$cpu = $parts[$n - 2];
}
switch ($sysname) {
case 'AIX' :
$release = "$parts[3].$parts[2]";
break;
case 'Windows' :
switch ($parts[1]) {
case '95/98':
$release = '9x';
break;
default:
$release = $parts[1];
break;
}
$cpu = 'i386';
break;
case 'Linux' :
$extra = $this->_detectGlibcVersion();
// use only the first two digits from the kernel version
$release = preg_replace('/^([0-9]+\.[0-9]+).*/', '\1', $parts[2]);
break;
case 'Mac' :
$sysname = 'darwin';
$nodename = $parts[2];
$release = $parts[3];
if ($cpu == 'Macintosh') {
if ($parts[$n - 2] == 'Power') {
$cpu = 'powerpc';
}
}
break;
case 'Darwin' :
if ($cpu == 'Macintosh') {
if ($parts[$n - 2] == 'Power') {
$cpu = 'powerpc';
}
}
$release = preg_replace('/^([0-9]+\.[0-9]+).*/', '\1', $parts[2]);
break;
default:
$release = preg_replace('/-.*/', '', $parts[2]);
break;
}
if (isset($sysmap[$sysname])) {
$sysname = $sysmap[$sysname];
} else {
$sysname = strtolower($sysname);
}
if (isset($cpumap[$cpu])) {
$cpu = $cpumap[$cpu];
}
return array($sysname, $release, $cpu, $extra, $nodename);
}
function _detectGlibcVersion()
{
static $glibc = false;
if ($glibc !== false) {
return $glibc; // no need to run this multiple times
}
$major = $minor = 0;
include_once "System.php";
// Use glibc's <features.h> header file to
// get major and minor version number:
if (@file_exists('/usr/include/features.h') &&
@is_readable('/usr/include/features.h')) {
if (!@file_exists('/usr/bin/cpp') || !@is_executable('/usr/bin/cpp')) {
$features_file = fopen('/usr/include/features.h', 'rb');
while (!feof($features_file)) {
$line = fgets($features_file, 8192);
if (!$line || (strpos($line, '#define') === false)) {
continue;
}
if (strpos($line, '__GLIBC__')) {
// major version number #define __GLIBC__ version
$line = preg_split('/\s+/', $line);
$glibc_major = trim($line[2]);
if (isset($glibc_minor)) {
break;
}
continue;
}
if (strpos($line, '__GLIBC_MINOR__')) {
// got the minor version number
// #define __GLIBC_MINOR__ version
$line = preg_split('/\s+/', $line);
$glibc_minor = trim($line[2]);
if (isset($glibc_major)) {
break;
}
continue;
}
}
fclose($features_file);
if (!isset($glibc_major) || !isset($glibc_minor)) {
return $glibc = '';
}
return $glibc = 'glibc' . trim($glibc_major) . "." . trim($glibc_minor) ;
} // no cpp
$tmpfile = System::mktemp("glibctest");
$fp = fopen($tmpfile, "w");
fwrite($fp, "#include <features.h>\n__GLIBC__ __GLIBC_MINOR__\n");
fclose($fp);
$cpp = popen("/usr/bin/cpp $tmpfile", "r");
while ($line = fgets($cpp, 1024)) {
if ($line{0} == '#' || trim($line) == '') {
continue;
}
if (list($major, $minor) = explode(' ', trim($line))) {
break;
}
}
pclose($cpp);
unlink($tmpfile);
} // features.h
if (!($major && $minor) && @is_link('/lib/libc.so.6')) {
// Let's try reading the libc.so.6 symlink
if (preg_match('/^libc-(.*)\.so$/', basename(readlink('/lib/libc.so.6')), $matches)) {
list($major, $minor) = explode('.', $matches[1]);
}
}
if (!($major && $minor)) {
return $glibc = '';
}
return $glibc = "glibc{$major}.{$minor}";
}
function getSignature()
{
if (empty($this->extra)) {
return "{$this->sysname}-{$this->release}-{$this->cpu}";
}
return "{$this->sysname}-{$this->release}-{$this->cpu}-{$this->extra}";
}
function getSysname()
{
return $this->sysname;
}
function getNodename()
{
return $this->nodename;
}
function getCpu()
{
return $this->cpu;
}
function getRelease()
{
return $this->release;
}
function getExtra()
{
return $this->extra;
}
function matchSignature($match)
{
$fragments = is_array($match) ? $match : explode('-', $match);
$n = count($fragments);
$matches = 0;
if ($n > 0) {
$matches += $this->_matchFragment($fragments[0], $this->sysname);
}
if ($n > 1) {
$matches += $this->_matchFragment($fragments[1], $this->release);
}
if ($n > 2) {
$matches += $this->_matchFragment($fragments[2], $this->cpu);
}
if ($n > 3) {
$matches += $this->_matchFragment($fragments[3], $this->extra);
}
return ($matches == $n);
}
function _matchFragment($fragment, $value)
{
if (strcspn($fragment, '*?') < strlen($fragment)) {
$reg = '/^' . str_replace(array('*', '?', '/'), array('.*', '.', '\\/'), $fragment) . '\\z/';
return preg_match($reg, $value);
}
return ($fragment == '*' || !strcasecmp($fragment, $value));
}
}
/*
* Local Variables:
* indent-tabs-mode: nil
* c-basic-offset: 4
* End:
*/

27
3rdparty/PEAR-LICENSE vendored Normal file
View File

@ -0,0 +1,27 @@
Copyright (c) 1997-2009,
Stig Bakken <ssb@php.net>,
Gregory Beaver <cellog@php.net>,
Helgi Þormar Þorbjörnsson <helgi@php.net>,
Tomas V.V.Cox <cox@idecnet.com>,
Martin Jansen <mj@php.net>.
All rights reserved.
Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are met:
* Redistributions of source code must retain the above copyright notice,
this list of conditions and the following disclaimer.
* 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.
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.

424
3rdparty/PEAR.php vendored
View File

@ -1,26 +1,27 @@
<?php <?php
// /**
// +--------------------------------------------------------------------+ * PEAR, the PHP Extension and Application Repository
// | PEAR, the PHP Extension and Application Repository | *
// +--------------------------------------------------------------------+ * PEAR class and PEAR_Error class
// | Copyright (c) 1997-2004 The PHP Group | *
// +--------------------------------------------------------------------+ * PHP versions 4 and 5
// | This source file is subject to version 3.0 of the PHP license, | *
// | that is bundled with this package in the file LICENSE, and is | * @category pear
// | available through the world-wide-web at the following url: | * @package PEAR
// | http://www.php.net/license/3_0.txt. | * @author Sterling Hughes <sterling@php.net>
// | If you did not receive a copy of the PHP license and are unable to | * @author Stig Bakken <ssb@php.net>
// | obtain it through the world-wide-web, please send a note to | * @author Tomas V.V.Cox <cox@idecnet.com>
// | license@php.net so we can mail you a copy immediately. | * @author Greg Beaver <cellog@php.net>
// +--------------------------------------------------------------------+ * @copyright 1997-2010 The Authors
// | Authors: Sterling Hughes <sterling@php.net> | * @license http://opensource.org/licenses/bsd-license.php New BSD License
// | Stig Bakken <ssb@php.net> | * @version CVS: $Id: PEAR.php 313023 2011-07-06 19:17:11Z dufuz $
// | Tomas V.V.Cox <cox@idecnet.com> | * @link http://pear.php.net/package/PEAR
// +--------------------------------------------------------------------+ * @since File available since Release 0.1
// */
// $Id: PEAR.php,v 1.82.2.6 2005/01/01 05:24:51 cellog Exp $
//
/**#@+
* ERROR constants
*/
define('PEAR_ERROR_RETURN', 1); define('PEAR_ERROR_RETURN', 1);
define('PEAR_ERROR_PRINT', 2); define('PEAR_ERROR_PRINT', 2);
define('PEAR_ERROR_TRIGGER', 4); define('PEAR_ERROR_TRIGGER', 4);
@ -31,6 +32,7 @@ define('PEAR_ERROR_CALLBACK', 16);
* @deprecated * @deprecated
*/ */
define('PEAR_ERROR_EXCEPTION', 32); define('PEAR_ERROR_EXCEPTION', 32);
/**#@-*/
define('PEAR_ZE2', (function_exists('version_compare') && define('PEAR_ZE2', (function_exists('version_compare') &&
version_compare(zend_version(), "2-dev", "ge"))); version_compare(zend_version(), "2-dev", "ge")));
@ -44,15 +46,6 @@ if (substr(PHP_OS, 0, 3) == 'WIN') {
define('PEAR_OS', 'Unix'); // blatant assumption 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_mode'] = PEAR_ERROR_RETURN;
$GLOBALS['_PEAR_default_error_options'] = E_USER_NOTICE; $GLOBALS['_PEAR_default_error_options'] = E_USER_NOTICE;
$GLOBALS['_PEAR_destructor_object_list'] = array(); $GLOBALS['_PEAR_destructor_object_list'] = array();
@ -78,14 +71,21 @@ $GLOBALS['_PEAR_error_handler_stack'] = array();
* IMPORTANT! To use the emulated destructors you need to create the * IMPORTANT! To use the emulated destructors you need to create the
* objects by reference: $obj =& new PEAR_child; * objects by reference: $obj =& new PEAR_child;
* *
* @since PHP 4.0.2 * @category pear
* @author Stig Bakken <ssb@php.net> * @package PEAR
* @see http://pear.php.net/manual/ * @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://opensource.org/licenses/bsd-license.php New BSD License
* @version Release: 1.9.4
* @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 class PEAR
{ {
// {{{ properties
/** /**
* Whether to enable internal debug messages. * Whether to enable internal debug messages.
* *
@ -136,10 +136,6 @@ class PEAR
*/ */
var $_expected_errors = array(); var $_expected_errors = array();
// }}}
// {{{ constructor
/** /**
* Constructor. Registers this object in * Constructor. Registers this object in
* $_PEAR_destructor_object_list for destructor emulation if a * $_PEAR_destructor_object_list for destructor emulation if a
@ -156,9 +152,11 @@ class PEAR
if ($this->_debug) { if ($this->_debug) {
print "PEAR constructor called, class=$classname\n"; print "PEAR constructor called, class=$classname\n";
} }
if ($error_class !== null) { if ($error_class !== null) {
$this->_error_class = $error_class; $this->_error_class = $error_class;
} }
while ($classname && strcasecmp($classname, "pear")) { while ($classname && strcasecmp($classname, "pear")) {
$destructor = "_$classname"; $destructor = "_$classname";
if (method_exists($this, $destructor)) { if (method_exists($this, $destructor)) {
@ -175,9 +173,6 @@ class PEAR
} }
} }
// }}}
// {{{ destructor
/** /**
* Destructor (the emulated type of...). Does nothing right now, * Destructor (the emulated type of...). Does nothing right now,
* but is included for forward compatibility, so subclass * but is included for forward compatibility, so subclass
@ -195,9 +190,6 @@ class PEAR
} }
} }
// }}}
// {{{ getStaticProperty()
/** /**
* If you have a class that's mostly/entirely static, and you need static * 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) * properties, you can use this method to simulate them. Eg. in your method(s)
@ -213,12 +205,17 @@ class PEAR
function &getStaticProperty($class, $var) function &getStaticProperty($class, $var)
{ {
static $properties; static $properties;
if (!isset($properties[$class])) {
$properties[$class] = array();
}
if (!array_key_exists($var, $properties[$class])) {
$properties[$class][$var] = null;
}
return $properties[$class][$var]; return $properties[$class][$var];
} }
// }}}
// {{{ registerShutdownFunc()
/** /**
* Use this function to register a shutdown method for static * Use this function to register a shutdown method for static
* classes. * classes.
@ -230,12 +227,15 @@ class PEAR
*/ */
function registerShutdownFunc($func, $args = array()) 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); $GLOBALS['_PEAR_shutdown_funcs'][] = array($func, $args);
} }
// }}}
// {{{ isError()
/** /**
* Tell whether a value is a PEAR error. * Tell whether a value is a PEAR error.
* *
@ -247,22 +247,20 @@ class PEAR
* @access public * @access public
* @return bool true if parameter is an error * @return bool true if parameter is an error
*/ */
static function isError($data, $code = null) function isError($data, $code = null)
{ {
if ($data instanceof PEAR_Error) { if (!is_a($data, 'PEAR_Error')) {
if (is_null($code)) { return false;
return true;
} elseif (is_string($code)) {
return $data->getMessage() == $code;
} else {
return $data->getCode() == $code;
}
} }
return false;
}
// }}} if (is_null($code)) {
// {{{ setErrorHandling() return true;
} elseif (is_string($code)) {
return $data->getMessage() == $code;
}
return $data->getCode() == $code;
}
/** /**
* Sets how errors generated by this object should be handled. * Sets how errors generated by this object should be handled.
@ -302,10 +300,9 @@ class PEAR
* *
* @since PHP 4.0.5 * @since PHP 4.0.5
*/ */
function setErrorHandling($mode = null, $options = null) function setErrorHandling($mode = null, $options = null)
{ {
if (isset($this) && $this instanceof PEAR) { if (isset($this) && is_a($this, 'PEAR')) {
$setmode = &$this->_default_error_mode; $setmode = &$this->_default_error_mode;
$setoptions = &$this->_default_error_options; $setoptions = &$this->_default_error_options;
} else { } else {
@ -340,9 +337,6 @@ class PEAR
} }
} }
// }}}
// {{{ expectError()
/** /**
* This method is used to tell which errors you expect to get. * This method is used to tell which errors you expect to get.
* Expected errors are always returned with error mode * Expected errors are always returned with error mode
@ -365,12 +359,9 @@ class PEAR
} else { } else {
array_push($this->_expected_errors, array($code)); array_push($this->_expected_errors, array($code));
} }
return sizeof($this->_expected_errors); return count($this->_expected_errors);
} }
// }}}
// {{{ popExpect()
/** /**
* This method pops one element off the expected error codes * This method pops one element off the expected error codes
* stack. * stack.
@ -382,9 +373,6 @@ class PEAR
return array_pop($this->_expected_errors); return array_pop($this->_expected_errors);
} }
// }}}
// {{{ _checkDelExpect()
/** /**
* This method checks unsets an error code if available * This method checks unsets an error code if available
* *
@ -396,8 +384,7 @@ class PEAR
function _checkDelExpect($error_code) function _checkDelExpect($error_code)
{ {
$deleted = false; $deleted = false;
foreach ($this->_expected_errors as $key => $error_array) {
foreach ($this->_expected_errors AS $key => $error_array) {
if (in_array($error_code, $error_array)) { if (in_array($error_code, $error_array)) {
unset($this->_expected_errors[$key][array_search($error_code, $error_array)]); unset($this->_expected_errors[$key][array_search($error_code, $error_array)]);
$deleted = true; $deleted = true;
@ -408,12 +395,10 @@ class PEAR
unset($this->_expected_errors[$key]); unset($this->_expected_errors[$key]);
} }
} }
return $deleted; return $deleted;
} }
// }}}
// {{{ delExpect()
/** /**
* This method deletes all occurences of the specified element from * This method deletes all occurences of the specified element from
* the expected error codes stack. * the expected error codes stack.
@ -426,34 +411,26 @@ class PEAR
function delExpect($error_code) function delExpect($error_code)
{ {
$deleted = false; $deleted = false;
if ((is_array($error_code) && (0 != count($error_code)))) { if ((is_array($error_code) && (0 != count($error_code)))) {
// $error_code is a non-empty array here; // $error_code is a non-empty array here; we walk through it trying
// we walk through it trying to unset all // to unset all values
// values foreach ($error_code as $key => $error) {
foreach($error_code as $key => $error) { $deleted = $this->_checkDelExpect($error) ? true : false;
if ($this->_checkDelExpect($error)) {
$deleted = true;
} else {
$deleted = false;
}
} }
return $deleted ? true : PEAR::raiseError("The expected error you submitted does not exist"); // IMPROVE ME return $deleted ? true : PEAR::raiseError("The expected error you submitted does not exist"); // IMPROVE ME
} elseif (!empty($error_code)) { } elseif (!empty($error_code)) {
// $error_code comes alone, trying to unset it // $error_code comes alone, trying to unset it
if ($this->_checkDelExpect($error_code)) { if ($this->_checkDelExpect($error_code)) {
return true; 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
}
}
// }}} return PEAR::raiseError("The expected error you submitted does not exist"); // IMPROVE ME
// {{{ raiseError() }
// $error_code is empty
return PEAR::raiseError("The expected error you submitted is empty"); // IMPROVE ME
}
/** /**
* This method is a wrapper that returns an instance of the * This method is a wrapper that returns an instance of the
@ -492,7 +469,7 @@ class PEAR
* @see PEAR::setErrorHandling * @see PEAR::setErrorHandling
* @since PHP 4.0.5 * @since PHP 4.0.5
*/ */
function raiseError($message = null, function &raiseError($message = null,
$code = null, $code = null,
$mode = null, $mode = null,
$options = null, $options = null,
@ -509,13 +486,20 @@ class PEAR
$message = $message->getMessage(); $message = $message->getMessage();
} }
if (isset($this) && isset($this->_expected_errors) && sizeof($this->_expected_errors) > 0 && sizeof($exp = end($this->_expected_errors))) { if (
isset($this) &&
isset($this->_expected_errors) &&
count($this->_expected_errors) > 0 &&
count($exp = end($this->_expected_errors))
) {
if ($exp[0] == "*" || if ($exp[0] == "*" ||
(is_int(reset($exp)) && in_array($code, $exp)) || (is_int(reset($exp)) && in_array($code, $exp)) ||
(is_string(reset($exp)) && in_array($message, $exp))) { (is_string(reset($exp)) && in_array($message, $exp))
) {
$mode = PEAR_ERROR_RETURN; $mode = PEAR_ERROR_RETURN;
} }
} }
// No mode given, try global ones // No mode given, try global ones
if ($mode === null) { if ($mode === null) {
// Class error handler // Class error handler
@ -536,38 +520,52 @@ class PEAR
} else { } else {
$ec = 'PEAR_Error'; $ec = 'PEAR_Error';
} }
if ($skipmsg) {
return new $ec($code, $mode, $options, $userinfo);
} else {
return new $ec($message, $code, $mode, $options, $userinfo);
}
}
// }}} if (intval(PHP_VERSION) < 5) {
// {{{ throwError() // little non-eval hack to fix bug #12147
include 'PEAR/FixPHP5PEARWarnings.php';
return $a;
}
if ($skipmsg) {
$a = new $ec($code, $mode, $options, $userinfo);
} else {
$a = new $ec($message, $code, $mode, $options, $userinfo);
}
return $a;
}
/** /**
* Simpler form of raiseError with fewer options. In most cases * Simpler form of raiseError with fewer options. In most cases
* message, code and userinfo are enough. * message, code and userinfo are enough.
* *
* @param string $message * @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 string $userinfo If you need to pass along for example debug
* information, this parameter is meant for that.
*
* @access public
* @return object a PEAR error object
* @see PEAR::raiseError
*/ */
function throwError($message = null, function &throwError($message = null, $code = null, $userinfo = null)
$code = null,
$userinfo = null)
{ {
if (isset($this) && $this instanceof PEAR) { if (isset($this) && is_a($this, 'PEAR')) {
return $this->raiseError($message, $code, null, null, $userinfo); $a = &$this->raiseError($message, $code, null, null, $userinfo);
} else { return $a;
return PEAR::raiseError($message, $code, null, null, $userinfo);
} }
$a = &PEAR::raiseError($message, $code, null, null, $userinfo);
return $a;
} }
// }}}
function staticPushErrorHandling($mode, $options = null) function staticPushErrorHandling($mode, $options = null)
{ {
$stack = &$GLOBALS['_PEAR_error_handler_stack']; $stack = &$GLOBALS['_PEAR_error_handler_stack'];
$def_mode = &$GLOBALS['_PEAR_default_error_mode']; $def_mode = &$GLOBALS['_PEAR_default_error_mode'];
$def_options = &$GLOBALS['_PEAR_default_error_options']; $def_options = &$GLOBALS['_PEAR_default_error_options'];
$stack[] = array($def_mode, $def_options); $stack[] = array($def_mode, $def_options);
@ -636,8 +634,6 @@ class PEAR
return true; return true;
} }
// {{{ pushErrorHandling()
/** /**
* Push a new error handler on top of the error handler options stack. With this * 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 * you can easily override the actual error handler for some code and restore
@ -653,7 +649,7 @@ class PEAR
function pushErrorHandling($mode, $options = null) function pushErrorHandling($mode, $options = null)
{ {
$stack = &$GLOBALS['_PEAR_error_handler_stack']; $stack = &$GLOBALS['_PEAR_error_handler_stack'];
if (isset($this) && $this instanceof PEAR) { if (isset($this) && is_a($this, 'PEAR')) {
$def_mode = &$this->_default_error_mode; $def_mode = &$this->_default_error_mode;
$def_options = &$this->_default_error_options; $def_options = &$this->_default_error_options;
} else { } else {
@ -662,7 +658,7 @@ class PEAR
} }
$stack[] = array($def_mode, $def_options); $stack[] = array($def_mode, $def_options);
if (isset($this) && $this instanceof PEAR) { if (isset($this) && is_a($this, 'PEAR')) {
$this->setErrorHandling($mode, $options); $this->setErrorHandling($mode, $options);
} else { } else {
PEAR::setErrorHandling($mode, $options); PEAR::setErrorHandling($mode, $options);
@ -671,9 +667,6 @@ class PEAR
return true; return true;
} }
// }}}
// {{{ popErrorHandling()
/** /**
* Pop the last error handler used * Pop the last error handler used
* *
@ -687,7 +680,7 @@ class PEAR
array_pop($stack); array_pop($stack);
list($mode, $options) = $stack[sizeof($stack) - 1]; list($mode, $options) = $stack[sizeof($stack) - 1];
array_pop($stack); array_pop($stack);
if (isset($this) && $this instanceof PEAR) { if (isset($this) && is_a($this, 'PEAR')) {
$this->setErrorHandling($mode, $options); $this->setErrorHandling($mode, $options);
} else { } else {
PEAR::setErrorHandling($mode, $options); PEAR::setErrorHandling($mode, $options);
@ -695,9 +688,6 @@ class PEAR
return true; return true;
} }
// }}}
// {{{ loadExtension()
/** /**
* OS independant PHP extension load. Remember to take care * OS independant PHP extension load. Remember to take care
* on the correct extension name for case sensitive OSes. * on the correct extension name for case sensitive OSes.
@ -707,31 +697,38 @@ class PEAR
*/ */
function loadExtension($ext) function loadExtension($ext)
{ {
if (!extension_loaded($ext)) { if (extension_loaded($ext)) {
// if either returns true dl() will produce a FATAL error, stop that return true;
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;
}
// }}} // if either returns true dl() will produce a FATAL error, stop that
if (
function_exists('dl') === false ||
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);
}
} }
// {{{ _PEAR_call_destructors() if (PEAR_ZE2) {
include_once 'PEAR5.php';
}
function _PEAR_call_destructors() function _PEAR_call_destructors()
{ {
@ -740,9 +737,16 @@ function _PEAR_call_destructors()
sizeof($_PEAR_destructor_object_list)) sizeof($_PEAR_destructor_object_list))
{ {
reset($_PEAR_destructor_object_list); reset($_PEAR_destructor_object_list);
if (@PEAR::getStaticProperty('PEAR', 'destructlifo')) { if (PEAR_ZE2) {
$destructLifoExists = PEAR5::getStaticProperty('PEAR', 'destructlifo');
} else {
$destructLifoExists = PEAR::getStaticProperty('PEAR', 'destructlifo');
}
if ($destructLifoExists) {
$_PEAR_destructor_object_list = array_reverse($_PEAR_destructor_object_list); $_PEAR_destructor_object_list = array_reverse($_PEAR_destructor_object_list);
} }
while (list($k, $objref) = each($_PEAR_destructor_object_list)) { while (list($k, $objref) = each($_PEAR_destructor_object_list)) {
$classname = get_class($objref); $classname = get_class($objref);
while ($classname) { while ($classname) {
@ -761,19 +765,36 @@ function _PEAR_call_destructors()
} }
// Now call the shutdown functions // Now call the shutdown functions
if (is_array($GLOBALS['_PEAR_shutdown_funcs']) AND !empty($GLOBALS['_PEAR_shutdown_funcs'])) { if (
isset($GLOBALS['_PEAR_shutdown_funcs']) &&
is_array($GLOBALS['_PEAR_shutdown_funcs']) &&
!empty($GLOBALS['_PEAR_shutdown_funcs'])
) {
foreach ($GLOBALS['_PEAR_shutdown_funcs'] as $value) { foreach ($GLOBALS['_PEAR_shutdown_funcs'] as $value) {
call_user_func_array($value[0], $value[1]); 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://opensource.org/licenses/bsd-license.php New BSD License
* @version Release: 1.9.4
* @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 class PEAR_Error
{ {
// {{{ properties
var $error_message_prefix = ''; var $error_message_prefix = '';
var $mode = PEAR_ERROR_RETURN; var $mode = PEAR_ERROR_RETURN;
var $level = E_USER_NOTICE; var $level = E_USER_NOTICE;
@ -782,9 +803,6 @@ class PEAR_Error
var $userinfo = ''; var $userinfo = '';
var $backtrace = null; var $backtrace = null;
// }}}
// {{{ constructor
/** /**
* PEAR_Error constructor * PEAR_Error constructor
* *
@ -815,11 +833,20 @@ class PEAR_Error
$this->code = $code; $this->code = $code;
$this->mode = $mode; $this->mode = $mode;
$this->userinfo = $userinfo; $this->userinfo = $userinfo;
if (function_exists("debug_backtrace")) {
if (@!PEAR::getStaticProperty('PEAR_Error', 'skiptrace')) { if (PEAR_ZE2) {
$this->backtrace = debug_backtrace(); $skiptrace = PEAR5::getStaticProperty('PEAR_Error', 'skiptrace');
} else {
$skiptrace = PEAR::getStaticProperty('PEAR_Error', 'skiptrace');
}
if (!$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) { if ($mode & PEAR_ERROR_CALLBACK) {
$this->level = E_USER_NOTICE; $this->level = E_USER_NOTICE;
$this->callback = $options; $this->callback = $options;
@ -827,20 +854,25 @@ class PEAR_Error
if ($options === null) { if ($options === null) {
$options = E_USER_NOTICE; $options = E_USER_NOTICE;
} }
$this->level = $options; $this->level = $options;
$this->callback = null; $this->callback = null;
} }
if ($this->mode & PEAR_ERROR_PRINT) { if ($this->mode & PEAR_ERROR_PRINT) {
if (is_null($options) || is_int($options)) { if (is_null($options) || is_int($options)) {
$format = "%s"; $format = "%s";
} else { } else {
$format = $options; $format = $options;
} }
printf($format, $this->getMessage()); printf($format, $this->getMessage());
} }
if ($this->mode & PEAR_ERROR_TRIGGER) { if ($this->mode & PEAR_ERROR_TRIGGER) {
trigger_error($this->getMessage(), $this->level); trigger_error($this->getMessage(), $this->level);
} }
if ($this->mode & PEAR_ERROR_DIE) { if ($this->mode & PEAR_ERROR_DIE) {
$msg = $this->getMessage(); $msg = $this->getMessage();
if (is_null($options) || is_int($options)) { if (is_null($options) || is_int($options)) {
@ -853,47 +885,39 @@ class PEAR_Error
} }
die(sprintf($format, $msg)); die(sprintf($format, $msg));
} }
if ($this->mode & PEAR_ERROR_CALLBACK) {
if (is_callable($this->callback)) { if ($this->mode & PEAR_ERROR_CALLBACK && is_callable($this->callback)) {
call_user_func($this->callback, $this); call_user_func($this->callback, $this);
}
} }
if ($this->mode & PEAR_ERROR_EXCEPTION) { if ($this->mode & PEAR_ERROR_EXCEPTION) {
trigger_error("PEAR_ERROR_EXCEPTION is obsolete, use class PEAR_ErrorStack for exceptions", E_USER_WARNING); trigger_error("PEAR_ERROR_EXCEPTION is obsolete, use class PEAR_Exception for exceptions", E_USER_WARNING);
eval('$e = new Exception($this->message, $this->code);$e->PEAR_Error = $this;throw($e);'); eval('$e = new Exception($this->message, $this->code);throw($e);');
} }
} }
// }}}
// {{{ getMode()
/** /**
* Get the error mode from an error object. * Get the error mode from an error object.
* *
* @return int error mode * @return int error mode
* @access public * @access public
*/ */
function getMode() { function getMode()
{
return $this->mode; return $this->mode;
} }
// }}}
// {{{ getCallback()
/** /**
* Get the callback function/method from an error object. * Get the callback function/method from an error object.
* *
* @return mixed callback function or object/method array * @return mixed callback function or object/method array
* @access public * @access public
*/ */
function getCallback() { function getCallback()
{
return $this->callback; return $this->callback;
} }
// }}}
// {{{ getMessage()
/** /**
* Get the error message from an error object. * Get the error message from an error object.
* *
@ -905,10 +929,6 @@ class PEAR_Error
return ($this->error_message_prefix . $this->message); return ($this->error_message_prefix . $this->message);
} }
// }}}
// {{{ getCode()
/** /**
* Get error code from an error object * Get error code from an error object
* *
@ -920,9 +940,6 @@ class PEAR_Error
return $this->code; return $this->code;
} }
// }}}
// {{{ getType()
/** /**
* Get the name of this error/exception. * Get the name of this error/exception.
* *
@ -934,9 +951,6 @@ class PEAR_Error
return get_class($this); return get_class($this);
} }
// }}}
// {{{ getUserInfo()
/** /**
* Get additional user-supplied information. * Get additional user-supplied information.
* *
@ -948,9 +962,6 @@ class PEAR_Error
return $this->userinfo; return $this->userinfo;
} }
// }}}
// {{{ getDebugInfo()
/** /**
* Get additional debug information supplied by the application. * Get additional debug information supplied by the application.
* *
@ -962,9 +973,6 @@ class PEAR_Error
return $this->getUserInfo(); return $this->getUserInfo();
} }
// }}}
// {{{ getBacktrace()
/** /**
* Get the call backtrace from where the error was generated. * Get the call backtrace from where the error was generated.
* Supported with PHP 4.3.0 or newer. * Supported with PHP 4.3.0 or newer.
@ -975,15 +983,15 @@ class PEAR_Error
*/ */
function getBacktrace($frame = null) function getBacktrace($frame = null)
{ {
if (defined('PEAR_IGNORE_BACKTRACE')) {
return null;
}
if ($frame === null) { if ($frame === null) {
return $this->backtrace; return $this->backtrace;
} }
return $this->backtrace[$frame]; return $this->backtrace[$frame];
} }
// }}}
// {{{ addUserInfo()
function addUserInfo($info) function addUserInfo($info)
{ {
if (empty($this->userinfo)) { if (empty($this->userinfo)) {
@ -993,8 +1001,10 @@ class PEAR_Error
} }
} }
// }}} function __toString()
// {{{ toString() {
return $this->getMessage();
}
/** /**
* Make a string representation of this object. * Make a string representation of this object.
@ -1002,7 +1012,8 @@ class PEAR_Error
* @return string a string with an object summary * @return string a string with an object summary
* @access public * @access public
*/ */
function toString() { function toString()
{
$modes = array(); $modes = array();
$levels = array(E_USER_NOTICE => 'notice', $levels = array(E_USER_NOTICE => 'notice',
E_USER_WARNING => 'warning', E_USER_WARNING => 'warning',
@ -1041,8 +1052,6 @@ class PEAR_Error
$this->error_message_prefix, $this->error_message_prefix,
$this->userinfo); $this->userinfo);
} }
// }}}
} }
/* /*
@ -1052,4 +1061,3 @@ class PEAR_Error
* c-basic-offset: 4 * c-basic-offset: 4
* End: * End:
*/ */
?>

View File

@ -1,29 +1,31 @@
<?php <?php
/**
* Class auto-loader
*
* PHP versions 4
*
* @category pear
* @package PEAR
* @author Stig Bakken <ssb@php.net>
* @copyright 1997-2009 The Authors
* @license http://opensource.org/licenses/bsd-license.php New BSD License
* @version CVS: $Id: Autoloader.php 313023 2011-07-06 19:17:11Z dufuz $
* @link http://pear.php.net/manual/en/core.ppm.php#core.ppm.pear-autoloader
* @since File available since Release 0.1
* @deprecated File deprecated in Release 1.4.0a1
*/
// /* vim: set expandtab tabstop=4 shiftwidth=4: */ // /* vim: set expandtab tabstop=4 shiftwidth=4: */
// +----------------------------------------------------------------------+
// | PHP Version 5 |
// +----------------------------------------------------------------------+
// | Copyright (c) 1997-2004 The PHP Group |
// +----------------------------------------------------------------------+
// | This source file is subject to version 3.0 of the PHP license, |
// | that is bundled with this package in the file LICENSE, and is |
// | available through the world-wide-web at the following url: |
// | 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 world-wide-web, please send a note to |
// | license@php.net so we can mail you a copy immediately. |
// +----------------------------------------------------------------------+
// | Author: Stig Bakken <ssb@php.net> |
// | |
// +----------------------------------------------------------------------+
//
// $Id: Autoloader.php,v 1.11 2004/02/27 02:21:29 cellog Exp $
if (!extension_loaded("overload")) { if (!extension_loaded("overload")) {
// die hard without ext/overload // die hard without ext/overload
die("Rebuild PHP with the `overload' extension to use PEAR_Autoloader"); die("Rebuild PHP with the `overload' extension to use PEAR_Autoloader");
} }
/**
* Include for PEAR_Error and PEAR classes
*/
require_once "PEAR.php"; require_once "PEAR.php";
/** /**
@ -38,7 +40,15 @@ require_once "PEAR.php";
* methods, an instance of each class providing separated methods is * methods, an instance of each class providing separated methods is
* stored and called every time the aggregated method is called. * stored and called every time the aggregated method is called.
* *
* @author Stig Sæther Bakken <ssb@php.net> * @category pear
* @package PEAR
* @author Stig Bakken <ssb@php.net>
* @copyright 1997-2009 The Authors
* @license http://opensource.org/licenses/bsd-license.php New BSD License
* @version Release: 1.9.4
* @link http://pear.php.net/manual/en/core.ppm.php#core.ppm.pear-autoloader
* @since File available since Release 0.1
* @deprecated File deprecated in Release 1.4.0a1
*/ */
class PEAR_Autoloader extends PEAR class PEAR_Autoloader extends PEAR
{ {

View File

@ -1,47 +1,60 @@
<?php <?php
// /**
// +----------------------------------------------------------------------+ * PEAR_Builder for building PHP extensions (PECL packages)
// | PHP Version 5 | *
// +----------------------------------------------------------------------+ * PHP versions 4 and 5
// | Copyright (c) 1997-2004 The PHP Group | *
// +----------------------------------------------------------------------+ * @category pear
// | This source file is subject to version 3.0 of the PHP license, | * @package PEAR
// | that is bundled with this package in the file LICENSE, and is | * @author Stig Bakken <ssb@php.net>
// | available through the world-wide-web at the following url: | * @author Greg Beaver <cellog@php.net>
// | http://www.php.net/license/3_0.txt. | * @copyright 1997-2009 The Authors
// | If you did not receive a copy of the PHP license and are unable to | * @license http://opensource.org/licenses/bsd-license.php New BSD License
// | obtain it through the world-wide-web, please send a note to | * @version CVS: $Id: Builder.php 313024 2011-07-06 19:51:24Z dufuz $
// | license@php.net so we can mail you a copy immediately. | * @link http://pear.php.net/package/PEAR
// +----------------------------------------------------------------------+ * @since File available since Release 0.1
// | Authors: Stig Sæther Bakken <ssb@php.net> | *
// +----------------------------------------------------------------------+ * TODO: log output parameters in PECL command line
// * TODO: msdev path in configuration
// $Id: Builder.php,v 1.16.2.3 2005/02/17 17:55:01 cellog Exp $ */
/**
* Needed for extending PEAR_Builder
*/
require_once 'PEAR/Common.php'; require_once 'PEAR/Common.php';
require_once 'PEAR/PackageFile.php';
/** /**
* Class to handle building (compiling) extensions. * Class to handle building (compiling) extensions.
* *
* @author Stig Sæther Bakken <ssb@php.net> * @category pear
* @package PEAR
* @author Stig Bakken <ssb@php.net>
* @author Greg Beaver <cellog@php.net>
* @copyright 1997-2009 The Authors
* @license http://opensource.org/licenses/bsd-license.php New BSD License
* @version Release: 1.9.4
* @link http://pear.php.net/package/PEAR
* @since Class available since PHP 4.0.2
* @see http://pear.php.net/manual/en/core.ppm.pear-builder.php
*/ */
class PEAR_Builder extends PEAR_Common class PEAR_Builder extends PEAR_Common
{ {
// {{{ properties
var $php_api_version = 0; var $php_api_version = 0;
var $zend_module_api_no = 0; var $zend_module_api_no = 0;
var $zend_extension_api_no = 0; var $zend_extension_api_no = 0;
var $extensions_built = array(); var $extensions_built = array();
/**
* @var string Used for reporting when it is not possible to pass function
* via extra parameter, e.g. log, msdevCallback
*/
var $current_callback = null; var $current_callback = null;
// used for msdev builds // used for msdev builds
var $_lastline = null; var $_lastline = null;
var $_firstline = null; var $_firstline = null;
// }}}
// {{{ constructor
/** /**
* PEAR_Builder constructor. * PEAR_Builder constructor.
@ -56,35 +69,48 @@ class PEAR_Builder extends PEAR_Common
$this->setFrontendObject($ui); $this->setFrontendObject($ui);
} }
// }}}
// {{{ _build_win32()
/** /**
* Build an extension from source on windows. * Build an extension from source on windows.
* requires msdev * requires msdev
*/ */
function _build_win32($descfile, $callback = null) function _build_win32($descfile, $callback = null)
{ {
if (PEAR::isError($info = $this->infoFromDescriptionFile($descfile))) { if (is_object($descfile)) {
return $info; $pkg = $descfile;
$descfile = $pkg->getPackageFile();
} else {
$pf = &new PEAR_PackageFile($this->config, $this->debug);
$pkg = &$pf->fromPackageFile($descfile, PEAR_VALIDATE_NORMAL);
if (PEAR::isError($pkg)) {
return $pkg;
}
} }
$dir = dirname($descfile); $dir = dirname($descfile);
$old_cwd = getcwd(); $old_cwd = getcwd();
if (!@chdir($dir)) { if (!file_exists($dir) || !is_dir($dir) || !chdir($dir)) {
return $this->raiseError("could not chdir to $dir"); return $this->raiseError("could not chdir to $dir");
} }
// packages that were in a .tar have the packagefile in this directory
$vdir = $pkg->getPackage() . '-' . $pkg->getVersion();
if (file_exists($dir) && is_dir($vdir)) {
if (!chdir($vdir)) {
return $this->raiseError("could not chdir to " . realpath($vdir));
}
$dir = getcwd();
}
$this->log(2, "building in $dir"); $this->log(2, "building in $dir");
$dsp = $info['package'].'.dsp'; $dsp = $pkg->getPackage().'.dsp';
if (!@is_file("$dir/$dsp")) { if (!file_exists("$dir/$dsp")) {
return $this->raiseError("The DSP $dsp does not exist."); return $this->raiseError("The DSP $dsp does not exist.");
} }
// XXX TODO: make release build type configurable // XXX TODO: make release build type configurable
$command = 'msdev '.$dsp.' /MAKE "'.$info['package']. ' - Release"'; $command = 'msdev '.$dsp.' /MAKE "'.$pkg->getPackage(). ' - Release"';
$this->current_callback = $callback;
$err = $this->_runCommand($command, array(&$this, 'msdevCallback')); $err = $this->_runCommand($command, array(&$this, 'msdevCallback'));
if (PEAR::isError($err)) { if (PEAR::isError($err)) {
return $err; return $err;
@ -93,12 +119,12 @@ class PEAR_Builder extends PEAR_Common
// figure out the build platform and type // figure out the build platform and type
$platform = 'Win32'; $platform = 'Win32';
$buildtype = 'Release'; $buildtype = 'Release';
if (preg_match('/.*?'.$info['package'].'\s-\s(\w+)\s(.*?)-+/i',$this->_firstline,$matches)) { if (preg_match('/.*?'.$pkg->getPackage().'\s-\s(\w+)\s(.*?)-+/i',$this->_firstline,$matches)) {
$platform = $matches[1]; $platform = $matches[1];
$buildtype = $matches[2]; $buildtype = $matches[2];
} }
if (preg_match('/(.*)?\s-\s(\d+).*?(\d+)/',$this->_lastline,$matches)) { if (preg_match('/(.*)?\s-\s(\d+).*?(\d+)/', $this->_lastline, $matches)) {
if ($matches[2]) { if ($matches[2]) {
// there were errors in the build // there were errors in the build
return $this->raiseError("There were errors during compilation."); return $this->raiseError("There were errors during compilation.");
@ -115,18 +141,19 @@ class PEAR_Builder extends PEAR_Common
// this regex depends on the build platform and type having been // this regex depends on the build platform and type having been
// correctly identified above. // correctly identified above.
$regex ='/.*?!IF\s+"\$\(CFG\)"\s+==\s+("'. $regex ='/.*?!IF\s+"\$\(CFG\)"\s+==\s+("'.
$info['package'].'\s-\s'. $pkg->getPackage().'\s-\s'.
$platform.'\s'. $platform.'\s'.
$buildtype.'").*?'. $buildtype.'").*?'.
'\/out:"(.*?)"/is'; '\/out:"(.*?)"/is';
if ($dsptext && preg_match($regex,$dsptext,$matches)) { if ($dsptext && preg_match($regex, $dsptext, $matches)) {
// what we get back is a relative path to the output file itself. // what we get back is a relative path to the output file itself.
$outfile = realpath($matches[2]); $outfile = realpath($matches[2]);
} else { } else {
return $this->raiseError("Could not retrieve output information from $dsp."); return $this->raiseError("Could not retrieve output information from $dsp.");
} }
if (@copy($outfile, "$dir/$out")) { // realpath returns false if the file doesn't exist
if ($outfile && copy($outfile, "$dir/$out")) {
$outfile = "$dir/$out"; $outfile = "$dir/$out";
} }
@ -147,10 +174,9 @@ class PEAR_Builder extends PEAR_Common
if (!$this->_firstline) if (!$this->_firstline)
$this->_firstline = $data; $this->_firstline = $data;
$this->_lastline = $data; $this->_lastline = $data;
call_user_func($this->current_callback, $what, $data);
} }
// }}}
// {{{ _harventInstDir
/** /**
* @param string * @param string
* @param string * @param string
@ -191,16 +217,13 @@ class PEAR_Builder extends PEAR_Common
return $ret; return $ret;
} }
// }}}
// {{{ build()
/** /**
* Build an extension from source. Runs "phpize" in the source * Build an extension from source. Runs "phpize" in the source
* directory, but compiles in a temporary directory * directory, but compiles in a temporary directory
* (/var/tmp/pear-build-USER/PACKAGE-VERSION). * (TMPDIR/pear-build-USER/PACKAGE-VERSION).
* *
* @param string $descfile path to XML package description file * @param string|PEAR_PackageFile_v* $descfile path to XML package description file, or
* a PEAR_PackageFile object
* *
* @param mixed $callback callback function used to report output, * @param mixed $callback callback function used to report output,
* see PEAR_Builder::_runCommand for details * see PEAR_Builder::_runCommand for details
@ -216,48 +239,97 @@ class PEAR_Builder extends PEAR_Common
* @access public * @access public
* *
* @see PEAR_Builder::_runCommand * @see PEAR_Builder::_runCommand
* @see PEAR_Common::infoFromDescriptionFile
*/ */
function build($descfile, $callback = null) function build($descfile, $callback = null)
{ {
if (PEAR_OS == "Windows") { if (preg_match('/(\\/|\\\\|^)([^\\/\\\\]+)?php(.+)?$/',
return $this->_build_win32($descfile,$callback); $this->config->get('php_bin'), $matches)) {
if (isset($matches[2]) && strlen($matches[2]) &&
trim($matches[2]) != trim($this->config->get('php_prefix'))) {
$this->log(0, 'WARNING: php_bin ' . $this->config->get('php_bin') .
' appears to have a prefix ' . $matches[2] . ', but' .
' config variable php_prefix does not match');
}
if (isset($matches[3]) && strlen($matches[3]) &&
trim($matches[3]) != trim($this->config->get('php_suffix'))) {
$this->log(0, 'WARNING: php_bin ' . $this->config->get('php_bin') .
' appears to have a suffix ' . $matches[3] . ', but' .
' config variable php_suffix does not match');
}
} }
$this->current_callback = $callback;
if (PEAR_OS == "Windows") {
return $this->_build_win32($descfile, $callback);
}
if (PEAR_OS != 'Unix') { if (PEAR_OS != 'Unix') {
return $this->raiseError("building extensions not supported on this platform"); return $this->raiseError("building extensions not supported on this platform");
} }
if (PEAR::isError($info = $this->infoFromDescriptionFile($descfile))) {
return $info; if (is_object($descfile)) {
$pkg = $descfile;
$descfile = $pkg->getPackageFile();
if (is_a($pkg, 'PEAR_PackageFile_v1')) {
$dir = dirname($descfile);
} else {
$dir = $pkg->_config->get('temp_dir') . '/' . $pkg->getName();
// automatically delete at session end
$this->addTempFile($dir);
}
} else {
$pf = &new PEAR_PackageFile($this->config);
$pkg = &$pf->fromPackageFile($descfile, PEAR_VALIDATE_NORMAL);
if (PEAR::isError($pkg)) {
return $pkg;
}
$dir = dirname($descfile);
} }
$dir = dirname($descfile);
// Find config. outside of normal path - e.g. config.m4
foreach (array_keys($pkg->getInstallationFileList()) as $item) {
if (stristr(basename($item), 'config.m4') && dirname($item) != '.') {
$dir .= DIRECTORY_SEPARATOR . dirname($item);
break;
}
}
$old_cwd = getcwd(); $old_cwd = getcwd();
if (!@chdir($dir)) { if (!file_exists($dir) || !is_dir($dir) || !chdir($dir)) {
return $this->raiseError("could not chdir to $dir"); return $this->raiseError("could not chdir to $dir");
} }
$vdir = "$info[package]-$info[version]";
$vdir = $pkg->getPackage() . '-' . $pkg->getVersion();
if (is_dir($vdir)) { if (is_dir($vdir)) {
chdir($vdir); chdir($vdir);
} }
$dir = getcwd(); $dir = getcwd();
$this->log(2, "building in $dir"); $this->log(2, "building in $dir");
$this->current_callback = $callback;
putenv('PATH=' . $this->config->get('bin_dir') . ':' . getenv('PATH')); putenv('PATH=' . $this->config->get('bin_dir') . ':' . getenv('PATH'));
$err = $this->_runCommand("phpize", array(&$this, 'phpizeCallback')); $err = $this->_runCommand($this->config->get('php_prefix')
. "phpize" .
$this->config->get('php_suffix'),
array(&$this, 'phpizeCallback'));
if (PEAR::isError($err)) { if (PEAR::isError($err)) {
return $err; return $err;
} }
if (!$err) { if (!$err) {
return $this->raiseError("`phpize' failed"); return $this->raiseError("`phpize' failed");
} }
// {{{ start of interactive part // {{{ start of interactive part
$configure_command = "$dir/configure"; $configure_command = "$dir/configure";
if (isset($info['configure_options'])) { $configure_options = $pkg->getConfigureOptions();
foreach ($info['configure_options'] as $o) { if ($configure_options) {
foreach ($configure_options as $o) {
$default = array_key_exists('default', $o) ? $o['default'] : null;
list($r) = $this->ui->userDialog('build', list($r) = $this->ui->userDialog('build',
array($o['prompt']), array($o['prompt']),
array('text'), array('text'),
array(@$o['default'])); array($default));
if (substr($o['name'], 0, 5) == 'with-' && if (substr($o['name'], 0, 5) == 'with-' &&
($r == 'yes' || $r == 'autodetect')) { ($r == 'yes' || $r == 'autodetect')) {
$configure_command .= " --$o[name]"; $configure_command .= " --$o[name]";
@ -269,40 +341,41 @@ class PEAR_Builder extends PEAR_Common
// }}} end of interactive part // }}} end of interactive part
// FIXME make configurable // FIXME make configurable
if(!$user=getenv('USER')){ if (!$user=getenv('USER')) {
$user='defaultuser'; $user='defaultuser';
} }
$build_basedir = "/var/tmp/pear-build-$user";
$build_dir = "$build_basedir/$info[package]-$info[version]"; $tmpdir = $this->config->get('temp_dir');
$inst_dir = "$build_basedir/install-$info[package]-$info[version]"; $build_basedir = System::mktemp(' -t "' . $tmpdir . '" -d "pear-build-' . $user . '"');
$build_dir = "$build_basedir/$vdir";
$inst_dir = "$build_basedir/install-$vdir";
$this->log(1, "building in $build_dir"); $this->log(1, "building in $build_dir");
if (is_dir($build_dir)) { if (is_dir($build_dir)) {
System::rm('-rf', $build_dir); System::rm(array('-rf', $build_dir));
} }
if (!System::mkDir(array('-p', $build_dir))) { if (!System::mkDir(array('-p', $build_dir))) {
return $this->raiseError("could not create build dir: $build_dir"); return $this->raiseError("could not create build dir: $build_dir");
} }
$this->addTempFile($build_dir); $this->addTempFile($build_dir);
if (!System::mkDir(array('-p', $inst_dir))) { if (!System::mkDir(array('-p', $inst_dir))) {
return $this->raiseError("could not create temporary install dir: $inst_dir"); return $this->raiseError("could not create temporary install dir: $inst_dir");
} }
$this->addTempFile($inst_dir); $this->addTempFile($inst_dir);
if (getenv('MAKE')) { $make_command = getenv('MAKE') ? getenv('MAKE') : 'make';
$make_command = getenv('MAKE');
} else {
$make_command = 'make';
}
$to_run = array( $to_run = array(
$configure_command, $configure_command,
$make_command, $make_command,
"$make_command INSTALL_ROOT=\"$inst_dir\" install", "$make_command INSTALL_ROOT=\"$inst_dir\" install",
"find \"$inst_dir\" -ls" "find \"$inst_dir\" | xargs ls -dils"
); );
if (!@chdir($build_dir)) { if (!file_exists($build_dir) || !is_dir($build_dir) || !chdir($build_dir)) {
return $this->raiseError("could not chdir to $build_dir"); return $this->raiseError("could not chdir to $build_dir");
} }
putenv('PHP_PEAR_VERSION=@PEAR-VER@'); putenv('PHP_PEAR_VERSION=1.9.4');
foreach ($to_run as $cmd) { foreach ($to_run as $cmd) {
$err = $this->_runCommand($cmd, $callback); $err = $this->_runCommand($cmd, $callback);
if (PEAR::isError($err)) { if (PEAR::isError($err)) {
@ -319,15 +392,14 @@ class PEAR_Builder extends PEAR_Common
return $this->raiseError("no `modules' directory found"); return $this->raiseError("no `modules' directory found");
} }
$built_files = array(); $built_files = array();
$prefix = exec("php-config --prefix"); $prefix = exec($this->config->get('php_prefix')
. "php-config" .
$this->config->get('php_suffix') . " --prefix");
$this->_harvestInstDir($prefix, $inst_dir . DIRECTORY_SEPARATOR . $prefix, $built_files); $this->_harvestInstDir($prefix, $inst_dir . DIRECTORY_SEPARATOR . $prefix, $built_files);
chdir($old_cwd); chdir($old_cwd);
return $built_files; return $built_files;
} }
// }}}
// {{{ phpizeCallback()
/** /**
* Message callback function used when running the "phpize" * Message callback function used when running the "phpize"
* program. Extracts the API numbers used. Ignores other message * program. Extracts the API numbers used. Ignores other message
@ -361,9 +433,6 @@ class PEAR_Builder extends PEAR_Common
} }
} }
// }}}
// {{{ _runCommand()
/** /**
* Run an external command, using a message callback to report * Run an external command, using a message callback to report
* output. The command will be run through popen and output is * output. The command will be run through popen and output is
@ -383,7 +452,7 @@ class PEAR_Builder extends PEAR_Common
function _runCommand($command, $callback = null) function _runCommand($command, $callback = null)
{ {
$this->log(1, "running: $command"); $this->log(1, "running: $command");
$pp = @popen("$command 2>&1", "r"); $pp = popen("$command 2>&1", "r");
if (!$pp) { if (!$pp) {
return $this->raiseError("failed to run `$command'"); return $this->raiseError("failed to run `$command'");
} }
@ -402,13 +471,11 @@ class PEAR_Builder extends PEAR_Common
if ($callback && isset($olddbg)) { if ($callback && isset($olddbg)) {
$callback[0]->debug = $olddbg; $callback[0]->debug = $olddbg;
} }
$exitcode = @pclose($pp);
$exitcode = is_resource($pp) ? pclose($pp) : -1;
return ($exitcode == 0); return ($exitcode == 0);
} }
// }}}
// {{{ log()
function log($level, $msg) function log($level, $msg)
{ {
if ($this->current_callback) { if ($this->current_callback) {
@ -419,8 +486,4 @@ class PEAR_Builder extends PEAR_Common
} }
return PEAR_Common::log($level, $msg); return PEAR_Common::log($level, $msg);
} }
// }}}
} }
?>

1559
3rdparty/PEAR/ChannelFile.php vendored Normal file

File diff suppressed because it is too large Load Diff

68
3rdparty/PEAR/ChannelFile/Parser.php vendored Normal file
View File

@ -0,0 +1,68 @@
<?php
/**
* PEAR_ChannelFile_Parser for parsing channel.xml
*
* PHP versions 4 and 5
*
* @category pear
* @package PEAR
* @author Greg Beaver <cellog@php.net>
* @copyright 1997-2009 The Authors
* @license http://opensource.org/licenses/bsd-license.php New BSD License
* @version CVS: $Id: Parser.php 313023 2011-07-06 19:17:11Z dufuz $
* @link http://pear.php.net/package/PEAR
* @since File available since Release 1.4.0a1
*/
/**
* base xml parser class
*/
require_once 'PEAR/XMLParser.php';
require_once 'PEAR/ChannelFile.php';
/**
* Parser for channel.xml
* @category pear
* @package PEAR
* @author Greg Beaver <cellog@php.net>
* @copyright 1997-2009 The Authors
* @license http://opensource.org/licenses/bsd-license.php New BSD License
* @version Release: 1.9.4
* @link http://pear.php.net/package/PEAR
* @since Class available since Release 1.4.0a1
*/
class PEAR_ChannelFile_Parser extends PEAR_XMLParser
{
var $_config;
var $_logger;
var $_registry;
function setConfig(&$c)
{
$this->_config = &$c;
$this->_registry = &$c->getRegistry();
}
function setLogger(&$l)
{
$this->_logger = &$l;
}
function parse($data, $file)
{
if (PEAR::isError($err = parent::parse($data, $file))) {
return $err;
}
$ret = new PEAR_ChannelFile;
$ret->setConfig($this->_config);
if (isset($this->_logger)) {
$ret->setLogger($this->_logger);
}
$ret->fromArray($this->_unserializedData);
// make sure the filelist is in the easy to read format needed
$ret->flattenFilelist();
$ret->setPackagefile($file, $archive);
return $ret;
}
}

View File

@ -1,25 +1,26 @@
<?php <?php
// /**
// +----------------------------------------------------------------------+ * PEAR_Command, command pattern class
// | PHP Version 5 | *
// +----------------------------------------------------------------------+ * PHP versions 4 and 5
// | Copyright (c) 1997-2004 The PHP Group | *
// +----------------------------------------------------------------------+ * @category pear
// | This source file is subject to version 3.0 of the PHP license, | * @package PEAR
// | that is bundled with this package in the file LICENSE, and is | * @author Stig Bakken <ssb@php.net>
// | available through the world-wide-web at the following url: | * @author Greg Beaver <cellog@php.net>
// | http://www.php.net/license/3_0.txt. | * @copyright 1997-2009 The Authors
// | If you did not receive a copy of the PHP license and are unable to | * @license http://opensource.org/licenses/bsd-license.php New BSD License
// | obtain it through the world-wide-web, please send a note to | * @version CVS: $Id: Command.php 313023 2011-07-06 19:17:11Z dufuz $
// | license@php.net so we can mail you a copy immediately. | * @link http://pear.php.net/package/PEAR
// +----------------------------------------------------------------------+ * @since File available since Release 0.1
// | Author: Stig Bakken <ssb@php.net> | */
// +----------------------------------------------------------------------+
//
// $Id: Command.php,v 1.24 2004/05/16 15:43:30 pajoye Exp $
/**
require_once "PEAR.php"; * Needed for error handling
*/
require_once 'PEAR.php';
require_once 'PEAR/Frontend.php';
require_once 'PEAR/XMLParser.php';
/** /**
* List of commands and what classes they are implemented in. * List of commands and what classes they are implemented in.
@ -27,6 +28,12 @@ require_once "PEAR.php";
*/ */
$GLOBALS['_PEAR_Command_commandlist'] = array(); $GLOBALS['_PEAR_Command_commandlist'] = array();
/**
* List of commands and their descriptions
* @var array command => description
*/
$GLOBALS['_PEAR_Command_commanddesc'] = array();
/** /**
* List of shortcuts to common commands. * List of shortcuts to common commands.
* @var array shortcut => command * @var array shortcut => command
@ -39,18 +46,6 @@ $GLOBALS['_PEAR_Command_shortcuts'] = array();
*/ */
$GLOBALS['_PEAR_Command_objects'] = array(); $GLOBALS['_PEAR_Command_objects'] = array();
/**
* Which user interface class is being used.
* @var string class name
*/
$GLOBALS['_PEAR_Command_uiclass'] = 'PEAR_Frontend_CLI';
/**
* Instance of $_PEAR_Command_uiclass.
* @var object
*/
$GLOBALS['_PEAR_Command_uiobject'] = null;
/** /**
* PEAR command class, a simple factory class for administrative * PEAR command class, a simple factory class for administrative
* commands. * commands.
@ -93,6 +88,15 @@ $GLOBALS['_PEAR_Command_uiobject'] = null;
* - DON'T USE EXIT OR DIE! Always use pear errors. From static * - DON'T USE EXIT OR DIE! Always use pear errors. From static
* classes do PEAR::raiseError(), from other classes do * classes do PEAR::raiseError(), from other classes do
* $this->raiseError(). * $this->raiseError().
* @category pear
* @package PEAR
* @author Stig Bakken <ssb@php.net>
* @author Greg Beaver <cellog@php.net>
* @copyright 1997-2009 The Authors
* @license http://opensource.org/licenses/bsd-license.php New BSD License
* @version Release: 1.9.4
* @link http://pear.php.net/package/PEAR
* @since Class available since Release 0.1
*/ */
class PEAR_Command class PEAR_Command
{ {
@ -109,7 +113,7 @@ class PEAR_Command
* @access public * @access public
* @static * @static
*/ */
function factory($command, &$config) function &factory($command, &$config)
{ {
if (empty($GLOBALS['_PEAR_Command_commandlist'])) { if (empty($GLOBALS['_PEAR_Command_commandlist'])) {
PEAR_Command::registerCommands(); PEAR_Command::registerCommands();
@ -118,13 +122,35 @@ class PEAR_Command
$command = $GLOBALS['_PEAR_Command_shortcuts'][$command]; $command = $GLOBALS['_PEAR_Command_shortcuts'][$command];
} }
if (!isset($GLOBALS['_PEAR_Command_commandlist'][$command])) { if (!isset($GLOBALS['_PEAR_Command_commandlist'][$command])) {
return PEAR::raiseError("unknown command `$command'"); $a = PEAR::raiseError("unknown command `$command'");
return $a;
} }
$class = $GLOBALS['_PEAR_Command_commandlist'][$command]; $class = $GLOBALS['_PEAR_Command_commandlist'][$command];
if (!class_exists($class)) {
require_once $GLOBALS['_PEAR_Command_objects'][$class];
}
if (!class_exists($class)) {
$a = PEAR::raiseError("unknown command `$command'");
return $a;
}
$ui =& PEAR_Command::getFrontendObject();
$obj = &new $class($ui, $config);
return $obj;
}
// }}}
// {{{ & getObject()
function &getObject($command)
{
$class = $GLOBALS['_PEAR_Command_commandlist'][$command];
if (!class_exists($class)) {
require_once $GLOBALS['_PEAR_Command_objects'][$class];
}
if (!class_exists($class)) { if (!class_exists($class)) {
return PEAR::raiseError("unknown command `$command'"); return PEAR::raiseError("unknown command `$command'");
} }
$ui =& PEAR_Command::getFrontendObject(); $ui =& PEAR_Command::getFrontendObject();
$config = &PEAR_Config::singleton();
$obj = &new $class($ui, $config); $obj = &new $class($ui, $config);
return $obj; return $obj;
} }
@ -135,15 +161,13 @@ class PEAR_Command
/** /**
* Get instance of frontend object. * Get instance of frontend object.
* *
* @return object * @return object|PEAR_Error
* @static * @static
*/ */
function &getFrontendObject() function &getFrontendObject()
{ {
if (empty($GLOBALS['_PEAR_Command_uiobject'])) { $a = &PEAR_Frontend::singleton();
$GLOBALS['_PEAR_Command_uiobject'] = &new $GLOBALS['_PEAR_Command_uiclass']; return $a;
}
return $GLOBALS['_PEAR_Command_uiobject'];
} }
// }}} // }}}
@ -159,59 +183,13 @@ class PEAR_Command
*/ */
function &setFrontendClass($uiclass) function &setFrontendClass($uiclass)
{ {
if (is_object($GLOBALS['_PEAR_Command_uiobject']) && $a = &PEAR_Frontend::setFrontendClass($uiclass);
is_a($GLOBALS['_PEAR_Command_uiobject'], $uiclass)) { return $a;
return $GLOBALS['_PEAR_Command_uiobject'];
}
if (!class_exists($uiclass)) {
$file = str_replace('_', '/', $uiclass) . '.php';
if (PEAR_Command::isIncludeable($file)) {
include_once $file;
}
}
if (class_exists($uiclass)) {
$obj = &new $uiclass;
// quick test to see if this class implements a few of the most
// important frontend methods
if (method_exists($obj, 'userConfirm')) {
$GLOBALS['_PEAR_Command_uiobject'] = &$obj;
$GLOBALS['_PEAR_Command_uiclass'] = $uiclass;
return $obj;
} else {
$err = PEAR::raiseError("not a frontend class: $uiclass");
return $err;
}
}
$err = PEAR::raiseError("no such class: $uiclass");
return $err;
} }
// }}} // }}}
// {{{ setFrontendType() // {{{ setFrontendType()
// }}}
// {{{ isIncludeable()
/**
* @param string $path relative or absolute include path
* @return boolean
* @static
*/
function isIncludeable($path)
{
if (file_exists($path) && is_readable($path)) {
return true;
}
$ipath = explode(PATH_SEPARATOR, ini_get('include_path'));
foreach ($ipath as $include) {
$test = realpath($include . DIRECTORY_SEPARATOR . $path);
if (file_exists($test) && is_readable($test)) {
return true;
}
}
return false;
}
/** /**
* Set current frontend. * Set current frontend.
* *
@ -249,9 +227,13 @@ class PEAR_Command
*/ */
function registerCommands($merge = false, $dir = null) function registerCommands($merge = false, $dir = null)
{ {
$parser = new PEAR_XMLParser;
if ($dir === null) { if ($dir === null) {
$dir = dirname(__FILE__) . '/Command'; $dir = dirname(__FILE__) . '/Command';
} }
if (!is_dir($dir)) {
return PEAR::raiseError("registerCommands: opendir($dir) '$dir' does not exist or is not a directory");
}
$dp = @opendir($dir); $dp = @opendir($dir);
if (empty($dp)) { if (empty($dp)) {
return PEAR::raiseError("registerCommands: opendir($dir) failed"); return PEAR::raiseError("registerCommands: opendir($dir) failed");
@ -259,27 +241,58 @@ class PEAR_Command
if (!$merge) { if (!$merge) {
$GLOBALS['_PEAR_Command_commandlist'] = array(); $GLOBALS['_PEAR_Command_commandlist'] = array();
} }
while ($entry = readdir($dp)) {
if ($entry{0} == '.' || substr($entry, -4) != '.php' || $entry == 'Common.php') { while ($file = readdir($dp)) {
if ($file{0} == '.' || substr($file, -4) != '.xml') {
continue; continue;
} }
$class = "PEAR_Command_".substr($entry, 0, -4);
$file = "$dir/$entry"; $f = substr($file, 0, -4);
include_once $file; $class = "PEAR_Command_" . $f;
// List of commands // List of commands
if (empty($GLOBALS['_PEAR_Command_objects'][$class])) { if (empty($GLOBALS['_PEAR_Command_objects'][$class])) {
$GLOBALS['_PEAR_Command_objects'][$class] = &new $class($ui, $config); $GLOBALS['_PEAR_Command_objects'][$class] = "$dir/" . $f . '.php';
} }
$implements = $GLOBALS['_PEAR_Command_objects'][$class]->getCommands();
$parser->parse(file_get_contents("$dir/$file"));
$implements = $parser->getData();
foreach ($implements as $command => $desc) { foreach ($implements as $command => $desc) {
if ($command == 'attribs') {
continue;
}
if (isset($GLOBALS['_PEAR_Command_commandlist'][$command])) {
return PEAR::raiseError('Command "' . $command . '" already registered in ' .
'class "' . $GLOBALS['_PEAR_Command_commandlist'][$command] . '"');
}
$GLOBALS['_PEAR_Command_commandlist'][$command] = $class; $GLOBALS['_PEAR_Command_commandlist'][$command] = $class;
$GLOBALS['_PEAR_Command_commanddesc'][$command] = $desc; $GLOBALS['_PEAR_Command_commanddesc'][$command] = $desc['summary'];
} if (isset($desc['shortcut'])) {
$shortcuts = $GLOBALS['_PEAR_Command_objects'][$class]->getShortcuts(); $shortcut = $desc['shortcut'];
foreach ($shortcuts as $shortcut => $command) { if (isset($GLOBALS['_PEAR_Command_shortcuts'][$shortcut])) {
$GLOBALS['_PEAR_Command_shortcuts'][$shortcut] = $command; return PEAR::raiseError('Command shortcut "' . $shortcut . '" already ' .
'registered to command "' . $command . '" in class "' .
$GLOBALS['_PEAR_Command_commandlist'][$command] . '"');
}
$GLOBALS['_PEAR_Command_shortcuts'][$shortcut] = $command;
}
if (isset($desc['options']) && $desc['options']) {
foreach ($desc['options'] as $oname => $option) {
if (isset($option['shortopt']) && strlen($option['shortopt']) > 1) {
return PEAR::raiseError('Option "' . $oname . '" short option "' .
$option['shortopt'] . '" must be ' .
'only 1 character in Command "' . $command . '" in class "' .
$class . '"');
}
}
}
} }
} }
ksort($GLOBALS['_PEAR_Command_shortcuts']);
ksort($GLOBALS['_PEAR_Command_commandlist']);
@closedir($dp); @closedir($dp);
return true; return true;
} }
@ -343,11 +356,13 @@ class PEAR_Command
if (empty($GLOBALS['_PEAR_Command_commandlist'])) { if (empty($GLOBALS['_PEAR_Command_commandlist'])) {
PEAR_Command::registerCommands(); PEAR_Command::registerCommands();
} }
if (isset($GLOBALS['_PEAR_Command_shortcuts'][$command])) {
$command = $GLOBALS['_PEAR_Command_shortcuts'][$command];
}
if (!isset($GLOBALS['_PEAR_Command_commandlist'][$command])) { if (!isset($GLOBALS['_PEAR_Command_commandlist'][$command])) {
return null; return null;
} }
$class = $GLOBALS['_PEAR_Command_commandlist'][$command]; $obj = &PEAR_Command::getObject($command);
$obj = &$GLOBALS['_PEAR_Command_objects'][$class];
return $obj->getGetoptArgs($command, $short_args, $long_args); return $obj->getGetoptArgs($command, $short_args, $long_args);
} }
@ -386,13 +401,14 @@ class PEAR_Command
function getHelp($command) function getHelp($command)
{ {
$cmds = PEAR_Command::getCommands(); $cmds = PEAR_Command::getCommands();
if (isset($GLOBALS['_PEAR_Command_shortcuts'][$command])) {
$command = $GLOBALS['_PEAR_Command_shortcuts'][$command];
}
if (isset($cmds[$command])) { if (isset($cmds[$command])) {
$class = $cmds[$command]; $obj = &PEAR_Command::getObject($command);
return $GLOBALS['_PEAR_Command_objects'][$class]->getHelp($command); return $obj->getHelp($command);
} }
return false; return false;
} }
// }}} // }}}
} }
?>

View File

@ -1,43 +1,53 @@
<?php <?php
// /**
// +----------------------------------------------------------------------+ * PEAR_Command_Auth (login, logout commands)
// | PHP Version 5 | *
// +----------------------------------------------------------------------+ * PHP versions 4 and 5
// | Copyright (c) 1997-2004 The PHP Group | *
// +----------------------------------------------------------------------+ * @category pear
// | This source file is subject to version 3.0 of the PHP license, | * @package PEAR
// | that is bundled with this package in the file LICENSE, and is | * @author Stig Bakken <ssb@php.net>
// | available through the world-wide-web at the following url: | * @author Greg Beaver <cellog@php.net>
// | http://www.php.net/license/3_0.txt. | * @copyright 1997-2009 The Authors
// | If you did not receive a copy of the PHP license and are unable to | * @license http://opensource.org/licenses/bsd-license.php New BSD License
// | obtain it through the world-wide-web, please send a note to | * @version CVS: $Id: Auth.php 313023 2011-07-06 19:17:11Z dufuz $
// | license@php.net so we can mail you a copy immediately. | * @link http://pear.php.net/package/PEAR
// +----------------------------------------------------------------------+ * @since File available since Release 0.1
// | Author: Stig Bakken <ssb@php.net> | * @deprecated since 1.8.0alpha1
// +----------------------------------------------------------------------+ */
//
// $Id: Auth.php,v 1.15 2004/01/08 17:33:13 sniper Exp $
require_once "PEAR/Command/Common.php";
require_once "PEAR/Remote.php";
require_once "PEAR/Config.php";
/** /**
* PEAR commands for managing configuration data. * base class
*
*/ */
class PEAR_Command_Auth extends PEAR_Command_Common require_once 'PEAR/Command/Channels.php';
{
// {{{ properties
/**
* PEAR commands for login/logout
*
* @category pear
* @package PEAR
* @author Stig Bakken <ssb@php.net>
* @author Greg Beaver <cellog@php.net>
* @copyright 1997-2009 The Authors
* @license http://opensource.org/licenses/bsd-license.php New BSD License
* @version Release: 1.9.4
* @link http://pear.php.net/package/PEAR
* @since Class available since Release 0.1
* @deprecated since 1.8.0alpha1
*/
class PEAR_Command_Auth extends PEAR_Command_Channels
{
var $commands = array( var $commands = array(
'login' => array( 'login' => array(
'summary' => 'Connects and authenticates to remote server', 'summary' => 'Connects and authenticates to remote server [Deprecated in favor of channel-login]',
'shortcut' => 'li', 'shortcut' => 'li',
'function' => 'doLogin', 'function' => 'doLogin',
'options' => array(), 'options' => array(),
'doc' => ' 'doc' => '<channel name>
Log in to the remote server. To use remote functions in the installer WARNING: This function is deprecated in favor of using channel-login
Log in to a remote channel server. If <channel name> is not supplied,
the default channel is used. To use remote functions in the installer
that require any kind of privileges, you need to log in first. The that require any kind of privileges, you need to log in first. The
username and password you enter here will be stored in your per-user username and password you enter here will be stored in your per-user
PEAR configuration (~/.pearrc on Unix-like systems). After logging PEAR configuration (~/.pearrc on Unix-like systems). After logging
@ -45,11 +55,13 @@ in, your username and password will be sent along in subsequent
operations on the remote server.', operations on the remote server.',
), ),
'logout' => array( 'logout' => array(
'summary' => 'Logs out from the remote server', 'summary' => 'Logs out from the remote server [Deprecated in favor of channel-logout]',
'shortcut' => 'lo', 'shortcut' => 'lo',
'function' => 'doLogout', 'function' => 'doLogout',
'options' => array(), 'options' => array(),
'doc' => ' 'doc' => '
WARNING: This function is deprecated in favor of using channel-logout
Logs out from the remote server. This command does not actually Logs out from the remote server. This command does not actually
connect to the remote server, it only deletes the stored username and connect to the remote server, it only deletes the stored username and
password from your user configuration.', password from your user configuration.',
@ -57,10 +69,6 @@ password from your user configuration.',
); );
// }}}
// {{{ constructor
/** /**
* PEAR_Command_Auth constructor. * PEAR_Command_Auth constructor.
* *
@ -68,88 +76,6 @@ password from your user configuration.',
*/ */
function PEAR_Command_Auth(&$ui, &$config) function PEAR_Command_Auth(&$ui, &$config)
{ {
parent::PEAR_Command_Common($ui, $config); parent::PEAR_Command_Channels($ui, $config);
} }
// }}}
// {{{ doLogin()
/**
* Execute the 'login' command.
*
* @param string $command command name
*
* @param array $options option_name => value
*
* @param array $params list of additional parameters
*
* @return bool TRUE on success, FALSE for unknown commands, or
* a PEAR error on failure
*
* @access public
*/
function doLogin($command, $options, $params)
{
$server = $this->config->get('master_server');
$remote = new PEAR_Remote($this->config);
$username = $this->config->get('username');
if (empty($username)) {
$username = @$_ENV['USER'];
}
$this->ui->outputData("Logging in to $server.", $command);
list($username, $password) = $this->ui->userDialog(
$command,
array('Username', 'Password'),
array('text', 'password'),
array($username, '')
);
$username = trim($username);
$password = trim($password);
$this->config->set('username', $username);
$this->config->set('password', $password);
$remote->expectError(401);
$ok = $remote->call('logintest');
$remote->popExpect();
if ($ok === true) {
$this->ui->outputData("Logged in.", $command);
$this->config->store();
} else {
return $this->raiseError("Login failed!");
}
}
// }}}
// {{{ doLogout()
/**
* Execute the 'logout' command.
*
* @param string $command command name
*
* @param array $options option_name => value
*
* @param array $params list of additional parameters
*
* @return bool TRUE on success, FALSE for unknown commands, or
* a PEAR error on failure
*
* @access public
*/
function doLogout($command, $options, $params)
{
$server = $this->config->get('master_server');
$this->ui->outputData("Logging out from $server.", $command);
$this->config->remove('username');
$this->config->remove('password');
$this->config->store();
}
// }}}
} }
?>

30
3rdparty/PEAR/Command/Auth.xml vendored Normal file
View File

@ -0,0 +1,30 @@
<commands version="1.0">
<login>
<summary>Connects and authenticates to remote server [Deprecated in favor of channel-login]</summary>
<function>doLogin</function>
<shortcut>li</shortcut>
<options />
<doc>&lt;channel name&gt;
WARNING: This function is deprecated in favor of using channel-login
Log in to a remote channel server. If &lt;channel name&gt; is not supplied,
the default channel is used. To use remote functions in the installer
that require any kind of privileges, you need to log in first. The
username and password you enter here will be stored in your per-user
PEAR configuration (~/.pearrc on Unix-like systems). After logging
in, your username and password will be sent along in subsequent
operations on the remote server.</doc>
</login>
<logout>
<summary>Logs out from the remote server [Deprecated in favor of channel-logout]</summary>
<function>doLogout</function>
<shortcut>lo</shortcut>
<options />
<doc>
WARNING: This function is deprecated in favor of using channel-logout
Logs out from the remote server. This command does not actually
connect to the remote server, it only deletes the stored username and
password from your user configuration.</doc>
</logout>
</commands>

View File

@ -1,36 +1,42 @@
<?php <?php
// /**
// +----------------------------------------------------------------------+ * PEAR_Command_Auth (build command)
// | PHP Version 5 | *
// +----------------------------------------------------------------------+ * PHP versions 4 and 5
// | Copyright (c) 1997-2004 The PHP Group | *
// +----------------------------------------------------------------------+ * @category pear
// | This source file is subject to version 3.0 of the PHP license, | * @package PEAR
// | that is bundled with this package in the file LICENSE, and is | * @author Stig Bakken <ssb@php.net>
// | available through the world-wide-web at the following url: | * @author Tomas V.V.Cox <cox@idecnet.com>
// | http://www.php.net/license/3_0.txt. | * @author Greg Beaver <cellog@php.net>
// | If you did not receive a copy of the PHP license and are unable to | * @copyright 1997-2009 The Authors
// | obtain it through the world-wide-web, please send a note to | * @license http://opensource.org/licenses/bsd-license.php New BSD License
// | license@php.net so we can mail you a copy immediately. | * @version CVS: $Id: Build.php 313023 2011-07-06 19:17:11Z dufuz $
// +----------------------------------------------------------------------+ * @link http://pear.php.net/package/PEAR
// | Author: Stig Bakken <ssb@php.net> | * @since File available since Release 0.1
// | Tomas V.V.Cox <cox@idecnet.com> | */
// | |
// +----------------------------------------------------------------------+
//
// $Id: Build.php,v 1.9 2004/01/08 17:33:13 sniper Exp $
require_once "PEAR/Command/Common.php"; /**
require_once "PEAR/Builder.php"; * base class
*/
require_once 'PEAR/Command/Common.php';
/** /**
* PEAR commands for building extensions. * PEAR commands for building extensions.
* *
* @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-2009 The Authors
* @license http://opensource.org/licenses/bsd-license.php New BSD License
* @version Release: 1.9.4
* @link http://pear.php.net/package/PEAR
* @since Class available since Release 0.1
*/ */
class PEAR_Command_Build extends PEAR_Command_Common class PEAR_Command_Build extends PEAR_Command_Common
{ {
// {{{ properties
var $commands = array( var $commands = array(
'build' => array( 'build' => array(
'summary' => 'Build an Extension From C Source', 'summary' => 'Build an Extension From C Source',
@ -42,10 +48,6 @@ Builds one or more extensions contained in a package.'
), ),
); );
// }}}
// {{{ constructor
/** /**
* PEAR_Command_Build constructor. * PEAR_Command_Build constructor.
* *
@ -56,27 +58,23 @@ Builds one or more extensions contained in a package.'
parent::PEAR_Command_Common($ui, $config); parent::PEAR_Command_Common($ui, $config);
} }
// }}}
// {{{ doBuild()
function doBuild($command, $options, $params) function doBuild($command, $options, $params)
{ {
require_once 'PEAR/Builder.php';
if (sizeof($params) < 1) { if (sizeof($params) < 1) {
$params[0] = 'package.xml'; $params[0] = 'package.xml';
} }
$builder = &new PEAR_Builder($this->ui); $builder = &new PEAR_Builder($this->ui);
$this->debug = $this->config->get('verbose'); $this->debug = $this->config->get('verbose');
$err = $builder->build($params[0], array(&$this, 'buildCallback')); $err = $builder->build($params[0], array(&$this, 'buildCallback'));
if (PEAR::isError($err)) { if (PEAR::isError($err)) {
return $err; return $err;
} }
return true; return true;
} }
// }}}
// {{{ buildCallback()
function buildCallback($what, $data) function buildCallback($what, $data)
{ {
if (($what == 'cmdoutput' && $this->debug > 1) || if (($what == 'cmdoutput' && $this->debug > 1) ||
@ -84,6 +82,4 @@ Builds one or more extensions contained in a package.'
$this->ui->outputData(rtrim($data), 'build'); $this->ui->outputData(rtrim($data), 'build');
} }
} }
// }}}
} }

10
3rdparty/PEAR/Command/Build.xml vendored Normal file
View File

@ -0,0 +1,10 @@
<commands version="1.0">
<build>
<summary>Build an Extension From C Source</summary>
<function>doBuild</function>
<shortcut>b</shortcut>
<options />
<doc>[package.xml]
Builds one or more extensions contained in a package.</doc>
</build>
</commands>

883
3rdparty/PEAR/Command/Channels.php vendored Normal file
View File

@ -0,0 +1,883 @@
<?php
// /* vim: set expandtab tabstop=4 shiftwidth=4: */
/**
* PEAR_Command_Channels (list-channels, update-channels, channel-delete, channel-add,
* channel-update, channel-info, channel-alias, channel-discover commands)
*
* PHP versions 4 and 5
*
* @category pear
* @package PEAR
* @author Stig Bakken <ssb@php.net>
* @author Greg Beaver <cellog@php.net>
* @copyright 1997-2009 The Authors
* @license http://opensource.org/licenses/bsd-license.php New BSD License
* @version CVS: $Id: Channels.php 313023 2011-07-06 19:17:11Z dufuz $
* @link http://pear.php.net/package/PEAR
* @since File available since Release 1.4.0a1
*/
/**
* base class
*/
require_once 'PEAR/Command/Common.php';
define('PEAR_COMMAND_CHANNELS_CHANNEL_EXISTS', -500);
/**
* PEAR commands for managing channels.
*
* @category pear
* @package PEAR
* @author Greg Beaver <cellog@php.net>
* @copyright 1997-2009 The Authors
* @license http://opensource.org/licenses/bsd-license.php New BSD License
* @version Release: 1.9.4
* @link http://pear.php.net/package/PEAR
* @since Class available since Release 1.4.0a1
*/
class PEAR_Command_Channels extends PEAR_Command_Common
{
var $commands = array(
'list-channels' => array(
'summary' => 'List Available Channels',
'function' => 'doList',
'shortcut' => 'lc',
'options' => array(),
'doc' => '
List all available channels for installation.
',
),
'update-channels' => array(
'summary' => 'Update the Channel List',
'function' => 'doUpdateAll',
'shortcut' => 'uc',
'options' => array(),
'doc' => '
List all installed packages in all channels.
'
),
'channel-delete' => array(
'summary' => 'Remove a Channel From the List',
'function' => 'doDelete',
'shortcut' => 'cde',
'options' => array(),
'doc' => '<channel name>
Delete a channel from the registry. You may not
remove any channel that has installed packages.
'
),
'channel-add' => array(
'summary' => 'Add a Channel',
'function' => 'doAdd',
'shortcut' => 'ca',
'options' => array(),
'doc' => '<channel.xml>
Add a private channel to the channel list. Note that all
public channels should be synced using "update-channels".
Parameter may be either a local file or remote URL to a
channel.xml.
'
),
'channel-update' => array(
'summary' => 'Update an Existing Channel',
'function' => 'doUpdate',
'shortcut' => 'cu',
'options' => array(
'force' => array(
'shortopt' => 'f',
'doc' => 'will force download of new channel.xml if an existing channel name is used',
),
'channel' => array(
'shortopt' => 'c',
'arg' => 'CHANNEL',
'doc' => 'will force download of new channel.xml if an existing channel name is used',
),
),
'doc' => '[<channel.xml>|<channel name>]
Update a channel in the channel list directly. Note that all
public channels can be synced using "update-channels".
Parameter may be a local or remote channel.xml, or the name of
an existing channel.
'
),
'channel-info' => array(
'summary' => 'Retrieve Information on a Channel',
'function' => 'doInfo',
'shortcut' => 'ci',
'options' => array(),
'doc' => '<package>
List the files in an installed package.
'
),
'channel-alias' => array(
'summary' => 'Specify an alias to a channel name',
'function' => 'doAlias',
'shortcut' => 'cha',
'options' => array(),
'doc' => '<channel> <alias>
Specify a specific alias to use for a channel name.
The alias may not be an existing channel name or
alias.
'
),
'channel-discover' => array(
'summary' => 'Initialize a Channel from its server',
'function' => 'doDiscover',
'shortcut' => 'di',
'options' => array(),
'doc' => '[<channel.xml>|<channel name>]
Initialize a channel from its server and create a local channel.xml.
If <channel name> is in the format "<username>:<password>@<channel>" then
<username> and <password> will be set as the login username/password for
<channel>. Use caution when passing the username/password in this way, as
it may allow other users on your computer to briefly view your username/
password via the system\'s process list.
'
),
'channel-login' => array(
'summary' => 'Connects and authenticates to remote channel server',
'shortcut' => 'cli',
'function' => 'doLogin',
'options' => array(),
'doc' => '<channel name>
Log in to a remote channel server. If <channel name> is not supplied,
the default channel is used. To use remote functions in the installer
that require any kind of privileges, you need to log in first. The
username and password you enter here will be stored in your per-user
PEAR configuration (~/.pearrc on Unix-like systems). After logging
in, your username and password will be sent along in subsequent
operations on the remote server.',
),
'channel-logout' => array(
'summary' => 'Logs out from the remote channel server',
'shortcut' => 'clo',
'function' => 'doLogout',
'options' => array(),
'doc' => '<channel name>
Logs out from a remote channel server. If <channel name> is not supplied,
the default channel is used. This command does not actually connect to the
remote server, it only deletes the stored username and password from your user
configuration.',
),
);
/**
* PEAR_Command_Registry constructor.
*
* @access public
*/
function PEAR_Command_Channels(&$ui, &$config)
{
parent::PEAR_Command_Common($ui, $config);
}
function _sortChannels($a, $b)
{
return strnatcasecmp($a->getName(), $b->getName());
}
function doList($command, $options, $params)
{
$reg = &$this->config->getRegistry();
$registered = $reg->getChannels();
usort($registered, array(&$this, '_sortchannels'));
$i = $j = 0;
$data = array(
'caption' => 'Registered Channels:',
'border' => true,
'headline' => array('Channel', 'Alias', 'Summary')
);
foreach ($registered as $channel) {
$data['data'][] = array($channel->getName(),
$channel->getAlias(),
$channel->getSummary());
}
if (count($registered) === 0) {
$data = '(no registered channels)';
}
$this->ui->outputData($data, $command);
return true;
}
function doUpdateAll($command, $options, $params)
{
$reg = &$this->config->getRegistry();
$channels = $reg->getChannels();
$success = true;
foreach ($channels as $channel) {
if ($channel->getName() != '__uri') {
PEAR::staticPushErrorHandling(PEAR_ERROR_RETURN);
$err = $this->doUpdate('channel-update',
$options,
array($channel->getName()));
if (PEAR::isError($err)) {
$this->ui->outputData($err->getMessage(), $command);
$success = false;
} else {
$success &= $err;
}
}
}
return $success;
}
function doInfo($command, $options, $params)
{
if (count($params) !== 1) {
return $this->raiseError("No channel specified");
}
$reg = &$this->config->getRegistry();
$channel = strtolower($params[0]);
if ($reg->channelExists($channel)) {
$chan = $reg->getChannel($channel);
if (PEAR::isError($chan)) {
return $this->raiseError($chan);
}
} else {
if (strpos($channel, '://')) {
$downloader = &$this->getDownloader();
$tmpdir = $this->config->get('temp_dir');
PEAR::staticPushErrorHandling(PEAR_ERROR_RETURN);
$loc = $downloader->downloadHttp($channel, $this->ui, $tmpdir);
PEAR::staticPopErrorHandling();
if (PEAR::isError($loc)) {
return $this->raiseError('Cannot open "' . $channel .
'" (' . $loc->getMessage() . ')');
} else {
$contents = implode('', file($loc));
}
} else {
if (!file_exists($params[0])) {
return $this->raiseError('Unknown channel "' . $channel . '"');
}
$fp = fopen($params[0], 'r');
if (!$fp) {
return $this->raiseError('Cannot open "' . $params[0] . '"');
}
$contents = '';
while (!feof($fp)) {
$contents .= fread($fp, 1024);
}
fclose($fp);
}
if (!class_exists('PEAR_ChannelFile')) {
require_once 'PEAR/ChannelFile.php';
}
$chan = new PEAR_ChannelFile;
$chan->fromXmlString($contents);
$chan->validate();
if ($errs = $chan->getErrors(true)) {
foreach ($errs as $err) {
$this->ui->outputData($err['level'] . ': ' . $err['message']);
}
return $this->raiseError('Channel file "' . $params[0] . '" is not valid');
}
}
if (!$chan) {
return $this->raiseError('Serious error: Channel "' . $params[0] .
'" has a corrupted registry entry');
}
$channel = $chan->getName();
$caption = 'Channel ' . $channel . ' Information:';
$data1 = array(
'caption' => $caption,
'border' => true);
$data1['data']['server'] = array('Name and Server', $chan->getName());
if ($chan->getAlias() != $chan->getName()) {
$data1['data']['alias'] = array('Alias', $chan->getAlias());
}
$data1['data']['summary'] = array('Summary', $chan->getSummary());
$validate = $chan->getValidationPackage();
$data1['data']['vpackage'] = array('Validation Package Name', $validate['_content']);
$data1['data']['vpackageversion'] =
array('Validation Package Version', $validate['attribs']['version']);
$d = array();
$d['main'] = $data1;
$data['data'] = array();
$data['caption'] = 'Server Capabilities';
$data['headline'] = array('Type', 'Version/REST type', 'Function Name/REST base');
if ($chan->supportsREST()) {
if ($chan->supportsREST()) {
$funcs = $chan->getFunctions('rest');
if (!isset($funcs[0])) {
$funcs = array($funcs);
}
foreach ($funcs as $protocol) {
$data['data'][] = array('rest', $protocol['attribs']['type'],
$protocol['_content']);
}
}
} else {
$data['data'][] = array('No supported protocols');
}
$d['protocols'] = $data;
$data['data'] = array();
$mirrors = $chan->getMirrors();
if ($mirrors) {
$data['caption'] = 'Channel ' . $channel . ' Mirrors:';
unset($data['headline']);
foreach ($mirrors as $mirror) {
$data['data'][] = array($mirror['attribs']['host']);
$d['mirrors'] = $data;
}
foreach ($mirrors as $i => $mirror) {
$data['data'] = array();
$data['caption'] = 'Mirror ' . $mirror['attribs']['host'] . ' Capabilities';
$data['headline'] = array('Type', 'Version/REST type', 'Function Name/REST base');
if ($chan->supportsREST($mirror['attribs']['host'])) {
if ($chan->supportsREST($mirror['attribs']['host'])) {
$funcs = $chan->getFunctions('rest', $mirror['attribs']['host']);
if (!isset($funcs[0])) {
$funcs = array($funcs);
}
foreach ($funcs as $protocol) {
$data['data'][] = array('rest', $protocol['attribs']['type'],
$protocol['_content']);
}
}
} else {
$data['data'][] = array('No supported protocols');
}
$d['mirrorprotocols' . $i] = $data;
}
}
$this->ui->outputData($d, 'channel-info');
}
// }}}
function doDelete($command, $options, $params)
{
if (count($params) !== 1) {
return $this->raiseError('channel-delete: no channel specified');
}
$reg = &$this->config->getRegistry();
if (!$reg->channelExists($params[0])) {
return $this->raiseError('channel-delete: channel "' . $params[0] . '" does not exist');
}
$channel = $reg->channelName($params[0]);
if ($channel == 'pear.php.net') {
return $this->raiseError('Cannot delete the pear.php.net channel');
}
if ($channel == 'pecl.php.net') {
return $this->raiseError('Cannot delete the pecl.php.net channel');
}
if ($channel == 'doc.php.net') {
return $this->raiseError('Cannot delete the doc.php.net channel');
}
if ($channel == '__uri') {
return $this->raiseError('Cannot delete the __uri pseudo-channel');
}
if (PEAR::isError($err = $reg->listPackages($channel))) {
return $err;
}
if (count($err)) {
return $this->raiseError('Channel "' . $channel .
'" has installed packages, cannot delete');
}
if (!$reg->deleteChannel($channel)) {
return $this->raiseError('Channel "' . $channel . '" deletion failed');
} else {
$this->config->deleteChannel($channel);
$this->ui->outputData('Channel "' . $channel . '" deleted', $command);
}
}
function doAdd($command, $options, $params)
{
if (count($params) !== 1) {
return $this->raiseError('channel-add: no channel file specified');
}
if (strpos($params[0], '://')) {
$downloader = &$this->getDownloader();
$tmpdir = $this->config->get('temp_dir');
if (!file_exists($tmpdir)) {
require_once 'System.php';
PEAR::staticPushErrorHandling(PEAR_ERROR_RETURN);
$err = System::mkdir(array('-p', $tmpdir));
PEAR::staticPopErrorHandling();
if (PEAR::isError($err)) {
return $this->raiseError('channel-add: temp_dir does not exist: "' .
$tmpdir .
'" - You can change this location with "pear config-set temp_dir"');
}
}
if (!is_writable($tmpdir)) {
return $this->raiseError('channel-add: temp_dir is not writable: "' .
$tmpdir .
'" - You can change this location with "pear config-set temp_dir"');
}
PEAR::staticPushErrorHandling(PEAR_ERROR_RETURN);
$loc = $downloader->downloadHttp($params[0], $this->ui, $tmpdir, null, false);
PEAR::staticPopErrorHandling();
if (PEAR::isError($loc)) {
return $this->raiseError('channel-add: Cannot open "' . $params[0] .
'" (' . $loc->getMessage() . ')');
}
list($loc, $lastmodified) = $loc;
$contents = implode('', file($loc));
} else {
$lastmodified = $fp = false;
if (file_exists($params[0])) {
$fp = fopen($params[0], 'r');
}
if (!$fp) {
return $this->raiseError('channel-add: cannot open "' . $params[0] . '"');
}
$contents = '';
while (!feof($fp)) {
$contents .= fread($fp, 1024);
}
fclose($fp);
}
if (!class_exists('PEAR_ChannelFile')) {
require_once 'PEAR/ChannelFile.php';
}
$channel = new PEAR_ChannelFile;
PEAR::staticPushErrorHandling(PEAR_ERROR_RETURN);
$result = $channel->fromXmlString($contents);
PEAR::staticPopErrorHandling();
if (!$result) {
$exit = false;
if (count($errors = $channel->getErrors(true))) {
foreach ($errors as $error) {
$this->ui->outputData(ucfirst($error['level'] . ': ' . $error['message']));
if (!$exit) {
$exit = $error['level'] == 'error' ? true : false;
}
}
if ($exit) {
return $this->raiseError('channel-add: invalid channel.xml file');
}
}
}
$reg = &$this->config->getRegistry();
if ($reg->channelExists($channel->getName())) {
return $this->raiseError('channel-add: Channel "' . $channel->getName() .
'" exists, use channel-update to update entry', PEAR_COMMAND_CHANNELS_CHANNEL_EXISTS);
}
$ret = $reg->addChannel($channel, $lastmodified);
if (PEAR::isError($ret)) {
return $ret;
}
if (!$ret) {
return $this->raiseError('channel-add: adding Channel "' . $channel->getName() .
'" to registry failed');
}
$this->config->setChannels($reg->listChannels());
$this->config->writeConfigFile();
$this->ui->outputData('Adding Channel "' . $channel->getName() . '" succeeded', $command);
}
function doUpdate($command, $options, $params)
{
if (count($params) !== 1) {
return $this->raiseError("No channel file specified");
}
$tmpdir = $this->config->get('temp_dir');
if (!file_exists($tmpdir)) {
require_once 'System.php';
PEAR::staticPushErrorHandling(PEAR_ERROR_RETURN);
$err = System::mkdir(array('-p', $tmpdir));
PEAR::staticPopErrorHandling();
if (PEAR::isError($err)) {
return $this->raiseError('channel-add: temp_dir does not exist: "' .
$tmpdir .
'" - You can change this location with "pear config-set temp_dir"');
}
}
if (!is_writable($tmpdir)) {
return $this->raiseError('channel-add: temp_dir is not writable: "' .
$tmpdir .
'" - You can change this location with "pear config-set temp_dir"');
}
$reg = &$this->config->getRegistry();
$lastmodified = false;
if ((!file_exists($params[0]) || is_dir($params[0]))
&& $reg->channelExists(strtolower($params[0]))) {
$c = $reg->getChannel(strtolower($params[0]));
if (PEAR::isError($c)) {
return $this->raiseError($c);
}
$this->ui->outputData("Updating channel \"$params[0]\"", $command);
$dl = &$this->getDownloader(array());
// if force is specified, use a timestamp of "1" to force retrieval
$lastmodified = isset($options['force']) ? false : $c->lastModified();
PEAR::staticPushErrorHandling(PEAR_ERROR_RETURN);
$contents = $dl->downloadHttp('http://' . $c->getName() . '/channel.xml',
$this->ui, $tmpdir, null, $lastmodified);
PEAR::staticPopErrorHandling();
if (PEAR::isError($contents)) {
// Attempt to fall back to https
$this->ui->outputData("Channel \"$params[0]\" is not responding over http://, failed with message: " . $contents->getMessage());
$this->ui->outputData("Trying channel \"$params[0]\" over https:// instead");
PEAR::staticPushErrorHandling(PEAR_ERROR_RETURN);
$contents = $dl->downloadHttp('https://' . $c->getName() . '/channel.xml',
$this->ui, $tmpdir, null, $lastmodified);
PEAR::staticPopErrorHandling();
if (PEAR::isError($contents)) {
return $this->raiseError('Cannot retrieve channel.xml for channel "' .
$c->getName() . '" (' . $contents->getMessage() . ')');
}
}
list($contents, $lastmodified) = $contents;
if (!$contents) {
$this->ui->outputData("Channel \"$params[0]\" is up to date");
return;
}
$contents = implode('', file($contents));
if (!class_exists('PEAR_ChannelFile')) {
require_once 'PEAR/ChannelFile.php';
}
$channel = new PEAR_ChannelFile;
$channel->fromXmlString($contents);
if (!$channel->getErrors()) {
// security check: is the downloaded file for the channel we got it from?
if (strtolower($channel->getName()) != strtolower($c->getName())) {
if (!isset($options['force'])) {
return $this->raiseError('ERROR: downloaded channel definition file' .
' for channel "' . $channel->getName() . '" from channel "' .
strtolower($c->getName()) . '"');
}
$this->ui->log(0, 'WARNING: downloaded channel definition file' .
' for channel "' . $channel->getName() . '" from channel "' .
strtolower($c->getName()) . '"');
}
}
} else {
if (strpos($params[0], '://')) {
$dl = &$this->getDownloader();
PEAR::staticPushErrorHandling(PEAR_ERROR_RETURN);
$loc = $dl->downloadHttp($params[0],
$this->ui, $tmpdir, null, $lastmodified);
PEAR::staticPopErrorHandling();
if (PEAR::isError($loc)) {
return $this->raiseError("Cannot open " . $params[0] .
' (' . $loc->getMessage() . ')');
}
list($loc, $lastmodified) = $loc;
$contents = implode('', file($loc));
} else {
$fp = false;
if (file_exists($params[0])) {
$fp = fopen($params[0], 'r');
}
if (!$fp) {
return $this->raiseError("Cannot open " . $params[0]);
}
$contents = '';
while (!feof($fp)) {
$contents .= fread($fp, 1024);
}
fclose($fp);
}
if (!class_exists('PEAR_ChannelFile')) {
require_once 'PEAR/ChannelFile.php';
}
$channel = new PEAR_ChannelFile;
$channel->fromXmlString($contents);
}
$exit = false;
if (count($errors = $channel->getErrors(true))) {
foreach ($errors as $error) {
$this->ui->outputData(ucfirst($error['level'] . ': ' . $error['message']));
if (!$exit) {
$exit = $error['level'] == 'error' ? true : false;
}
}
if ($exit) {
return $this->raiseError('Invalid channel.xml file');
}
}
if (!$reg->channelExists($channel->getName())) {
return $this->raiseError('Error: Channel "' . $channel->getName() .
'" does not exist, use channel-add to add an entry');
}
$ret = $reg->updateChannel($channel, $lastmodified);
if (PEAR::isError($ret)) {
return $ret;
}
if (!$ret) {
return $this->raiseError('Updating Channel "' . $channel->getName() .
'" in registry failed');
}
$this->config->setChannels($reg->listChannels());
$this->config->writeConfigFile();
$this->ui->outputData('Update of Channel "' . $channel->getName() . '" succeeded');
}
function &getDownloader()
{
if (!class_exists('PEAR_Downloader')) {
require_once 'PEAR/Downloader.php';
}
$a = new PEAR_Downloader($this->ui, array(), $this->config);
return $a;
}
function doAlias($command, $options, $params)
{
if (count($params) === 1) {
return $this->raiseError('No channel alias specified');
}
if (count($params) !== 2 || (!empty($params[1]) && $params[1]{0} == '-')) {
return $this->raiseError(
'Invalid format, correct is: channel-alias channel alias');
}
$reg = &$this->config->getRegistry();
if (!$reg->channelExists($params[0], true)) {
$extra = '';
if ($reg->isAlias($params[0])) {
$extra = ' (use "channel-alias ' . $reg->channelName($params[0]) . ' ' .
strtolower($params[1]) . '")';
}
return $this->raiseError('"' . $params[0] . '" is not a valid channel' . $extra);
}
if ($reg->isAlias($params[1])) {
return $this->raiseError('Channel "' . $reg->channelName($params[1]) . '" is ' .
'already aliased to "' . strtolower($params[1]) . '", cannot re-alias');
}
$chan = &$reg->getChannel($params[0]);
if (PEAR::isError($chan)) {
return $this->raiseError('Corrupt registry? Error retrieving channel "' . $params[0] .
'" information (' . $chan->getMessage() . ')');
}
// make it a local alias
if (!$chan->setAlias(strtolower($params[1]), true)) {
return $this->raiseError('Alias "' . strtolower($params[1]) .
'" is not a valid channel alias');
}
$reg->updateChannel($chan);
$this->ui->outputData('Channel "' . $chan->getName() . '" aliased successfully to "' .
strtolower($params[1]) . '"');
}
/**
* The channel-discover command
*
* @param string $command command name
* @param array $options option_name => value
* @param array $params list of additional parameters.
* $params[0] should contain a string with either:
* - <channel name> or
* - <username>:<password>@<channel name>
* @return null|PEAR_Error
*/
function doDiscover($command, $options, $params)
{
if (count($params) !== 1) {
return $this->raiseError("No channel server specified");
}
// Look for the possible input format "<username>:<password>@<channel>"
if (preg_match('/^(.+):(.+)@(.+)\\z/', $params[0], $matches)) {
$username = $matches[1];
$password = $matches[2];
$channel = $matches[3];
} else {
$channel = $params[0];
}
$reg = &$this->config->getRegistry();
if ($reg->channelExists($channel)) {
if (!$reg->isAlias($channel)) {
return $this->raiseError("Channel \"$channel\" is already initialized", PEAR_COMMAND_CHANNELS_CHANNEL_EXISTS);
}
return $this->raiseError("A channel alias named \"$channel\" " .
'already exists, aliasing channel "' . $reg->channelName($channel)
. '"');
}
$this->pushErrorHandling(PEAR_ERROR_RETURN);
$err = $this->doAdd($command, $options, array('http://' . $channel . '/channel.xml'));
$this->popErrorHandling();
if (PEAR::isError($err)) {
if ($err->getCode() === PEAR_COMMAND_CHANNELS_CHANNEL_EXISTS) {
return $this->raiseError("Discovery of channel \"$channel\" failed (" .
$err->getMessage() . ')');
}
// Attempt fetch via https
$this->ui->outputData("Discovering channel $channel over http:// failed with message: " . $err->getMessage());
$this->ui->outputData("Trying to discover channel $channel over https:// instead");
$this->pushErrorHandling(PEAR_ERROR_RETURN);
$err = $this->doAdd($command, $options, array('https://' . $channel . '/channel.xml'));
$this->popErrorHandling();
if (PEAR::isError($err)) {
return $this->raiseError("Discovery of channel \"$channel\" failed (" .
$err->getMessage() . ')');
}
}
// Store username/password if they were given
// Arguably we should do a logintest on the channel here, but since
// that's awkward on a REST-based channel (even "pear login" doesn't
// do it for those), and XML-RPC is deprecated, it's fairly pointless.
if (isset($username)) {
$this->config->set('username', $username, 'user', $channel);
$this->config->set('password', $password, 'user', $channel);
$this->config->store();
$this->ui->outputData("Stored login for channel \"$channel\" using username \"$username\"", $command);
}
$this->ui->outputData("Discovery of channel \"$channel\" succeeded", $command);
}
/**
* Execute the 'login' command.
*
* @param string $command command name
* @param array $options option_name => value
* @param array $params list of additional parameters
*
* @return bool TRUE on success or
* a PEAR error on failure
*
* @access public
*/
function doLogin($command, $options, $params)
{
$reg = &$this->config->getRegistry();
// If a parameter is supplied, use that as the channel to log in to
$channel = isset($params[0]) ? $params[0] : $this->config->get('default_channel');
$chan = $reg->getChannel($channel);
if (PEAR::isError($chan)) {
return $this->raiseError($chan);
}
$server = $this->config->get('preferred_mirror', null, $channel);
$username = $this->config->get('username', null, $channel);
if (empty($username)) {
$username = isset($_ENV['USER']) ? $_ENV['USER'] : null;
}
$this->ui->outputData("Logging in to $server.", $command);
list($username, $password) = $this->ui->userDialog(
$command,
array('Username', 'Password'),
array('text', 'password'),
array($username, '')
);
$username = trim($username);
$password = trim($password);
$ourfile = $this->config->getConfFile('user');
if (!$ourfile) {
$ourfile = $this->config->getConfFile('system');
}
$this->config->set('username', $username, 'user', $channel);
$this->config->set('password', $password, 'user', $channel);
if ($chan->supportsREST()) {
$ok = true;
}
if ($ok !== true) {
return $this->raiseError('Login failed!');
}
$this->ui->outputData("Logged in.", $command);
// avoid changing any temporary settings changed with -d
$ourconfig = new PEAR_Config($ourfile, $ourfile);
$ourconfig->set('username', $username, 'user', $channel);
$ourconfig->set('password', $password, 'user', $channel);
$ourconfig->store();
return true;
}
/**
* Execute the 'logout' command.
*
* @param string $command command name
* @param array $options option_name => value
* @param array $params list of additional parameters
*
* @return bool TRUE on success or
* a PEAR error on failure
*
* @access public
*/
function doLogout($command, $options, $params)
{
$reg = &$this->config->getRegistry();
// If a parameter is supplied, use that as the channel to log in to
$channel = isset($params[0]) ? $params[0] : $this->config->get('default_channel');
$chan = $reg->getChannel($channel);
if (PEAR::isError($chan)) {
return $this->raiseError($chan);
}
$server = $this->config->get('preferred_mirror', null, $channel);
$this->ui->outputData("Logging out from $server.", $command);
$this->config->remove('username', 'user', $channel);
$this->config->remove('password', 'user', $channel);
$this->config->store();
return true;
}
}

123
3rdparty/PEAR/Command/Channels.xml vendored Normal file
View File

@ -0,0 +1,123 @@
<commands version="1.0">
<list-channels>
<summary>List Available Channels</summary>
<function>doList</function>
<shortcut>lc</shortcut>
<options />
<doc>
List all available channels for installation.
</doc>
</list-channels>
<update-channels>
<summary>Update the Channel List</summary>
<function>doUpdateAll</function>
<shortcut>uc</shortcut>
<options />
<doc>
List all installed packages in all channels.
</doc>
</update-channels>
<channel-delete>
<summary>Remove a Channel From the List</summary>
<function>doDelete</function>
<shortcut>cde</shortcut>
<options />
<doc>&lt;channel name&gt;
Delete a channel from the registry. You may not
remove any channel that has installed packages.
</doc>
</channel-delete>
<channel-add>
<summary>Add a Channel</summary>
<function>doAdd</function>
<shortcut>ca</shortcut>
<options />
<doc>&lt;channel.xml&gt;
Add a private channel to the channel list. Note that all
public channels should be synced using &quot;update-channels&quot;.
Parameter may be either a local file or remote URL to a
channel.xml.
</doc>
</channel-add>
<channel-update>
<summary>Update an Existing Channel</summary>
<function>doUpdate</function>
<shortcut>cu</shortcut>
<options>
<force>
<shortopt>f</shortopt>
<doc>will force download of new channel.xml if an existing channel name is used</doc>
</force>
<channel>
<shortopt>c</shortopt>
<doc>will force download of new channel.xml if an existing channel name is used</doc>
<arg>CHANNEL</arg>
</channel>
</options>
<doc>[&lt;channel.xml&gt;|&lt;channel name&gt;]
Update a channel in the channel list directly. Note that all
public channels can be synced using &quot;update-channels&quot;.
Parameter may be a local or remote channel.xml, or the name of
an existing channel.
</doc>
</channel-update>
<channel-info>
<summary>Retrieve Information on a Channel</summary>
<function>doInfo</function>
<shortcut>ci</shortcut>
<options />
<doc>&lt;package&gt;
List the files in an installed package.
</doc>
</channel-info>
<channel-alias>
<summary>Specify an alias to a channel name</summary>
<function>doAlias</function>
<shortcut>cha</shortcut>
<options />
<doc>&lt;channel&gt; &lt;alias&gt;
Specify a specific alias to use for a channel name.
The alias may not be an existing channel name or
alias.
</doc>
</channel-alias>
<channel-discover>
<summary>Initialize a Channel from its server</summary>
<function>doDiscover</function>
<shortcut>di</shortcut>
<options />
<doc>[&lt;channel.xml&gt;|&lt;channel name&gt;]
Initialize a channel from its server and create a local channel.xml.
If &lt;channel name&gt; is in the format &quot;&lt;username&gt;:&lt;password&gt;@&lt;channel&gt;&quot; then
&lt;username&gt; and &lt;password&gt; will be set as the login username/password for
&lt;channel&gt;. Use caution when passing the username/password in this way, as
it may allow other users on your computer to briefly view your username/
password via the system&#039;s process list.
</doc>
</channel-discover>
<channel-login>
<summary>Connects and authenticates to remote channel server</summary>
<function>doLogin</function>
<shortcut>cli</shortcut>
<options />
<doc>&lt;channel name&gt;
Log in to a remote channel server. If &lt;channel name&gt; is not supplied,
the default channel is used. To use remote functions in the installer
that require any kind of privileges, you need to log in first. The
username and password you enter here will be stored in your per-user
PEAR configuration (~/.pearrc on Unix-like systems). After logging
in, your username and password will be sent along in subsequent
operations on the remote server.</doc>
</channel-login>
<channel-logout>
<summary>Logs out from the remote channel server</summary>
<function>doLogout</function>
<shortcut>clo</shortcut>
<options />
<doc>&lt;channel name&gt;
Logs out from a remote channel server. If &lt;channel name&gt; is not supplied,
the default channel is used. This command does not actually connect to the
remote server, it only deletes the stored username and password from your user
configuration.</doc>
</channel-logout>
</commands>

View File

@ -1,36 +1,52 @@
<?php <?php
// /**
// +----------------------------------------------------------------------+ * PEAR_Command_Common base class
// | PHP Version 5 | *
// +----------------------------------------------------------------------+ * PHP versions 4 and 5
// | Copyright (c) 1997-2004 The PHP Group | *
// +----------------------------------------------------------------------+ * @category pear
// | This source file is subject to version 3.0 of the PHP license, | * @package PEAR
// | that is bundled with this package in the file LICENSE, and is | * @author Stig Bakken <ssb@php.net>
// | available through the world-wide-web at the following url: | * @author Greg Beaver <cellog@php.net>
// | http://www.php.net/license/3_0.txt. | * @copyright 1997-2009 The Authors
// | If you did not receive a copy of the PHP license and are unable to | * @license http://opensource.org/licenses/bsd-license.php New BSD License
// | obtain it through the world-wide-web, please send a note to | * @version CVS: $Id: Common.php 313023 2011-07-06 19:17:11Z dufuz $
// | license@php.net so we can mail you a copy immediately. | * @link http://pear.php.net/package/PEAR
// +----------------------------------------------------------------------+ * @since File available since Release 0.1
// | Author: Stig Sæther Bakken <ssb@php.net> | */
// +----------------------------------------------------------------------+
//
// $Id: Common.php,v 1.24 2004/01/08 17:33:13 sniper Exp $
require_once "PEAR.php"; /**
* base class
*/
require_once 'PEAR.php';
/**
* PEAR commands base class
*
* @category pear
* @package PEAR
* @author Stig Bakken <ssb@php.net>
* @author Greg Beaver <cellog@php.net>
* @copyright 1997-2009 The Authors
* @license http://opensource.org/licenses/bsd-license.php New BSD License
* @version Release: 1.9.4
* @link http://pear.php.net/package/PEAR
* @since Class available since Release 0.1
*/
class PEAR_Command_Common extends PEAR class PEAR_Command_Common extends PEAR
{ {
// {{{ properties
/** /**
* PEAR_Config object used to pass user system and configuration * PEAR_Config object used to pass user system and configuration
* on when executing commands * on when executing commands
* *
* @var object * @var PEAR_Config
*/ */
var $config; var $config;
/**
* @var PEAR_Registry
* @access protected
*/
var $_registry;
/** /**
* User Interface object, for all interaction with the user. * User Interface object, for all interaction with the user.
@ -50,7 +66,7 @@ class PEAR_Command_Common extends PEAR
var $_deps_type_trans = array( var $_deps_type_trans = array(
'pkg' => 'package', 'pkg' => 'package',
'extension' => 'extension', 'ext' => 'extension',
'php' => 'PHP', 'php' => 'PHP',
'prog' => 'external program', 'prog' => 'external program',
'ldlib' => 'external library for linking', 'ldlib' => 'external library for linking',
@ -60,9 +76,6 @@ class PEAR_Command_Common extends PEAR
'sapi' => 'SAPI backend' 'sapi' => 'SAPI backend'
); );
// }}}
// {{{ constructor
/** /**
* PEAR_Command_Common constructor. * PEAR_Command_Common constructor.
* *
@ -75,10 +88,6 @@ class PEAR_Command_Common extends PEAR
$this->ui = &$ui; $this->ui = &$ui;
} }
// }}}
// {{{ getCommands()
/** /**
* Return a list of all the commands defined by this class. * Return a list of all the commands defined by this class.
* @return array list of commands * @return array list of commands
@ -90,12 +99,10 @@ class PEAR_Command_Common extends PEAR
foreach (array_keys($this->commands) as $command) { foreach (array_keys($this->commands) as $command) {
$ret[$command] = $this->commands[$command]['summary']; $ret[$command] = $this->commands[$command]['summary'];
} }
return $ret; return $ret;
} }
// }}}
// {{{ getShortcuts()
/** /**
* Return a list of all the command shortcuts defined by this class. * Return a list of all the command shortcuts defined by this class.
* @return array shortcut => command * @return array shortcut => command
@ -109,28 +116,34 @@ class PEAR_Command_Common extends PEAR
$ret[$this->commands[$command]['shortcut']] = $command; $ret[$this->commands[$command]['shortcut']] = $command;
} }
} }
return $ret; return $ret;
} }
// }}}
// {{{ getOptions()
function getOptions($command) function getOptions($command)
{ {
return @$this->commands[$command]['options']; $shortcuts = $this->getShortcuts();
} if (isset($shortcuts[$command])) {
$command = $shortcuts[$command];
}
// }}} if (isset($this->commands[$command]) &&
// {{{ getGetoptArgs() isset($this->commands[$command]['options'])) {
return $this->commands[$command]['options'];
}
return null;
}
function getGetoptArgs($command, &$short_args, &$long_args) function getGetoptArgs($command, &$short_args, &$long_args)
{ {
$short_args = ""; $short_args = '';
$long_args = array(); $long_args = array();
if (empty($this->commands[$command])) { if (empty($this->commands[$command]) || empty($this->commands[$command]['options'])) {
return; return;
} }
reset($this->commands[$command]);
reset($this->commands[$command]['options']);
while (list($option, $info) = each($this->commands[$command]['options'])) { while (list($option, $info) = each($this->commands[$command]['options'])) {
$larg = $sarg = ''; $larg = $sarg = '';
if (isset($info['arg'])) { if (isset($info['arg'])) {
@ -144,15 +157,15 @@ class PEAR_Command_Common extends PEAR
$arg = $info['arg']; $arg = $info['arg'];
} }
} }
if (isset($info['shortopt'])) { if (isset($info['shortopt'])) {
$short_args .= $info['shortopt'] . $sarg; $short_args .= $info['shortopt'] . $sarg;
} }
$long_args[] = $option . $larg; $long_args[] = $option . $larg;
} }
} }
// }}}
// {{{ getHelp()
/** /**
* Returns the help message for the given command * Returns the help message for the given command
* *
@ -164,29 +177,38 @@ class PEAR_Command_Common extends PEAR
function getHelp($command) function getHelp($command)
{ {
$config = &PEAR_Config::singleton(); $config = &PEAR_Config::singleton();
$help = @$this->commands[$command]['doc']; if (!isset($this->commands[$command])) {
return "No such command \"$command\"";
}
$help = null;
if (isset($this->commands[$command]['doc'])) {
$help = $this->commands[$command]['doc'];
}
if (empty($help)) { if (empty($help)) {
// XXX (cox) Fallback to summary if there is no doc (show both?) // XXX (cox) Fallback to summary if there is no doc (show both?)
if (!$help = @$this->commands[$command]['summary']) { if (!isset($this->commands[$command]['summary'])) {
return "No help for command \"$command\""; return "No help for command \"$command\"";
} }
$help = $this->commands[$command]['summary'];
} }
if (preg_match_all('/{config\s+([^\}]+)}/e', $help, $matches)) { if (preg_match_all('/{config\s+([^\}]+)}/e', $help, $matches)) {
foreach($matches[0] as $k => $v) { foreach($matches[0] as $k => $v) {
$help = preg_replace("/$v/", $config->get($matches[1][$k]), $help); $help = preg_replace("/$v/", $config->get($matches[1][$k]), $help);
} }
} }
return array($help, $this->getHelpArgs($command)); return array($help, $this->getHelpArgs($command));
} }
// }}}
// {{{ getHelpArgs()
/** /**
* Returns the help for the accepted arguments of a command * Returns the help for the accepted arguments of a command
* *
* @param string $command * @param string $command
* @return string The help string * @return string The help string
*/ */
function getHelpArgs($command) function getHelpArgs($command)
{ {
if (isset($this->commands[$command]['options']) && if (isset($this->commands[$command]['options']) &&
@ -195,7 +217,7 @@ class PEAR_Command_Common extends PEAR
$help = "Options:\n"; $help = "Options:\n";
foreach ($this->commands[$command]['options'] as $k => $v) { foreach ($this->commands[$command]['options'] as $k => $v) {
if (isset($v['arg'])) { if (isset($v['arg'])) {
if ($v['arg']{0} == '(') { if ($v['arg'][0] == '(') {
$arg = substr($v['arg'], 1, -1); $arg = substr($v['arg'], 1, -1);
$sapp = " [$arg]"; $sapp = " [$arg]";
$lapp = "[=$arg]"; $lapp = "[=$arg]";
@ -206,44 +228,46 @@ class PEAR_Command_Common extends PEAR
} else { } else {
$sapp = $lapp = ""; $sapp = $lapp = "";
} }
if (isset($v['shortopt'])) { if (isset($v['shortopt'])) {
$s = $v['shortopt']; $s = $v['shortopt'];
@$help .= " -$s$sapp, --$k$lapp\n"; $help .= " -$s$sapp, --$k$lapp\n";
} else { } else {
@$help .= " --$k$lapp\n"; $help .= " --$k$lapp\n";
} }
$p = " "; $p = " ";
$doc = rtrim(str_replace("\n", "\n$p", $v['doc'])); $doc = rtrim(str_replace("\n", "\n$p", $v['doc']));
$help .= " $doc\n"; $help .= " $doc\n";
} }
return $help; return $help;
} }
return null; return null;
} }
// }}}
// {{{ run()
function run($command, $options, $params) function run($command, $options, $params)
{ {
$func = @$this->commands[$command]['function']; if (empty($this->commands[$command]['function'])) {
if (empty($func)) {
// look for shortcuts // look for shortcuts
foreach (array_keys($this->commands) as $cmd) { foreach (array_keys($this->commands) as $cmd) {
if (@$this->commands[$cmd]['shortcut'] == $command) { if (isset($this->commands[$cmd]['shortcut']) && $this->commands[$cmd]['shortcut'] == $command) {
$command = $cmd; if (empty($this->commands[$cmd]['function'])) {
$func = @$this->commands[$command]['function'];
if (empty($func)) {
return $this->raiseError("unknown command `$command'"); return $this->raiseError("unknown command `$command'");
} else {
$func = $this->commands[$cmd]['function'];
} }
$command = $cmd;
//$command = $this->commands[$cmd]['function'];
break; break;
} }
} }
} else {
$func = $this->commands[$command]['function'];
} }
return $this->$func($command, $options, $params); return $this->$func($command, $options, $params);
} }
// }}}
} }
?>

View File

@ -1,74 +1,101 @@
<?php <?php
// /**
// +----------------------------------------------------------------------+ * PEAR_Command_Config (config-show, config-get, config-set, config-help, config-create commands)
// | PHP Version 5 | *
// +----------------------------------------------------------------------+ * PHP versions 4 and 5
// | Copyright (c) 1997-2004 The PHP Group | *
// +----------------------------------------------------------------------+ * @category pear
// | This source file is subject to version 3.0 of the PHP license, | * @package PEAR
// | that is bundled with this package in the file LICENSE, and is | * @author Stig Bakken <ssb@php.net>
// | available through the world-wide-web at the following url: | * @author Greg Beaver <cellog@php.net>
// | http://www.php.net/license/3_0.txt. | * @copyright 1997-2009 The Authors
// | If you did not receive a copy of the PHP license and are unable to | * @license http://opensource.org/licenses/bsd-license.php New BSD License
// | obtain it through the world-wide-web, please send a note to | * @version CVS: $Id: Config.php 313024 2011-07-06 19:51:24Z dufuz $
// | license@php.net so we can mail you a copy immediately. | * @link http://pear.php.net/package/PEAR
// +----------------------------------------------------------------------+ * @since File available since Release 0.1
// | Author: Stig Bakken <ssb@php.net> | */
// | Tomas V.V.Cox <cox@idecnet.com> |
// | |
// +----------------------------------------------------------------------+
//
// $Id: Config.php,v 1.27 2004/06/15 16:48:49 pajoye Exp $
require_once "PEAR/Command/Common.php"; /**
require_once "PEAR/Config.php"; * base class
*/
require_once 'PEAR/Command/Common.php';
/** /**
* PEAR commands for managing configuration data. * PEAR commands for managing configuration data.
* *
* @category pear
* @package PEAR
* @author Stig Bakken <ssb@php.net>
* @author Greg Beaver <cellog@php.net>
* @copyright 1997-2009 The Authors
* @license http://opensource.org/licenses/bsd-license.php New BSD License
* @version Release: 1.9.4
* @link http://pear.php.net/package/PEAR
* @since Class available since Release 0.1
*/ */
class PEAR_Command_Config extends PEAR_Command_Common class PEAR_Command_Config extends PEAR_Command_Common
{ {
// {{{ properties
var $commands = array( var $commands = array(
'config-show' => array( 'config-show' => array(
'summary' => 'Show All Settings', 'summary' => 'Show All Settings',
'function' => 'doConfigShow', 'function' => 'doConfigShow',
'shortcut' => 'csh', 'shortcut' => 'csh',
'options' => array(), 'options' => array(
'doc' => ' 'channel' => array(
'shortopt' => 'c',
'doc' => 'show configuration variables for another channel',
'arg' => 'CHAN',
),
),
'doc' => '[layer]
Displays all configuration values. An optional argument Displays all configuration values. An optional argument
may be used to tell which configuration layer to display. Valid may be used to tell which configuration layer to display. Valid
configuration layers are "user", "system" and "default". configuration layers are "user", "system" and "default". To display
configurations for different channels, set the default_channel
configuration variable and run config-show again.
', ',
), ),
'config-get' => array( 'config-get' => array(
'summary' => 'Show One Setting', 'summary' => 'Show One Setting',
'function' => 'doConfigGet', 'function' => 'doConfigGet',
'shortcut' => 'cg', 'shortcut' => 'cg',
'options' => array(), 'options' => array(
'channel' => array(
'shortopt' => 'c',
'doc' => 'show configuration variables for another channel',
'arg' => 'CHAN',
),
),
'doc' => '<parameter> [layer] 'doc' => '<parameter> [layer]
Displays the value of one configuration parameter. The Displays the value of one configuration parameter. The
first argument is the name of the parameter, an optional second argument first argument is the name of the parameter, an optional second argument
may be used to tell which configuration layer to look in. Valid configuration may be used to tell which configuration layer to look in. Valid configuration
layers are "user", "system" and "default". If no layer is specified, a value layers are "user", "system" and "default". If no layer is specified, a value
will be picked from the first layer that defines the parameter, in the order will be picked from the first layer that defines the parameter, in the order
just specified. just specified. The configuration value will be retrieved for the channel
specified by the default_channel configuration variable.
', ',
), ),
'config-set' => array( 'config-set' => array(
'summary' => 'Change Setting', 'summary' => 'Change Setting',
'function' => 'doConfigSet', 'function' => 'doConfigSet',
'shortcut' => 'cs', 'shortcut' => 'cs',
'options' => array(), 'options' => array(
'channel' => array(
'shortopt' => 'c',
'doc' => 'show configuration variables for another channel',
'arg' => 'CHAN',
),
),
'doc' => '<parameter> <value> [layer] 'doc' => '<parameter> <value> [layer]
Sets the value of one configuration parameter. The first argument is Sets the value of one configuration parameter. The first argument is
the name of the parameter, the second argument is the new value. Some the name of the parameter, the second argument is the new value. Some
parameters are subject to validation, and the command will fail with parameters are subject to validation, and the command will fail with
an error message if the new value does not make sense. An optional an error message if the new value does not make sense. An optional
third argument may be used to specify in which layer to set the third argument may be used to specify in which layer to set the
configuration parameter. The default layer is "user". configuration parameter. The default layer is "user". The
configuration value will be set for the current channel, which
is controlled by the default_channel configuration variable.
', ',
), ),
'config-help' => array( 'config-help' => array(
@ -81,11 +108,26 @@ Displays help for a configuration parameter. Without arguments it
displays help for all configuration parameters. displays help for all configuration parameters.
', ',
), ),
'config-create' => array(
'summary' => 'Create a Default configuration file',
'function' => 'doConfigCreate',
'shortcut' => 'coc',
'options' => array(
'windows' => array(
'shortopt' => 'w',
'doc' => 'create a config file for a windows install',
),
),
'doc' => '<root path> <filename>
Create a default configuration file with all directory configuration
variables set to subdirectories of <root path>, and save it as <filename>.
This is useful especially for creating a configuration file for a remote
PEAR installation (using the --remoteconfig option of install, upgrade,
and uninstall).
',
),
); );
// }}}
// {{{ constructor
/** /**
* PEAR_Command_Config constructor. * PEAR_Command_Config constructor.
* *
@ -96,94 +138,154 @@ displays help for all configuration parameters.
parent::PEAR_Command_Common($ui, $config); parent::PEAR_Command_Common($ui, $config);
} }
// }}}
// {{{ doConfigShow()
function doConfigShow($command, $options, $params) function doConfigShow($command, $options, $params)
{ {
// $params[0] -> the layer $layer = null;
if ($error = $this->_checkLayer(@$params[0])) { if (is_array($params)) {
return $this->raiseError($error); $layer = isset($params[0]) ? $params[0] : null;
} }
// $params[0] -> the layer
if ($error = $this->_checkLayer($layer)) {
return $this->raiseError("config-show:$error");
}
$keys = $this->config->getKeys(); $keys = $this->config->getKeys();
sort($keys); sort($keys);
$data = array('caption' => 'Configuration:'); $channel = isset($options['channel']) ? $options['channel'] :
$this->config->get('default_channel');
$reg = &$this->config->getRegistry();
if (!$reg->channelExists($channel)) {
return $this->raiseError('Channel "' . $channel . '" does not exist');
}
$channel = $reg->channelName($channel);
$data = array('caption' => 'Configuration (channel ' . $channel . '):');
foreach ($keys as $key) { foreach ($keys as $key) {
$type = $this->config->getType($key); $type = $this->config->getType($key);
$value = $this->config->get($key, @$params[0]); $value = $this->config->get($key, $layer, $channel);
if ($type == 'password' && $value) { if ($type == 'password' && $value) {
$value = '********'; $value = '********';
} }
if ($value === false) { if ($value === false) {
$value = 'false'; $value = 'false';
} elseif ($value === true) { } elseif ($value === true) {
$value = 'true'; $value = 'true';
} }
$data['data'][$this->config->getGroup($key)][] = array($this->config->getPrompt($key) , $key, $value); $data['data'][$this->config->getGroup($key)][] = array($this->config->getPrompt($key) , $key, $value);
} }
foreach ($this->config->getLayers() as $layer) {
$data['data']['Config Files'][] = array(ucfirst($layer) . ' Configuration File', 'Filename' , $this->config->getConfFile($layer));
}
$this->ui->outputData($data, $command); $this->ui->outputData($data, $command);
return true; return true;
} }
// }}}
// {{{ doConfigGet()
function doConfigGet($command, $options, $params) function doConfigGet($command, $options, $params)
{ {
// $params[0] -> the parameter $args_cnt = is_array($params) ? count($params) : 0;
// $params[1] -> the layer switch ($args_cnt) {
if ($error = $this->_checkLayer(@$params[1])) { case 1:
return $this->raiseError($error); $config_key = $params[0];
$layer = null;
break;
case 2:
$config_key = $params[0];
$layer = $params[1];
if ($error = $this->_checkLayer($layer)) {
return $this->raiseError("config-get:$error");
}
break;
case 0:
default:
return $this->raiseError("config-get expects 1 or 2 parameters");
} }
if (sizeof($params) < 1 || sizeof($params) > 2) {
return $this->raiseError("config-get expects 1 or 2 parameters"); $reg = &$this->config->getRegistry();
} elseif (sizeof($params) == 1) { $channel = isset($options['channel']) ? $options['channel'] : $this->config->get('default_channel');
$this->ui->outputData($this->config->get($params[0]), $command); if (!$reg->channelExists($channel)) {
} else { return $this->raiseError('Channel "' . $channel . '" does not exist');
$data = $this->config->get($params[0], $params[1]);
$this->ui->outputData($data, $command);
} }
$channel = $reg->channelName($channel);
$this->ui->outputData($this->config->get($config_key, $layer, $channel), $command);
return true; return true;
} }
// }}}
// {{{ doConfigSet()
function doConfigSet($command, $options, $params) function doConfigSet($command, $options, $params)
{ {
// $param[0] -> a parameter to set // $param[0] -> a parameter to set
// $param[1] -> the value for the parameter // $param[1] -> the value for the parameter
// $param[2] -> the layer // $param[2] -> the layer
$failmsg = ''; $failmsg = '';
if (sizeof($params) < 2 || sizeof($params) > 3) { if (count($params) < 2 || count($params) > 3) {
$failmsg .= "config-set expects 2 or 3 parameters"; $failmsg .= "config-set expects 2 or 3 parameters";
return PEAR::raiseError($failmsg); return PEAR::raiseError($failmsg);
} }
if ($error = $this->_checkLayer(@$params[2])) {
if (isset($params[2]) && ($error = $this->_checkLayer($params[2]))) {
$failmsg .= $error; $failmsg .= $error;
return PEAR::raiseError($failmsg); return PEAR::raiseError("config-set:$failmsg");
} }
if (!call_user_func_array(array(&$this->config, 'set'), $params))
{ $channel = isset($options['channel']) ? $options['channel'] : $this->config->get('default_channel');
$failmsg = "config-set (" . implode(", ", $params) . ") failed"; $reg = &$this->config->getRegistry();
if (!$reg->channelExists($channel)) {
return $this->raiseError('Channel "' . $channel . '" does not exist');
}
$channel = $reg->channelName($channel);
if ($params[0] == 'default_channel' && !$reg->channelExists($params[1])) {
return $this->raiseError('Channel "' . $params[1] . '" does not exist');
}
if ($params[0] == 'preferred_mirror'
&& (
!$reg->mirrorExists($channel, $params[1]) &&
(!$reg->channelExists($params[1]) || $channel != $params[1])
)
) {
$msg = 'Channel Mirror "' . $params[1] . '" does not exist';
$msg .= ' in your registry for channel "' . $channel . '".';
$msg .= "\n" . 'Attempt to run "pear channel-update ' . $channel .'"';
$msg .= ' if you believe this mirror should exist as you may';
$msg .= ' have outdated channel information.';
return $this->raiseError($msg);
}
if (count($params) == 2) {
array_push($params, 'user');
$layer = 'user';
} else { } else {
$this->config->store(); $layer = $params[2];
} }
array_push($params, $channel);
if (!call_user_func_array(array(&$this->config, 'set'), $params)) {
array_pop($params);
$failmsg = "config-set (" . implode(", ", $params) . ") failed, channel $channel";
} else {
$this->config->store($layer);
}
if ($failmsg) { if ($failmsg) {
return $this->raiseError($failmsg); return $this->raiseError($failmsg);
} }
$this->ui->outputData('config-set succeeded', $command);
return true; return true;
} }
// }}}
// {{{ doConfigHelp()
function doConfigHelp($command, $options, $params) function doConfigHelp($command, $options, $params)
{ {
if (empty($params)) { if (empty($params)) {
$params = $this->config->getKeys(); $params = $this->config->getKeys();
} }
$data['caption'] = "Config help" . ((count($params) == 1) ? " for $params[0]" : ''); $data['caption'] = "Config help" . ((count($params) == 1) ? " for $params[0]" : '');
$data['headline'] = array('Name', 'Type', 'Description'); $data['headline'] = array('Name', 'Type', 'Description');
$data['border'] = true; $data['border'] = true;
@ -194,13 +296,103 @@ displays help for all configuration parameters.
$docs = rtrim($docs) . "\nValid set: " . $docs = rtrim($docs) . "\nValid set: " .
implode(' ', $this->config->getSetValues($name)); implode(' ', $this->config->getSetValues($name));
} }
$data['data'][] = array($name, $type, $docs); $data['data'][] = array($name, $type, $docs);
} }
$this->ui->outputData($data, $command); $this->ui->outputData($data, $command);
} }
// }}} function doConfigCreate($command, $options, $params)
// {{{ _checkLayer() {
if (count($params) != 2) {
return PEAR::raiseError('config-create: must have 2 parameters, root path and ' .
'filename to save as');
}
$root = $params[0];
// Clean up the DIRECTORY_SEPARATOR mess
$ds2 = DIRECTORY_SEPARATOR . DIRECTORY_SEPARATOR;
$root = preg_replace(array('!\\\\+!', '!/+!', "!$ds2+!"),
array('/', '/', '/'),
$root);
if ($root{0} != '/') {
if (!isset($options['windows'])) {
return PEAR::raiseError('Root directory must be an absolute path beginning ' .
'with "/", was: "' . $root . '"');
}
if (!preg_match('/^[A-Za-z]:/', $root)) {
return PEAR::raiseError('Root directory must be an absolute path beginning ' .
'with "\\" or "C:\\", was: "' . $root . '"');
}
}
$windows = isset($options['windows']);
if ($windows) {
$root = str_replace('/', '\\', $root);
}
if (!file_exists($params[1]) && !@touch($params[1])) {
return PEAR::raiseError('Could not create "' . $params[1] . '"');
}
$params[1] = realpath($params[1]);
$config = &new PEAR_Config($params[1], '#no#system#config#', false, false);
if ($root{strlen($root) - 1} == '/') {
$root = substr($root, 0, strlen($root) - 1);
}
$config->noRegistry();
$config->set('php_dir', $windows ? "$root\\pear\\php" : "$root/pear/php", 'user');
$config->set('data_dir', $windows ? "$root\\pear\\data" : "$root/pear/data");
$config->set('www_dir', $windows ? "$root\\pear\\www" : "$root/pear/www");
$config->set('cfg_dir', $windows ? "$root\\pear\\cfg" : "$root/pear/cfg");
$config->set('ext_dir', $windows ? "$root\\pear\\ext" : "$root/pear/ext");
$config->set('doc_dir', $windows ? "$root\\pear\\docs" : "$root/pear/docs");
$config->set('test_dir', $windows ? "$root\\pear\\tests" : "$root/pear/tests");
$config->set('cache_dir', $windows ? "$root\\pear\\cache" : "$root/pear/cache");
$config->set('download_dir', $windows ? "$root\\pear\\download" : "$root/pear/download");
$config->set('temp_dir', $windows ? "$root\\pear\\temp" : "$root/pear/temp");
$config->set('bin_dir', $windows ? "$root\\pear" : "$root/pear");
$config->writeConfigFile();
$this->_showConfig($config);
$this->ui->outputData('Successfully created default configuration file "' . $params[1] . '"',
$command);
}
function _showConfig(&$config)
{
$params = array('user');
$keys = $config->getKeys();
sort($keys);
$channel = 'pear.php.net';
$data = array('caption' => 'Configuration (channel ' . $channel . '):');
foreach ($keys as $key) {
$type = $config->getType($key);
$value = $config->get($key, 'user', $channel);
if ($type == 'password' && $value) {
$value = '********';
}
if ($value === false) {
$value = 'false';
} elseif ($value === true) {
$value = 'true';
}
$data['data'][$config->getGroup($key)][] =
array($config->getPrompt($key) , $key, $value);
}
foreach ($config->getLayers() as $layer) {
$data['data']['Config Files'][] =
array(ucfirst($layer) . ' Configuration File', 'Filename' ,
$config->getConfFile($layer));
}
$this->ui->outputData($data, 'config-show');
return true;
}
/** /**
* Checks if a layer is defined or not * Checks if a layer is defined or not
@ -216,10 +408,7 @@ displays help for all configuration parameters.
return " only the layers: \"" . implode('" or "', $layers) . "\" are supported"; return " only the layers: \"" . implode('" or "', $layers) . "\" are supported";
} }
} }
return false; return false;
} }
// }}}
} }
?>

92
3rdparty/PEAR/Command/Config.xml vendored Normal file
View File

@ -0,0 +1,92 @@
<commands version="1.0">
<config-show>
<summary>Show All Settings</summary>
<function>doConfigShow</function>
<shortcut>csh</shortcut>
<options>
<channel>
<shortopt>c</shortopt>
<doc>show configuration variables for another channel</doc>
<arg>CHAN</arg>
</channel>
</options>
<doc>[layer]
Displays all configuration values. An optional argument
may be used to tell which configuration layer to display. Valid
configuration layers are &quot;user&quot;, &quot;system&quot; and &quot;default&quot;. To display
configurations for different channels, set the default_channel
configuration variable and run config-show again.
</doc>
</config-show>
<config-get>
<summary>Show One Setting</summary>
<function>doConfigGet</function>
<shortcut>cg</shortcut>
<options>
<channel>
<shortopt>c</shortopt>
<doc>show configuration variables for another channel</doc>
<arg>CHAN</arg>
</channel>
</options>
<doc>&lt;parameter&gt; [layer]
Displays the value of one configuration parameter. The
first argument is the name of the parameter, an optional second argument
may be used to tell which configuration layer to look in. Valid configuration
layers are &quot;user&quot;, &quot;system&quot; and &quot;default&quot;. If no layer is specified, a value
will be picked from the first layer that defines the parameter, in the order
just specified. The configuration value will be retrieved for the channel
specified by the default_channel configuration variable.
</doc>
</config-get>
<config-set>
<summary>Change Setting</summary>
<function>doConfigSet</function>
<shortcut>cs</shortcut>
<options>
<channel>
<shortopt>c</shortopt>
<doc>show configuration variables for another channel</doc>
<arg>CHAN</arg>
</channel>
</options>
<doc>&lt;parameter&gt; &lt;value&gt; [layer]
Sets the value of one configuration parameter. The first argument is
the name of the parameter, the second argument is the new value. Some
parameters are subject to validation, and the command will fail with
an error message if the new value does not make sense. An optional
third argument may be used to specify in which layer to set the
configuration parameter. The default layer is &quot;user&quot;. The
configuration value will be set for the current channel, which
is controlled by the default_channel configuration variable.
</doc>
</config-set>
<config-help>
<summary>Show Information About Setting</summary>
<function>doConfigHelp</function>
<shortcut>ch</shortcut>
<options />
<doc>[parameter]
Displays help for a configuration parameter. Without arguments it
displays help for all configuration parameters.
</doc>
</config-help>
<config-create>
<summary>Create a Default configuration file</summary>
<function>doConfigCreate</function>
<shortcut>coc</shortcut>
<options>
<windows>
<shortopt>w</shortopt>
<doc>create a config file for a windows install</doc>
</windows>
</options>
<doc>&lt;root path&gt; &lt;filename&gt;
Create a default configuration file with all directory configuration
variables set to subdirectories of &lt;root path&gt;, and save it as &lt;filename&gt;.
This is useful especially for creating a configuration file for a remote
PEAR installation (using the --remoteconfig option of install, upgrade,
and uninstall).
</doc>
</config-create>
</commands>

File diff suppressed because it is too large Load Diff

276
3rdparty/PEAR/Command/Install.xml vendored Normal file
View File

@ -0,0 +1,276 @@
<commands version="1.0">
<install>
<summary>Install Package</summary>
<function>doInstall</function>
<shortcut>i</shortcut>
<options>
<force>
<shortopt>f</shortopt>
<doc>will overwrite newer installed packages</doc>
</force>
<loose>
<shortopt>l</shortopt>
<doc>do not check for recommended dependency version</doc>
</loose>
<nodeps>
<shortopt>n</shortopt>
<doc>ignore dependencies, install anyway</doc>
</nodeps>
<register-only>
<shortopt>r</shortopt>
<doc>do not install files, only register the package as installed</doc>
</register-only>
<soft>
<shortopt>s</shortopt>
<doc>soft install, fail silently, or upgrade if already installed</doc>
</soft>
<nobuild>
<shortopt>B</shortopt>
<doc>don&#039;t build C extensions</doc>
</nobuild>
<nocompress>
<shortopt>Z</shortopt>
<doc>request uncompressed files when downloading</doc>
</nocompress>
<installroot>
<shortopt>R</shortopt>
<doc>root directory used when installing files (ala PHP&#039;s INSTALL_ROOT), use packagingroot for RPM</doc>
<arg>DIR</arg>
</installroot>
<packagingroot>
<shortopt>P</shortopt>
<doc>root directory used when packaging files, like RPM packaging</doc>
<arg>DIR</arg>
</packagingroot>
<ignore-errors>
<shortopt></shortopt>
<doc>force install even if there were errors</doc>
</ignore-errors>
<alldeps>
<shortopt>a</shortopt>
<doc>install all required and optional dependencies</doc>
</alldeps>
<onlyreqdeps>
<shortopt>o</shortopt>
<doc>install all required dependencies</doc>
</onlyreqdeps>
<offline>
<shortopt>O</shortopt>
<doc>do not attempt to download any urls or contact channels</doc>
</offline>
<pretend>
<shortopt>p</shortopt>
<doc>Only list the packages that would be downloaded</doc>
</pretend>
</options>
<doc>[channel/]&lt;package&gt; ...
Installs one or more PEAR packages. You can specify a package to
install in four ways:
&quot;Package-1.0.tgz&quot; : installs from a local file
&quot;http://example.com/Package-1.0.tgz&quot; : installs from
anywhere on the net.
&quot;package.xml&quot; : installs the package described in
package.xml. Useful for testing, or for wrapping a PEAR package in
another package manager such as RPM.
&quot;Package[-version/state][.tar]&quot; : queries your default channel&#039;s server
({config master_server}) and downloads the newest package with
the preferred quality/state ({config preferred_state}).
To retrieve Package version 1.1, use &quot;Package-1.1,&quot; to retrieve
Package state beta, use &quot;Package-beta.&quot; To retrieve an uncompressed
file, append .tar (make sure there is no file by the same name first)
To download a package from another channel, prefix with the channel name like
&quot;channel/Package&quot;
More than one package may be specified at once. It is ok to mix these
four ways of specifying packages.
</doc>
</install>
<upgrade>
<summary>Upgrade Package</summary>
<function>doInstall</function>
<shortcut>up</shortcut>
<options>
<channel>
<shortopt>c</shortopt>
<doc>upgrade packages from a specific channel</doc>
<arg>CHAN</arg>
</channel>
<force>
<shortopt>f</shortopt>
<doc>overwrite newer installed packages</doc>
</force>
<loose>
<shortopt>l</shortopt>
<doc>do not check for recommended dependency version</doc>
</loose>
<nodeps>
<shortopt>n</shortopt>
<doc>ignore dependencies, upgrade anyway</doc>
</nodeps>
<register-only>
<shortopt>r</shortopt>
<doc>do not install files, only register the package as upgraded</doc>
</register-only>
<nobuild>
<shortopt>B</shortopt>
<doc>don&#039;t build C extensions</doc>
</nobuild>
<nocompress>
<shortopt>Z</shortopt>
<doc>request uncompressed files when downloading</doc>
</nocompress>
<installroot>
<shortopt>R</shortopt>
<doc>root directory used when installing files (ala PHP&#039;s INSTALL_ROOT)</doc>
<arg>DIR</arg>
</installroot>
<ignore-errors>
<shortopt></shortopt>
<doc>force install even if there were errors</doc>
</ignore-errors>
<alldeps>
<shortopt>a</shortopt>
<doc>install all required and optional dependencies</doc>
</alldeps>
<onlyreqdeps>
<shortopt>o</shortopt>
<doc>install all required dependencies</doc>
</onlyreqdeps>
<offline>
<shortopt>O</shortopt>
<doc>do not attempt to download any urls or contact channels</doc>
</offline>
<pretend>
<shortopt>p</shortopt>
<doc>Only list the packages that would be downloaded</doc>
</pretend>
</options>
<doc>&lt;package&gt; ...
Upgrades one or more PEAR packages. See documentation for the
&quot;install&quot; command for ways to specify a package.
When upgrading, your package will be updated if the provided new
package has a higher version number (use the -f option if you need to
upgrade anyway).
More than one package may be specified at once.
</doc>
</upgrade>
<upgrade-all>
<summary>Upgrade All Packages [Deprecated in favor of calling upgrade with no parameters]</summary>
<function>doUpgradeAll</function>
<shortcut>ua</shortcut>
<options>
<channel>
<shortopt>c</shortopt>
<doc>upgrade packages from a specific channel</doc>
<arg>CHAN</arg>
</channel>
<nodeps>
<shortopt>n</shortopt>
<doc>ignore dependencies, upgrade anyway</doc>
</nodeps>
<register-only>
<shortopt>r</shortopt>
<doc>do not install files, only register the package as upgraded</doc>
</register-only>
<nobuild>
<shortopt>B</shortopt>
<doc>don&#039;t build C extensions</doc>
</nobuild>
<nocompress>
<shortopt>Z</shortopt>
<doc>request uncompressed files when downloading</doc>
</nocompress>
<installroot>
<shortopt>R</shortopt>
<doc>root directory used when installing files (ala PHP&#039;s INSTALL_ROOT), use packagingroot for RPM</doc>
<arg>DIR</arg>
</installroot>
<ignore-errors>
<shortopt></shortopt>
<doc>force install even if there were errors</doc>
</ignore-errors>
<loose>
<shortopt></shortopt>
<doc>do not check for recommended dependency version</doc>
</loose>
</options>
<doc>
WARNING: This function is deprecated in favor of using the upgrade command with no params
Upgrades all packages that have a newer release available. Upgrades are
done only if there is a release available of the state specified in
&quot;preferred_state&quot; (currently {config preferred_state}), or a state considered
more stable.
</doc>
</upgrade-all>
<uninstall>
<summary>Un-install Package</summary>
<function>doUninstall</function>
<shortcut>un</shortcut>
<options>
<nodeps>
<shortopt>n</shortopt>
<doc>ignore dependencies, uninstall anyway</doc>
</nodeps>
<register-only>
<shortopt>r</shortopt>
<doc>do not remove files, only register the packages as not installed</doc>
</register-only>
<installroot>
<shortopt>R</shortopt>
<doc>root directory used when installing files (ala PHP&#039;s INSTALL_ROOT)</doc>
<arg>DIR</arg>
</installroot>
<ignore-errors>
<shortopt></shortopt>
<doc>force install even if there were errors</doc>
</ignore-errors>
<offline>
<shortopt>O</shortopt>
<doc>do not attempt to uninstall remotely</doc>
</offline>
</options>
<doc>[channel/]&lt;package&gt; ...
Uninstalls one or more PEAR packages. More than one package may be
specified at once. Prefix with channel name to uninstall from a
channel not in your default channel ({config default_channel})
</doc>
</uninstall>
<bundle>
<summary>Unpacks a Pecl Package</summary>
<function>doBundle</function>
<shortcut>bun</shortcut>
<options>
<destination>
<shortopt>d</shortopt>
<doc>Optional destination directory for unpacking (defaults to current path or &quot;ext&quot; if exists)</doc>
<arg>DIR</arg>
</destination>
<force>
<shortopt>f</shortopt>
<doc>Force the unpacking even if there were errors in the package</doc>
</force>
</options>
<doc>&lt;package&gt;
Unpacks a Pecl Package into the selected location. It will download the
package if needed.
</doc>
</bundle>
<run-scripts>
<summary>Run Post-Install Scripts bundled with a package</summary>
<function>doRunScripts</function>
<shortcut>rs</shortcut>
<options />
<doc>&lt;package&gt;
Run post-installation scripts in package &lt;package&gt;, if any exist.
</doc>
</run-scripts>
</commands>

View File

@ -1,53 +1,58 @@
<?php <?php
// /**
// +----------------------------------------------------------------------+ * PEAR_Command_Mirror (download-all command)
// | PHP Version 5 | *
// +----------------------------------------------------------------------+ * PHP versions 4 and 5
// | Copyright (c) 1997-2004 The PHP Group | *
// +----------------------------------------------------------------------+ * @category pear
// | This source file is subject to version 3.0 of the PHP license, | * @package PEAR
// | that is bundled with this package in the file LICENSE, and is | * @author Alexander Merz <alexmerz@php.net>
// | available through the world-wide-web at the following url: | * @copyright 1997-2009 The Authors
// | http://www.php.net/license/3_0.txt. | * @license http://opensource.org/licenses/bsd-license.php New BSD License
// | If you did not receive a copy of the PHP license and are unable to | * @version CVS: $Id: Mirror.php 313023 2011-07-06 19:17:11Z dufuz $
// | obtain it through the world-wide-web, please send a note to | * @link http://pear.php.net/package/PEAR
// | license@php.net so we can mail you a copy immediately. | * @since File available since Release 1.2.0
// +----------------------------------------------------------------------+ */
// | Author: Alexander Merz <alexmerz@php.net> |
// | |
// +----------------------------------------------------------------------+
//
// $Id: Mirror.php,v 1.5 2004/03/18 12:23:57 mj Exp $
require_once "PEAR/Command/Common.php"; /**
require_once "PEAR/Command.php"; * base class
require_once "PEAR/Remote.php"; */
require_once "PEAR.php"; require_once 'PEAR/Command/Common.php';
/** /**
* PEAR commands for providing file mirrors * PEAR commands for providing file mirrors
* *
* @category pear
* @package PEAR
* @author Alexander Merz <alexmerz@php.net>
* @copyright 1997-2009 The Authors
* @license http://opensource.org/licenses/bsd-license.php New BSD License
* @version Release: 1.9.4
* @link http://pear.php.net/package/PEAR
* @since Class available since Release 1.2.0
*/ */
class PEAR_Command_Mirror extends PEAR_Command_Common class PEAR_Command_Mirror extends PEAR_Command_Common
{ {
// {{{ properties
var $commands = array( var $commands = array(
'download-all' => array( 'download-all' => array(
'summary' => 'Downloads each available package from master_server', 'summary' => 'Downloads each available package from the default channel',
'function' => 'doDownloadAll', 'function' => 'doDownloadAll',
'shortcut' => 'da', 'shortcut' => 'da',
'options' => array(), 'options' => array(
'channel' =>
array(
'shortopt' => 'c',
'doc' => 'specify a channel other than the default channel',
'arg' => 'CHAN',
),
),
'doc' => ' 'doc' => '
Requests a list of available packages from the package server Requests a list of available packages from the default channel ({config default_channel})
(master_server) and downloads them to current working directory' and downloads them to current working directory. Note: only
packages within preferred_state ({config preferred_state}) will be downloaded'
), ),
); );
// }}}
// {{{ constructor
/** /**
* PEAR_Command_Mirror constructor. * PEAR_Command_Mirror constructor.
* *
@ -60,9 +65,15 @@ class PEAR_Command_Mirror extends PEAR_Command_Common
parent::PEAR_Command_Common($ui, $config); parent::PEAR_Command_Common($ui, $config);
} }
// }}} /**
* For unit-testing
*/
function &factory($a)
{
$a = &PEAR_Command::factory($a, $this->config);
return $a;
}
// {{{ doDownloadAll()
/** /**
* retrieves a list of avaible Packages from master server * retrieves a list of avaible Packages from master server
* and downloads them * and downloads them
@ -76,26 +87,53 @@ class PEAR_Command_Mirror extends PEAR_Command_Common
*/ */
function doDownloadAll($command, $options, $params) function doDownloadAll($command, $options, $params)
{ {
$this->config->set("php_dir", "."); $savechannel = $this->config->get('default_channel');
$remote = &new PEAR_Remote($this->config); $reg = &$this->config->getRegistry();
$remoteInfo = $remote->call("package.listAll"); $channel = isset($options['channel']) ? $options['channel'] :
$this->config->get('default_channel');
if (!$reg->channelExists($channel)) {
$this->config->set('default_channel', $savechannel);
return $this->raiseError('Channel "' . $channel . '" does not exist');
}
$this->config->set('default_channel', $channel);
$this->ui->outputData('Using Channel ' . $this->config->get('default_channel'));
$chan = $reg->getChannel($channel);
if (PEAR::isError($chan)) {
return $this->raiseError($chan);
}
if ($chan->supportsREST($this->config->get('preferred_mirror')) &&
$base = $chan->getBaseURL('REST1.0', $this->config->get('preferred_mirror'))) {
$rest = &$this->config->getREST('1.0', array());
$remoteInfo = array_flip($rest->listPackages($base, $channel));
}
if (PEAR::isError($remoteInfo)) { if (PEAR::isError($remoteInfo)) {
return $remoteInfo; return $remoteInfo;
} }
$cmd = &PEAR_Command::factory("download", $this->config);
$cmd = &$this->factory("download");
if (PEAR::isError($cmd)) { if (PEAR::isError($cmd)) {
return $cmd; return $cmd;
} }
foreach ($remoteInfo as $pkgn => $pkg) {
/** $this->ui->outputData('Using Preferred State of ' .
* Error handling not neccesary, because already done by $this->config->get('preferred_state'));
* the download command $this->ui->outputData('Gathering release information, please wait...');
*/
$cmd->run("download", array(), array($pkgn)); /**
* Error handling not necessary, because already done by
* the download command
*/
PEAR::staticPushErrorHandling(PEAR_ERROR_RETURN);
$err = $cmd->run('download', array('downloadonly' => true), array_keys($remoteInfo));
PEAR::staticPopErrorHandling();
$this->config->set('default_channel', $savechannel);
if (PEAR::isError($err)) {
$this->ui->outputData($err->getMessage());
} }
return true; return true;
} }
// }}}
} }

18
3rdparty/PEAR/Command/Mirror.xml vendored Normal file
View File

@ -0,0 +1,18 @@
<commands version="1.0">
<download-all>
<summary>Downloads each available package from the default channel</summary>
<function>doDownloadAll</function>
<shortcut>da</shortcut>
<options>
<channel>
<shortopt>c</shortopt>
<doc>specify a channel other than the default channel</doc>
<arg>CHAN</arg>
</channel>
</options>
<doc>
Requests a list of available packages from the default channel ({config default_channel})
and downloads them to current working directory. Note: only
packages within preferred_state ({config preferred_state}) will be downloaded</doc>
</download-all>
</commands>

File diff suppressed because it is too large Load Diff

237
3rdparty/PEAR/Command/Package.xml vendored Normal file
View File

@ -0,0 +1,237 @@
<commands version="1.0">
<package>
<summary>Build Package</summary>
<function>doPackage</function>
<shortcut>p</shortcut>
<options>
<nocompress>
<shortopt>Z</shortopt>
<doc>Do not gzip the package file</doc>
</nocompress>
<showname>
<shortopt>n</shortopt>
<doc>Print the name of the packaged file.</doc>
</showname>
</options>
<doc>[descfile] [descfile2]
Creates a PEAR package from its description file (usually called
package.xml). If a second packagefile is passed in, then
the packager will check to make sure that one is a package.xml
version 1.0, and the other is a package.xml version 2.0. The
package.xml version 1.0 will be saved as &quot;package.xml&quot; in the archive,
and the other as &quot;package2.xml&quot; in the archive&quot;
</doc>
</package>
<package-validate>
<summary>Validate Package Consistency</summary>
<function>doPackageValidate</function>
<shortcut>pv</shortcut>
<options />
<doc>
</doc>
</package-validate>
<cvsdiff>
<summary>Run a &quot;cvs diff&quot; for all files in a package</summary>
<function>doCvsDiff</function>
<shortcut>cd</shortcut>
<options>
<quiet>
<shortopt>q</shortopt>
<doc>Be quiet</doc>
</quiet>
<reallyquiet>
<shortopt>Q</shortopt>
<doc>Be really quiet</doc>
</reallyquiet>
<date>
<shortopt>D</shortopt>
<doc>Diff against revision of DATE</doc>
<arg>DATE</arg>
</date>
<release>
<shortopt>R</shortopt>
<doc>Diff against tag for package release REL</doc>
<arg>REL</arg>
</release>
<revision>
<shortopt>r</shortopt>
<doc>Diff against revision REV</doc>
<arg>REV</arg>
</revision>
<context>
<shortopt>c</shortopt>
<doc>Generate context diff</doc>
</context>
<unified>
<shortopt>u</shortopt>
<doc>Generate unified diff</doc>
</unified>
<ignore-case>
<shortopt>i</shortopt>
<doc>Ignore case, consider upper- and lower-case letters equivalent</doc>
</ignore-case>
<ignore-whitespace>
<shortopt>b</shortopt>
<doc>Ignore changes in amount of white space</doc>
</ignore-whitespace>
<ignore-blank-lines>
<shortopt>B</shortopt>
<doc>Ignore changes that insert or delete blank lines</doc>
</ignore-blank-lines>
<brief>
<shortopt></shortopt>
<doc>Report only whether the files differ, no details</doc>
</brief>
<dry-run>
<shortopt>n</shortopt>
<doc>Don&#039;t do anything, just pretend</doc>
</dry-run>
</options>
<doc>&lt;package.xml&gt;
Compares all the files in a package. Without any options, this
command will compare the current code with the last checked-in code.
Using the -r or -R option you may compare the current code with that
of a specific release.
</doc>
</cvsdiff>
<svntag>
<summary>Set SVN Release Tag</summary>
<function>doSvnTag</function>
<shortcut>sv</shortcut>
<options>
<quiet>
<shortopt>q</shortopt>
<doc>Be quiet</doc>
</quiet>
<slide>
<shortopt>F</shortopt>
<doc>Move (slide) tag if it exists</doc>
</slide>
<delete>
<shortopt>d</shortopt>
<doc>Remove tag</doc>
</delete>
<dry-run>
<shortopt>n</shortopt>
<doc>Don&#039;t do anything, just pretend</doc>
</dry-run>
</options>
<doc>&lt;package.xml&gt; [files...]
Sets a SVN tag on all files in a package. Use this command after you have
packaged a distribution tarball with the &quot;package&quot; command to tag what
revisions of what files were in that release. If need to fix something
after running svntag once, but before the tarball is released to the public,
use the &quot;slide&quot; option to move the release tag.
to include files (such as a second package.xml, or tests not included in the
release), pass them as additional parameters.
</doc>
</svntag>
<cvstag>
<summary>Set CVS Release Tag</summary>
<function>doCvsTag</function>
<shortcut>ct</shortcut>
<options>
<quiet>
<shortopt>q</shortopt>
<doc>Be quiet</doc>
</quiet>
<reallyquiet>
<shortopt>Q</shortopt>
<doc>Be really quiet</doc>
</reallyquiet>
<slide>
<shortopt>F</shortopt>
<doc>Move (slide) tag if it exists</doc>
</slide>
<delete>
<shortopt>d</shortopt>
<doc>Remove tag</doc>
</delete>
<dry-run>
<shortopt>n</shortopt>
<doc>Don&#039;t do anything, just pretend</doc>
</dry-run>
</options>
<doc>&lt;package.xml&gt; [files...]
Sets a CVS tag on all files in a package. Use this command after you have
packaged a distribution tarball with the &quot;package&quot; command to tag what
revisions of what files were in that release. If need to fix something
after running cvstag once, but before the tarball is released to the public,
use the &quot;slide&quot; option to move the release tag.
to include files (such as a second package.xml, or tests not included in the
release), pass them as additional parameters.
</doc>
</cvstag>
<package-dependencies>
<summary>Show package dependencies</summary>
<function>doPackageDependencies</function>
<shortcut>pd</shortcut>
<options />
<doc>&lt;package-file&gt; or &lt;package.xml&gt; or &lt;install-package-name&gt;
List all dependencies the package has.
Can take a tgz / tar file, package.xml or a package name of an installed package.</doc>
</package-dependencies>
<sign>
<summary>Sign a package distribution file</summary>
<function>doSign</function>
<shortcut>si</shortcut>
<options>
<verbose>
<shortopt>v</shortopt>
<doc>Display GnuPG output</doc>
</verbose>
</options>
<doc>&lt;package-file&gt;
Signs a package distribution (.tar or .tgz) file with GnuPG.</doc>
</sign>
<makerpm>
<summary>Builds an RPM spec file from a PEAR package</summary>
<function>doMakeRPM</function>
<shortcut>rpm</shortcut>
<options>
<spec-template>
<shortopt>t</shortopt>
<doc>Use FILE as RPM spec file template</doc>
<arg>FILE</arg>
</spec-template>
<rpm-pkgname>
<shortopt>p</shortopt>
<doc>Use FORMAT as format string for RPM package name, %s is replaced
by the PEAR package name, defaults to &quot;PEAR::%s&quot;.</doc>
<arg>FORMAT</arg>
</rpm-pkgname>
</options>
<doc>&lt;package-file&gt;
Creates an RPM .spec file for wrapping a PEAR package inside an RPM
package. Intended to be used from the SPECS directory, with the PEAR
package tarball in the SOURCES directory:
$ pear makerpm ../SOURCES/Net_Socket-1.0.tgz
Wrote RPM spec file PEAR::Net_Geo-1.0.spec
$ rpm -bb PEAR::Net_Socket-1.0.spec
...
Wrote: /usr/src/redhat/RPMS/i386/PEAR::Net_Socket-1.0-1.i386.rpm
</doc>
</makerpm>
<convert>
<summary>Convert a package.xml 1.0 to package.xml 2.0 format</summary>
<function>doConvert</function>
<shortcut>c2</shortcut>
<options>
<flat>
<shortopt>f</shortopt>
<doc>do not beautify the filelist.</doc>
</flat>
</options>
<doc>[descfile] [descfile2]
Converts a package.xml in 1.0 format into a package.xml
in 2.0 format. The new file will be named package2.xml by default,
and package.xml will be used as the old file by default.
This is not the most intelligent conversion, and should only be
used for automated conversion or learning the format.
</doc>
</convert>
</commands>

421
3rdparty/PEAR/Command/Pickle.php vendored Normal file
View File

@ -0,0 +1,421 @@
<?php
/**
* PEAR_Command_Pickle (pickle command)
*
* PHP versions 4 and 5
*
* @category pear
* @package PEAR
* @author Greg Beaver <cellog@php.net>
* @copyright 2005-2009 The Authors
* @license http://opensource.org/licenses/bsd-license.php New BSD License
* @version CVS: $Id: Pickle.php 313023 2011-07-06 19:17:11Z dufuz $
* @link http://pear.php.net/package/PEAR
* @since File available since Release 1.4.1
*/
/**
* base class
*/
require_once 'PEAR/Command/Common.php';
/**
* PEAR commands for login/logout
*
* @category pear
* @package PEAR
* @author Greg Beaver <cellog@php.net>
* @copyright 2005-2009 The Authors
* @license http://opensource.org/licenses/bsd-license.php New BSD License
* @version Release: 1.9.4
* @link http://pear.php.net/package/PEAR
* @since Class available since Release 1.4.1
*/
class PEAR_Command_Pickle extends PEAR_Command_Common
{
var $commands = array(
'pickle' => array(
'summary' => 'Build PECL Package',
'function' => 'doPackage',
'shortcut' => 'pi',
'options' => array(
'nocompress' => array(
'shortopt' => 'Z',
'doc' => 'Do not gzip the package file'
),
'showname' => array(
'shortopt' => 'n',
'doc' => 'Print the name of the packaged file.',
),
),
'doc' => '[descfile]
Creates a PECL package from its package2.xml file.
An automatic conversion will be made to a package.xml 1.0 and written out to
disk in the current directory as "package.xml". Note that
only simple package.xml 2.0 will be converted. package.xml 2.0 with:
- dependency types other than required/optional PECL package/ext/php/pearinstaller
- more than one extsrcrelease or zendextsrcrelease
- zendextbinrelease, extbinrelease, phprelease, or bundle release type
- dependency groups
- ignore tags in release filelist
- tasks other than replace
- custom roles
will cause pickle to fail, and output an error message. If your package2.xml
uses any of these features, you are best off using PEAR_PackageFileManager to
generate both package.xml.
'
),
);
/**
* PEAR_Command_Package constructor.
*
* @access public
*/
function PEAR_Command_Pickle(&$ui, &$config)
{
parent::PEAR_Command_Common($ui, $config);
}
/**
* For unit-testing ease
*
* @return PEAR_Packager
*/
function &getPackager()
{
if (!class_exists('PEAR_Packager')) {
require_once 'PEAR/Packager.php';
}
$a = &new PEAR_Packager;
return $a;
}
/**
* For unit-testing ease
*
* @param PEAR_Config $config
* @param bool $debug
* @param string|null $tmpdir
* @return PEAR_PackageFile
*/
function &getPackageFile($config, $debug = false)
{
if (!class_exists('PEAR_Common')) {
require_once 'PEAR/Common.php';
}
if (!class_exists('PEAR_PackageFile')) {
require_once 'PEAR/PackageFile.php';
}
$a = &new PEAR_PackageFile($config, $debug);
$common = new PEAR_Common;
$common->ui = $this->ui;
$a->setLogger($common);
return $a;
}
function doPackage($command, $options, $params)
{
$this->output = '';
$pkginfofile = isset($params[0]) ? $params[0] : 'package2.xml';
$packager = &$this->getPackager();
if (PEAR::isError($err = $this->_convertPackage($pkginfofile))) {
return $err;
}
$compress = empty($options['nocompress']) ? true : false;
$result = $packager->package($pkginfofile, $compress, 'package.xml');
if (PEAR::isError($result)) {
return $this->raiseError($result);
}
// Don't want output, only the package file name just created
if (isset($options['showname'])) {
$this->ui->outputData($result, $command);
}
return true;
}
function _convertPackage($packagexml)
{
$pkg = &$this->getPackageFile($this->config);
$pf2 = &$pkg->fromPackageFile($packagexml, PEAR_VALIDATE_NORMAL);
if (!is_a($pf2, 'PEAR_PackageFile_v2')) {
return $this->raiseError('Cannot process "' .
$packagexml . '", is not a package.xml 2.0');
}
require_once 'PEAR/PackageFile/v1.php';
$pf = new PEAR_PackageFile_v1;
$pf->setConfig($this->config);
if ($pf2->getPackageType() != 'extsrc' && $pf2->getPackageType() != 'zendextsrc') {
return $this->raiseError('Cannot safely convert "' . $packagexml .
'", is not an extension source package. Using a PEAR_PackageFileManager-based ' .
'script is an option');
}
if (is_array($pf2->getUsesRole())) {
return $this->raiseError('Cannot safely convert "' . $packagexml .
'", contains custom roles. Using a PEAR_PackageFileManager-based script or ' .
'the convert command is an option');
}
if (is_array($pf2->getUsesTask())) {
return $this->raiseError('Cannot safely convert "' . $packagexml .
'", contains custom tasks. Using a PEAR_PackageFileManager-based script or ' .
'the convert command is an option');
}
$deps = $pf2->getDependencies();
if (isset($deps['group'])) {
return $this->raiseError('Cannot safely convert "' . $packagexml .
'", contains dependency groups. Using a PEAR_PackageFileManager-based script ' .
'or the convert command is an option');
}
if (isset($deps['required']['subpackage']) ||
isset($deps['optional']['subpackage'])) {
return $this->raiseError('Cannot safely convert "' . $packagexml .
'", contains subpackage dependencies. Using a PEAR_PackageFileManager-based '.
'script is an option');
}
if (isset($deps['required']['os'])) {
return $this->raiseError('Cannot safely convert "' . $packagexml .
'", contains os dependencies. Using a PEAR_PackageFileManager-based '.
'script is an option');
}
if (isset($deps['required']['arch'])) {
return $this->raiseError('Cannot safely convert "' . $packagexml .
'", contains arch dependencies. Using a PEAR_PackageFileManager-based '.
'script is an option');
}
$pf->setPackage($pf2->getPackage());
$pf->setSummary($pf2->getSummary());
$pf->setDescription($pf2->getDescription());
foreach ($pf2->getMaintainers() as $maintainer) {
$pf->addMaintainer($maintainer['role'], $maintainer['handle'],
$maintainer['name'], $maintainer['email']);
}
$pf->setVersion($pf2->getVersion());
$pf->setDate($pf2->getDate());
$pf->setLicense($pf2->getLicense());
$pf->setState($pf2->getState());
$pf->setNotes($pf2->getNotes());
$pf->addPhpDep($deps['required']['php']['min'], 'ge');
if (isset($deps['required']['php']['max'])) {
$pf->addPhpDep($deps['required']['php']['max'], 'le');
}
if (isset($deps['required']['package'])) {
if (!isset($deps['required']['package'][0])) {
$deps['required']['package'] = array($deps['required']['package']);
}
foreach ($deps['required']['package'] as $dep) {
if (!isset($dep['channel'])) {
return $this->raiseError('Cannot safely convert "' . $packagexml . '"' .
' contains uri-based dependency on a package. Using a ' .
'PEAR_PackageFileManager-based script is an option');
}
if ($dep['channel'] != 'pear.php.net'
&& $dep['channel'] != 'pecl.php.net'
&& $dep['channel'] != 'doc.php.net') {
return $this->raiseError('Cannot safely convert "' . $packagexml . '"' .
' contains dependency on a non-standard channel package. Using a ' .
'PEAR_PackageFileManager-based script is an option');
}
if (isset($dep['conflicts'])) {
return $this->raiseError('Cannot safely convert "' . $packagexml . '"' .
' contains conflicts dependency. Using a ' .
'PEAR_PackageFileManager-based script is an option');
}
if (isset($dep['exclude'])) {
$this->ui->outputData('WARNING: exclude tags are ignored in conversion');
}
if (isset($dep['min'])) {
$pf->addPackageDep($dep['name'], $dep['min'], 'ge');
}
if (isset($dep['max'])) {
$pf->addPackageDep($dep['name'], $dep['max'], 'le');
}
}
}
if (isset($deps['required']['extension'])) {
if (!isset($deps['required']['extension'][0])) {
$deps['required']['extension'] = array($deps['required']['extension']);
}
foreach ($deps['required']['extension'] as $dep) {
if (isset($dep['conflicts'])) {
return $this->raiseError('Cannot safely convert "' . $packagexml . '"' .
' contains conflicts dependency. Using a ' .
'PEAR_PackageFileManager-based script is an option');
}
if (isset($dep['exclude'])) {
$this->ui->outputData('WARNING: exclude tags are ignored in conversion');
}
if (isset($dep['min'])) {
$pf->addExtensionDep($dep['name'], $dep['min'], 'ge');
}
if (isset($dep['max'])) {
$pf->addExtensionDep($dep['name'], $dep['max'], 'le');
}
}
}
if (isset($deps['optional']['package'])) {
if (!isset($deps['optional']['package'][0])) {
$deps['optional']['package'] = array($deps['optional']['package']);
}
foreach ($deps['optional']['package'] as $dep) {
if (!isset($dep['channel'])) {
return $this->raiseError('Cannot safely convert "' . $packagexml . '"' .
' contains uri-based dependency on a package. Using a ' .
'PEAR_PackageFileManager-based script is an option');
}
if ($dep['channel'] != 'pear.php.net'
&& $dep['channel'] != 'pecl.php.net'
&& $dep['channel'] != 'doc.php.net') {
return $this->raiseError('Cannot safely convert "' . $packagexml . '"' .
' contains dependency on a non-standard channel package. Using a ' .
'PEAR_PackageFileManager-based script is an option');
}
if (isset($dep['exclude'])) {
$this->ui->outputData('WARNING: exclude tags are ignored in conversion');
}
if (isset($dep['min'])) {
$pf->addPackageDep($dep['name'], $dep['min'], 'ge', 'yes');
}
if (isset($dep['max'])) {
$pf->addPackageDep($dep['name'], $dep['max'], 'le', 'yes');
}
}
}
if (isset($deps['optional']['extension'])) {
if (!isset($deps['optional']['extension'][0])) {
$deps['optional']['extension'] = array($deps['optional']['extension']);
}
foreach ($deps['optional']['extension'] as $dep) {
if (isset($dep['exclude'])) {
$this->ui->outputData('WARNING: exclude tags are ignored in conversion');
}
if (isset($dep['min'])) {
$pf->addExtensionDep($dep['name'], $dep['min'], 'ge', 'yes');
}
if (isset($dep['max'])) {
$pf->addExtensionDep($dep['name'], $dep['max'], 'le', 'yes');
}
}
}
$contents = $pf2->getContents();
$release = $pf2->getReleases();
if (isset($releases[0])) {
return $this->raiseError('Cannot safely process "' . $packagexml . '" contains '
. 'multiple extsrcrelease/zendextsrcrelease tags. Using a PEAR_PackageFileManager-based script ' .
'or the convert command is an option');
}
if ($configoptions = $pf2->getConfigureOptions()) {
foreach ($configoptions as $option) {
$default = isset($option['default']) ? $option['default'] : false;
$pf->addConfigureOption($option['name'], $option['prompt'], $default);
}
}
if (isset($release['filelist']['ignore'])) {
return $this->raiseError('Cannot safely process "' . $packagexml . '" contains '
. 'ignore tags. Using a PEAR_PackageFileManager-based script or the convert' .
' command is an option');
}
if (isset($release['filelist']['install']) &&
!isset($release['filelist']['install'][0])) {
$release['filelist']['install'] = array($release['filelist']['install']);
}
if (isset($contents['dir']['attribs']['baseinstalldir'])) {
$baseinstalldir = $contents['dir']['attribs']['baseinstalldir'];
} else {
$baseinstalldir = false;
}
if (!isset($contents['dir']['file'][0])) {
$contents['dir']['file'] = array($contents['dir']['file']);
}
foreach ($contents['dir']['file'] as $file) {
if ($baseinstalldir && !isset($file['attribs']['baseinstalldir'])) {
$file['attribs']['baseinstalldir'] = $baseinstalldir;
}
$processFile = $file;
unset($processFile['attribs']);
if (count($processFile)) {
foreach ($processFile as $name => $task) {
if ($name != $pf2->getTasksNs() . ':replace') {
return $this->raiseError('Cannot safely process "' . $packagexml .
'" contains tasks other than replace. Using a ' .
'PEAR_PackageFileManager-based script is an option.');
}
$file['attribs']['replace'][] = $task;
}
}
if (!in_array($file['attribs']['role'], PEAR_Common::getFileRoles())) {
return $this->raiseError('Cannot safely convert "' . $packagexml .
'", contains custom roles. Using a PEAR_PackageFileManager-based script ' .
'or the convert command is an option');
}
if (isset($release['filelist']['install'])) {
foreach ($release['filelist']['install'] as $installas) {
if ($installas['attribs']['name'] == $file['attribs']['name']) {
$file['attribs']['install-as'] = $installas['attribs']['as'];
}
}
}
$pf->addFile('/', $file['attribs']['name'], $file['attribs']);
}
if ($pf2->getChangeLog()) {
$this->ui->outputData('WARNING: changelog is not translated to package.xml ' .
'1.0, use PEAR_PackageFileManager-based script if you need changelog-' .
'translation for package.xml 1.0');
}
$gen = &$pf->getDefaultGenerator();
$gen->toPackageFile('.');
}
}

36
3rdparty/PEAR/Command/Pickle.xml vendored Normal file
View File

@ -0,0 +1,36 @@
<commands version="1.0">
<pickle>
<summary>Build PECL Package</summary>
<function>doPackage</function>
<shortcut>pi</shortcut>
<options>
<nocompress>
<shortopt>Z</shortopt>
<doc>Do not gzip the package file</doc>
</nocompress>
<showname>
<shortopt>n</shortopt>
<doc>Print the name of the packaged file.</doc>
</showname>
</options>
<doc>[descfile]
Creates a PECL package from its package2.xml file.
An automatic conversion will be made to a package.xml 1.0 and written out to
disk in the current directory as &quot;package.xml&quot;. Note that
only simple package.xml 2.0 will be converted. package.xml 2.0 with:
- dependency types other than required/optional PECL package/ext/php/pearinstaller
- more than one extsrcrelease or zendextsrcrelease
- zendextbinrelease, extbinrelease, phprelease, or bundle release type
- dependency groups
- ignore tags in release filelist
- tasks other than replace
- custom roles
will cause pickle to fail, and output an error message. If your package2.xml
uses any of these features, you are best off using PEAR_PackageFileManager to
generate both package.xml.
</doc>
</pickle>
</commands>

File diff suppressed because it is too large Load Diff

58
3rdparty/PEAR/Command/Registry.xml vendored Normal file
View File

@ -0,0 +1,58 @@
<commands version="1.0">
<list>
<summary>List Installed Packages In The Default Channel</summary>
<function>doList</function>
<shortcut>l</shortcut>
<options>
<channel>
<shortopt>c</shortopt>
<doc>list installed packages from this channel</doc>
<arg>CHAN</arg>
</channel>
<allchannels>
<shortopt>a</shortopt>
<doc>list installed packages from all channels</doc>
</allchannels>
<channelinfo>
<shortopt>i</shortopt>
<doc>output fully channel-aware data, even on failure</doc>
</channelinfo>
</options>
<doc>&lt;package&gt;
If invoked without parameters, this command lists the PEAR packages
installed in your php_dir ({config php_dir}). With a parameter, it
lists the files in a package.
</doc>
</list>
<list-files>
<summary>List Files In Installed Package</summary>
<function>doFileList</function>
<shortcut>fl</shortcut>
<options />
<doc>&lt;package&gt;
List the files in an installed package.
</doc>
</list-files>
<shell-test>
<summary>Shell Script Test</summary>
<function>doShellTest</function>
<shortcut>st</shortcut>
<options />
<doc>&lt;package&gt; [[relation] version]
Tests if a package is installed in the system. Will exit(1) if it is not.
&lt;relation&gt; The version comparison operator. One of:
&lt;, lt, &lt;=, le, &gt;, gt, &gt;=, ge, ==, =, eq, !=, &lt;&gt;, ne
&lt;version&gt; The version to compare with
</doc>
</shell-test>
<info>
<summary>Display information about a package</summary>
<function>doInfo</function>
<shortcut>in</shortcut>
<options />
<doc>&lt;package&gt;
Displays information about a package. The package argument may be a
local package file, an URL to a package file, or the name of an
installed package.</doc>
</info>
</commands>

View File

@ -1,33 +1,42 @@
<?php <?php
// /* vim: set expandtab tabstop=4 shiftwidth=4: */ /**
// +----------------------------------------------------------------------+ * PEAR_Command_Remote (remote-info, list-upgrades, remote-list, search, list-all, download,
// | PHP Version 5 | * clear-cache commands)
// +----------------------------------------------------------------------+ *
// | Copyright (c) 1997-2004 The PHP Group | * PHP versions 4 and 5
// +----------------------------------------------------------------------+ *
// | This source file is subject to version 3.0 of the PHP license, | * @category pear
// | that is bundled with this package in the file LICENSE, and is | * @package PEAR
// | available through the world-wide-web at the following url: | * @author Stig Bakken <ssb@php.net>
// | http://www.php.net/license/3_0.txt. | * @author Greg Beaver <cellog@php.net>
// | If you did not receive a copy of the PHP license and are unable to | * @copyright 1997-2009 The Authors
// | obtain it through the world-wide-web, please send a note to | * @license http://opensource.org/licenses/bsd-license.php New BSD License
// | license@php.net so we can mail you a copy immediately. | * @version CVS: $Id: Remote.php 313023 2011-07-06 19:17:11Z dufuz $
// +----------------------------------------------------------------------+ * @link http://pear.php.net/package/PEAR
// | Author: Stig Bakken <ssb@php.net> | * @since File available since Release 0.1
// | | */
// +----------------------------------------------------------------------+
//
// $Id: Remote.php,v 1.39 2004/04/03 15:56:00 cellog Exp $
/**
* base class
*/
require_once 'PEAR/Command/Common.php'; require_once 'PEAR/Command/Common.php';
require_once 'PEAR/Common.php'; require_once 'PEAR/REST.php';
require_once 'PEAR/Remote.php';
require_once 'PEAR/Registry.php';
/**
* PEAR commands for remote server querying
*
* @category pear
* @package PEAR
* @author Stig Bakken <ssb@php.net>
* @author Greg Beaver <cellog@php.net>
* @copyright 1997-2009 The Authors
* @license http://opensource.org/licenses/bsd-license.php New BSD License
* @version Release: 1.9.4
* @link http://pear.php.net/package/PEAR
* @since Class available since Release 0.1
*/
class PEAR_Command_Remote extends PEAR_Command_Common class PEAR_Command_Remote extends PEAR_Command_Common
{ {
// {{{ command definitions
var $commands = array( var $commands = array(
'remote-info' => array( 'remote-info' => array(
'summary' => 'Information About Remote Packages', 'summary' => 'Information About Remote Packages',
@ -41,16 +50,29 @@ Get details on a package from the server.',
'summary' => 'List Available Upgrades', 'summary' => 'List Available Upgrades',
'function' => 'doListUpgrades', 'function' => 'doListUpgrades',
'shortcut' => 'lu', 'shortcut' => 'lu',
'options' => array(), 'options' => array(
'doc' => ' 'channelinfo' => array(
'shortopt' => 'i',
'doc' => 'output fully channel-aware data, even on failure',
),
),
'doc' => '[preferred_state]
List releases on the server of packages you have installed where List releases on the server of packages you have installed where
a newer version is available with the same release state (stable etc.).' a newer version is available with the same release state (stable etc.)
or the state passed as the second parameter.'
), ),
'remote-list' => array( 'remote-list' => array(
'summary' => 'List Remote Packages', 'summary' => 'List Remote Packages',
'function' => 'doRemoteList', 'function' => 'doRemoteList',
'shortcut' => 'rl', 'shortcut' => 'rl',
'options' => array(), 'options' => array(
'channel' =>
array(
'shortopt' => 'c',
'doc' => 'specify a channel other than the default channel',
'arg' => 'CHAN',
)
),
'doc' => ' 'doc' => '
Lists the packages available on the configured server along with the Lists the packages available on the configured server along with the
latest stable release of each package.', latest stable release of each package.',
@ -59,16 +81,44 @@ latest stable release of each package.',
'summary' => 'Search remote package database', 'summary' => 'Search remote package database',
'function' => 'doSearch', 'function' => 'doSearch',
'shortcut' => 'sp', 'shortcut' => 'sp',
'options' => array(), 'options' => array(
'doc' => ' 'channel' =>
Lists all packages which match the search parameters (first param array(
is package name, second package info)', 'shortopt' => 'c',
'doc' => 'specify a channel other than the default channel',
'arg' => 'CHAN',
),
'allchannels' => array(
'shortopt' => 'a',
'doc' => 'search packages from all known channels',
),
'channelinfo' => array(
'shortopt' => 'i',
'doc' => 'output fully channel-aware data, even on failure',
),
),
'doc' => '[packagename] [packageinfo]
Lists all packages which match the search parameters. The first
parameter is a fragment of a packagename. The default channel
will be used unless explicitly overridden. The second parameter
will be used to match any portion of the summary/description',
), ),
'list-all' => array( 'list-all' => array(
'summary' => 'List All Packages', 'summary' => 'List All Packages',
'function' => 'doListAll', 'function' => 'doListAll',
'shortcut' => 'la', 'shortcut' => 'la',
'options' => array(), 'options' => array(
'channel' =>
array(
'shortopt' => 'c',
'doc' => 'specify a channel other than the default channel',
'arg' => 'CHAN',
),
'channelinfo' => array(
'shortopt' => 'i',
'doc' => 'output fully channel-aware data, even on failure',
),
),
'doc' => ' 'doc' => '
Lists the packages available on the configured server along with the Lists the packages available on the configured server along with the
latest stable release of each package.', latest stable release of each package.',
@ -83,26 +133,23 @@ latest stable release of each package.',
'doc' => 'download an uncompressed (.tar) file', 'doc' => 'download an uncompressed (.tar) file',
), ),
), ),
'doc' => '{package|package-version} 'doc' => '<package>...
Download a package tarball. The file will be named as suggested by the Download package tarballs. The files will be named as suggested by the
server, for example if you download the DB package and the latest stable server, for example if you download the DB package and the latest stable
version of DB is 1.2, the downloaded file will be DB-1.2.tgz.', version of DB is 1.6.5, the downloaded file will be DB-1.6.5.tgz.',
), ),
'clear-cache' => array( 'clear-cache' => array(
'summary' => 'Clear XML-RPC Cache', 'summary' => 'Clear Web Services Cache',
'function' => 'doClearCache', 'function' => 'doClearCache',
'shortcut' => 'cc', 'shortcut' => 'cc',
'options' => array(), 'options' => array(),
'doc' => ' 'doc' => '
Clear the XML-RPC cache. See also the cache_ttl configuration Clear the REST cache. See also the cache_ttl configuration
parameter. parameter.
', ',
), ),
); );
// }}}
// {{{ constructor
/** /**
* PEAR_Command_Remote constructor. * PEAR_Command_Remote constructor.
* *
@ -113,98 +160,216 @@ parameter.
parent::PEAR_Command_Common($ui, $config); parent::PEAR_Command_Common($ui, $config);
} }
// }}} function _checkChannelForStatus($channel, $chan)
{
// {{{ doRemoteInfo() if (PEAR::isError($chan)) {
$this->raiseError($chan);
}
if (!is_a($chan, 'PEAR_ChannelFile')) {
return $this->raiseError('Internal corruption error: invalid channel "' .
$channel . '"');
}
$rest = new PEAR_REST($this->config);
PEAR::staticPushErrorHandling(PEAR_ERROR_RETURN);
$mirror = $this->config->get('preferred_mirror', null,
$channel);
$a = $rest->downloadHttp('http://' . $channel .
'/channel.xml', $chan->lastModified());
PEAR::staticPopErrorHandling();
if (!PEAR::isError($a) && $a) {
$this->ui->outputData('WARNING: channel "' . $channel . '" has ' .
'updated its protocols, use "' . PEAR_RUNTYPE . ' channel-update ' . $channel .
'" to update');
}
}
function doRemoteInfo($command, $options, $params) function doRemoteInfo($command, $options, $params)
{ {
if (sizeof($params) != 1) { if (sizeof($params) != 1) {
return $this->raiseError("$command expects one param: the remote package name"); return $this->raiseError("$command expects one param: the remote package name");
} }
$r = new PEAR_Remote($this->config); $savechannel = $channel = $this->config->get('default_channel');
$info = $r->call('package.info', $params[0]); $reg = &$this->config->getRegistry();
$package = $params[0];
$parsed = $reg->parsePackageName($package, $channel);
if (PEAR::isError($parsed)) {
return $this->raiseError('Invalid package name "' . $package . '"');
}
$channel = $parsed['channel'];
$this->config->set('default_channel', $channel);
$chan = $reg->getChannel($channel);
if (PEAR::isError($e = $this->_checkChannelForStatus($channel, $chan))) {
return $e;
}
$mirror = $this->config->get('preferred_mirror');
if ($chan->supportsREST($mirror) && $base = $chan->getBaseURL('REST1.0', $mirror)) {
$rest = &$this->config->getREST('1.0', array());
$info = $rest->packageInfo($base, $parsed['package'], $channel);
}
if (!isset($info)) {
return $this->raiseError('No supported protocol was found');
}
if (PEAR::isError($info)) { if (PEAR::isError($info)) {
$this->config->set('default_channel', $savechannel);
return $this->raiseError($info); return $this->raiseError($info);
} }
$reg = new PEAR_Registry($this->config->get('php_dir')); if (!isset($info['name'])) {
$installed = $reg->packageInfo($info['name']); return $this->raiseError('No remote package "' . $package . '" was found');
}
$installed = $reg->packageInfo($info['name'], null, $channel);
$info['installed'] = $installed['version'] ? $installed['version'] : '- no -'; $info['installed'] = $installed['version'] ? $installed['version'] : '- no -';
if (is_array($info['installed'])) {
$info['installed'] = $info['installed']['release'];
}
$this->ui->outputData($info, $command); $this->ui->outputData($info, $command);
$this->config->set('default_channel', $savechannel);
return true; return true;
} }
// }}}
// {{{ doRemoteList()
function doRemoteList($command, $options, $params) function doRemoteList($command, $options, $params)
{ {
$r = new PEAR_Remote($this->config); $savechannel = $channel = $this->config->get('default_channel');
$reg = &$this->config->getRegistry();
if (isset($options['channel'])) {
$channel = $options['channel'];
if (!$reg->channelExists($channel)) {
return $this->raiseError('Channel "' . $channel . '" does not exist');
}
$this->config->set('default_channel', $channel);
}
$chan = $reg->getChannel($channel);
if (PEAR::isError($e = $this->_checkChannelForStatus($channel, $chan))) {
return $e;
}
$list_options = false; $list_options = false;
if ($this->config->get('preferred_state') == 'stable') if ($this->config->get('preferred_state') == 'stable') {
$list_options = true; $list_options = true;
$available = $r->call('package.listAll', $list_options); }
$available = array();
if ($chan->supportsREST($this->config->get('preferred_mirror')) &&
$base = $chan->getBaseURL('REST1.1', $this->config->get('preferred_mirror'))
) {
// use faster list-all if available
$rest = &$this->config->getREST('1.1', array());
$available = $rest->listAll($base, $list_options, true, false, false, $chan->getName());
} elseif ($chan->supportsREST($this->config->get('preferred_mirror')) &&
$base = $chan->getBaseURL('REST1.0', $this->config->get('preferred_mirror'))) {
$rest = &$this->config->getREST('1.0', array());
$available = $rest->listAll($base, $list_options, true, false, false, $chan->getName());
}
if (PEAR::isError($available)) { if (PEAR::isError($available)) {
$this->config->set('default_channel', $savechannel);
return $this->raiseError($available); return $this->raiseError($available);
} }
$i = $j = 0; $i = $j = 0;
$data = array( $data = array(
'caption' => 'Available packages:', 'caption' => 'Channel ' . $channel . ' Available packages:',
'border' => true, 'border' => true,
'headline' => array('Package', 'Version'), 'headline' => array('Package', 'Version'),
'channel' => $channel
); );
foreach ($available as $name => $info) {
$data['data'][] = array($name, isset($info['stable']) ? $info['stable'] : '-n/a-'); if (count($available) == 0) {
} $data = '(no packages available yet)';
if (count($available)==0) { } else {
$data = '(no packages installed yet)'; foreach ($available as $name => $info) {
$version = (isset($info['stable']) && $info['stable']) ? $info['stable'] : '-n/a-';
$data['data'][] = array($name, $version);
}
} }
$this->ui->outputData($data, $command); $this->ui->outputData($data, $command);
$this->config->set('default_channel', $savechannel);
return true; return true;
} }
// }}}
// {{{ doListAll()
function doListAll($command, $options, $params) function doListAll($command, $options, $params)
{ {
$r = new PEAR_Remote($this->config); $savechannel = $channel = $this->config->get('default_channel');
$reg = new PEAR_Registry($this->config->get('php_dir')); $reg = &$this->config->getRegistry();
if (isset($options['channel'])) {
$channel = $options['channel'];
if (!$reg->channelExists($channel)) {
return $this->raiseError("Channel \"$channel\" does not exist");
}
$this->config->set('default_channel', $channel);
}
$list_options = false; $list_options = false;
if ($this->config->get('preferred_state') == 'stable') if ($this->config->get('preferred_state') == 'stable') {
$list_options = true; $list_options = true;
$available = $r->call('package.listAll', $list_options); }
$chan = $reg->getChannel($channel);
if (PEAR::isError($e = $this->_checkChannelForStatus($channel, $chan))) {
return $e;
}
if ($chan->supportsREST($this->config->get('preferred_mirror')) &&
$base = $chan->getBaseURL('REST1.1', $this->config->get('preferred_mirror'))) {
// use faster list-all if available
$rest = &$this->config->getREST('1.1', array());
$available = $rest->listAll($base, $list_options, false, false, false, $chan->getName());
} elseif ($chan->supportsREST($this->config->get('preferred_mirror')) &&
$base = $chan->getBaseURL('REST1.0', $this->config->get('preferred_mirror'))) {
$rest = &$this->config->getREST('1.0', array());
$available = $rest->listAll($base, $list_options, false, false, false, $chan->getName());
}
if (PEAR::isError($available)) { if (PEAR::isError($available)) {
return $this->raiseError($available); $this->config->set('default_channel', $savechannel);
} return $this->raiseError('The package list could not be fetched from the remote server. Please try again. (Debug info: "' . $available->getMessage() . '")');
if (!is_array($available)) {
return $this->raiseError('The package list could not be fetched from the remote server. Please try again. (Debug info: "'.$available.'")');
} }
$data = array( $data = array(
'caption' => 'All packages:', 'caption' => 'All packages [Channel ' . $channel . ']:',
'border' => true, 'border' => true,
'headline' => array('Package', 'Latest', 'Local'), 'headline' => array('Package', 'Latest', 'Local'),
'channel' => $channel,
); );
$local_pkgs = $reg->listPackages();
if (isset($options['channelinfo'])) {
// add full channelinfo
$data['caption'] = 'Channel ' . $channel . ' All packages:';
$data['headline'] = array('Channel', 'Package', 'Latest', 'Local',
'Description', 'Dependencies');
}
$local_pkgs = $reg->listPackages($channel);
foreach ($available as $name => $info) { foreach ($available as $name => $info) {
$installed = $reg->packageInfo($name); $installed = $reg->packageInfo($name, null, $channel);
if (is_array($installed['version'])) {
$installed['version'] = $installed['version']['release'];
}
$desc = $info['summary']; $desc = $info['summary'];
if (isset($params[$name])) if (isset($params[$name])) {
$desc .= "\n\n".$info['description']; $desc .= "\n\n".$info['description'];
}
if (isset($options['mode'])) if (isset($options['mode']))
{ {
if ($options['mode'] == 'installed' && !isset($installed['version'])) if ($options['mode'] == 'installed' && !isset($installed['version'])) {
continue; continue;
if ($options['mode'] == 'notinstalled' && isset($installed['version'])) }
if ($options['mode'] == 'notinstalled' && isset($installed['version'])) {
continue; continue;
}
if ($options['mode'] == 'upgrades' if ($options['mode'] == 'upgrades'
&& (!isset($installed['version']) || $installed['version'] == $info['stable'])) && (!isset($installed['version']) || version_compare($installed['version'],
{ $info['stable'], '>='))) {
continue; continue;
} }
} }
@ -213,112 +378,253 @@ parameter.
unset($local_pkgs[$pos]); unset($local_pkgs[$pos]);
} }
$data['data'][$info['category']][] = array( if (isset($info['stable']) && !$info['stable']) {
$name, $info['stable'] = null;
@$info['stable'], }
@$installed['version'],
@$desc, if (isset($options['channelinfo'])) {
@$info['deps'], // add full channelinfo
if ($info['stable'] === $info['unstable']) {
$state = $info['state'];
} else {
$state = 'stable';
}
$latest = $info['stable'].' ('.$state.')';
$local = '';
if (isset($installed['version'])) {
$inst_state = $reg->packageInfo($name, 'release_state', $channel);
$local = $installed['version'].' ('.$inst_state.')';
}
$packageinfo = array(
$channel,
$name,
$latest,
$local,
isset($desc) ? $desc : null,
isset($info['deps']) ? $info['deps'] : null,
); );
} else {
$packageinfo = array(
$reg->channelAlias($channel) . '/' . $name,
isset($info['stable']) ? $info['stable'] : null,
isset($installed['version']) ? $installed['version'] : null,
isset($desc) ? $desc : null,
isset($info['deps']) ? $info['deps'] : null,
);
}
$data['data'][$info['category']][] = $packageinfo;
}
if (isset($options['mode']) && in_array($options['mode'], array('notinstalled', 'upgrades'))) {
$this->config->set('default_channel', $savechannel);
$this->ui->outputData($data, $command);
return true;
} }
foreach ($local_pkgs as $name) { foreach ($local_pkgs as $name) {
$info = $reg->packageInfo($name); $info = &$reg->getPackage($name, $channel);
$data['data']['Local'][] = array( $data['data']['Local'][] = array(
$info['package'], $reg->channelAlias($channel) . '/' . $info->getPackage(),
'', '',
$info['version'], $info->getVersion(),
$info['summary'], $info->getSummary(),
@$info['release_deps'] $info->getDeps()
); );
} }
$this->config->set('default_channel', $savechannel);
$this->ui->outputData($data, $command); $this->ui->outputData($data, $command);
return true; return true;
} }
// }}}
// {{{ doSearch()
function doSearch($command, $options, $params) function doSearch($command, $options, $params)
{ {
if ((!isset($params[0]) || empty($params[0])) if ((!isset($params[0]) || empty($params[0]))
&& (!isset($params[1]) || empty($params[1]))) && (!isset($params[1]) || empty($params[1])))
{ {
return $this->raiseError('no valid search string supplied'); return $this->raiseError('no valid search string supplied');
}; }
$channelinfo = isset($options['channelinfo']);
$reg = &$this->config->getRegistry();
if (isset($options['allchannels'])) {
// search all channels
unset($options['allchannels']);
$channels = $reg->getChannels();
$errors = array();
PEAR::staticPushErrorHandling(PEAR_ERROR_RETURN);
foreach ($channels as $channel) {
if ($channel->getName() != '__uri') {
$options['channel'] = $channel->getName();
$ret = $this->doSearch($command, $options, $params);
if (PEAR::isError($ret)) {
$errors[] = $ret;
}
}
}
PEAR::staticPopErrorHandling();
if (count($errors) !== 0) {
// for now, only give first error
return PEAR::raiseError($errors[0]);
}
return true;
}
$savechannel = $channel = $this->config->get('default_channel');
$package = strtolower($params[0]);
$summary = isset($params[1]) ? $params[1] : false;
if (isset($options['channel'])) {
$reg = &$this->config->getRegistry();
$channel = $options['channel'];
if (!$reg->channelExists($channel)) {
return $this->raiseError('Channel "' . $channel . '" does not exist');
}
$this->config->set('default_channel', $channel);
}
$chan = $reg->getChannel($channel);
if (PEAR::isError($e = $this->_checkChannelForStatus($channel, $chan))) {
return $e;
}
if ($chan->supportsREST($this->config->get('preferred_mirror')) &&
$base = $chan->getBaseURL('REST1.0', $this->config->get('preferred_mirror'))) {
$rest = &$this->config->getREST('1.0', array());
$available = $rest->listAll($base, false, false, $package, $summary, $chan->getName());
}
$r = new PEAR_Remote($this->config);
$reg = new PEAR_Registry($this->config->get('php_dir'));
$available = $r->call('package.listAll', true, false);
if (PEAR::isError($available)) { if (PEAR::isError($available)) {
$this->config->set('default_channel', $savechannel);
return $this->raiseError($available); return $this->raiseError($available);
} }
$data = array(
'caption' => 'Matched packages:', if (!$available && !$channelinfo) {
'border' => true, // clean exit when not found, no error !
'headline' => array('Package', 'Stable/(Latest)', 'Local'), $data = 'no packages found that match pattern "' . $package . '", for channel '.$channel.'.';
); $this->ui->outputData($data);
$this->config->set('default_channel', $channel);
return true;
}
if ($channelinfo) {
$data = array(
'caption' => 'Matched packages, channel ' . $channel . ':',
'border' => true,
'headline' => array('Channel', 'Package', 'Stable/(Latest)', 'Local'),
'channel' => $channel
);
} else {
$data = array(
'caption' => 'Matched packages, channel ' . $channel . ':',
'border' => true,
'headline' => array('Package', 'Stable/(Latest)', 'Local'),
'channel' => $channel
);
}
if (!$available && $channelinfo) {
unset($data['headline']);
$data['data'] = 'No packages found that match pattern "' . $package . '".';
$available = array();
}
foreach ($available as $name => $info) { foreach ($available as $name => $info) {
$found = (!empty($params[0]) && stristr($name, $params[0]) !== false); $installed = $reg->packageInfo($name, null, $channel);
if (!$found && !(isset($params[1]) && !empty($params[1])
&& (stristr($info['summary'], $params[1]) !== false
|| stristr($info['description'], $params[1]) !== false)))
{
continue;
};
$installed = $reg->packageInfo($name);
$desc = $info['summary']; $desc = $info['summary'];
if (isset($params[$name])) if (isset($params[$name]))
$desc .= "\n\n".$info['description']; $desc .= "\n\n".$info['description'];
$unstable = '';
if ($info['unstable']) {
$unstable = '/(' . $info['unstable'] . $info['state'] . ')';
}
if (!isset($info['stable']) || !$info['stable']) { if (!isset($info['stable']) || !$info['stable']) {
$info['stable'] = 'none'; $version_remote = 'none';
} else {
if ($info['unstable']) {
$version_remote = $info['unstable'];
} else {
$version_remote = $info['stable'];
}
$version_remote .= ' ('.$info['state'].')';
} }
$data['data'][$info['category']][] = array( $version = is_array($installed['version']) ? $installed['version']['release'] :
$name, $installed['version'];
$info['stable'] . $unstable, if ($channelinfo) {
$installed['version'], $packageinfo = array(
$desc, $channel,
$name,
$version_remote,
$version,
$desc,
); );
} else {
$packageinfo = array(
$name,
$version_remote,
$version,
$desc,
);
}
$data['data'][$info['category']][] = $packageinfo;
} }
if (!isset($data['data'])) {
return $this->raiseError('no packages found');
}
$this->ui->outputData($data, $command); $this->ui->outputData($data, $command);
$this->config->set('default_channel', $channel);
return true; return true;
} }
// }}} function &getDownloader($options)
// {{{ doDownload() {
if (!class_exists('PEAR_Downloader')) {
require_once 'PEAR/Downloader.php';
}
$a = &new PEAR_Downloader($this->ui, $options, $this->config);
return $a;
}
function doDownload($command, $options, $params) function doDownload($command, $options, $params)
{ {
//$params[0] -> The package to download // make certain that dependencies are ignored
if (count($params) != 1) { $options['downloadonly'] = 1;
return PEAR::raiseError("download expects one argument: the package to download");
// eliminate error messages for preferred_state-related errors
/* TODO: Should be an option, but until now download does respect
prefered state */
/* $options['ignorepreferred_state'] = 1; */
// eliminate error messages for preferred_state-related errors
$downloader = &$this->getDownloader($options);
PEAR::staticPushErrorHandling(PEAR_ERROR_RETURN);
$e = $downloader->setDownloadDir(getcwd());
PEAR::staticPopErrorHandling();
if (PEAR::isError($e)) {
return $this->raiseError('Current directory is not writeable, cannot download');
} }
$server = $this->config->get('master_server');
if (!ereg('^http://', $params[0])) { $errors = array();
$getoption = isset($options['nocompress'])&&$options['nocompress']==1?'?uncompress=on':''; $downloaded = array();
$pkgfile = "http://$server/get/$params[0]".$getoption; $err = $downloader->download($params);
} else { if (PEAR::isError($err)) {
$pkgfile = $params[0]; return $err;
} }
$this->bytes_downloaded = 0;
$saved = PEAR_Common::downloadHttp($pkgfile, $this->ui, '.', $errors = $downloader->getErrorMsgs();
array(&$this, 'downloadCallback')); if (count($errors)) {
if (PEAR::isError($saved)) { foreach ($errors as $error) {
return $this->raiseError($saved); if ($error !== null) {
$this->ui->outputData($error);
}
}
return $this->raiseError("$command failed");
} }
$fname = basename($saved);
$this->ui->outputData("File $fname downloaded ($this->bytes_downloaded bytes)", $command); $downloaded = $downloader->getDownloadedPackages();
foreach ($downloaded as $pkg) {
$this->ui->outputData("File $pkg[file] downloaded", $command);
}
return true; return true;
} }
@ -329,107 +635,176 @@ parameter.
} }
} }
// }}}
// {{{ doListUpgrades()
function doListUpgrades($command, $options, $params) function doListUpgrades($command, $options, $params)
{ {
include_once "PEAR/Registry.php"; require_once 'PEAR/Common.php';
$remote = new PEAR_Remote($this->config); if (isset($params[0]) && !is_array(PEAR_Common::betterStates($params[0]))) {
if (empty($params[0])) { return $this->raiseError($params[0] . ' is not a valid state (stable/beta/alpha/devel/etc.) try "pear help list-upgrades"');
$state = $this->config->get('preferred_state');
} else {
$state = $params[0];
} }
$caption = 'Available Upgrades';
if (empty($state) || $state == 'any') { $savechannel = $channel = $this->config->get('default_channel');
$latest = $remote->call("package.listLatestReleases"); $reg = &$this->config->getRegistry();
} else { foreach ($reg->listChannels() as $channel) {
$latest = $remote->call("package.listLatestReleases", $state); $inst = array_flip($reg->listPackages($channel));
$caption .= ' (' . implode(', ', PEAR_Common::betterStates($state, true)) . ')'; if (!count($inst)) {
}
$caption .= ':';
if (PEAR::isError($latest)) {
return $latest;
}
$reg = new PEAR_Registry($this->config->get('php_dir'));
$inst = array_flip($reg->listPackages());
$data = array(
'caption' => $caption,
'border' => 1,
'headline' => array('Package', 'Local', 'Remote', 'Size'),
);
foreach ((array)$latest as $pkg => $info) {
$package = strtolower($pkg);
if (!isset($inst[$package])) {
// skip packages we don't have installed
continue; continue;
} }
extract($info);
$pkginfo = $reg->packageInfo($package); if ($channel == '__uri') {
$inst_version = $pkginfo['version'];
$inst_state = $pkginfo['release_state'];
if (version_compare("$version", "$inst_version", "le")) {
// installed version is up-to-date
continue; continue;
} }
if ($filesize >= 20480) {
$filesize += 1024 - ($filesize % 1024); $this->config->set('default_channel', $channel);
$fs = sprintf("%dkB", $filesize / 1024); $state = empty($params[0]) ? $this->config->get('preferred_state') : $params[0];
} elseif ($filesize > 0) {
$filesize += 103 - ($filesize % 103); $caption = $channel . ' Available Upgrades';
$fs = sprintf("%.1fkB", $filesize / 1024.0); $chan = $reg->getChannel($channel);
if (PEAR::isError($e = $this->_checkChannelForStatus($channel, $chan))) {
return $e;
}
$latest = array();
$base2 = false;
$preferred_mirror = $this->config->get('preferred_mirror');
if ($chan->supportsREST($preferred_mirror) &&
(
//($base2 = $chan->getBaseURL('REST1.4', $preferred_mirror)) ||
($base = $chan->getBaseURL('REST1.0', $preferred_mirror))
)
) {
if ($base2) {
$rest = &$this->config->getREST('1.4', array());
$base = $base2;
} else {
$rest = &$this->config->getREST('1.0', array());
}
if (empty($state) || $state == 'any') {
$state = false;
} else {
$caption .= ' (' . implode(', ', PEAR_Common::betterStates($state, true)) . ')';
}
PEAR::staticPushErrorHandling(PEAR_ERROR_RETURN);
$latest = $rest->listLatestUpgrades($base, $state, $inst, $channel, $reg);
PEAR::staticPopErrorHandling();
}
if (PEAR::isError($latest)) {
$this->ui->outputData($latest->getMessage());
continue;
}
$caption .= ':';
if (PEAR::isError($latest)) {
$this->config->set('default_channel', $savechannel);
return $latest;
}
$data = array(
'caption' => $caption,
'border' => 1,
'headline' => array('Channel', 'Package', 'Local', 'Remote', 'Size'),
'channel' => $channel
);
foreach ((array)$latest as $pkg => $info) {
$package = strtolower($pkg);
if (!isset($inst[$package])) {
// skip packages we don't have installed
continue;
}
extract($info);
$inst_version = $reg->packageInfo($package, 'version', $channel);
$inst_state = $reg->packageInfo($package, 'release_state', $channel);
if (version_compare("$version", "$inst_version", "le")) {
// installed version is up-to-date
continue;
}
if ($filesize >= 20480) {
$filesize += 1024 - ($filesize % 1024);
$fs = sprintf("%dkB", $filesize / 1024);
} elseif ($filesize > 0) {
$filesize += 103 - ($filesize % 103);
$fs = sprintf("%.1fkB", $filesize / 1024.0);
} else {
$fs = " -"; // XXX center instead
}
$data['data'][] = array($channel, $pkg, "$inst_version ($inst_state)", "$version ($state)", $fs);
}
if (isset($options['channelinfo'])) {
if (empty($data['data'])) {
unset($data['headline']);
if (count($inst) == 0) {
$data['data'] = '(no packages installed)';
} else {
$data['data'] = '(no upgrades available)';
}
}
$this->ui->outputData($data, $command);
} else { } else {
$fs = " -"; // XXX center instead if (empty($data['data'])) {
$this->ui->outputData('Channel ' . $channel . ': No upgrades available');
} else {
$this->ui->outputData($data, $command);
}
} }
$data['data'][] = array($pkg, "$inst_version ($inst_state)", "$version ($state)", $fs);
}
if (empty($data['data'])) {
$this->ui->outputData('No upgrades available');
} else {
$this->ui->outputData($data, $command);
} }
$this->config->set('default_channel', $savechannel);
return true; return true;
} }
// }}}
// {{{ doClearCache()
function doClearCache($command, $options, $params) function doClearCache($command, $options, $params)
{ {
$cache_dir = $this->config->get('cache_dir'); $cache_dir = $this->config->get('cache_dir');
$verbose = $this->config->get('verbose'); $verbose = $this->config->get('verbose');
$output = ''; $output = '';
if (!file_exists($cache_dir) || !is_dir($cache_dir)) {
return $this->raiseError("$cache_dir does not exist or is not a directory");
}
if (!($dp = @opendir($cache_dir))) { if (!($dp = @opendir($cache_dir))) {
return $this->raiseError("opendir($cache_dir) failed: $php_errormsg"); return $this->raiseError("opendir($cache_dir) failed: $php_errormsg");
} }
if ($verbose >= 1) { if ($verbose >= 1) {
$output .= "reading directory $cache_dir\n"; $output .= "reading directory $cache_dir\n";
} }
$num = 0; $num = 0;
while ($ent = readdir($dp)) { while ($ent = readdir($dp)) {
if (preg_match('/^xmlrpc_cache_[a-z0-9]{32}$/', $ent)) { if (preg_match('/rest.cache(file|id)\\z/', $ent)) {
$path = $cache_dir . DIRECTORY_SEPARATOR . $ent; $path = $cache_dir . DIRECTORY_SEPARATOR . $ent;
$ok = @unlink($path); if (file_exists($path)) {
$ok = @unlink($path);
} else {
$ok = false;
$php_errormsg = '';
}
if ($ok) { if ($ok) {
if ($verbose >= 2) { if ($verbose >= 2) {
$output .= "deleted $path\n"; $output .= "deleted $path\n";
} }
$num++; $num++;
} elseif ($verbose >= 1) { } elseif ($verbose >= 1) {
$output .= "failed to delete $path\n"; $output .= "failed to delete $path $php_errormsg\n";
} }
} }
} }
closedir($dp); closedir($dp);
if ($verbose >= 1) { if ($verbose >= 1) {
$output .= "$num cache entries cleared\n"; $output .= "$num cache entries cleared\n";
} }
$this->ui->outputData(rtrim($output), $command); $this->ui->outputData(rtrim($output), $command);
return $num; return $num;
} }
// }}}
} }
?>

109
3rdparty/PEAR/Command/Remote.xml vendored Normal file
View File

@ -0,0 +1,109 @@
<commands version="1.0">
<remote-info>
<summary>Information About Remote Packages</summary>
<function>doRemoteInfo</function>
<shortcut>ri</shortcut>
<options />
<doc>&lt;package&gt;
Get details on a package from the server.</doc>
</remote-info>
<list-upgrades>
<summary>List Available Upgrades</summary>
<function>doListUpgrades</function>
<shortcut>lu</shortcut>
<options>
<channelinfo>
<shortopt>i</shortopt>
<doc>output fully channel-aware data, even on failure</doc>
</channelinfo>
</options>
<doc>[preferred_state]
List releases on the server of packages you have installed where
a newer version is available with the same release state (stable etc.)
or the state passed as the second parameter.</doc>
</list-upgrades>
<remote-list>
<summary>List Remote Packages</summary>
<function>doRemoteList</function>
<shortcut>rl</shortcut>
<options>
<channel>
<shortopt>c</shortopt>
<doc>specify a channel other than the default channel</doc>
<arg>CHAN</arg>
</channel>
</options>
<doc>
Lists the packages available on the configured server along with the
latest stable release of each package.</doc>
</remote-list>
<search>
<summary>Search remote package database</summary>
<function>doSearch</function>
<shortcut>sp</shortcut>
<options>
<channel>
<shortopt>c</shortopt>
<doc>specify a channel other than the default channel</doc>
<arg>CHAN</arg>
</channel>
<allchannels>
<shortopt>a</shortopt>
<doc>search packages from all known channels</doc>
</allchannels>
<channelinfo>
<shortopt>i</shortopt>
<doc>output fully channel-aware data, even on failure</doc>
</channelinfo>
</options>
<doc>[packagename] [packageinfo]
Lists all packages which match the search parameters. The first
parameter is a fragment of a packagename. The default channel
will be used unless explicitly overridden. The second parameter
will be used to match any portion of the summary/description</doc>
</search>
<list-all>
<summary>List All Packages</summary>
<function>doListAll</function>
<shortcut>la</shortcut>
<options>
<channel>
<shortopt>c</shortopt>
<doc>specify a channel other than the default channel</doc>
<arg>CHAN</arg>
</channel>
<channelinfo>
<shortopt>i</shortopt>
<doc>output fully channel-aware data, even on failure</doc>
</channelinfo>
</options>
<doc>
Lists the packages available on the configured server along with the
latest stable release of each package.</doc>
</list-all>
<download>
<summary>Download Package</summary>
<function>doDownload</function>
<shortcut>d</shortcut>
<options>
<nocompress>
<shortopt>Z</shortopt>
<doc>download an uncompressed (.tar) file</doc>
</nocompress>
</options>
<doc>&lt;package&gt;...
Download package tarballs. The files will be named as suggested by the
server, for example if you download the DB package and the latest stable
version of DB is 1.6.5, the downloaded file will be DB-1.6.5.tgz.</doc>
</download>
<clear-cache>
<summary>Clear Web Services Cache</summary>
<function>doClearCache</function>
<shortcut>cc</shortcut>
<options />
<doc>
Clear the XML-RPC/REST cache. See also the cache_ttl configuration
parameter.
</doc>
</clear-cache>
</commands>

337
3rdparty/PEAR/Command/Test.php vendored Normal file
View File

@ -0,0 +1,337 @@
<?php
/**
* PEAR_Command_Test (run-tests)
*
* PHP versions 4 and 5
*
* @category pear
* @package PEAR
* @author Stig Bakken <ssb@php.net>
* @author Martin Jansen <mj@php.net>
* @author Greg Beaver <cellog@php.net>
* @copyright 1997-2009 The Authors
* @license http://opensource.org/licenses/bsd-license.php New BSD License
* @version CVS: $Id: Test.php 313023 2011-07-06 19:17:11Z dufuz $
* @link http://pear.php.net/package/PEAR
* @since File available since Release 0.1
*/
/**
* base class
*/
require_once 'PEAR/Command/Common.php';
/**
* PEAR commands for login/logout
*
* @category pear
* @package PEAR
* @author Stig Bakken <ssb@php.net>
* @author Martin Jansen <mj@php.net>
* @author Greg Beaver <cellog@php.net>
* @copyright 1997-2009 The Authors
* @license http://opensource.org/licenses/bsd-license.php New BSD License
* @version Release: 1.9.4
* @link http://pear.php.net/package/PEAR
* @since Class available since Release 0.1
*/
class PEAR_Command_Test extends PEAR_Command_Common
{
var $commands = array(
'run-tests' => array(
'summary' => 'Run Regression Tests',
'function' => 'doRunTests',
'shortcut' => 'rt',
'options' => array(
'recur' => array(
'shortopt' => 'r',
'doc' => 'Run tests in child directories, recursively. 4 dirs deep maximum',
),
'ini' => array(
'shortopt' => 'i',
'doc' => 'actual string of settings to pass to php in format " -d setting=blah"',
'arg' => 'SETTINGS'
),
'realtimelog' => array(
'shortopt' => 'l',
'doc' => 'Log test runs/results as they are run',
),
'quiet' => array(
'shortopt' => 'q',
'doc' => 'Only display detail for failed tests',
),
'simple' => array(
'shortopt' => 's',
'doc' => 'Display simple output for all tests',
),
'package' => array(
'shortopt' => 'p',
'doc' => 'Treat parameters as installed packages from which to run tests',
),
'phpunit' => array(
'shortopt' => 'u',
'doc' => 'Search parameters for AllTests.php, and use that to run phpunit-based tests
If none is found, all .phpt tests will be tried instead.',
),
'tapoutput' => array(
'shortopt' => 't',
'doc' => 'Output run-tests.log in TAP-compliant format',
),
'cgi' => array(
'shortopt' => 'c',
'doc' => 'CGI php executable (needed for tests with POST/GET section)',
'arg' => 'PHPCGI',
),
'coverage' => array(
'shortopt' => 'x',
'doc' => 'Generate a code coverage report (requires Xdebug 2.0.0+)',
),
),
'doc' => '[testfile|dir ...]
Run regression tests with PHP\'s regression testing script (run-tests.php).',
),
);
var $output;
/**
* PEAR_Command_Test constructor.
*
* @access public
*/
function PEAR_Command_Test(&$ui, &$config)
{
parent::PEAR_Command_Common($ui, $config);
}
function doRunTests($command, $options, $params)
{
if (isset($options['phpunit']) && isset($options['tapoutput'])) {
return $this->raiseError('ERROR: cannot use both --phpunit and --tapoutput at the same time');
}
require_once 'PEAR/Common.php';
require_once 'System.php';
$log = new PEAR_Common;
$log->ui = &$this->ui; // slightly hacky, but it will work
$tests = array();
$depth = isset($options['recur']) ? 14 : 1;
if (!count($params)) {
$params[] = '.';
}
if (isset($options['package'])) {
$oldparams = $params;
$params = array();
$reg = &$this->config->getRegistry();
foreach ($oldparams as $param) {
$pname = $reg->parsePackageName($param, $this->config->get('default_channel'));
if (PEAR::isError($pname)) {
return $this->raiseError($pname);
}
$package = &$reg->getPackage($pname['package'], $pname['channel']);
if (!$package) {
return PEAR::raiseError('Unknown package "' .
$reg->parsedPackageNameToString($pname) . '"');
}
$filelist = $package->getFilelist();
foreach ($filelist as $name => $atts) {
if (isset($atts['role']) && $atts['role'] != 'test') {
continue;
}
if (isset($options['phpunit']) && preg_match('/AllTests\.php\\z/i', $name)) {
$params[] = $atts['installed_as'];
continue;
} elseif (!preg_match('/\.phpt\\z/', $name)) {
continue;
}
$params[] = $atts['installed_as'];
}
}
}
foreach ($params as $p) {
if (is_dir($p)) {
if (isset($options['phpunit'])) {
$dir = System::find(array($p, '-type', 'f',
'-maxdepth', $depth,
'-name', 'AllTests.php'));
if (count($dir)) {
foreach ($dir as $p) {
$p = realpath($p);
if (!count($tests) ||
(count($tests) && strlen($p) < strlen($tests[0]))) {
// this is in a higher-level directory, use this one instead.
$tests = array($p);
}
}
}
continue;
}
$args = array($p, '-type', 'f', '-name', '*.phpt');
} else {
if (isset($options['phpunit'])) {
if (preg_match('/AllTests\.php\\z/i', $p)) {
$p = realpath($p);
if (!count($tests) ||
(count($tests) && strlen($p) < strlen($tests[0]))) {
// this is in a higher-level directory, use this one instead.
$tests = array($p);
}
}
continue;
}
if (file_exists($p) && preg_match('/\.phpt$/', $p)) {
$tests[] = $p;
continue;
}
if (!preg_match('/\.phpt\\z/', $p)) {
$p .= '.phpt';
}
$args = array(dirname($p), '-type', 'f', '-name', $p);
}
if (!isset($options['recur'])) {
$args[] = '-maxdepth';
$args[] = 1;
}
$dir = System::find($args);
$tests = array_merge($tests, $dir);
}
$ini_settings = '';
if (isset($options['ini'])) {
$ini_settings .= $options['ini'];
}
if (isset($_ENV['TEST_PHP_INCLUDE_PATH'])) {
$ini_settings .= " -d include_path={$_ENV['TEST_PHP_INCLUDE_PATH']}";
}
if ($ini_settings) {
$this->ui->outputData('Using INI settings: "' . $ini_settings . '"');
}
$skipped = $passed = $failed = array();
$tests_count = count($tests);
$this->ui->outputData('Running ' . $tests_count . ' tests', $command);
$start = time();
if (isset($options['realtimelog']) && file_exists('run-tests.log')) {
unlink('run-tests.log');
}
if (isset($options['tapoutput'])) {
$tap = '1..' . $tests_count . "\n";
}
require_once 'PEAR/RunTest.php';
$run = new PEAR_RunTest($log, $options);
$run->tests_count = $tests_count;
if (isset($options['coverage']) && extension_loaded('xdebug')){
$run->xdebug_loaded = true;
} else {
$run->xdebug_loaded = false;
}
$j = $i = 1;
foreach ($tests as $t) {
if (isset($options['realtimelog'])) {
$fp = @fopen('run-tests.log', 'a');
if ($fp) {
fwrite($fp, "Running test [$i / $tests_count] $t...");
fclose($fp);
}
}
PEAR::staticPushErrorHandling(PEAR_ERROR_RETURN);
if (isset($options['phpunit'])) {
$result = $run->runPHPUnit($t, $ini_settings);
} else {
$result = $run->run($t, $ini_settings, $j);
}
PEAR::staticPopErrorHandling();
if (PEAR::isError($result)) {
$this->ui->log($result->getMessage());
continue;
}
if (isset($options['tapoutput'])) {
$tap .= $result[0] . ' ' . $i . $result[1] . "\n";
continue;
}
if (isset($options['realtimelog'])) {
$fp = @fopen('run-tests.log', 'a');
if ($fp) {
fwrite($fp, "$result\n");
fclose($fp);
}
}
if ($result == 'FAILED') {
$failed[] = $t;
}
if ($result == 'PASSED') {
$passed[] = $t;
}
if ($result == 'SKIPPED') {
$skipped[] = $t;
}
$j++;
}
$total = date('i:s', time() - $start);
if (isset($options['tapoutput'])) {
$fp = @fopen('run-tests.log', 'w');
if ($fp) {
fwrite($fp, $tap, strlen($tap));
fclose($fp);
$this->ui->outputData('wrote TAP-format log to "' .realpath('run-tests.log') .
'"', $command);
}
} else {
if (count($failed)) {
$output = "TOTAL TIME: $total\n";
$output .= count($passed) . " PASSED TESTS\n";
$output .= count($skipped) . " SKIPPED TESTS\n";
$output .= count($failed) . " FAILED TESTS:\n";
foreach ($failed as $failure) {
$output .= $failure . "\n";
}
$mode = isset($options['realtimelog']) ? 'a' : 'w';
$fp = @fopen('run-tests.log', $mode);
if ($fp) {
fwrite($fp, $output, strlen($output));
fclose($fp);
$this->ui->outputData('wrote log to "' . realpath('run-tests.log') . '"', $command);
}
} elseif (file_exists('run-tests.log') && !is_dir('run-tests.log')) {
@unlink('run-tests.log');
}
}
$this->ui->outputData('TOTAL TIME: ' . $total);
$this->ui->outputData(count($passed) . ' PASSED TESTS', $command);
$this->ui->outputData(count($skipped) . ' SKIPPED TESTS', $command);
if (count($failed)) {
$this->ui->outputData(count($failed) . ' FAILED TESTS:', $command);
foreach ($failed as $failure) {
$this->ui->outputData($failure, $command);
}
}
return true;
}
}

54
3rdparty/PEAR/Command/Test.xml vendored Normal file
View File

@ -0,0 +1,54 @@
<commands version="1.0">
<run-tests>
<summary>Run Regression Tests</summary>
<function>doRunTests</function>
<shortcut>rt</shortcut>
<options>
<recur>
<shortopt>r</shortopt>
<doc>Run tests in child directories, recursively. 4 dirs deep maximum</doc>
</recur>
<ini>
<shortopt>i</shortopt>
<doc>actual string of settings to pass to php in format &quot; -d setting=blah&quot;</doc>
<arg>SETTINGS</arg>
</ini>
<realtimelog>
<shortopt>l</shortopt>
<doc>Log test runs/results as they are run</doc>
</realtimelog>
<quiet>
<shortopt>q</shortopt>
<doc>Only display detail for failed tests</doc>
</quiet>
<simple>
<shortopt>s</shortopt>
<doc>Display simple output for all tests</doc>
</simple>
<package>
<shortopt>p</shortopt>
<doc>Treat parameters as installed packages from which to run tests</doc>
</package>
<phpunit>
<shortopt>u</shortopt>
<doc>Search parameters for AllTests.php, and use that to run phpunit-based tests
If none is found, all .phpt tests will be tried instead.</doc>
</phpunit>
<tapoutput>
<shortopt>t</shortopt>
<doc>Output run-tests.log in TAP-compliant format</doc>
</tapoutput>
<cgi>
<shortopt>c</shortopt>
<doc>CGI php executable (needed for tests with POST/GET section)</doc>
<arg>PHPCGI</arg>
</cgi>
<coverage>
<shortopt>x</shortopt>
<doc>Generate a code coverage report (requires Xdebug 2.0.0+)</doc>
</coverage>
</options>
<doc>[testfile|dir ...]
Run regression tests with PHP&#039;s regression testing script (run-tests.php).</doc>
</run-tests>
</commands>

1963
3rdparty/PEAR/Common.php vendored

File diff suppressed because it is too large Load Diff

1402
3rdparty/PEAR/Config.php vendored

File diff suppressed because it is too large Load Diff

1358
3rdparty/PEAR/Dependency2.php vendored Normal file

File diff suppressed because it is too large Load Diff

769
3rdparty/PEAR/DependencyDB.php vendored Normal file
View File

@ -0,0 +1,769 @@
<?php
/**
* PEAR_DependencyDB, advanced installed packages dependency database
*
* PHP versions 4 and 5
*
* @category pear
* @package PEAR
* @author Tomas V. V. Cox <cox@idecnet.com>
* @author Greg Beaver <cellog@php.net>
* @copyright 1997-2009 The Authors
* @license http://opensource.org/licenses/bsd-license.php New BSD License
* @version CVS: $Id: DependencyDB.php 313023 2011-07-06 19:17:11Z dufuz $
* @link http://pear.php.net/package/PEAR
* @since File available since Release 1.4.0a1
*/
/**
* Needed for error handling
*/
require_once 'PEAR.php';
require_once 'PEAR/Config.php';
$GLOBALS['_PEAR_DEPENDENCYDB_INSTANCE'] = array();
/**
* Track dependency relationships between installed packages
* @category pear
* @package PEAR
* @author Greg Beaver <cellog@php.net>
* @author Tomas V.V.Cox <cox@idec.net.com>
* @copyright 1997-2009 The Authors
* @license http://opensource.org/licenses/bsd-license.php New BSD License
* @version Release: 1.9.4
* @link http://pear.php.net/package/PEAR
* @since Class available since Release 1.4.0a1
*/
class PEAR_DependencyDB
{
// {{{ properties
/**
* This is initialized by {@link setConfig()}
* @var PEAR_Config
* @access private
*/
var $_config;
/**
* This is initialized by {@link setConfig()}
* @var PEAR_Registry
* @access private
*/
var $_registry;
/**
* Filename of the dependency DB (usually .depdb)
* @var string
* @access private
*/
var $_depdb = false;
/**
* File name of the lockfile (usually .depdblock)
* @var string
* @access private
*/
var $_lockfile = false;
/**
* Open file resource for locking the lockfile
* @var resource|false
* @access private
*/
var $_lockFp = false;
/**
* API version of this class, used to validate a file on-disk
* @var string
* @access private
*/
var $_version = '1.0';
/**
* Cached dependency database file
* @var array|null
* @access private
*/
var $_cache;
// }}}
// {{{ & singleton()
/**
* Get a raw dependency database. Calls setConfig() and assertDepsDB()
* @param PEAR_Config
* @param string|false full path to the dependency database, or false to use default
* @return PEAR_DependencyDB|PEAR_Error
* @static
*/
function &singleton(&$config, $depdb = false)
{
$phpdir = $config->get('php_dir', null, 'pear.php.net');
if (!isset($GLOBALS['_PEAR_DEPENDENCYDB_INSTANCE'][$phpdir])) {
$a = new PEAR_DependencyDB;
$GLOBALS['_PEAR_DEPENDENCYDB_INSTANCE'][$phpdir] = &$a;
$a->setConfig($config, $depdb);
$e = $a->assertDepsDB();
if (PEAR::isError($e)) {
return $e;
}
}
return $GLOBALS['_PEAR_DEPENDENCYDB_INSTANCE'][$phpdir];
}
/**
* Set up the registry/location of dependency DB
* @param PEAR_Config|false
* @param string|false full path to the dependency database, or false to use default
*/
function setConfig(&$config, $depdb = false)
{
if (!$config) {
$this->_config = &PEAR_Config::singleton();
} else {
$this->_config = &$config;
}
$this->_registry = &$this->_config->getRegistry();
if (!$depdb) {
$this->_depdb = $this->_config->get('php_dir', null, 'pear.php.net') .
DIRECTORY_SEPARATOR . '.depdb';
} else {
$this->_depdb = $depdb;
}
$this->_lockfile = dirname($this->_depdb) . DIRECTORY_SEPARATOR . '.depdblock';
}
// }}}
function hasWriteAccess()
{
if (!file_exists($this->_depdb)) {
$dir = $this->_depdb;
while ($dir && $dir != '.') {
$dir = dirname($dir); // cd ..
if ($dir != '.' && file_exists($dir)) {
if (is_writeable($dir)) {
return true;
}
return false;
}
}
return false;
}
return is_writeable($this->_depdb);
}
// {{{ assertDepsDB()
/**
* Create the dependency database, if it doesn't exist. Error if the database is
* newer than the code reading it.
* @return void|PEAR_Error
*/
function assertDepsDB()
{
if (!is_file($this->_depdb)) {
$this->rebuildDB();
return;
}
$depdb = $this->_getDepDB();
// Datatype format has been changed, rebuild the Deps DB
if ($depdb['_version'] < $this->_version) {
$this->rebuildDB();
}
if ($depdb['_version']{0} > $this->_version{0}) {
return PEAR::raiseError('Dependency database is version ' .
$depdb['_version'] . ', and we are version ' .
$this->_version . ', cannot continue');
}
}
/**
* Get a list of installed packages that depend on this package
* @param PEAR_PackageFile_v1|PEAR_PackageFile_v2|array
* @return array|false
*/
function getDependentPackages(&$pkg)
{
$data = $this->_getDepDB();
if (is_object($pkg)) {
$channel = strtolower($pkg->getChannel());
$package = strtolower($pkg->getPackage());
} else {
$channel = strtolower($pkg['channel']);
$package = strtolower($pkg['package']);
}
if (isset($data['packages'][$channel][$package])) {
return $data['packages'][$channel][$package];
}
return false;
}
/**
* Get a list of the actual dependencies of installed packages that depend on
* a package.
* @param PEAR_PackageFile_v1|PEAR_PackageFile_v2|array
* @return array|false
*/
function getDependentPackageDependencies(&$pkg)
{
$data = $this->_getDepDB();
if (is_object($pkg)) {
$channel = strtolower($pkg->getChannel());
$package = strtolower($pkg->getPackage());
} else {
$channel = strtolower($pkg['channel']);
$package = strtolower($pkg['package']);
}
$depend = $this->getDependentPackages($pkg);
if (!$depend) {
return false;
}
$dependencies = array();
foreach ($depend as $info) {
$temp = $this->getDependencies($info);
foreach ($temp as $dep) {
if (
isset($dep['dep'], $dep['dep']['channel'], $dep['dep']['name']) &&
strtolower($dep['dep']['channel']) == $channel &&
strtolower($dep['dep']['name']) == $package
) {
if (!isset($dependencies[$info['channel']])) {
$dependencies[$info['channel']] = array();
}
if (!isset($dependencies[$info['channel']][$info['package']])) {
$dependencies[$info['channel']][$info['package']] = array();
}
$dependencies[$info['channel']][$info['package']][] = $dep;
}
}
}
return $dependencies;
}
/**
* Get a list of dependencies of this installed package
* @param PEAR_PackageFile_v1|PEAR_PackageFile_v2|array
* @return array|false
*/
function getDependencies(&$pkg)
{
if (is_object($pkg)) {
$channel = strtolower($pkg->getChannel());
$package = strtolower($pkg->getPackage());
} else {
$channel = strtolower($pkg['channel']);
$package = strtolower($pkg['package']);
}
$data = $this->_getDepDB();
if (isset($data['dependencies'][$channel][$package])) {
return $data['dependencies'][$channel][$package];
}
return false;
}
/**
* Determine whether $parent depends on $child, near or deep
* @param array|PEAR_PackageFile_v2|PEAR_PackageFile_v2
* @param array|PEAR_PackageFile_v2|PEAR_PackageFile_v2
*/
function dependsOn($parent, $child)
{
$c = array();
$this->_getDepDB();
return $this->_dependsOn($parent, $child, $c);
}
function _dependsOn($parent, $child, &$checked)
{
if (is_object($parent)) {
$channel = strtolower($parent->getChannel());
$package = strtolower($parent->getPackage());
} else {
$channel = strtolower($parent['channel']);
$package = strtolower($parent['package']);
}
if (is_object($child)) {
$depchannel = strtolower($child->getChannel());
$deppackage = strtolower($child->getPackage());
} else {
$depchannel = strtolower($child['channel']);
$deppackage = strtolower($child['package']);
}
if (isset($checked[$channel][$package][$depchannel][$deppackage])) {
return false; // avoid endless recursion
}
$checked[$channel][$package][$depchannel][$deppackage] = true;
if (!isset($this->_cache['dependencies'][$channel][$package])) {
return false;
}
foreach ($this->_cache['dependencies'][$channel][$package] as $info) {
if (isset($info['dep']['uri'])) {
if (is_object($child)) {
if ($info['dep']['uri'] == $child->getURI()) {
return true;
}
} elseif (isset($child['uri'])) {
if ($info['dep']['uri'] == $child['uri']) {
return true;
}
}
return false;
}
if (strtolower($info['dep']['channel']) == $depchannel &&
strtolower($info['dep']['name']) == $deppackage) {
return true;
}
}
foreach ($this->_cache['dependencies'][$channel][$package] as $info) {
if (isset($info['dep']['uri'])) {
if ($this->_dependsOn(array(
'uri' => $info['dep']['uri'],
'package' => $info['dep']['name']), $child, $checked)) {
return true;
}
} else {
if ($this->_dependsOn(array(
'channel' => $info['dep']['channel'],
'package' => $info['dep']['name']), $child, $checked)) {
return true;
}
}
}
return false;
}
/**
* Register dependencies of a package that is being installed or upgraded
* @param PEAR_PackageFile_v2|PEAR_PackageFile_v2
*/
function installPackage(&$package)
{
$data = $this->_getDepDB();
unset($this->_cache);
$this->_setPackageDeps($data, $package);
$this->_writeDepDB($data);
}
/**
* Remove dependencies of a package that is being uninstalled, or upgraded.
*
* Upgraded packages first uninstall, then install
* @param PEAR_PackageFile_v1|PEAR_PackageFile_v2|array If an array, then it must have
* indices 'channel' and 'package'
*/
function uninstallPackage(&$pkg)
{
$data = $this->_getDepDB();
unset($this->_cache);
if (is_object($pkg)) {
$channel = strtolower($pkg->getChannel());
$package = strtolower($pkg->getPackage());
} else {
$channel = strtolower($pkg['channel']);
$package = strtolower($pkg['package']);
}
if (!isset($data['dependencies'][$channel][$package])) {
return true;
}
foreach ($data['dependencies'][$channel][$package] as $dep) {
$found = false;
$depchannel = isset($dep['dep']['uri']) ? '__uri' : strtolower($dep['dep']['channel']);
$depname = strtolower($dep['dep']['name']);
if (isset($data['packages'][$depchannel][$depname])) {
foreach ($data['packages'][$depchannel][$depname] as $i => $info) {
if ($info['channel'] == $channel && $info['package'] == $package) {
$found = true;
break;
}
}
}
if ($found) {
unset($data['packages'][$depchannel][$depname][$i]);
if (!count($data['packages'][$depchannel][$depname])) {
unset($data['packages'][$depchannel][$depname]);
if (!count($data['packages'][$depchannel])) {
unset($data['packages'][$depchannel]);
}
} else {
$data['packages'][$depchannel][$depname] =
array_values($data['packages'][$depchannel][$depname]);
}
}
}
unset($data['dependencies'][$channel][$package]);
if (!count($data['dependencies'][$channel])) {
unset($data['dependencies'][$channel]);
}
if (!count($data['dependencies'])) {
unset($data['dependencies']);
}
if (!count($data['packages'])) {
unset($data['packages']);
}
$this->_writeDepDB($data);
}
/**
* Rebuild the dependency DB by reading registry entries.
* @return true|PEAR_Error
*/
function rebuildDB()
{
$depdb = array('_version' => $this->_version);
if (!$this->hasWriteAccess()) {
// allow startup for read-only with older Registry
return $depdb;
}
$packages = $this->_registry->listAllPackages();
if (PEAR::isError($packages)) {
return $packages;
}
foreach ($packages as $channel => $ps) {
foreach ($ps as $package) {
$package = $this->_registry->getPackage($package, $channel);
if (PEAR::isError($package)) {
return $package;
}
$this->_setPackageDeps($depdb, $package);
}
}
$error = $this->_writeDepDB($depdb);
if (PEAR::isError($error)) {
return $error;
}
$this->_cache = $depdb;
return true;
}
/**
* Register usage of the dependency DB to prevent race conditions
* @param int one of the LOCK_* constants
* @return true|PEAR_Error
* @access private
*/
function _lock($mode = LOCK_EX)
{
if (stristr(php_uname(), 'Windows 9')) {
return true;
}
if ($mode != LOCK_UN && is_resource($this->_lockFp)) {
// XXX does not check type of lock (LOCK_SH/LOCK_EX)
return true;
}
$open_mode = 'w';
// XXX People reported problems with LOCK_SH and 'w'
if ($mode === LOCK_SH) {
if (!file_exists($this->_lockfile)) {
touch($this->_lockfile);
} elseif (!is_file($this->_lockfile)) {
return PEAR::raiseError('could not create Dependency lock file, ' .
'it exists and is not a regular file');
}
$open_mode = 'r';
}
if (!is_resource($this->_lockFp)) {
$this->_lockFp = @fopen($this->_lockfile, $open_mode);
}
if (!is_resource($this->_lockFp)) {
return PEAR::raiseError("could not create Dependency lock file" .
(isset($php_errormsg) ? ": " . $php_errormsg : ""));
}
if (!(int)flock($this->_lockFp, $mode)) {
switch ($mode) {
case LOCK_SH: $str = 'shared'; break;
case LOCK_EX: $str = 'exclusive'; break;
case LOCK_UN: $str = 'unlock'; break;
default: $str = 'unknown'; break;
}
return PEAR::raiseError("could not acquire $str lock ($this->_lockfile)");
}
return true;
}
/**
* Release usage of dependency DB
* @return true|PEAR_Error
* @access private
*/
function _unlock()
{
$ret = $this->_lock(LOCK_UN);
if (is_resource($this->_lockFp)) {
fclose($this->_lockFp);
}
$this->_lockFp = null;
return $ret;
}
/**
* Load the dependency database from disk, or return the cache
* @return array|PEAR_Error
*/
function _getDepDB()
{
if (!$this->hasWriteAccess()) {
return array('_version' => $this->_version);
}
if (isset($this->_cache)) {
return $this->_cache;
}
if (!$fp = fopen($this->_depdb, 'r')) {
$err = PEAR::raiseError("Could not open dependencies file `".$this->_depdb."'");
return $err;
}
$rt = get_magic_quotes_runtime();
set_magic_quotes_runtime(0);
clearstatcache();
fclose($fp);
$data = unserialize(file_get_contents($this->_depdb));
set_magic_quotes_runtime($rt);
$this->_cache = $data;
return $data;
}
/**
* Write out the dependency database to disk
* @param array the database
* @return true|PEAR_Error
* @access private
*/
function _writeDepDB(&$deps)
{
if (PEAR::isError($e = $this->_lock(LOCK_EX))) {
return $e;
}
if (!$fp = fopen($this->_depdb, 'wb')) {
$this->_unlock();
return PEAR::raiseError("Could not open dependencies file `".$this->_depdb."' for writing");
}
$rt = get_magic_quotes_runtime();
set_magic_quotes_runtime(0);
fwrite($fp, serialize($deps));
set_magic_quotes_runtime($rt);
fclose($fp);
$this->_unlock();
$this->_cache = $deps;
return true;
}
/**
* Register all dependencies from a package in the dependencies database, in essence
* "installing" the package's dependency information
* @param array the database
* @param PEAR_PackageFile_v1|PEAR_PackageFile_v2
* @access private
*/
function _setPackageDeps(&$data, &$pkg)
{
$pkg->setConfig($this->_config);
if ($pkg->getPackagexmlVersion() == '1.0') {
$gen = &$pkg->getDefaultGenerator();
$deps = $gen->dependenciesToV2();
} else {
$deps = $pkg->getDeps(true);
}
if (!$deps) {
return;
}
if (!is_array($data)) {
$data = array();
}
if (!isset($data['dependencies'])) {
$data['dependencies'] = array();
}
$channel = strtolower($pkg->getChannel());
$package = strtolower($pkg->getPackage());
if (!isset($data['dependencies'][$channel])) {
$data['dependencies'][$channel] = array();
}
$data['dependencies'][$channel][$package] = array();
if (isset($deps['required']['package'])) {
if (!isset($deps['required']['package'][0])) {
$deps['required']['package'] = array($deps['required']['package']);
}
foreach ($deps['required']['package'] as $dep) {
$this->_registerDep($data, $pkg, $dep, 'required');
}
}
if (isset($deps['optional']['package'])) {
if (!isset($deps['optional']['package'][0])) {
$deps['optional']['package'] = array($deps['optional']['package']);
}
foreach ($deps['optional']['package'] as $dep) {
$this->_registerDep($data, $pkg, $dep, 'optional');
}
}
if (isset($deps['required']['subpackage'])) {
if (!isset($deps['required']['subpackage'][0])) {
$deps['required']['subpackage'] = array($deps['required']['subpackage']);
}
foreach ($deps['required']['subpackage'] as $dep) {
$this->_registerDep($data, $pkg, $dep, 'required');
}
}
if (isset($deps['optional']['subpackage'])) {
if (!isset($deps['optional']['subpackage'][0])) {
$deps['optional']['subpackage'] = array($deps['optional']['subpackage']);
}
foreach ($deps['optional']['subpackage'] as $dep) {
$this->_registerDep($data, $pkg, $dep, 'optional');
}
}
if (isset($deps['group'])) {
if (!isset($deps['group'][0])) {
$deps['group'] = array($deps['group']);
}
foreach ($deps['group'] as $group) {
if (isset($group['package'])) {
if (!isset($group['package'][0])) {
$group['package'] = array($group['package']);
}
foreach ($group['package'] as $dep) {
$this->_registerDep($data, $pkg, $dep, 'optional',
$group['attribs']['name']);
}
}
if (isset($group['subpackage'])) {
if (!isset($group['subpackage'][0])) {
$group['subpackage'] = array($group['subpackage']);
}
foreach ($group['subpackage'] as $dep) {
$this->_registerDep($data, $pkg, $dep, 'optional',
$group['attribs']['name']);
}
}
}
}
if ($data['dependencies'][$channel][$package] == array()) {
unset($data['dependencies'][$channel][$package]);
if (!count($data['dependencies'][$channel])) {
unset($data['dependencies'][$channel]);
}
}
}
/**
* @param array the database
* @param PEAR_PackageFile_v1|PEAR_PackageFile_v2
* @param array the specific dependency
* @param required|optional whether this is a required or an optional dep
* @param string|false dependency group this dependency is from, or false for ordinary dep
*/
function _registerDep(&$data, &$pkg, $dep, $type, $group = false)
{
$info = array(
'dep' => $dep,
'type' => $type,
'group' => $group
);
$dep = array_map('strtolower', $dep);
$depchannel = isset($dep['channel']) ? $dep['channel'] : '__uri';
if (!isset($data['dependencies'])) {
$data['dependencies'] = array();
}
$channel = strtolower($pkg->getChannel());
$package = strtolower($pkg->getPackage());
if (!isset($data['dependencies'][$channel])) {
$data['dependencies'][$channel] = array();
}
if (!isset($data['dependencies'][$channel][$package])) {
$data['dependencies'][$channel][$package] = array();
}
$data['dependencies'][$channel][$package][] = $info;
if (isset($data['packages'][$depchannel][$dep['name']])) {
$found = false;
foreach ($data['packages'][$depchannel][$dep['name']] as $i => $p) {
if ($p['channel'] == $channel && $p['package'] == $package) {
$found = true;
break;
}
}
} else {
if (!isset($data['packages'])) {
$data['packages'] = array();
}
if (!isset($data['packages'][$depchannel])) {
$data['packages'][$depchannel] = array();
}
if (!isset($data['packages'][$depchannel][$dep['name']])) {
$data['packages'][$depchannel][$dep['name']] = array();
}
$found = false;
}
if (!$found) {
$data['packages'][$depchannel][$dep['name']][] = array(
'channel' => $channel,
'package' => $package
);
}
}
}

File diff suppressed because it is too large Load Diff

1988
3rdparty/PEAR/Downloader/Package.php vendored Normal file

File diff suppressed because it is too large Load Diff

View File

@ -1,24 +1,4 @@
<?php <?php
//
// +----------------------------------------------------------------------+
// | PHP Version 5 |
// +----------------------------------------------------------------------+
// | Copyright (c) 1997-2004 The PHP Group |
// +----------------------------------------------------------------------+
// | This source file is subject to version 3.0 of the PHP license, |
// | that is bundled with this package in the file LICENSE, and is |
// | available through the world-wide-web at the following url: |
// | 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 world-wide-web, please send a note to |
// | license@php.net so we can mail you a copy immediately. |
// +----------------------------------------------------------------------+
// | Author: Gregory Beaver <cellog@php.net> |
// | |
// +----------------------------------------------------------------------+
//
// $Id: ErrorStack.php,v 1.7.2.5 2005/01/01 21:26:51 cellog Exp $
/** /**
* Error Stack Implementation * Error Stack Implementation
* *
@ -38,11 +18,13 @@
* *
* Since version PEAR1.3.2, ErrorStack no longer instantiates an exception class. This can * Since version PEAR1.3.2, ErrorStack no longer instantiates an exception class. This can
* still be done quite handily in an error callback or by manipulating the returned array * still be done quite handily in an error callback or by manipulating the returned array
* @author Greg Beaver <cellog@php.net> * @category Debugging
* @version PEAR1.3.2 (beta) * @package PEAR_ErrorStack
* @package PEAR_ErrorStack * @author Greg Beaver <cellog@php.net>
* @category Debugging * @copyright 2004-2008 Greg Beaver
* @license http://www.php.net/license/3_0.txt PHP License v3.0 * @license http://opensource.org/licenses/bsd-license.php New BSD License
* @version CVS: $Id: ErrorStack.php 313023 2011-07-06 19:17:11Z dufuz $
* @link http://pear.php.net/package/PEAR_ErrorStack
*/ */
/** /**
@ -149,9 +131,14 @@ define('PEAR_ERRORSTACK_ERR_OBJTOSTRING', 2);
* // local error stack * // local error stack
* $local_stack = new PEAR_ErrorStack('MyPackage'); * $local_stack = new PEAR_ErrorStack('MyPackage');
* </code> * </code>
* @copyright 2004 Gregory Beaver * @author Greg Beaver <cellog@php.net>
* @package PEAR_ErrorStack * @version 1.9.4
* @license http://www.php.net/license/3_0.txt PHP License * @package PEAR_ErrorStack
* @category Debugging
* @copyright 2004-2008 Greg Beaver
* @license http://opensource.org/licenses/bsd-license.php New BSD License
* @version CVS: $Id: ErrorStack.php 313023 2011-07-06 19:17:11Z dufuz $
* @link http://pear.php.net/package/PEAR_ErrorStack
*/ */
class PEAR_ErrorStack { class PEAR_ErrorStack {
/** /**
@ -281,8 +268,10 @@ class PEAR_ErrorStack {
'stack class "%stackclass%" is not a valid class name (should be like PEAR_ErrorStack)', 'stack class "%stackclass%" is not a valid class name (should be like PEAR_ErrorStack)',
false, $trace); false, $trace);
} }
return $GLOBALS['_PEAR_ERRORSTACK_SINGLETON'][$package] = $GLOBALS['_PEAR_ERRORSTACK_SINGLETON'][$package] =
&new $stackClass($package, $msgCallback, $contextCallback, $throwPEAR_Error); new $stackClass($package, $msgCallback, $contextCallback, $throwPEAR_Error);
return $GLOBALS['_PEAR_ERRORSTACK_SINGLETON'][$package];
} }
/** /**
@ -487,19 +476,10 @@ class PEAR_ErrorStack {
* @param array $backtrace Protected parameter: use this to pass in the * @param array $backtrace Protected parameter: use this to pass in the
* {@link debug_backtrace()} that should be used * {@link debug_backtrace()} that should be used
* to find error context * to find error context
* @return PEAR_Error|array|Exception * @return PEAR_Error|array if compatibility mode is on, a PEAR_Error is also
* if compatibility mode is on, a PEAR_Error is also * thrown. If a PEAR_Error is returned, the userinfo
* thrown. If the class Exception exists, then one * property is set to the following array:
* is returned to allow code like:
* <code>
* throw ($stack->push(MY_ERROR_CODE, 'error', array('username' => 'grob')));
* </code>
* *
* The errorData property of the exception class will be set to the array
* that would normally be returned. If a PEAR_Error is returned, the userinfo
* property is set to the array
*
* Otherwise, an array is returned in this format:
* <code> * <code>
* array( * array(
* 'code' => $code, * 'code' => $code,
@ -512,6 +492,8 @@ class PEAR_ErrorStack {
* //['repackage' => $err] repackaged error array/Exception class * //['repackage' => $err] repackaged error array/Exception class
* ); * );
* </code> * </code>
*
* Normally, the previous array is returned.
*/ */
function push($code, $level = 'error', $params = array(), $msg = false, function push($code, $level = 'error', $params = array(), $msg = false,
$repackage = false, $backtrace = false) $repackage = false, $backtrace = false)
@ -538,16 +520,16 @@ class PEAR_ErrorStack {
'message' => $msg, 'message' => $msg,
); );
if ($repackage) {
$err['repackage'] = $repackage;
}
// set up the error message, if necessary // set up the error message, if necessary
if ($this->_msgCallback) { if ($this->_msgCallback) {
$msg = call_user_func_array($this->_msgCallback, $msg = call_user_func_array($this->_msgCallback,
array(&$this, $err)); array(&$this, $err));
$err['message'] = $msg; $err['message'] = $msg;
} }
if ($repackage) {
$err['repackage'] = $repackage;
}
$push = $log = true; $push = $log = true;
$die = false; $die = false;
// try the overriding callback first // try the overriding callback first
@ -586,6 +568,9 @@ class PEAR_ErrorStack {
} }
if ($push) { if ($push) {
array_unshift($this->_errors, $err); array_unshift($this->_errors, $err);
if (!isset($this->_errorsByLevel[$err['level']])) {
$this->_errorsByLevel[$err['level']] = array();
}
$this->_errorsByLevel[$err['level']][] = &$this->_errors[0]; $this->_errorsByLevel[$err['level']][] = &$this->_errors[0];
} }
if ($log) { if ($log) {
@ -617,13 +602,8 @@ class PEAR_ErrorStack {
* @param array $backtrace Protected parameter: use this to pass in the * @param array $backtrace Protected parameter: use this to pass in the
* {@link debug_backtrace()} that should be used * {@link debug_backtrace()} that should be used
* to find error context * to find error context
* @return PEAR_Error|null|Exception * @return PEAR_Error|array if compatibility mode is on, a PEAR_Error is also
* if compatibility mode is on, a PEAR_Error is also * thrown. see docs for {@link push()}
* thrown. If the class Exception exists, then one
* is returned to allow code like:
* <code>
* throw ($stack->push(MY_ERROR_CODE, 'error', array('username' => 'grob')));
* </code>
* @static * @static
*/ */
function staticPush($package, $code, $level = 'error', $params = array(), function staticPush($package, $code, $level = 'error', $params = array(),
@ -684,7 +664,31 @@ class PEAR_ErrorStack {
*/ */
function pop() function pop()
{ {
return @array_shift($this->_errors); $err = @array_shift($this->_errors);
if (!is_null($err)) {
@array_pop($this->_errorsByLevel[$err['level']]);
if (!count($this->_errorsByLevel[$err['level']])) {
unset($this->_errorsByLevel[$err['level']]);
}
}
return $err;
}
/**
* Pop an error off of the error stack, static method
*
* @param string package name
* @return boolean
* @since PEAR1.5.0a1
*/
function staticPop($package)
{
if ($package) {
if (!isset($GLOBALS['_PEAR_ERRORSTACK_SINGLETON'][$package])) {
return false;
}
return $GLOBALS['_PEAR_ERRORSTACK_SINGLETON'][$package]->pop();
}
} }
/** /**
@ -853,7 +857,7 @@ class PEAR_ErrorStack {
'line' => $filebacktrace['line']); 'line' => $filebacktrace['line']);
// rearrange for eval'd code or create function errors // rearrange for eval'd code or create function errors
if (strpos($filebacktrace['file'], '(') && if (strpos($filebacktrace['file'], '(') &&
preg_match(';^(.*?)\((\d+)\) : (.*?)$;', $filebacktrace['file'], preg_match(';^(.*?)\((\d+)\) : (.*?)\\z;', $filebacktrace['file'],
$matches)) { $matches)) {
$ret['file'] = $matches[1]; $ret['file'] = $matches[1];
$ret['line'] = $matches[2] + 0; $ret['line'] = $matches[2] + 0;
@ -910,7 +914,7 @@ class PEAR_ErrorStack {
$mainmsg = $stack->getErrorMessageTemplate($err['code']); $mainmsg = $stack->getErrorMessageTemplate($err['code']);
} }
$mainmsg = str_replace('%__msg%', $err['message'], $mainmsg); $mainmsg = str_replace('%__msg%', $err['message'], $mainmsg);
if (count($err['params'])) { if (is_array($err['params']) && count($err['params'])) {
foreach ($err['params'] as $name => $val) { foreach ($err['params'] as $name => $val) {
if (is_array($val)) { if (is_array($val)) {
// @ is needed in case $val is a multi-dimensional array // @ is needed in case $val is a multi-dimensional array

View File

@ -1,34 +1,27 @@
<?php <?php
/* vim: set expandtab tabstop=4 shiftwidth=4 foldmethod=marker: */ /* vim: set expandtab tabstop=4 shiftwidth=4 foldmethod=marker: */
// +----------------------------------------------------------------------+ /**
// | PEAR_Exception | * PEAR_Exception
// +----------------------------------------------------------------------+ *
// | Copyright (c) 2004 The PEAR Group | * PHP versions 4 and 5
// +----------------------------------------------------------------------+ *
// | This source file is subject to version 3.0 of the PHP license, | * @category pear
// | that is bundled with this package in the file LICENSE, and is | * @package PEAR
// | available at through the world-wide-web at | * @author Tomas V. V. Cox <cox@idecnet.com>
// | http://www.php.net/license/3_0.txt. | * @author Hans Lellelid <hans@velum.net>
// | If you did not receive a copy of the PHP license and are unable to | * @author Bertrand Mansion <bmansion@mamasam.com>
// | obtain it through the world-wide-web, please send a note to | * @author Greg Beaver <cellog@php.net>
// | license@php.net so we can mail you a copy immediately. | * @copyright 1997-2009 The Authors
// +----------------------------------------------------------------------+ * @license http://opensource.org/licenses/bsd-license.php New BSD License
// | Authors: Tomas V.V.Cox <cox@idecnet.com> | * @version CVS: $Id: Exception.php 313023 2011-07-06 19:17:11Z dufuz $
// | Hans Lellelid <hans@velum.net> | * @link http://pear.php.net/package/PEAR
// | Bertrand Mansion <bmansion@mamasam.com> | * @since File available since Release 1.3.3
// | Greg Beaver <cellog@php.net> | */
// +----------------------------------------------------------------------+
//
// $Id: Exception.php,v 1.4.2.2 2004/12/31 19:01:52 cellog Exp $
/** /**
* Base PEAR_Exception Class * Base PEAR_Exception Class
* *
* WARNING: This code should be considered stable, but the API is
* subject to immediate and drastic change, so API stability is
* at best alpha
*
* 1) Features: * 1) Features:
* *
* - Nestable exceptions (throw new PEAR_Exception($msg, $prev_exception)) * - Nestable exceptions (throw new PEAR_Exception($msg, $prev_exception))
@ -88,12 +81,17 @@
* } * }
* </code> * </code>
* *
* @since PHP 5 * @category pear
* @package PEAR * @package PEAR
* @version $Revision: 1.4.2.2 $ * @author Tomas V.V.Cox <cox@idecnet.com>
* @author Tomas V.V.Cox <cox@idecnet.com> * @author Hans Lellelid <hans@velum.net>
* @author Hans Lellelid <hans@velum.net> * @author Bertrand Mansion <bmansion@mamasam.com>
* @author Bertrand Mansion <bmansion@mamasam.com> * @author Greg Beaver <cellog@php.net>
* @copyright 1997-2009 The Authors
* @license http://opensource.org/licenses/bsd-license.php New BSD License
* @version Release: 1.9.4
* @link http://pear.php.net/package/PEAR
* @since Class available since Release 1.3.3
* *
*/ */
class PEAR_Exception extends Exception class PEAR_Exception extends Exception
@ -108,19 +106,31 @@ class PEAR_Exception extends Exception
/** /**
* Supported signatures: * Supported signatures:
* PEAR_Exception(string $message); * - PEAR_Exception(string $message);
* PEAR_Exception(string $message, int $code); * - PEAR_Exception(string $message, int $code);
* PEAR_Exception(string $message, Exception $cause); * - PEAR_Exception(string $message, Exception $cause);
* PEAR_Exception(string $message, Exception $cause, int $code); * - PEAR_Exception(string $message, Exception $cause, int $code);
* PEAR_Exception(string $message, array $causes); * - PEAR_Exception(string $message, PEAR_Error $cause);
* PEAR_Exception(string $message, array $causes, int $code); * - PEAR_Exception(string $message, PEAR_Error $cause, int $code);
* - PEAR_Exception(string $message, array $causes);
* - PEAR_Exception(string $message, array $causes, int $code);
* @param string exception message
* @param int|Exception|PEAR_Error|array|null exception cause
* @param int|null exception code or null
*/ */
public function __construct($message, $p2 = null, $p3 = null) public function __construct($message, $p2 = null, $p3 = null)
{ {
if (is_int($p2)) { if (is_int($p2)) {
$code = $p2; $code = $p2;
$this->cause = null; $this->cause = null;
} elseif ($p2 instanceof Exception || is_array($p2)) { } elseif (is_object($p2) || is_array($p2)) {
// using is_object allows both Exception and PEAR_Error
if (is_object($p2) && !($p2 instanceof Exception)) {
if (!class_exists('PEAR_Error') || !($p2 instanceof PEAR_Error)) {
throw new PEAR_Exception('exception cause must be Exception, ' .
'array, or PEAR_Error');
}
}
$code = $p3; $code = $p3;
if (is_array($p2) && isset($p2['message'])) { if (is_array($p2) && isset($p2['message'])) {
// fix potential problem of passing in a single warning // fix potential problem of passing in a single warning
@ -128,7 +138,7 @@ class PEAR_Exception extends Exception
} }
$this->cause = $p2; $this->cause = $p2;
} else { } else {
$code = null; $code = null;
$this->cause = null; $this->cause = null;
} }
parent::__construct($message, $code); parent::__construct($message, $code);
@ -234,13 +244,33 @@ class PEAR_Exception extends Exception
$cause['line'] = $trace[0]['line']; $cause['line'] = $trace[0]['line'];
} }
} }
$causes[] = $cause;
if ($this->cause instanceof PEAR_Exception) { if ($this->cause instanceof PEAR_Exception) {
$this->cause->getCauseMessage($causes); $this->cause->getCauseMessage($causes);
} } elseif ($this->cause instanceof Exception) {
if (is_array($this->cause)) { $causes[] = array('class' => get_class($this->cause),
'message' => $this->cause->getMessage(),
'file' => $this->cause->getFile(),
'line' => $this->cause->getLine());
} elseif (class_exists('PEAR_Error') && $this->cause instanceof PEAR_Error) {
$causes[] = array('class' => get_class($this->cause),
'message' => $this->cause->getMessage(),
'file' => 'unknown',
'line' => 'unknown');
} elseif (is_array($this->cause)) {
foreach ($this->cause as $cause) { foreach ($this->cause as $cause) {
if ($cause instanceof PEAR_Exception) { if ($cause instanceof PEAR_Exception) {
$cause->getCauseMessage($causes); $cause->getCauseMessage($causes);
} elseif ($cause instanceof Exception) {
$causes[] = array('class' => get_class($cause),
'message' => $cause->getMessage(),
'file' => $cause->getFile(),
'line' => $cause->getLine());
} elseif (class_exists('PEAR_Error') && $cause instanceof PEAR_Error) {
$causes[] = array('class' => get_class($cause),
'message' => $cause->getMessage(),
'file' => 'unknown',
'line' => 'unknown');
} elseif (is_array($cause) && isset($cause['message'])) { } elseif (is_array($cause) && isset($cause['message'])) {
// PEAR_ErrorStack warning // PEAR_ErrorStack warning
$causes[] = array( $causes[] = array(
@ -288,28 +318,28 @@ class PEAR_Exception extends Exception
return $this->toHtml(); return $this->toHtml();
} }
return $this->toText(); return $this->toText();
} }
public function toHtml() public function toHtml()
{ {
$trace = $this->getTraceSafe(); $trace = $this->getTraceSafe();
$causes = array(); $causes = array();
$this->getCauseMessage($causes); $this->getCauseMessage($causes);
$html = '<table border="1" cellspacing="0">' . "\n"; $html = '<table style="border: 1px" cellspacing="0">' . "\n";
foreach ($causes as $i => $cause) { foreach ($causes as $i => $cause) {
$html .= '<tr><td colspan="3" bgcolor="#ff9999">' $html .= '<tr><td colspan="3" style="background: #ff9999">'
. str_repeat('-', $i) . ' <b>' . $cause['class'] . '</b>: ' . str_repeat('-', $i) . ' <b>' . $cause['class'] . '</b>: '
. htmlspecialchars($cause['message']) . ' in <b>' . $cause['file'] . '</b> ' . htmlspecialchars($cause['message']) . ' in <b>' . $cause['file'] . '</b> '
. 'on line <b>' . $cause['line'] . '</b>' . 'on line <b>' . $cause['line'] . '</b>'
. "</td></tr>\n"; . "</td></tr>\n";
} }
$html .= '<tr><td colspan="3" bgcolor="#aaaaaa" align="center"><b>Exception trace</b></td></tr>' . "\n" $html .= '<tr><td colspan="3" style="background-color: #aaaaaa; text-align: center; font-weight: bold;">Exception trace</td></tr>' . "\n"
. '<tr><td align="center" bgcolor="#cccccc" width="20"><b>#</b></td>' . '<tr><td style="text-align: center; background: #cccccc; width:20px; font-weight: bold;">#</td>'
. '<td align="center" bgcolor="#cccccc"><b>Function</b></td>' . '<td style="text-align: center; background: #cccccc; font-weight: bold;">Function</td>'
. '<td align="center" bgcolor="#cccccc"><b>Location</b></td></tr>' . "\n"; . '<td style="text-align: center; background: #cccccc; font-weight: bold;">Location</td></tr>' . "\n";
foreach ($trace as $k => $v) { foreach ($trace as $k => $v) {
$html .= '<tr><td align="center">' . $k . '</td>' $html .= '<tr><td style="text-align: center;">' . $k . '</td>'
. '<td>'; . '<td>';
if (!empty($v['class'])) { if (!empty($v['class'])) {
$html .= $v['class'] . $v['type']; $html .= $v['class'] . $v['type'];
@ -333,9 +363,11 @@ class PEAR_Exception extends Exception
} }
$html .= '(' . implode(', ',$args) . ')' $html .= '(' . implode(', ',$args) . ')'
. '</td>' . '</td>'
. '<td>' . $v['file'] . ':' . $v['line'] . '</td></tr>' . "\n"; . '<td>' . (isset($v['file']) ? $v['file'] : 'unknown')
. ':' . (isset($v['line']) ? $v['line'] : 'unknown')
. '</td></tr>' . "\n";
} }
$html .= '<tr><td align="center">' . ($k+1) . '</td>' $html .= '<tr><td style="text-align: center;">' . ($k+1) . '</td>'
. '<td>{main}</td>' . '<td>{main}</td>'
. '<td>&nbsp;</td></tr>' . "\n" . '<td>&nbsp;</td></tr>' . "\n"
. '</table>'; . '</table>';
@ -355,5 +387,3 @@ class PEAR_Exception extends Exception
return $causeMsg . $this->getTraceAsString(); return $causeMsg . $this->getTraceAsString();
} }
} }
?>

7
3rdparty/PEAR/FixPHP5PEARWarnings.php vendored Normal file
View File

@ -0,0 +1,7 @@
<?php
if ($skipmsg) {
$a = &new $ec($code, $mode, $options, $userinfo);
} else {
$a = &new $ec($message, $code, $mode, $options, $userinfo);
}
?>

228
3rdparty/PEAR/Frontend.php vendored Normal file
View File

@ -0,0 +1,228 @@
<?php
/**
* PEAR_Frontend, the singleton-based frontend for user input/output
*
* PHP versions 4 and 5
*
* @category pear
* @package PEAR
* @author Greg Beaver <cellog@php.net>
* @copyright 1997-2009 The Authors
* @license http://opensource.org/licenses/bsd-license.php New BSD License
* @version CVS: $Id: Frontend.php 313023 2011-07-06 19:17:11Z dufuz $
* @link http://pear.php.net/package/PEAR
* @since File available since Release 1.4.0a1
*/
/**
* Include error handling
*/
//require_once 'PEAR.php';
/**
* Which user interface class is being used.
* @var string class name
*/
$GLOBALS['_PEAR_FRONTEND_CLASS'] = 'PEAR_Frontend_CLI';
/**
* Instance of $_PEAR_Command_uiclass.
* @var object
*/
$GLOBALS['_PEAR_FRONTEND_SINGLETON'] = null;
/**
* Singleton-based frontend for PEAR user input/output
*
* @category pear
* @package PEAR
* @author Greg Beaver <cellog@php.net>
* @copyright 1997-2009 The Authors
* @license http://opensource.org/licenses/bsd-license.php New BSD License
* @version Release: 1.9.4
* @link http://pear.php.net/package/PEAR
* @since Class available since Release 1.4.0a1
*/
class PEAR_Frontend extends PEAR
{
/**
* Retrieve the frontend object
* @return PEAR_Frontend_CLI|PEAR_Frontend_Web|PEAR_Frontend_Gtk
* @static
*/
function &singleton($type = null)
{
if ($type === null) {
if (!isset($GLOBALS['_PEAR_FRONTEND_SINGLETON'])) {
$a = false;
return $a;
}
return $GLOBALS['_PEAR_FRONTEND_SINGLETON'];
}
$a = PEAR_Frontend::setFrontendClass($type);
return $a;
}
/**
* Set the frontend class that will be used by calls to {@link singleton()}
*
* Frontends are expected to conform to the PEAR naming standard of
* _ => DIRECTORY_SEPARATOR (PEAR_Frontend_CLI is in PEAR/Frontend/CLI.php)
* @param string $uiclass full class name
* @return PEAR_Frontend
* @static
*/
function &setFrontendClass($uiclass)
{
if (is_object($GLOBALS['_PEAR_FRONTEND_SINGLETON']) &&
is_a($GLOBALS['_PEAR_FRONTEND_SINGLETON'], $uiclass)) {
return $GLOBALS['_PEAR_FRONTEND_SINGLETON'];
}
if (!class_exists($uiclass)) {
$file = str_replace('_', '/', $uiclass) . '.php';
if (PEAR_Frontend::isIncludeable($file)) {
include_once $file;
}
}
if (class_exists($uiclass)) {
$obj = &new $uiclass;
// quick test to see if this class implements a few of the most
// important frontend methods
if (is_a($obj, 'PEAR_Frontend')) {
$GLOBALS['_PEAR_FRONTEND_SINGLETON'] = &$obj;
$GLOBALS['_PEAR_FRONTEND_CLASS'] = $uiclass;
return $obj;
}
$err = PEAR::raiseError("not a frontend class: $uiclass");
return $err;
}
$err = PEAR::raiseError("no such class: $uiclass");
return $err;
}
/**
* Set the frontend class that will be used by calls to {@link singleton()}
*
* Frontends are expected to be a descendant of PEAR_Frontend
* @param PEAR_Frontend
* @return PEAR_Frontend
* @static
*/
function &setFrontendObject($uiobject)
{
if (is_object($GLOBALS['_PEAR_FRONTEND_SINGLETON']) &&
is_a($GLOBALS['_PEAR_FRONTEND_SINGLETON'], get_class($uiobject))) {
return $GLOBALS['_PEAR_FRONTEND_SINGLETON'];
}
if (!is_a($uiobject, 'PEAR_Frontend')) {
$err = PEAR::raiseError('not a valid frontend class: (' .
get_class($uiobject) . ')');
return $err;
}
$GLOBALS['_PEAR_FRONTEND_SINGLETON'] = &$uiobject;
$GLOBALS['_PEAR_FRONTEND_CLASS'] = get_class($uiobject);
return $uiobject;
}
/**
* @param string $path relative or absolute include path
* @return boolean
* @static
*/
function isIncludeable($path)
{
if (file_exists($path) && is_readable($path)) {
return true;
}
$fp = @fopen($path, 'r', true);
if ($fp) {
fclose($fp);
return true;
}
return false;
}
/**
* @param PEAR_Config
*/
function setConfig(&$config)
{
}
/**
* This can be overridden to allow session-based temporary file management
*
* By default, all files are deleted at the end of a session. The web installer
* needs to be able to sustain a list over many sessions in order to support
* user interaction with install scripts
*/
function addTempFile($file)
{
$GLOBALS['_PEAR_Common_tempfiles'][] = $file;
}
/**
* Log an action
*
* @param string $msg the message to log
* @param boolean $append_crlf
* @return boolean true
* @abstract
*/
function log($msg, $append_crlf = true)
{
}
/**
* Run a post-installation script
*
* @param array $scripts array of post-install scripts
* @abstract
*/
function runPostinstallScripts(&$scripts)
{
}
/**
* Display human-friendly output formatted depending on the
* $command parameter.
*
* This should be able to handle basic output data with no command
* @param mixed $data data structure containing the information to display
* @param string $command command from which this method was called
* @abstract
*/
function outputData($data, $command = '_default')
{
}
/**
* Display a modal form dialog and return the given input
*
* A frontend that requires multiple requests to retrieve and process
* data must take these needs into account, and implement the request
* handling code.
* @param string $command command from which this method was called
* @param array $prompts associative array. keys are the input field names
* and values are the description
* @param array $types array of input field types (text, password,
* etc.) keys have to be the same like in $prompts
* @param array $defaults array of default values. again keys have
* to be the same like in $prompts. Do not depend
* on a default value being set.
* @return array input sent by the user
* @abstract
*/
function userDialog($command, $prompts, $types = array(), $defaults = array())
{
}
}

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

276
3rdparty/PEAR/Installer/Role.php vendored Normal file
View File

@ -0,0 +1,276 @@
<?php
/**
* PEAR_Installer_Role
*
* PHP versions 4 and 5
*
* @category pear
* @package PEAR
* @author Greg Beaver <cellog@php.net>
* @copyright 1997-2009 The Authors
* @license http://opensource.org/licenses/bsd-license.php New BSD License
* @version CVS: $Id: Role.php 313023 2011-07-06 19:17:11Z dufuz $
* @link http://pear.php.net/package/PEAR
* @since File available since Release 1.4.0a1
*/
/**
* base class for installer roles
*/
require_once 'PEAR/Installer/Role/Common.php';
require_once 'PEAR/XMLParser.php';
/**
* @category pear
* @package PEAR
* @author Greg Beaver <cellog@php.net>
* @copyright 1997-2009 The Authors
* @license http://opensource.org/licenses/bsd-license.php New BSD License
* @version Release: 1.9.4
* @link http://pear.php.net/package/PEAR
* @since Class available since Release 1.4.0a1
*/
class PEAR_Installer_Role
{
/**
* Set up any additional configuration variables that file roles require
*
* Never call this directly, it is called by the PEAR_Config constructor
* @param PEAR_Config
* @access private
* @static
*/
function initializeConfig(&$config)
{
if (!isset($GLOBALS['_PEAR_INSTALLER_ROLES'])) {
PEAR_Installer_Role::registerRoles();
}
foreach ($GLOBALS['_PEAR_INSTALLER_ROLES'] as $class => $info) {
if (!$info['config_vars']) {
continue;
}
$config->_addConfigVars($class, $info['config_vars']);
}
}
/**
* @param PEAR_PackageFile_v2
* @param string role name
* @param PEAR_Config
* @return PEAR_Installer_Role_Common
* @static
*/
function &factory($pkg, $role, &$config)
{
if (!isset($GLOBALS['_PEAR_INSTALLER_ROLES'])) {
PEAR_Installer_Role::registerRoles();
}
if (!in_array($role, PEAR_Installer_Role::getValidRoles($pkg->getPackageType()))) {
$a = false;
return $a;
}
$a = 'PEAR_Installer_Role_' . ucfirst($role);
if (!class_exists($a)) {
require_once str_replace('_', '/', $a) . '.php';
}
$b = new $a($config);
return $b;
}
/**
* Get a list of file roles that are valid for the particular release type.
*
* For instance, src files serve no purpose in regular php releases.
* @param string
* @param bool clear cache
* @return array
* @static
*/
function getValidRoles($release, $clear = false)
{
if (!isset($GLOBALS['_PEAR_INSTALLER_ROLES'])) {
PEAR_Installer_Role::registerRoles();
}
static $ret = array();
if ($clear) {
$ret = array();
}
if (isset($ret[$release])) {
return $ret[$release];
}
$ret[$release] = array();
foreach ($GLOBALS['_PEAR_INSTALLER_ROLES'] as $role => $okreleases) {
if (in_array($release, $okreleases['releasetypes'])) {
$ret[$release][] = strtolower(str_replace('PEAR_Installer_Role_', '', $role));
}
}
return $ret[$release];
}
/**
* Get a list of roles that require their files to be installed
*
* Most roles must be installed, but src and package roles, for instance
* are pseudo-roles. src files are compiled into a new extension. Package
* roles are actually fully bundled releases of a package
* @param bool clear cache
* @return array
* @static
*/
function getInstallableRoles($clear = false)
{
if (!isset($GLOBALS['_PEAR_INSTALLER_ROLES'])) {
PEAR_Installer_Role::registerRoles();
}
static $ret;
if ($clear) {
unset($ret);
}
if (isset($ret)) {
return $ret;
}
$ret = array();
foreach ($GLOBALS['_PEAR_INSTALLER_ROLES'] as $role => $okreleases) {
if ($okreleases['installable']) {
$ret[] = strtolower(str_replace('PEAR_Installer_Role_', '', $role));
}
}
return $ret;
}
/**
* Return an array of roles that are affected by the baseinstalldir attribute
*
* Most roles ignore this attribute, and instead install directly into:
* PackageName/filepath
* so a tests file tests/file.phpt is installed into PackageName/tests/filepath.php
* @param bool clear cache
* @return array
* @static
*/
function getBaseinstallRoles($clear = false)
{
if (!isset($GLOBALS['_PEAR_INSTALLER_ROLES'])) {
PEAR_Installer_Role::registerRoles();
}
static $ret;
if ($clear) {
unset($ret);
}
if (isset($ret)) {
return $ret;
}
$ret = array();
foreach ($GLOBALS['_PEAR_INSTALLER_ROLES'] as $role => $okreleases) {
if ($okreleases['honorsbaseinstall']) {
$ret[] = strtolower(str_replace('PEAR_Installer_Role_', '', $role));
}
}
return $ret;
}
/**
* Return an array of file roles that should be analyzed for PHP content at package time,
* like the "php" role.
* @param bool clear cache
* @return array
* @static
*/
function getPhpRoles($clear = false)
{
if (!isset($GLOBALS['_PEAR_INSTALLER_ROLES'])) {
PEAR_Installer_Role::registerRoles();
}
static $ret;
if ($clear) {
unset($ret);
}
if (isset($ret)) {
return $ret;
}
$ret = array();
foreach ($GLOBALS['_PEAR_INSTALLER_ROLES'] as $role => $okreleases) {
if ($okreleases['phpfile']) {
$ret[] = strtolower(str_replace('PEAR_Installer_Role_', '', $role));
}
}
return $ret;
}
/**
* Scan through the Command directory looking for classes
* and see what commands they implement.
* @param string which directory to look for classes, defaults to
* the Installer/Roles subdirectory of
* the directory from where this file (__FILE__) is
* included.
*
* @return bool TRUE on success, a PEAR error on failure
* @access public
* @static
*/
function registerRoles($dir = null)
{
$GLOBALS['_PEAR_INSTALLER_ROLES'] = array();
$parser = new PEAR_XMLParser;
if ($dir === null) {
$dir = dirname(__FILE__) . '/Role';
}
if (!file_exists($dir) || !is_dir($dir)) {
return PEAR::raiseError("registerRoles: opendir($dir) failed: does not exist/is not directory");
}
$dp = @opendir($dir);
if (empty($dp)) {
return PEAR::raiseError("registerRoles: opendir($dir) failed: $php_errmsg");
}
while ($entry = readdir($dp)) {
if ($entry{0} == '.' || substr($entry, -4) != '.xml') {
continue;
}
$class = "PEAR_Installer_Role_".substr($entry, 0, -4);
// List of roles
if (!isset($GLOBALS['_PEAR_INSTALLER_ROLES'][$class])) {
$file = "$dir/$entry";
$parser->parse(file_get_contents($file));
$data = $parser->getData();
if (!is_array($data['releasetypes'])) {
$data['releasetypes'] = array($data['releasetypes']);
}
$GLOBALS['_PEAR_INSTALLER_ROLES'][$class] = $data;
}
}
closedir($dp);
ksort($GLOBALS['_PEAR_INSTALLER_ROLES']);
PEAR_Installer_Role::getBaseinstallRoles(true);
PEAR_Installer_Role::getInstallableRoles(true);
PEAR_Installer_Role::getPhpRoles(true);
PEAR_Installer_Role::getValidRoles('****', true);
return true;
}
}

106
3rdparty/PEAR/Installer/Role/Cfg.php vendored Normal file
View File

@ -0,0 +1,106 @@
<?php
/**
* PEAR_Installer_Role_Cfg
*
* PHP versions 4 and 5
*
* @category pear
* @package PEAR
* @author Greg Beaver <cellog@php.net>
* @copyright 2007-2009 The Authors
* @license http://opensource.org/licenses/bsd-license.php New BSD License
* @version CVS: $Id: Cfg.php 313023 2011-07-06 19:17:11Z dufuz $
* @link http://pear.php.net/package/PEAR
* @since File available since Release 1.7.0
*/
/**
* @category pear
* @package PEAR
* @author Greg Beaver <cellog@php.net>
* @copyright 2007-2009 The Authors
* @license http://opensource.org/licenses/bsd-license.php New BSD License
* @version Release: 1.9.4
* @link http://pear.php.net/package/PEAR
* @since Class available since Release 1.7.0
*/
class PEAR_Installer_Role_Cfg extends PEAR_Installer_Role_Common
{
/**
* @var PEAR_Installer
*/
var $installer;
/**
* the md5 of the original file
*
* @var unknown_type
*/
var $md5 = null;
/**
* Do any unusual setup here
* @param PEAR_Installer
* @param PEAR_PackageFile_v2
* @param array file attributes
* @param string file name
*/
function setup(&$installer, $pkg, $atts, $file)
{
$this->installer = &$installer;
$reg = &$this->installer->config->getRegistry();
$package = $reg->getPackage($pkg->getPackage(), $pkg->getChannel());
if ($package) {
$filelist = $package->getFilelist();
if (isset($filelist[$file]) && isset($filelist[$file]['md5sum'])) {
$this->md5 = $filelist[$file]['md5sum'];
}
}
}
function processInstallation($pkg, $atts, $file, $tmp_path, $layer = null)
{
$test = parent::processInstallation($pkg, $atts, $file, $tmp_path, $layer);
if (@file_exists($test[2]) && @file_exists($test[3])) {
$md5 = md5_file($test[2]);
// configuration has already been installed, check for mods
if ($md5 !== $this->md5 && $md5 !== md5_file($test[3])) {
// configuration has been modified, so save our version as
// configfile-version
$old = $test[2];
$test[2] .= '.new-' . $pkg->getVersion();
// backup original and re-install it
PEAR::pushErrorHandling(PEAR_ERROR_RETURN);
$tmpcfg = $this->config->get('temp_dir');
$newloc = System::mkdir(array('-p', $tmpcfg));
if (!$newloc) {
// try temp_dir
$newloc = System::mktemp(array('-d'));
if (!$newloc || PEAR::isError($newloc)) {
PEAR::popErrorHandling();
return PEAR::raiseError('Could not save existing configuration file '.
$old . ', unable to install. Please set temp_dir ' .
'configuration variable to a writeable location and try again');
}
} else {
$newloc = $tmpcfg;
}
$temp_file = $newloc . DIRECTORY_SEPARATOR . uniqid('savefile');
if (!@copy($old, $temp_file)) {
PEAR::popErrorHandling();
return PEAR::raiseError('Could not save existing configuration file '.
$old . ', unable to install. Please set temp_dir ' .
'configuration variable to a writeable location and try again');
}
PEAR::popErrorHandling();
$this->installer->log(0, "WARNING: configuration file $old is being installed as $test[2], you should manually merge in changes to the existing configuration file");
$this->installer->addFileOperation('rename', array($temp_file, $old, false));
$this->installer->addFileOperation('delete', array($temp_file));
}
}
return $test;
}
}

15
3rdparty/PEAR/Installer/Role/Cfg.xml vendored Normal file
View File

@ -0,0 +1,15 @@
<role version="1.0">
<releasetypes>php</releasetypes>
<releasetypes>extsrc</releasetypes>
<releasetypes>extbin</releasetypes>
<releasetypes>zendextsrc</releasetypes>
<releasetypes>zendextbin</releasetypes>
<installable>1</installable>
<locationconfig>cfg_dir</locationconfig>
<honorsbaseinstall />
<unusualbaseinstall>1</unusualbaseinstall>
<phpfile />
<executable />
<phpextension />
<config_vars />
</role>

174
3rdparty/PEAR/Installer/Role/Common.php vendored Normal file
View File

@ -0,0 +1,174 @@
<?php
/**
* Base class for all installation roles.
*
* PHP versions 4 and 5
*
* @category pear
* @package PEAR
* @author Greg Beaver <cellog@php.net>
* @copyright 1997-2006 The PHP Group
* @license http://opensource.org/licenses/bsd-license.php New BSD License
* @version CVS: $Id: Common.php 313023 2011-07-06 19:17:11Z dufuz $
* @link http://pear.php.net/package/PEAR
* @since File available since Release 1.4.0a1
*/
/**
* Base class for all installation roles.
*
* This class allows extensibility of file roles. Packages with complex
* customization can now provide custom file roles along with the possibility of
* adding configuration values to match.
* @category pear
* @package PEAR
* @author Greg Beaver <cellog@php.net>
* @copyright 1997-2006 The PHP Group
* @license http://opensource.org/licenses/bsd-license.php New BSD License
* @version Release: 1.9.4
* @link http://pear.php.net/package/PEAR
* @since Class available since Release 1.4.0a1
*/
class PEAR_Installer_Role_Common
{
/**
* @var PEAR_Config
* @access protected
*/
var $config;
/**
* @param PEAR_Config
*/
function PEAR_Installer_Role_Common(&$config)
{
$this->config = $config;
}
/**
* Retrieve configuration information about a file role from its XML info
*
* @param string $role Role Classname, as in "PEAR_Installer_Role_Data"
* @return array
*/
function getInfo($role)
{
if (empty($GLOBALS['_PEAR_INSTALLER_ROLES'][$role])) {
return PEAR::raiseError('Unknown Role class: "' . $role . '"');
}
return $GLOBALS['_PEAR_INSTALLER_ROLES'][$role];
}
/**
* This is called for each file to set up the directories and files
* @param PEAR_PackageFile_v1|PEAR_PackageFile_v2
* @param array attributes from the <file> tag
* @param string file name
* @return array an array consisting of:
*
* 1 the original, pre-baseinstalldir installation directory
* 2 the final installation directory
* 3 the full path to the final location of the file
* 4 the location of the pre-installation file
*/
function processInstallation($pkg, $atts, $file, $tmp_path, $layer = null)
{
$roleInfo = PEAR_Installer_Role_Common::getInfo('PEAR_Installer_Role_' .
ucfirst(str_replace('pear_installer_role_', '', strtolower(get_class($this)))));
if (PEAR::isError($roleInfo)) {
return $roleInfo;
}
if (!$roleInfo['locationconfig']) {
return false;
}
if ($roleInfo['honorsbaseinstall']) {
$dest_dir = $save_destdir = $this->config->get($roleInfo['locationconfig'], $layer,
$pkg->getChannel());
if (!empty($atts['baseinstalldir'])) {
$dest_dir .= DIRECTORY_SEPARATOR . $atts['baseinstalldir'];
}
} elseif ($roleInfo['unusualbaseinstall']) {
$dest_dir = $save_destdir = $this->config->get($roleInfo['locationconfig'],
$layer, $pkg->getChannel()) . DIRECTORY_SEPARATOR . $pkg->getPackage();
if (!empty($atts['baseinstalldir'])) {
$dest_dir .= DIRECTORY_SEPARATOR . $atts['baseinstalldir'];
}
} else {
$dest_dir = $save_destdir = $this->config->get($roleInfo['locationconfig'],
$layer, $pkg->getChannel()) . DIRECTORY_SEPARATOR . $pkg->getPackage();
}
if (dirname($file) != '.' && empty($atts['install-as'])) {
$dest_dir .= DIRECTORY_SEPARATOR . dirname($file);
}
if (empty($atts['install-as'])) {
$dest_file = $dest_dir . DIRECTORY_SEPARATOR . basename($file);
} else {
$dest_file = $dest_dir . DIRECTORY_SEPARATOR . $atts['install-as'];
}
$orig_file = $tmp_path . DIRECTORY_SEPARATOR . $file;
// Clean up the DIRECTORY_SEPARATOR mess
$ds2 = DIRECTORY_SEPARATOR . DIRECTORY_SEPARATOR;
list($dest_dir, $dest_file, $orig_file) = preg_replace(array('!\\\\+!', '!/!', "!$ds2+!"),
array(DIRECTORY_SEPARATOR, DIRECTORY_SEPARATOR,
DIRECTORY_SEPARATOR),
array($dest_dir, $dest_file, $orig_file));
return array($save_destdir, $dest_dir, $dest_file, $orig_file);
}
/**
* Get the name of the configuration variable that specifies the location of this file
* @return string|false
*/
function getLocationConfig()
{
$roleInfo = PEAR_Installer_Role_Common::getInfo('PEAR_Installer_Role_' .
ucfirst(str_replace('pear_installer_role_', '', strtolower(get_class($this)))));
if (PEAR::isError($roleInfo)) {
return $roleInfo;
}
return $roleInfo['locationconfig'];
}
/**
* Do any unusual setup here
* @param PEAR_Installer
* @param PEAR_PackageFile_v2
* @param array file attributes
* @param string file name
*/
function setup(&$installer, $pkg, $atts, $file)
{
}
function isExecutable()
{
$roleInfo = PEAR_Installer_Role_Common::getInfo('PEAR_Installer_Role_' .
ucfirst(str_replace('pear_installer_role_', '', strtolower(get_class($this)))));
if (PEAR::isError($roleInfo)) {
return $roleInfo;
}
return $roleInfo['executable'];
}
function isInstallable()
{
$roleInfo = PEAR_Installer_Role_Common::getInfo('PEAR_Installer_Role_' .
ucfirst(str_replace('pear_installer_role_', '', strtolower(get_class($this)))));
if (PEAR::isError($roleInfo)) {
return $roleInfo;
}
return $roleInfo['installable'];
}
function isExtension()
{
$roleInfo = PEAR_Installer_Role_Common::getInfo('PEAR_Installer_Role_' .
ucfirst(str_replace('pear_installer_role_', '', strtolower(get_class($this)))));
if (PEAR::isError($roleInfo)) {
return $roleInfo;
}
return $roleInfo['phpextension'];
}
}
?>

28
3rdparty/PEAR/Installer/Role/Data.php vendored Normal file
View File

@ -0,0 +1,28 @@
<?php
/**
* PEAR_Installer_Role_Data
*
* PHP versions 4 and 5
*
* @category pear
* @package PEAR
* @author Greg Beaver <cellog@php.net>
* @copyright 1997-2009 The Authors
* @license http://opensource.org/licenses/bsd-license.php New BSD License
* @version CVS: $Id: Data.php 313023 2011-07-06 19:17:11Z dufuz $
* @link http://pear.php.net/package/PEAR
* @since File available since Release 1.4.0a1
*/
/**
* @category pear
* @package PEAR
* @author Greg Beaver <cellog@php.net>
* @copyright 1997-2009 The Authors
* @license http://opensource.org/licenses/bsd-license.php New BSD License
* @version Release: 1.9.4
* @link http://pear.php.net/package/PEAR
* @since Class available since Release 1.4.0a1
*/
class PEAR_Installer_Role_Data extends PEAR_Installer_Role_Common {}
?>

15
3rdparty/PEAR/Installer/Role/Data.xml vendored Normal file
View File

@ -0,0 +1,15 @@
<role version="1.0">
<releasetypes>php</releasetypes>
<releasetypes>extsrc</releasetypes>
<releasetypes>extbin</releasetypes>
<releasetypes>zendextsrc</releasetypes>
<releasetypes>zendextbin</releasetypes>
<installable>1</installable>
<locationconfig>data_dir</locationconfig>
<honorsbaseinstall />
<unusualbaseinstall />
<phpfile />
<executable />
<phpextension />
<config_vars />
</role>

28
3rdparty/PEAR/Installer/Role/Doc.php vendored Normal file
View File

@ -0,0 +1,28 @@
<?php
/**
* PEAR_Installer_Role_Doc
*
* PHP versions 4 and 5
*
* @category pear
* @package PEAR
* @author Greg Beaver <cellog@php.net>
* @copyright 1997-2009 The Authors
* @license http://opensource.org/licenses/bsd-license.php New BSD License
* @version CVS: $Id: Doc.php 313023 2011-07-06 19:17:11Z dufuz $
* @link http://pear.php.net/package/PEAR
* @since File available since Release 1.4.0a1
*/
/**
* @category pear
* @package PEAR
* @author Greg Beaver <cellog@php.net>
* @copyright 1997-2009 The Authors
* @license http://opensource.org/licenses/bsd-license.php New BSD License
* @version Release: 1.9.4
* @link http://pear.php.net/package/PEAR
* @since Class available since Release 1.4.0a1
*/
class PEAR_Installer_Role_Doc extends PEAR_Installer_Role_Common {}
?>

15
3rdparty/PEAR/Installer/Role/Doc.xml vendored Normal file
View File

@ -0,0 +1,15 @@
<role version="1.0">
<releasetypes>php</releasetypes>
<releasetypes>extsrc</releasetypes>
<releasetypes>extbin</releasetypes>
<releasetypes>zendextsrc</releasetypes>
<releasetypes>zendextbin</releasetypes>
<installable>1</installable>
<locationconfig>doc_dir</locationconfig>
<honorsbaseinstall />
<unusualbaseinstall />
<phpfile />
<executable />
<phpextension />
<config_vars />
</role>

28
3rdparty/PEAR/Installer/Role/Ext.php vendored Normal file
View File

@ -0,0 +1,28 @@
<?php
/**
* PEAR_Installer_Role_Ext
*
* PHP versions 4 and 5
*
* @category pear
* @package PEAR
* @author Greg Beaver <cellog@php.net>
* @copyright 1997-2009 The Authors
* @license http://opensource.org/licenses/bsd-license.php New BSD License
* @version CVS: $Id: Ext.php 313023 2011-07-06 19:17:11Z dufuz $
* @link http://pear.php.net/package/PEAR
* @since File available since Release 1.4.0a1
*/
/**
* @category pear
* @package PEAR
* @author Greg Beaver <cellog@php.net>
* @copyright 1997-2009 The Authors
* @license http://opensource.org/licenses/bsd-license.php New BSD License
* @version Release: 1.9.4
* @link http://pear.php.net/package/PEAR
* @since Class available since Release 1.4.0a1
*/
class PEAR_Installer_Role_Ext extends PEAR_Installer_Role_Common {}
?>

12
3rdparty/PEAR/Installer/Role/Ext.xml vendored Normal file
View File

@ -0,0 +1,12 @@
<role version="1.0">
<releasetypes>extbin</releasetypes>
<releasetypes>zendextbin</releasetypes>
<installable>1</installable>
<locationconfig>ext_dir</locationconfig>
<honorsbaseinstall>1</honorsbaseinstall>
<unusualbaseinstall />
<phpfile />
<executable />
<phpextension>1</phpextension>
<config_vars />
</role>

28
3rdparty/PEAR/Installer/Role/Php.php vendored Normal file
View File

@ -0,0 +1,28 @@
<?php
/**
* PEAR_Installer_Role_Php
*
* PHP versions 4 and 5
*
* @category pear
* @package PEAR
* @author Greg Beaver <cellog@php.net>
* @copyright 1997-2009 The Authors
* @license http://opensource.org/licenses/bsd-license.php New BSD License
* @version CVS: $Id: Php.php 313023 2011-07-06 19:17:11Z dufuz $
* @link http://pear.php.net/package/PEAR
* @since File available since Release 1.4.0a1
*/
/**
* @category pear
* @package PEAR
* @author Greg Beaver <cellog@php.net>
* @copyright 1997-2009 The Authors
* @license http://opensource.org/licenses/bsd-license.php New BSD License
* @version Release: 1.9.4
* @link http://pear.php.net/package/PEAR
* @since Class available since Release 1.4.0a1
*/
class PEAR_Installer_Role_Php extends PEAR_Installer_Role_Common {}
?>

15
3rdparty/PEAR/Installer/Role/Php.xml vendored Normal file
View File

@ -0,0 +1,15 @@
<role version="1.0">
<releasetypes>php</releasetypes>
<releasetypes>extsrc</releasetypes>
<releasetypes>extbin</releasetypes>
<releasetypes>zendextsrc</releasetypes>
<releasetypes>zendextbin</releasetypes>
<installable>1</installable>
<locationconfig>php_dir</locationconfig>
<honorsbaseinstall>1</honorsbaseinstall>
<unusualbaseinstall />
<phpfile>1</phpfile>
<executable />
<phpextension />
<config_vars />
</role>

28
3rdparty/PEAR/Installer/Role/Script.php vendored Normal file
View File

@ -0,0 +1,28 @@
<?php
/**
* PEAR_Installer_Role_Script
*
* PHP versions 4 and 5
*
* @category pear
* @package PEAR
* @author Greg Beaver <cellog@php.net>
* @copyright 1997-2009 The Authors
* @license http://opensource.org/licenses/bsd-license.php New BSD License
* @version CVS: $Id: Script.php 313023 2011-07-06 19:17:11Z dufuz $
* @link http://pear.php.net/package/PEAR
* @since File available since Release 1.4.0a1
*/
/**
* @category pear
* @package PEAR
* @author Greg Beaver <cellog@php.net>
* @copyright 1997-2009 The Authors
* @license http://opensource.org/licenses/bsd-license.php New BSD License
* @version Release: 1.9.4
* @link http://pear.php.net/package/PEAR
* @since Class available since Release 1.4.0a1
*/
class PEAR_Installer_Role_Script extends PEAR_Installer_Role_Common {}
?>

15
3rdparty/PEAR/Installer/Role/Script.xml vendored Normal file
View File

@ -0,0 +1,15 @@
<role version="1.0">
<releasetypes>php</releasetypes>
<releasetypes>extsrc</releasetypes>
<releasetypes>extbin</releasetypes>
<releasetypes>zendextsrc</releasetypes>
<releasetypes>zendextbin</releasetypes>
<installable>1</installable>
<locationconfig>bin_dir</locationconfig>
<honorsbaseinstall>1</honorsbaseinstall>
<unusualbaseinstall />
<phpfile />
<executable>1</executable>
<phpextension />
<config_vars />
</role>

34
3rdparty/PEAR/Installer/Role/Src.php vendored Normal file
View File

@ -0,0 +1,34 @@
<?php
/**
* PEAR_Installer_Role_Src
*
* PHP versions 4 and 5
*
* @category pear
* @package PEAR
* @author Greg Beaver <cellog@php.net>
* @copyright 1997-2009 The Authors
* @license http://opensource.org/licenses/bsd-license.php New BSD License
* @version CVS: $Id: Src.php 313023 2011-07-06 19:17:11Z dufuz $
* @link http://pear.php.net/package/PEAR
* @since File available since Release 1.4.0a1
*/
/**
* @category pear
* @package PEAR
* @author Greg Beaver <cellog@php.net>
* @copyright 1997-2009 The Authors
* @license http://opensource.org/licenses/bsd-license.php New BSD License
* @version Release: 1.9.4
* @link http://pear.php.net/package/PEAR
* @since Class available since Release 1.4.0a1
*/
class PEAR_Installer_Role_Src extends PEAR_Installer_Role_Common
{
function setup(&$installer, $pkg, $atts, $file)
{
$installer->source_files++;
}
}
?>

12
3rdparty/PEAR/Installer/Role/Src.xml vendored Normal file
View File

@ -0,0 +1,12 @@
<role version="1.0">
<releasetypes>extsrc</releasetypes>
<releasetypes>zendextsrc</releasetypes>
<installable>1</installable>
<locationconfig>temp_dir</locationconfig>
<honorsbaseinstall />
<unusualbaseinstall />
<phpfile />
<executable />
<phpextension />
<config_vars />
</role>

28
3rdparty/PEAR/Installer/Role/Test.php vendored Normal file
View File

@ -0,0 +1,28 @@
<?php
/**
* PEAR_Installer_Role_Test
*
* PHP versions 4 and 5
*
* @category pear
* @package PEAR
* @author Greg Beaver <cellog@php.net>
* @copyright 1997-2009 The Authors
* @license http://opensource.org/licenses/bsd-license.php New BSD License
* @version CVS: $Id: Test.php 313023 2011-07-06 19:17:11Z dufuz $
* @link http://pear.php.net/package/PEAR
* @since File available since Release 1.4.0a1
*/
/**
* @category pear
* @package PEAR
* @author Greg Beaver <cellog@php.net>
* @copyright 1997-2009 The Authors
* @license http://opensource.org/licenses/bsd-license.php New BSD License
* @version Release: 1.9.4
* @link http://pear.php.net/package/PEAR
* @since Class available since Release 1.4.0a1
*/
class PEAR_Installer_Role_Test extends PEAR_Installer_Role_Common {}
?>

15
3rdparty/PEAR/Installer/Role/Test.xml vendored Normal file
View File

@ -0,0 +1,15 @@
<role version="1.0">
<releasetypes>php</releasetypes>
<releasetypes>extsrc</releasetypes>
<releasetypes>extbin</releasetypes>
<releasetypes>zendextsrc</releasetypes>
<releasetypes>zendextbin</releasetypes>
<installable>1</installable>
<locationconfig>test_dir</locationconfig>
<honorsbaseinstall />
<unusualbaseinstall />
<phpfile />
<executable />
<phpextension />
<config_vars />
</role>

28
3rdparty/PEAR/Installer/Role/Www.php vendored Normal file
View File

@ -0,0 +1,28 @@
<?php
/**
* PEAR_Installer_Role_Www
*
* PHP versions 4 and 5
*
* @category pear
* @package PEAR
* @author Greg Beaver <cellog@php.net>
* @copyright 2007-2009 The Authors
* @license http://opensource.org/licenses/bsd-license.php New BSD License
* @version CVS: $Id: Www.php 313023 2011-07-06 19:17:11Z dufuz $
* @link http://pear.php.net/package/PEAR
* @since File available since Release 1.7.0
*/
/**
* @category pear
* @package PEAR
* @author Greg Beaver <cellog@php.net>
* @copyright 2007-2009 The Authors
* @license http://opensource.org/licenses/bsd-license.php New BSD License
* @version Release: 1.9.4
* @link http://pear.php.net/package/PEAR
* @since Class available since Release 1.7.0
*/
class PEAR_Installer_Role_Www extends PEAR_Installer_Role_Common {}
?>

15
3rdparty/PEAR/Installer/Role/Www.xml vendored Normal file
View File

@ -0,0 +1,15 @@
<role version="1.0">
<releasetypes>php</releasetypes>
<releasetypes>extsrc</releasetypes>
<releasetypes>extbin</releasetypes>
<releasetypes>zendextsrc</releasetypes>
<releasetypes>zendextbin</releasetypes>
<installable>1</installable>
<locationconfig>www_dir</locationconfig>
<honorsbaseinstall>1</honorsbaseinstall>
<unusualbaseinstall />
<phpfile />
<executable />
<phpextension />
<config_vars />
</role>

492
3rdparty/PEAR/PackageFile.php vendored Normal file
View File

@ -0,0 +1,492 @@
<?php
/**
* PEAR_PackageFile, package.xml parsing utility class
*
* PHP versions 4 and 5
*
* @category pear
* @package PEAR
* @author Greg Beaver <cellog@php.net>
* @copyright 1997-2009 The Authors
* @license http://opensource.org/licenses/bsd-license.php New BSD License
* @version CVS: $Id: PackageFile.php 313024 2011-07-06 19:51:24Z dufuz $
* @link http://pear.php.net/package/PEAR
* @since File available since Release 1.4.0a1
*/
/**
* needed for PEAR_VALIDATE_* constants
*/
require_once 'PEAR/Validate.php';
/**
* Error code if the package.xml <package> tag does not contain a valid version
*/
define('PEAR_PACKAGEFILE_ERROR_NO_PACKAGEVERSION', 1);
/**
* Error code if the package.xml <package> tag version is not supported (version 1.0 and 1.1 are the only supported versions,
* currently
*/
define('PEAR_PACKAGEFILE_ERROR_INVALID_PACKAGEVERSION', 2);
/**
* Abstraction for the package.xml package description file
*
* @category pear
* @package PEAR
* @author Greg Beaver <cellog@php.net>
* @copyright 1997-2009 The Authors
* @license http://opensource.org/licenses/bsd-license.php New BSD License
* @version Release: 1.9.4
* @link http://pear.php.net/package/PEAR
* @since Class available since Release 1.4.0a1
*/
class PEAR_PackageFile
{
/**
* @var PEAR_Config
*/
var $_config;
var $_debug;
var $_logger = false;
/**
* @var boolean
*/
var $_rawReturn = false;
/**
* helper for extracting Archive_Tar errors
* @var array
* @access private
*/
var $_extractErrors = array();
/**
*
* @param PEAR_Config $config
* @param ? $debug
* @param string @tmpdir Optional temporary directory for uncompressing
* files
*/
function PEAR_PackageFile(&$config, $debug = false)
{
$this->_config = $config;
$this->_debug = $debug;
}
/**
* Turn off validation - return a parsed package.xml without checking it
*
* This is used by the package-validate command
*/
function rawReturn()
{
$this->_rawReturn = true;
}
function setLogger(&$l)
{
$this->_logger = &$l;
}
/**
* Create a PEAR_PackageFile_Parser_v* of a given version.
* @param int $version
* @return PEAR_PackageFile_Parser_v1|PEAR_PackageFile_Parser_v1
*/
function &parserFactory($version)
{
if (!in_array($version{0}, array('1', '2'))) {
$a = false;
return $a;
}
include_once 'PEAR/PackageFile/Parser/v' . $version{0} . '.php';
$version = $version{0};
$class = "PEAR_PackageFile_Parser_v$version";
$a = new $class;
return $a;
}
/**
* For simpler unit-testing
* @return string
*/
function getClassPrefix()
{
return 'PEAR_PackageFile_v';
}
/**
* Create a PEAR_PackageFile_v* of a given version.
* @param int $version
* @return PEAR_PackageFile_v1|PEAR_PackageFile_v1
*/
function &factory($version)
{
if (!in_array($version{0}, array('1', '2'))) {
$a = false;
return $a;
}
include_once 'PEAR/PackageFile/v' . $version{0} . '.php';
$version = $version{0};
$class = $this->getClassPrefix() . $version;
$a = new $class;
return $a;
}
/**
* Create a PEAR_PackageFile_v* from its toArray() method
*
* WARNING: no validation is performed, the array is assumed to be valid,
* always parse from xml if you want validation.
* @param array $arr
* @return PEAR_PackageFileManager_v1|PEAR_PackageFileManager_v2
* @uses factory() to construct the returned object.
*/
function &fromArray($arr)
{
if (isset($arr['xsdversion'])) {
$obj = &$this->factory($arr['xsdversion']);
if ($this->_logger) {
$obj->setLogger($this->_logger);
}
$obj->setConfig($this->_config);
$obj->fromArray($arr);
return $obj;
}
if (isset($arr['package']['attribs']['version'])) {
$obj = &$this->factory($arr['package']['attribs']['version']);
} else {
$obj = &$this->factory('1.0');
}
if ($this->_logger) {
$obj->setLogger($this->_logger);
}
$obj->setConfig($this->_config);
$obj->fromArray($arr);
return $obj;
}
/**
* Create a PEAR_PackageFile_v* from an XML string.
* @access public
* @param string $data contents of package.xml file
* @param int $state package state (one of PEAR_VALIDATE_* constants)
* @param string $file full path to the package.xml file (and the files
* it references)
* @param string $archive optional name of the archive that the XML was
* extracted from, if any
* @return PEAR_PackageFile_v1|PEAR_PackageFile_v2
* @uses parserFactory() to construct a parser to load the package.
*/
function &fromXmlString($data, $state, $file, $archive = false)
{
if (preg_match('/<package[^>]+version=[\'"]([0-9]+\.[0-9]+)[\'"]/', $data, $packageversion)) {
if (!in_array($packageversion[1], array('1.0', '2.0', '2.1'))) {
return PEAR::raiseError('package.xml version "' . $packageversion[1] .
'" is not supported, only 1.0, 2.0, and 2.1 are supported.');
}
$object = &$this->parserFactory($packageversion[1]);
if ($this->_logger) {
$object->setLogger($this->_logger);
}
$object->setConfig($this->_config);
$pf = $object->parse($data, $file, $archive);
if (PEAR::isError($pf)) {
return $pf;
}
if ($this->_rawReturn) {
return $pf;
}
if (!$pf->validate($state)) {;
if ($this->_config->get('verbose') > 0
&& $this->_logger && $pf->getValidationWarnings(false)
) {
foreach ($pf->getValidationWarnings(false) as $warning) {
$this->_logger->log(0, 'ERROR: ' . $warning['message']);
}
}
$a = PEAR::raiseError('Parsing of package.xml from file "' . $file . '" failed',
2, null, null, $pf->getValidationWarnings());
return $a;
}
if ($this->_logger && $pf->getValidationWarnings(false)) {
foreach ($pf->getValidationWarnings() as $warning) {
$this->_logger->log(0, 'WARNING: ' . $warning['message']);
}
}
if (method_exists($pf, 'flattenFilelist')) {
$pf->flattenFilelist(); // for v2
}
return $pf;
} elseif (preg_match('/<package[^>]+version=[\'"]([^"\']+)[\'"]/', $data, $packageversion)) {
$a = PEAR::raiseError('package.xml file "' . $file .
'" has unsupported package.xml <package> version "' . $packageversion[1] . '"');
return $a;
} else {
if (!class_exists('PEAR_ErrorStack')) {
require_once 'PEAR/ErrorStack.php';
}
PEAR_ErrorStack::staticPush('PEAR_PackageFile',
PEAR_PACKAGEFILE_ERROR_NO_PACKAGEVERSION,
'warning', array('xml' => $data), 'package.xml "' . $file .
'" has no package.xml <package> version');
$object = &$this->parserFactory('1.0');
$object->setConfig($this->_config);
$pf = $object->parse($data, $file, $archive);
if (PEAR::isError($pf)) {
return $pf;
}
if ($this->_rawReturn) {
return $pf;
}
if (!$pf->validate($state)) {
$a = PEAR::raiseError('Parsing of package.xml from file "' . $file . '" failed',
2, null, null, $pf->getValidationWarnings());
return $a;
}
if ($this->_logger && $pf->getValidationWarnings(false)) {
foreach ($pf->getValidationWarnings() as $warning) {
$this->_logger->log(0, 'WARNING: ' . $warning['message']);
}
}
if (method_exists($pf, 'flattenFilelist')) {
$pf->flattenFilelist(); // for v2
}
return $pf;
}
}
/**
* Register a temporary file or directory. When the destructor is
* executed, all registered temporary files and directories are
* removed.
*
* @param string $file name of file or directory
* @return void
*/
function addTempFile($file)
{
$GLOBALS['_PEAR_Common_tempfiles'][] = $file;
}
/**
* Create a PEAR_PackageFile_v* from a compresed Tar or Tgz file.
* @access public
* @param string contents of package.xml file
* @param int package state (one of PEAR_VALIDATE_* constants)
* @return PEAR_PackageFile_v1|PEAR_PackageFile_v2
* @using Archive_Tar to extract the files
* @using fromPackageFile() to load the package after the package.xml
* file is extracted.
*/
function &fromTgzFile($file, $state)
{
if (!class_exists('Archive_Tar')) {
require_once 'Archive/Tar.php';
}
$tar = new Archive_Tar($file);
if ($this->_debug <= 1) {
$tar->pushErrorHandling(PEAR_ERROR_RETURN);
}
$content = $tar->listContent();
if ($this->_debug <= 1) {
$tar->popErrorHandling();
}
if (!is_array($content)) {
if (is_string($file) && strlen($file < 255) &&
(!file_exists($file) || !@is_file($file))) {
$ret = PEAR::raiseError("could not open file \"$file\"");
return $ret;
}
$file = realpath($file);
$ret = PEAR::raiseError("Could not get contents of package \"$file\"".
'. Invalid tgz file.');
return $ret;
}
if (!count($content) && !@is_file($file)) {
$ret = PEAR::raiseError("could not open file \"$file\"");
return $ret;
}
$xml = null;
$origfile = $file;
foreach ($content as $file) {
$name = $file['filename'];
if ($name == 'package2.xml') { // allow a .tgz to distribute both versions
$xml = $name;
break;
}
if ($name == 'package.xml') {
$xml = $name;
break;
} elseif (preg_match('/package.xml$/', $name, $match)) {
$xml = $name;
break;
}
}
$tmpdir = System::mktemp('-t "' . $this->_config->get('temp_dir') . '" -d pear');
if ($tmpdir === false) {
$ret = PEAR::raiseError("there was a problem with getting the configured temp directory");
return $ret;
}
PEAR_PackageFile::addTempFile($tmpdir);
$this->_extractErrors();
PEAR::staticPushErrorHandling(PEAR_ERROR_CALLBACK, array($this, '_extractErrors'));
if (!$xml || !$tar->extractList(array($xml), $tmpdir)) {
$extra = implode("\n", $this->_extractErrors());
if ($extra) {
$extra = ' ' . $extra;
}
PEAR::staticPopErrorHandling();
$ret = PEAR::raiseError('could not extract the package.xml file from "' .
$origfile . '"' . $extra);
return $ret;
}
PEAR::staticPopErrorHandling();
$ret = &PEAR_PackageFile::fromPackageFile("$tmpdir/$xml", $state, $origfile);
return $ret;
}
/**
* helper callback for extracting Archive_Tar errors
*
* @param PEAR_Error|null $err
* @return array
* @access private
*/
function _extractErrors($err = null)
{
static $errors = array();
if ($err === null) {
$e = $errors;
$errors = array();
return $e;
}
$errors[] = $err->getMessage();
}
/**
* Create a PEAR_PackageFile_v* from a package.xml file.
*
* @access public
* @param string $descfile name of package xml file
* @param int $state package state (one of PEAR_VALIDATE_* constants)
* @param string|false $archive name of the archive this package.xml came
* from, if any
* @return PEAR_PackageFile_v1|PEAR_PackageFile_v2
* @uses PEAR_PackageFile::fromXmlString to create the oject after the
* XML is loaded from the package.xml file.
*/
function &fromPackageFile($descfile, $state, $archive = false)
{
$fp = false;
if (is_string($descfile) && strlen($descfile) < 255 &&
(
!file_exists($descfile) || !is_file($descfile) || !is_readable($descfile)
|| (!$fp = @fopen($descfile, 'r'))
)
) {
$a = PEAR::raiseError("Unable to open $descfile");
return $a;
}
// read the whole thing so we only get one cdata callback
// for each block of cdata
fclose($fp);
$data = file_get_contents($descfile);
$ret = &PEAR_PackageFile::fromXmlString($data, $state, $descfile, $archive);
return $ret;
}
/**
* Create a PEAR_PackageFile_v* from a .tgz archive or package.xml file.
*
* This method is able to extract information about a package from a .tgz
* archive or from a XML package definition file.
*
* @access public
* @param string $info file name
* @param int $state package state (one of PEAR_VALIDATE_* constants)
* @return PEAR_PackageFile_v1|PEAR_PackageFile_v2
* @uses fromPackageFile() if the file appears to be XML
* @uses fromTgzFile() to load all non-XML files
*/
function &fromAnyFile($info, $state)
{
if (is_dir($info)) {
$dir_name = realpath($info);
if (file_exists($dir_name . '/package.xml')) {
$info = PEAR_PackageFile::fromPackageFile($dir_name . '/package.xml', $state);
} elseif (file_exists($dir_name . '/package2.xml')) {
$info = PEAR_PackageFile::fromPackageFile($dir_name . '/package2.xml', $state);
} else {
$info = PEAR::raiseError("No package definition found in '$info' directory");
}
return $info;
}
$fp = false;
if (is_string($info) && strlen($info) < 255 &&
(file_exists($info) || ($fp = @fopen($info, 'r')))
) {
if ($fp) {
fclose($fp);
}
$tmp = substr($info, -4);
if ($tmp == '.xml') {
$info = &PEAR_PackageFile::fromPackageFile($info, $state);
} elseif ($tmp == '.tar' || $tmp == '.tgz') {
$info = &PEAR_PackageFile::fromTgzFile($info, $state);
} else {
$fp = fopen($info, 'r');
$test = fread($fp, 5);
fclose($fp);
if ($test == '<?xml') {
$info = &PEAR_PackageFile::fromPackageFile($info, $state);
} else {
$info = &PEAR_PackageFile::fromTgzFile($info, $state);
}
}
return $info;
}
$info = PEAR::raiseError("Cannot open '$info' for parsing");
return $info;
}
}

1284
3rdparty/PEAR/PackageFile/Generator/v1.php vendored Normal file

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,893 @@
<?php
/**
* package.xml generation class, package.xml version 2.0
*
* PHP versions 4 and 5
*
* @category pear
* @package PEAR
* @author Greg Beaver <cellog@php.net>
* @author Stephan Schmidt (original XML_Serializer code)
* @copyright 1997-2009 The Authors
* @license http://opensource.org/licenses/bsd-license.php New BSD License
* @version CVS: $Id: v2.php 313023 2011-07-06 19:17:11Z dufuz $
* @link http://pear.php.net/package/PEAR
* @since File available since Release 1.4.0a1
*/
/**
* file/dir manipulation routines
*/
require_once 'System.php';
require_once 'XML/Util.php';
/**
* This class converts a PEAR_PackageFile_v2 object into any output format.
*
* Supported output formats include array, XML string (using S. Schmidt's
* XML_Serializer, slightly customized)
* @category pear
* @package PEAR
* @author Greg Beaver <cellog@php.net>
* @author Stephan Schmidt (original XML_Serializer code)
* @copyright 1997-2009 The Authors
* @license http://opensource.org/licenses/bsd-license.php New BSD License
* @version Release: 1.9.4
* @link http://pear.php.net/package/PEAR
* @since Class available since Release 1.4.0a1
*/
class PEAR_PackageFile_Generator_v2
{
/**
* default options for the serialization
* @access private
* @var array $_defaultOptions
*/
var $_defaultOptions = array(
'indent' => ' ', // string used for indentation
'linebreak' => "\n", // string used for newlines
'typeHints' => false, // automatically add type hin attributes
'addDecl' => true, // add an XML declaration
'defaultTagName' => 'XML_Serializer_Tag', // tag used for indexed arrays or invalid names
'classAsTagName' => false, // use classname for objects in indexed arrays
'keyAttribute' => '_originalKey', // attribute where original key is stored
'typeAttribute' => '_type', // attribute for type (only if typeHints => true)
'classAttribute' => '_class', // attribute for class of objects (only if typeHints => true)
'scalarAsAttributes' => false, // scalar values (strings, ints,..) will be serialized as attribute
'prependAttributes' => '', // prepend string for attributes
'indentAttributes' => false, // indent the attributes, if set to '_auto', it will indent attributes so they all start at the same column
'mode' => 'simplexml', // use 'simplexml' to use parent name as tagname if transforming an indexed array
'addDoctype' => false, // add a doctype declaration
'doctype' => null, // supply a string or an array with id and uri ({@see XML_Util::getDoctypeDeclaration()}
'rootName' => 'package', // name of the root tag
'rootAttributes' => array(
'version' => '2.0',
'xmlns' => 'http://pear.php.net/dtd/package-2.0',
'xmlns:tasks' => 'http://pear.php.net/dtd/tasks-1.0',
'xmlns:xsi' => 'http://www.w3.org/2001/XMLSchema-instance',
'xsi:schemaLocation' => 'http://pear.php.net/dtd/tasks-1.0
http://pear.php.net/dtd/tasks-1.0.xsd
http://pear.php.net/dtd/package-2.0
http://pear.php.net/dtd/package-2.0.xsd',
), // attributes of the root tag
'attributesArray' => 'attribs', // all values in this key will be treated as attributes
'contentName' => '_content', // this value will be used directly as content, instead of creating a new tag, may only be used in conjuction with attributesArray
'beautifyFilelist' => false,
'encoding' => 'UTF-8',
);
/**
* options for the serialization
* @access private
* @var array $options
*/
var $options = array();
/**
* current tag depth
* @var integer $_tagDepth
*/
var $_tagDepth = 0;
/**
* serilialized representation of the data
* @var string $_serializedData
*/
var $_serializedData = null;
/**
* @var PEAR_PackageFile_v2
*/
var $_packagefile;
/**
* @param PEAR_PackageFile_v2
*/
function PEAR_PackageFile_Generator_v2(&$packagefile)
{
$this->_packagefile = &$packagefile;
if (isset($this->_packagefile->encoding)) {
$this->_defaultOptions['encoding'] = $this->_packagefile->encoding;
}
}
/**
* @return string
*/
function getPackagerVersion()
{
return '1.9.4';
}
/**
* @param PEAR_Packager
* @param bool generate a .tgz or a .tar
* @param string|null temporary directory to package in
*/
function toTgz(&$packager, $compress = true, $where = null)
{
$a = null;
return $this->toTgz2($packager, $a, $compress, $where);
}
/**
* Package up both a package.xml and package2.xml for the same release
* @param PEAR_Packager
* @param PEAR_PackageFile_v1
* @param bool generate a .tgz or a .tar
* @param string|null temporary directory to package in
*/
function toTgz2(&$packager, &$pf1, $compress = true, $where = null)
{
require_once 'Archive/Tar.php';
if (!$this->_packagefile->isEquivalent($pf1)) {
return PEAR::raiseError('PEAR_Packagefile_v2::toTgz: "' .
basename($pf1->getPackageFile()) .
'" is not equivalent to "' . basename($this->_packagefile->getPackageFile())
. '"');
}
if ($where === null) {
if (!($where = System::mktemp(array('-d')))) {
return PEAR::raiseError('PEAR_Packagefile_v2::toTgz: mktemp failed');
}
} elseif (!@System::mkDir(array('-p', $where))) {
return PEAR::raiseError('PEAR_Packagefile_v2::toTgz: "' . $where . '" could' .
' not be created');
}
$file = $where . DIRECTORY_SEPARATOR . 'package.xml';
if (file_exists($file) && !is_file($file)) {
return PEAR::raiseError('PEAR_Packagefile_v2::toTgz: unable to save package.xml as' .
' "' . $file .'"');
}
if (!$this->_packagefile->validate(PEAR_VALIDATE_PACKAGING)) {
return PEAR::raiseError('PEAR_Packagefile_v2::toTgz: invalid package.xml');
}
$ext = $compress ? '.tgz' : '.tar';
$pkgver = $this->_packagefile->getPackage() . '-' . $this->_packagefile->getVersion();
$dest_package = getcwd() . DIRECTORY_SEPARATOR . $pkgver . $ext;
if (file_exists($dest_package) && !is_file($dest_package)) {
return PEAR::raiseError('PEAR_Packagefile_v2::toTgz: cannot create tgz file "' .
$dest_package . '"');
}
$pkgfile = $this->_packagefile->getPackageFile();
if (!$pkgfile) {
return PEAR::raiseError('PEAR_Packagefile_v2::toTgz: package file object must ' .
'be created from a real file');
}
$pkgdir = dirname(realpath($pkgfile));
$pkgfile = basename($pkgfile);
// {{{ Create the package file list
$filelist = array();
$i = 0;
$this->_packagefile->flattenFilelist();
$contents = $this->_packagefile->getContents();
if (isset($contents['bundledpackage'])) { // bundles of packages
$contents = $contents['bundledpackage'];
if (!isset($contents[0])) {
$contents = array($contents);
}
$packageDir = $where;
foreach ($contents as $i => $package) {
$fname = $package;
$file = $pkgdir . DIRECTORY_SEPARATOR . $fname;
if (!file_exists($file)) {
return $packager->raiseError("File does not exist: $fname");
}
$tfile = $packageDir . DIRECTORY_SEPARATOR . $fname;
System::mkdir(array('-p', dirname($tfile)));
copy($file, $tfile);
$filelist[$i++] = $tfile;
$packager->log(2, "Adding package $fname");
}
} else { // normal packages
$contents = $contents['dir']['file'];
if (!isset($contents[0])) {
$contents = array($contents);
}
$packageDir = $where;
foreach ($contents as $i => $file) {
$fname = $file['attribs']['name'];
$atts = $file['attribs'];
$orig = $file;
$file = $pkgdir . DIRECTORY_SEPARATOR . $fname;
if (!file_exists($file)) {
return $packager->raiseError("File does not exist: $fname");
}
$origperms = fileperms($file);
$tfile = $packageDir . DIRECTORY_SEPARATOR . $fname;
unset($orig['attribs']);
if (count($orig)) { // file with tasks
// run any package-time tasks
$contents = file_get_contents($file);
foreach ($orig as $tag => $raw) {
$tag = str_replace(
array($this->_packagefile->getTasksNs() . ':', '-'),
array('', '_'), $tag);
$task = "PEAR_Task_$tag";
$task = &new $task($this->_packagefile->_config,
$this->_packagefile->_logger,
PEAR_TASK_PACKAGE);
$task->init($raw, $atts, null);
$res = $task->startSession($this->_packagefile, $contents, $tfile);
if (!$res) {
continue; // skip this task
}
if (PEAR::isError($res)) {
return $res;
}
$contents = $res; // save changes
System::mkdir(array('-p', dirname($tfile)));
$wp = fopen($tfile, "wb");
fwrite($wp, $contents);
fclose($wp);
}
}
if (!file_exists($tfile)) {
System::mkdir(array('-p', dirname($tfile)));
copy($file, $tfile);
}
chmod($tfile, $origperms);
$filelist[$i++] = $tfile;
$this->_packagefile->setFileAttribute($fname, 'md5sum', md5_file($tfile), $i - 1);
$packager->log(2, "Adding file $fname");
}
}
// }}}
$name = $pf1 !== null ? 'package2.xml' : 'package.xml';
$packagexml = $this->toPackageFile($where, PEAR_VALIDATE_PACKAGING, $name);
if ($packagexml) {
$tar =& new Archive_Tar($dest_package, $compress);
$tar->setErrorHandling(PEAR_ERROR_RETURN); // XXX Don't print errors
// ----- Creates with the package.xml file
$ok = $tar->createModify(array($packagexml), '', $where);
if (PEAR::isError($ok)) {
return $packager->raiseError($ok);
} elseif (!$ok) {
return $packager->raiseError('PEAR_Packagefile_v2::toTgz(): adding ' . $name .
' failed');
}
// ----- Add the content of the package
if (!$tar->addModify($filelist, $pkgver, $where)) {
return $packager->raiseError(
'PEAR_Packagefile_v2::toTgz(): tarball creation failed');
}
// add the package.xml version 1.0
if ($pf1 !== null) {
$pfgen = &$pf1->getDefaultGenerator();
$packagexml1 = $pfgen->toPackageFile($where, PEAR_VALIDATE_PACKAGING, 'package.xml', true);
if (!$tar->addModify(array($packagexml1), '', $where)) {
return $packager->raiseError(
'PEAR_Packagefile_v2::toTgz(): adding package.xml failed');
}
}
return $dest_package;
}
}
function toPackageFile($where = null, $state = PEAR_VALIDATE_NORMAL, $name = 'package.xml')
{
if (!$this->_packagefile->validate($state)) {
return PEAR::raiseError('PEAR_Packagefile_v2::toPackageFile: invalid package.xml',
null, null, null, $this->_packagefile->getValidationWarnings());
}
if ($where === null) {
if (!($where = System::mktemp(array('-d')))) {
return PEAR::raiseError('PEAR_Packagefile_v2::toPackageFile: mktemp failed');
}
} elseif (!@System::mkDir(array('-p', $where))) {
return PEAR::raiseError('PEAR_Packagefile_v2::toPackageFile: "' . $where . '" could' .
' not be created');
}
$newpkgfile = $where . DIRECTORY_SEPARATOR . $name;
$np = @fopen($newpkgfile, 'wb');
if (!$np) {
return PEAR::raiseError('PEAR_Packagefile_v2::toPackageFile: unable to save ' .
"$name as $newpkgfile");
}
fwrite($np, $this->toXml($state));
fclose($np);
return $newpkgfile;
}
function &toV2()
{
return $this->_packagefile;
}
/**
* Return an XML document based on the package info (as returned
* by the PEAR_Common::infoFrom* methods).
*
* @return string XML data
*/
function toXml($state = PEAR_VALIDATE_NORMAL, $options = array())
{
$this->_packagefile->setDate(date('Y-m-d'));
$this->_packagefile->setTime(date('H:i:s'));
if (!$this->_packagefile->validate($state)) {
return false;
}
if (is_array($options)) {
$this->options = array_merge($this->_defaultOptions, $options);
} else {
$this->options = $this->_defaultOptions;
}
$arr = $this->_packagefile->getArray();
if (isset($arr['filelist'])) {
unset($arr['filelist']);
}
if (isset($arr['_lastversion'])) {
unset($arr['_lastversion']);
}
// Fix the notes a little bit
if (isset($arr['notes'])) {
// This trims out the indenting, needs fixing
$arr['notes'] = "\n" . trim($arr['notes']) . "\n";
}
if (isset($arr['changelog']) && !empty($arr['changelog'])) {
// Fix for inconsistency how the array is filled depending on the changelog release amount
if (!isset($arr['changelog']['release'][0])) {
$release = $arr['changelog']['release'];
unset($arr['changelog']['release']);
$arr['changelog']['release'] = array();
$arr['changelog']['release'][0] = $release;
}
foreach (array_keys($arr['changelog']['release']) as $key) {
$c =& $arr['changelog']['release'][$key];
if (isset($c['notes'])) {
// This trims out the indenting, needs fixing
$c['notes'] = "\n" . trim($c['notes']) . "\n";
}
}
}
if ($state ^ PEAR_VALIDATE_PACKAGING && !isset($arr['bundle'])) {
$use = $this->_recursiveXmlFilelist($arr['contents']['dir']['file']);
unset($arr['contents']['dir']['file']);
if (isset($use['dir'])) {
$arr['contents']['dir']['dir'] = $use['dir'];
}
if (isset($use['file'])) {
$arr['contents']['dir']['file'] = $use['file'];
}
$this->options['beautifyFilelist'] = true;
}
$arr['attribs']['packagerversion'] = '1.9.4';
if ($this->serialize($arr, $options)) {
return $this->_serializedData . "\n";
}
return false;
}
function _recursiveXmlFilelist($list)
{
$dirs = array();
if (isset($list['attribs'])) {
$file = $list['attribs']['name'];
unset($list['attribs']['name']);
$attributes = $list['attribs'];
$this->_addDir($dirs, explode('/', dirname($file)), $file, $attributes);
} else {
foreach ($list as $a) {
$file = $a['attribs']['name'];
$attributes = $a['attribs'];
unset($a['attribs']);
$this->_addDir($dirs, explode('/', dirname($file)), $file, $attributes, $a);
}
}
$this->_formatDir($dirs);
$this->_deFormat($dirs);
return $dirs;
}
function _addDir(&$dirs, $dir, $file = null, $attributes = null, $tasks = null)
{
if (!$tasks) {
$tasks = array();
}
if ($dir == array() || $dir == array('.')) {
$dirs['file'][basename($file)] = $tasks;
$attributes['name'] = basename($file);
$dirs['file'][basename($file)]['attribs'] = $attributes;
return;
}
$curdir = array_shift($dir);
if (!isset($dirs['dir'][$curdir])) {
$dirs['dir'][$curdir] = array();
}
$this->_addDir($dirs['dir'][$curdir], $dir, $file, $attributes, $tasks);
}
function _formatDir(&$dirs)
{
if (!count($dirs)) {
return array();
}
$newdirs = array();
if (isset($dirs['dir'])) {
$newdirs['dir'] = $dirs['dir'];
}
if (isset($dirs['file'])) {
$newdirs['file'] = $dirs['file'];
}
$dirs = $newdirs;
if (isset($dirs['dir'])) {
uksort($dirs['dir'], 'strnatcasecmp');
foreach ($dirs['dir'] as $dir => $contents) {
$this->_formatDir($dirs['dir'][$dir]);
}
}
if (isset($dirs['file'])) {
uksort($dirs['file'], 'strnatcasecmp');
};
}
function _deFormat(&$dirs)
{
if (!count($dirs)) {
return array();
}
$newdirs = array();
if (isset($dirs['dir'])) {
foreach ($dirs['dir'] as $dir => $contents) {
$newdir = array();
$newdir['attribs']['name'] = $dir;
$this->_deFormat($contents);
foreach ($contents as $tag => $val) {
$newdir[$tag] = $val;
}
$newdirs['dir'][] = $newdir;
}
if (count($newdirs['dir']) == 1) {
$newdirs['dir'] = $newdirs['dir'][0];
}
}
if (isset($dirs['file'])) {
foreach ($dirs['file'] as $name => $file) {
$newdirs['file'][] = $file;
}
if (count($newdirs['file']) == 1) {
$newdirs['file'] = $newdirs['file'][0];
}
}
$dirs = $newdirs;
}
/**
* reset all options to default options
*
* @access public
* @see setOption(), XML_Unserializer()
*/
function resetOptions()
{
$this->options = $this->_defaultOptions;
}
/**
* set an option
*
* You can use this method if you do not want to set all options in the constructor
*
* @access public
* @see resetOption(), XML_Serializer()
*/
function setOption($name, $value)
{
$this->options[$name] = $value;
}
/**
* sets several options at once
*
* You can use this method if you do not want to set all options in the constructor
*
* @access public
* @see resetOption(), XML_Unserializer(), setOption()
*/
function setOptions($options)
{
$this->options = array_merge($this->options, $options);
}
/**
* serialize data
*
* @access public
* @param mixed $data data to serialize
* @return boolean true on success, pear error on failure
*/
function serialize($data, $options = null)
{
// if options have been specified, use them instead
// of the previously defined ones
if (is_array($options)) {
$optionsBak = $this->options;
if (isset($options['overrideOptions']) && $options['overrideOptions'] == true) {
$this->options = array_merge($this->_defaultOptions, $options);
} else {
$this->options = array_merge($this->options, $options);
}
} else {
$optionsBak = null;
}
// start depth is zero
$this->_tagDepth = 0;
$this->_serializedData = '';
// serialize an array
if (is_array($data)) {
$tagName = isset($this->options['rootName']) ? $this->options['rootName'] : 'array';
$this->_serializedData .= $this->_serializeArray($data, $tagName, $this->options['rootAttributes']);
}
// add doctype declaration
if ($this->options['addDoctype'] === true) {
$this->_serializedData = XML_Util::getDoctypeDeclaration($tagName, $this->options['doctype'])
. $this->options['linebreak']
. $this->_serializedData;
}
// build xml declaration
if ($this->options['addDecl']) {
$atts = array();
$encoding = isset($this->options['encoding']) ? $this->options['encoding'] : null;
$this->_serializedData = XML_Util::getXMLDeclaration('1.0', $encoding)
. $this->options['linebreak']
. $this->_serializedData;
}
if ($optionsBak !== null) {
$this->options = $optionsBak;
}
return true;
}
/**
* get the result of the serialization
*
* @access public
* @return string serialized XML
*/
function getSerializedData()
{
if ($this->_serializedData === null) {
return $this->raiseError('No serialized data available. Use XML_Serializer::serialize() first.', XML_SERIALIZER_ERROR_NO_SERIALIZATION);
}
return $this->_serializedData;
}
/**
* serialize any value
*
* This method checks for the type of the value and calls the appropriate method
*
* @access private
* @param mixed $value
* @param string $tagName
* @param array $attributes
* @return string
*/
function _serializeValue($value, $tagName = null, $attributes = array())
{
if (is_array($value)) {
$xml = $this->_serializeArray($value, $tagName, $attributes);
} elseif (is_object($value)) {
$xml = $this->_serializeObject($value, $tagName);
} else {
$tag = array(
'qname' => $tagName,
'attributes' => $attributes,
'content' => $value
);
$xml = $this->_createXMLTag($tag);
}
return $xml;
}
/**
* serialize an array
*
* @access private
* @param array $array array to serialize
* @param string $tagName name of the root tag
* @param array $attributes attributes for the root tag
* @return string $string serialized data
* @uses XML_Util::isValidName() to check, whether key has to be substituted
*/
function _serializeArray(&$array, $tagName = null, $attributes = array())
{
$_content = null;
/**
* check for special attributes
*/
if ($this->options['attributesArray'] !== null) {
if (isset($array[$this->options['attributesArray']])) {
$attributes = $array[$this->options['attributesArray']];
unset($array[$this->options['attributesArray']]);
}
/**
* check for special content
*/
if ($this->options['contentName'] !== null) {
if (isset($array[$this->options['contentName']])) {
$_content = $array[$this->options['contentName']];
unset($array[$this->options['contentName']]);
}
}
}
/*
* if mode is set to simpleXML, check whether
* the array is associative or indexed
*/
if (is_array($array) && $this->options['mode'] == 'simplexml') {
$indexed = true;
if (!count($array)) {
$indexed = false;
}
foreach ($array as $key => $val) {
if (!is_int($key)) {
$indexed = false;
break;
}
}
if ($indexed && $this->options['mode'] == 'simplexml') {
$string = '';
foreach ($array as $key => $val) {
if ($this->options['beautifyFilelist'] && $tagName == 'dir') {
if (!isset($this->_curdir)) {
$this->_curdir = '';
}
$savedir = $this->_curdir;
if (isset($val['attribs'])) {
if ($val['attribs']['name'] == '/') {
$this->_curdir = '/';
} else {
if ($this->_curdir == '/') {
$this->_curdir = '';
}
$this->_curdir .= '/' . $val['attribs']['name'];
}
}
}
$string .= $this->_serializeValue( $val, $tagName, $attributes);
if ($this->options['beautifyFilelist'] && $tagName == 'dir') {
$string .= ' <!-- ' . $this->_curdir . ' -->';
if (empty($savedir)) {
unset($this->_curdir);
} else {
$this->_curdir = $savedir;
}
}
$string .= $this->options['linebreak'];
// do indentation
if ($this->options['indent'] !== null && $this->_tagDepth > 0) {
$string .= str_repeat($this->options['indent'], $this->_tagDepth);
}
}
return rtrim($string);
}
}
if ($this->options['scalarAsAttributes'] === true) {
foreach ($array as $key => $value) {
if (is_scalar($value) && (XML_Util::isValidName($key) === true)) {
unset($array[$key]);
$attributes[$this->options['prependAttributes'].$key] = $value;
}
}
}
// check for empty array => create empty tag
if (empty($array)) {
$tag = array(
'qname' => $tagName,
'content' => $_content,
'attributes' => $attributes
);
} else {
$this->_tagDepth++;
$tmp = $this->options['linebreak'];
foreach ($array as $key => $value) {
// do indentation
if ($this->options['indent'] !== null && $this->_tagDepth > 0) {
$tmp .= str_repeat($this->options['indent'], $this->_tagDepth);
}
// copy key
$origKey = $key;
// key cannot be used as tagname => use default tag
$valid = XML_Util::isValidName($key);
if (PEAR::isError($valid)) {
if ($this->options['classAsTagName'] && is_object($value)) {
$key = get_class($value);
} else {
$key = $this->options['defaultTagName'];
}
}
$atts = array();
if ($this->options['typeHints'] === true) {
$atts[$this->options['typeAttribute']] = gettype($value);
if ($key !== $origKey) {
$atts[$this->options['keyAttribute']] = (string)$origKey;
}
}
if ($this->options['beautifyFilelist'] && $key == 'dir') {
if (!isset($this->_curdir)) {
$this->_curdir = '';
}
$savedir = $this->_curdir;
if (isset($value['attribs'])) {
if ($value['attribs']['name'] == '/') {
$this->_curdir = '/';
} else {
$this->_curdir .= '/' . $value['attribs']['name'];
}
}
}
if (is_string($value) && $value && ($value{strlen($value) - 1} == "\n")) {
$value .= str_repeat($this->options['indent'], $this->_tagDepth);
}
$tmp .= $this->_createXMLTag(array(
'qname' => $key,
'attributes' => $atts,
'content' => $value )
);
if ($this->options['beautifyFilelist'] && $key == 'dir') {
if (isset($value['attribs'])) {
$tmp .= ' <!-- ' . $this->_curdir . ' -->';
if (empty($savedir)) {
unset($this->_curdir);
} else {
$this->_curdir = $savedir;
}
}
}
$tmp .= $this->options['linebreak'];
}
$this->_tagDepth--;
if ($this->options['indent']!==null && $this->_tagDepth>0) {
$tmp .= str_repeat($this->options['indent'], $this->_tagDepth);
}
if (trim($tmp) === '') {
$tmp = null;
}
$tag = array(
'qname' => $tagName,
'content' => $tmp,
'attributes' => $attributes
);
}
if ($this->options['typeHints'] === true) {
if (!isset($tag['attributes'][$this->options['typeAttribute']])) {
$tag['attributes'][$this->options['typeAttribute']] = 'array';
}
}
$string = $this->_createXMLTag($tag, false);
return $string;
}
/**
* create a tag from an array
* this method awaits an array in the following format
* array(
* 'qname' => $tagName,
* 'attributes' => array(),
* 'content' => $content, // optional
* 'namespace' => $namespace // optional
* 'namespaceUri' => $namespaceUri // optional
* )
*
* @access private
* @param array $tag tag definition
* @param boolean $replaceEntities whether to replace XML entities in content or not
* @return string $string XML tag
*/
function _createXMLTag($tag, $replaceEntities = true)
{
if ($this->options['indentAttributes'] !== false) {
$multiline = true;
$indent = str_repeat($this->options['indent'], $this->_tagDepth);
if ($this->options['indentAttributes'] == '_auto') {
$indent .= str_repeat(' ', (strlen($tag['qname'])+2));
} else {
$indent .= $this->options['indentAttributes'];
}
} else {
$indent = $multiline = false;
}
if (is_array($tag['content'])) {
if (empty($tag['content'])) {
$tag['content'] = '';
}
} elseif(is_scalar($tag['content']) && (string)$tag['content'] == '') {
$tag['content'] = '';
}
if (is_scalar($tag['content']) || is_null($tag['content'])) {
if ($this->options['encoding'] == 'UTF-8' &&
version_compare(phpversion(), '5.0.0', 'lt')
) {
$tag['content'] = utf8_encode($tag['content']);
}
if ($replaceEntities === true) {
$replaceEntities = XML_UTIL_ENTITIES_XML;
}
$tag = XML_Util::createTagFromArray($tag, $replaceEntities, $multiline, $indent, $this->options['linebreak']);
} elseif (is_array($tag['content'])) {
$tag = $this->_serializeArray($tag['content'], $tag['qname'], $tag['attributes']);
} elseif (is_object($tag['content'])) {
$tag = $this->_serializeObject($tag['content'], $tag['qname'], $tag['attributes']);
} elseif (is_resource($tag['content'])) {
settype($tag['content'], 'string');
$tag = XML_Util::createTagFromArray($tag, $replaceEntities);
}
return $tag;
}
}

459
3rdparty/PEAR/PackageFile/Parser/v1.php vendored Normal file
View File

@ -0,0 +1,459 @@
<?php
/**
* package.xml parsing class, package.xml version 1.0
*
* PHP versions 4 and 5
*
* @category pear
* @package PEAR
* @author Greg Beaver <cellog@php.net>
* @copyright 1997-2009 The Authors
* @license http://opensource.org/licenses/bsd-license.php New BSD License
* @version CVS: $Id: v1.php 313023 2011-07-06 19:17:11Z dufuz $
* @link http://pear.php.net/package/PEAR
* @since File available since Release 1.4.0a1
*/
/**
* package.xml abstraction class
*/
require_once 'PEAR/PackageFile/v1.php';
/**
* Parser for package.xml version 1.0
* @category pear
* @package PEAR
* @author Greg Beaver <cellog@php.net>
* @copyright 1997-2009 The Authors
* @license http://opensource.org/licenses/bsd-license.php New BSD License
* @version Release: @PEAR-VER@
* @link http://pear.php.net/package/PEAR
* @since Class available since Release 1.4.0a1
*/
class PEAR_PackageFile_Parser_v1
{
var $_registry;
var $_config;
var $_logger;
/**
* BC hack to allow PEAR_Common::infoFromString() to sort of
* work with the version 2.0 format - there's no filelist though
* @param PEAR_PackageFile_v2
*/
function fromV2($packagefile)
{
$info = $packagefile->getArray(true);
$ret = new PEAR_PackageFile_v1;
$ret->fromArray($info['old']);
}
function setConfig(&$c)
{
$this->_config = &$c;
$this->_registry = &$c->getRegistry();
}
function setLogger(&$l)
{
$this->_logger = &$l;
}
/**
* @param string contents of package.xml file, version 1.0
* @return bool success of parsing
*/
function &parse($data, $file, $archive = false)
{
if (!extension_loaded('xml')) {
return PEAR::raiseError('Cannot create xml parser for parsing package.xml, no xml extension');
}
$xp = xml_parser_create();
if (!$xp) {
$a = &PEAR::raiseError('Cannot create xml parser for parsing package.xml');
return $a;
}
xml_set_object($xp, $this);
xml_set_element_handler($xp, '_element_start_1_0', '_element_end_1_0');
xml_set_character_data_handler($xp, '_pkginfo_cdata_1_0');
xml_parser_set_option($xp, XML_OPTION_CASE_FOLDING, false);
$this->element_stack = array();
$this->_packageInfo = array('provides' => array());
$this->current_element = false;
unset($this->dir_install);
$this->_packageInfo['filelist'] = array();
$this->filelist =& $this->_packageInfo['filelist'];
$this->dir_names = array();
$this->in_changelog = false;
$this->d_i = 0;
$this->cdata = '';
$this->_isValid = true;
if (!xml_parse($xp, $data, 1)) {
$code = xml_get_error_code($xp);
$line = xml_get_current_line_number($xp);
xml_parser_free($xp);
$a = &PEAR::raiseError(sprintf("XML error: %s at line %d",
$str = xml_error_string($code), $line), 2);
return $a;
}
xml_parser_free($xp);
$pf = new PEAR_PackageFile_v1;
$pf->setConfig($this->_config);
if (isset($this->_logger)) {
$pf->setLogger($this->_logger);
}
$pf->setPackagefile($file, $archive);
$pf->fromArray($this->_packageInfo);
return $pf;
}
// {{{ _unIndent()
/**
* Unindent given string
*
* @param string $str The string that has to be unindented.
* @return string
* @access private
*/
function _unIndent($str)
{
// remove leading newlines
$str = preg_replace('/^[\r\n]+/', '', $str);
// find whitespace at the beginning of the first line
$indent_len = strspn($str, " \t");
$indent = substr($str, 0, $indent_len);
$data = '';
// remove the same amount of whitespace from following lines
foreach (explode("\n", $str) as $line) {
if (substr($line, 0, $indent_len) == $indent) {
$data .= substr($line, $indent_len) . "\n";
} elseif (trim(substr($line, 0, $indent_len))) {
$data .= ltrim($line);
}
}
return $data;
}
// Support for package DTD v1.0:
// {{{ _element_start_1_0()
/**
* XML parser callback for ending elements. Used for version 1.0
* packages.
*
* @param resource $xp XML parser resource
* @param string $name name of ending element
*
* @return void
*
* @access private
*/
function _element_start_1_0($xp, $name, $attribs)
{
array_push($this->element_stack, $name);
$this->current_element = $name;
$spos = sizeof($this->element_stack) - 2;
$this->prev_element = ($spos >= 0) ? $this->element_stack[$spos] : '';
$this->current_attributes = $attribs;
$this->cdata = '';
switch ($name) {
case 'dir':
if ($this->in_changelog) {
break;
}
if (array_key_exists('name', $attribs) && $attribs['name'] != '/') {
$attribs['name'] = preg_replace(array('!\\\\+!', '!/+!'), array('/', '/'),
$attribs['name']);
if (strrpos($attribs['name'], '/') === strlen($attribs['name']) - 1) {
$attribs['name'] = substr($attribs['name'], 0,
strlen($attribs['name']) - 1);
}
if (strpos($attribs['name'], '/') === 0) {
$attribs['name'] = substr($attribs['name'], 1);
}
$this->dir_names[] = $attribs['name'];
}
if (isset($attribs['baseinstalldir'])) {
$this->dir_install = $attribs['baseinstalldir'];
}
if (isset($attribs['role'])) {
$this->dir_role = $attribs['role'];
}
break;
case 'file':
if ($this->in_changelog) {
break;
}
if (isset($attribs['name'])) {
$path = '';
if (count($this->dir_names)) {
foreach ($this->dir_names as $dir) {
$path .= $dir . '/';
}
}
$path .= preg_replace(array('!\\\\+!', '!/+!'), array('/', '/'),
$attribs['name']);
unset($attribs['name']);
$this->current_path = $path;
$this->filelist[$path] = $attribs;
// Set the baseinstalldir only if the file don't have this attrib
if (!isset($this->filelist[$path]['baseinstalldir']) &&
isset($this->dir_install))
{
$this->filelist[$path]['baseinstalldir'] = $this->dir_install;
}
// Set the Role
if (!isset($this->filelist[$path]['role']) && isset($this->dir_role)) {
$this->filelist[$path]['role'] = $this->dir_role;
}
}
break;
case 'replace':
if (!$this->in_changelog) {
$this->filelist[$this->current_path]['replacements'][] = $attribs;
}
break;
case 'maintainers':
$this->_packageInfo['maintainers'] = array();
$this->m_i = 0; // maintainers array index
break;
case 'maintainer':
// compatibility check
if (!isset($this->_packageInfo['maintainers'])) {
$this->_packageInfo['maintainers'] = array();
$this->m_i = 0;
}
$this->_packageInfo['maintainers'][$this->m_i] = array();
$this->current_maintainer =& $this->_packageInfo['maintainers'][$this->m_i];
break;
case 'changelog':
$this->_packageInfo['changelog'] = array();
$this->c_i = 0; // changelog array index
$this->in_changelog = true;
break;
case 'release':
if ($this->in_changelog) {
$this->_packageInfo['changelog'][$this->c_i] = array();
$this->current_release = &$this->_packageInfo['changelog'][$this->c_i];
} else {
$this->current_release = &$this->_packageInfo;
}
break;
case 'deps':
if (!$this->in_changelog) {
$this->_packageInfo['release_deps'] = array();
}
break;
case 'dep':
// dependencies array index
if (!$this->in_changelog) {
$this->d_i++;
isset($attribs['type']) ? ($attribs['type'] = strtolower($attribs['type'])) : false;
$this->_packageInfo['release_deps'][$this->d_i] = $attribs;
}
break;
case 'configureoptions':
if (!$this->in_changelog) {
$this->_packageInfo['configure_options'] = array();
}
break;
case 'configureoption':
if (!$this->in_changelog) {
$this->_packageInfo['configure_options'][] = $attribs;
}
break;
case 'provides':
if (empty($attribs['type']) || empty($attribs['name'])) {
break;
}
$attribs['explicit'] = true;
$this->_packageInfo['provides']["$attribs[type];$attribs[name]"] = $attribs;
break;
case 'package' :
if (isset($attribs['version'])) {
$this->_packageInfo['xsdversion'] = trim($attribs['version']);
} else {
$this->_packageInfo['xsdversion'] = '1.0';
}
if (isset($attribs['packagerversion'])) {
$this->_packageInfo['packagerversion'] = $attribs['packagerversion'];
}
break;
}
}
// }}}
// {{{ _element_end_1_0()
/**
* XML parser callback for ending elements. Used for version 1.0
* packages.
*
* @param resource $xp XML parser resource
* @param string $name name of ending element
*
* @return void
*
* @access private
*/
function _element_end_1_0($xp, $name)
{
$data = trim($this->cdata);
switch ($name) {
case 'name':
switch ($this->prev_element) {
case 'package':
$this->_packageInfo['package'] = $data;
break;
case 'maintainer':
$this->current_maintainer['name'] = $data;
break;
}
break;
case 'extends' :
$this->_packageInfo['extends'] = $data;
break;
case 'summary':
$this->_packageInfo['summary'] = $data;
break;
case 'description':
$data = $this->_unIndent($this->cdata);
$this->_packageInfo['description'] = $data;
break;
case 'user':
$this->current_maintainer['handle'] = $data;
break;
case 'email':
$this->current_maintainer['email'] = $data;
break;
case 'role':
$this->current_maintainer['role'] = $data;
break;
case 'version':
if ($this->in_changelog) {
$this->current_release['version'] = $data;
} else {
$this->_packageInfo['version'] = $data;
}
break;
case 'date':
if ($this->in_changelog) {
$this->current_release['release_date'] = $data;
} else {
$this->_packageInfo['release_date'] = $data;
}
break;
case 'notes':
// try to "de-indent" release notes in case someone
// has been over-indenting their xml ;-)
// Trim only on the right side
$data = rtrim($this->_unIndent($this->cdata));
if ($this->in_changelog) {
$this->current_release['release_notes'] = $data;
} else {
$this->_packageInfo['release_notes'] = $data;
}
break;
case 'warnings':
if ($this->in_changelog) {
$this->current_release['release_warnings'] = $data;
} else {
$this->_packageInfo['release_warnings'] = $data;
}
break;
case 'state':
if ($this->in_changelog) {
$this->current_release['release_state'] = $data;
} else {
$this->_packageInfo['release_state'] = $data;
}
break;
case 'license':
if ($this->in_changelog) {
$this->current_release['release_license'] = $data;
} else {
$this->_packageInfo['release_license'] = $data;
}
break;
case 'dep':
if ($data && !$this->in_changelog) {
$this->_packageInfo['release_deps'][$this->d_i]['name'] = $data;
}
break;
case 'dir':
if ($this->in_changelog) {
break;
}
array_pop($this->dir_names);
break;
case 'file':
if ($this->in_changelog) {
break;
}
if ($data) {
$path = '';
if (count($this->dir_names)) {
foreach ($this->dir_names as $dir) {
$path .= $dir . '/';
}
}
$path .= $data;
$this->filelist[$path] = $this->current_attributes;
// Set the baseinstalldir only if the file don't have this attrib
if (!isset($this->filelist[$path]['baseinstalldir']) &&
isset($this->dir_install))
{
$this->filelist[$path]['baseinstalldir'] = $this->dir_install;
}
// Set the Role
if (!isset($this->filelist[$path]['role']) && isset($this->dir_role)) {
$this->filelist[$path]['role'] = $this->dir_role;
}
}
break;
case 'maintainer':
if (empty($this->_packageInfo['maintainers'][$this->m_i]['role'])) {
$this->_packageInfo['maintainers'][$this->m_i]['role'] = 'lead';
}
$this->m_i++;
break;
case 'release':
if ($this->in_changelog) {
$this->c_i++;
}
break;
case 'changelog':
$this->in_changelog = false;
break;
}
array_pop($this->element_stack);
$spos = sizeof($this->element_stack) - 1;
$this->current_element = ($spos > 0) ? $this->element_stack[$spos] : '';
$this->cdata = '';
}
// }}}
// {{{ _pkginfo_cdata_1_0()
/**
* XML parser callback for character data. Used for version 1.0
* packages.
*
* @param resource $xp XML parser resource
* @param string $name character data
*
* @return void
*
* @access private
*/
function _pkginfo_cdata_1_0($xp, $data)
{
if (isset($this->cdata)) {
$this->cdata .= $data;
}
}
// }}}
}
?>

Some files were not shown because too many files have changed in this diff Show More