Update PEAR to v1.10.9 and patch it so it works quietly
This commit is contained in:
parent
daa5f87fd4
commit
b17e0b4169
470
extlib/DB.php
470
extlib/DB.php
|
@ -164,7 +164,7 @@ define('DB_ERROR_CONNECT_FAILED', -24);
|
||||||
/**
|
/**
|
||||||
* The PHP extension needed for this DBMS could not be found
|
* The PHP extension needed for this DBMS could not be found
|
||||||
*/
|
*/
|
||||||
define('DB_ERROR_EXTENSION_NOT_FOUND',-25);
|
define('DB_ERROR_EXTENSION_NOT_FOUND', -25);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* The present user has inadequate permissions to perform the task requestd
|
* The present user has inadequate permissions to perform the task requestd
|
||||||
|
@ -179,7 +179,7 @@ define('DB_ERROR_NOSUCHDB', -27);
|
||||||
/**
|
/**
|
||||||
* Tried to insert a null value into a column that doesn't allow nulls
|
* Tried to insert a null value into a column that doesn't allow nulls
|
||||||
*/
|
*/
|
||||||
define('DB_ERROR_CONSTRAINT_NOT_NULL',-29);
|
define('DB_ERROR_CONSTRAINT_NOT_NULL', -29);
|
||||||
/**#@-*/
|
/**#@-*/
|
||||||
|
|
||||||
|
|
||||||
|
@ -212,7 +212,7 @@ define('DB_PARAM_OPAQUE', 2);
|
||||||
*
|
*
|
||||||
* The value should not be quoted or escaped.
|
* The value should not be quoted or escaped.
|
||||||
*/
|
*/
|
||||||
define('DB_PARAM_MISC', 3);
|
define('DB_PARAM_MISC', 3);
|
||||||
/**#@-*/
|
/**#@-*/
|
||||||
|
|
||||||
|
|
||||||
|
@ -287,7 +287,7 @@ define('DB_FETCHMODE_FLIPPED', 4);
|
||||||
* Old fetch modes. Left here for compatibility.
|
* Old fetch modes. Left here for compatibility.
|
||||||
*/
|
*/
|
||||||
define('DB_GETMODE_ORDERED', DB_FETCHMODE_ORDERED);
|
define('DB_GETMODE_ORDERED', DB_FETCHMODE_ORDERED);
|
||||||
define('DB_GETMODE_ASSOC', DB_FETCHMODE_ASSOC);
|
define('DB_GETMODE_ASSOC', DB_FETCHMODE_ASSOC);
|
||||||
define('DB_GETMODE_FLIPPED', DB_FETCHMODE_FLIPPED);
|
define('DB_GETMODE_FLIPPED', DB_FETCHMODE_FLIPPED);
|
||||||
/**#@-*/
|
/**#@-*/
|
||||||
|
|
||||||
|
@ -437,14 +437,14 @@ class DB
|
||||||
* Create a new DB object for the specified database type but don't
|
* Create a new DB object for the specified database type but don't
|
||||||
* connect to the database
|
* connect to the database
|
||||||
*
|
*
|
||||||
* @param string $type the database type (eg "mysql")
|
* @param string $type the database type (eg "mysql")
|
||||||
* @param array $options an associative array of option names and values
|
* @param array $options an associative array of option names and values
|
||||||
*
|
*
|
||||||
* @return object a new DB object. A DB_Error object on failure.
|
* @return object a new DB object. A DB_Error object on failure.
|
||||||
*
|
*
|
||||||
* @see DB_common::setOption()
|
* @see DB_common::setOption()
|
||||||
*/
|
*/
|
||||||
public static function factory($type, $options = false)
|
public static function factory($type, $options = [])
|
||||||
{
|
{
|
||||||
if (!is_array($options)) {
|
if (!is_array($options)) {
|
||||||
$options = array('persistent' => $options);
|
$options = array('persistent' => $options);
|
||||||
|
@ -461,9 +461,9 @@ class DB
|
||||||
|
|
||||||
if (!class_exists($classname)) {
|
if (!class_exists($classname)) {
|
||||||
$tmp = PEAR::raiseError(null, DB_ERROR_NOT_FOUND, null, null,
|
$tmp = PEAR::raiseError(null, DB_ERROR_NOT_FOUND, null, null,
|
||||||
"Unable to include the DB/{$type}.php"
|
"Unable to include the DB/{$type}.php"
|
||||||
. " file for '$dsn'",
|
. " file for '$dsn'",
|
||||||
'DB_Error', true);
|
'DB_Error', true);
|
||||||
return $tmp;
|
return $tmp;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -482,6 +482,21 @@ class DB
|
||||||
// }}}
|
// }}}
|
||||||
// {{{ connect()
|
// {{{ connect()
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Determines if a variable is a DB_Error object
|
||||||
|
*
|
||||||
|
* @param mixed $value the variable to check
|
||||||
|
*
|
||||||
|
* @return bool whether $value is DB_Error object
|
||||||
|
*/
|
||||||
|
public static function isError($value)
|
||||||
|
{
|
||||||
|
return is_object($value) && is_a($value, 'DB_Error');
|
||||||
|
}
|
||||||
|
|
||||||
|
// }}}
|
||||||
|
// {{{ apiVersion()
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Create a new DB object including a connection to the specified database
|
* Create a new DB object including a connection to the specified database
|
||||||
*
|
*
|
||||||
|
@ -501,9 +516,9 @@ class DB
|
||||||
* }
|
* }
|
||||||
* </code>
|
* </code>
|
||||||
*
|
*
|
||||||
* @param mixed $dsn the string "data source name" or array in the
|
* @param mixed $dsn the string "data source name" or array in the
|
||||||
* format returned by DB::parseDSN()
|
* format returned by DB::parseDSN()
|
||||||
* @param array $options an associative array of option names and values
|
* @param array $options an associative array of option names and values
|
||||||
*
|
*
|
||||||
* @return object a new DB object. A DB_Error object on failure.
|
* @return object a new DB object. A DB_Error object on failure.
|
||||||
*
|
*
|
||||||
|
@ -538,10 +553,10 @@ class DB
|
||||||
$classname = "DB_${type}";
|
$classname = "DB_${type}";
|
||||||
if (!class_exists($classname)) {
|
if (!class_exists($classname)) {
|
||||||
$tmp = PEAR::raiseError(null, DB_ERROR_NOT_FOUND, null, null,
|
$tmp = PEAR::raiseError(null, DB_ERROR_NOT_FOUND, null, null,
|
||||||
"Unable to include the DB/{$type}.php"
|
"Unable to include the DB/{$type}.php"
|
||||||
. " file for '"
|
. " file for '"
|
||||||
. DB::getDSNString($dsn, true) . "'",
|
. DB::getDSNString($dsn, true) . "'",
|
||||||
'DB_Error', true);
|
'DB_Error', true);
|
||||||
return $tmp;
|
return $tmp;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -567,136 +582,9 @@ class DB
|
||||||
return $obj;
|
return $obj;
|
||||||
}
|
}
|
||||||
|
|
||||||
// }}}
|
|
||||||
// {{{ apiVersion()
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Return the DB API version
|
|
||||||
*
|
|
||||||
* @return string the DB API version number
|
|
||||||
*/
|
|
||||||
function apiVersion()
|
|
||||||
{
|
|
||||||
return '1.9.2';
|
|
||||||
}
|
|
||||||
|
|
||||||
// }}}
|
// }}}
|
||||||
// {{{ isError()
|
// {{{ isError()
|
||||||
|
|
||||||
/**
|
|
||||||
* Determines if a variable is a DB_Error object
|
|
||||||
*
|
|
||||||
* @param mixed $value the variable to check
|
|
||||||
*
|
|
||||||
* @return bool whether $value is DB_Error object
|
|
||||||
*/
|
|
||||||
public static function isError($value)
|
|
||||||
{
|
|
||||||
return is_object($value) && is_a($value, 'DB_Error');
|
|
||||||
}
|
|
||||||
|
|
||||||
// }}}
|
|
||||||
// {{{ isConnection()
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Determines if a value is a DB_<driver> object
|
|
||||||
*
|
|
||||||
* @param mixed $value the value to test
|
|
||||||
*
|
|
||||||
* @return bool whether $value is a DB_<driver> object
|
|
||||||
*/
|
|
||||||
public static function isConnection($value)
|
|
||||||
{
|
|
||||||
return (is_object($value) &&
|
|
||||||
is_subclass_of($value, 'db_common') &&
|
|
||||||
method_exists($value, 'simpleQuery'));
|
|
||||||
}
|
|
||||||
|
|
||||||
// }}}
|
|
||||||
// {{{ isManip()
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Tell whether a query is a data manipulation or data definition query
|
|
||||||
*
|
|
||||||
* Examples of data manipulation queries are INSERT, UPDATE and DELETE.
|
|
||||||
* Examples of data definition queries are CREATE, DROP, ALTER, GRANT,
|
|
||||||
* REVOKE.
|
|
||||||
*
|
|
||||||
* @param string $query the query
|
|
||||||
*
|
|
||||||
* @return boolean whether $query is a data manipulation query
|
|
||||||
*/
|
|
||||||
public static function isManip($query)
|
|
||||||
{
|
|
||||||
$manips = 'INSERT|UPDATE|DELETE|REPLACE|'
|
|
||||||
. 'CREATE|DROP|'
|
|
||||||
. 'LOAD DATA|SELECT .* INTO .* FROM|COPY|'
|
|
||||||
. 'ALTER|GRANT|REVOKE|'
|
|
||||||
. 'LOCK|UNLOCK';
|
|
||||||
if (preg_match('/^\s*"?(' . $manips . ')\s+/i', $query)) {
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
// }}}
|
|
||||||
// {{{ errorMessage()
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Return a textual error message for a DB error code
|
|
||||||
*
|
|
||||||
* @param integer $value the DB error code
|
|
||||||
*
|
|
||||||
* @return string the error message or false if the error code was
|
|
||||||
* not recognized
|
|
||||||
*/
|
|
||||||
public static function errorMessage($value)
|
|
||||||
{
|
|
||||||
static $errorMessages;
|
|
||||||
if (!isset($errorMessages)) {
|
|
||||||
$errorMessages = array(
|
|
||||||
DB_ERROR => 'unknown error',
|
|
||||||
DB_ERROR_ACCESS_VIOLATION => 'insufficient permissions',
|
|
||||||
DB_ERROR_ALREADY_EXISTS => 'already exists',
|
|
||||||
DB_ERROR_CANNOT_CREATE => 'can not create',
|
|
||||||
DB_ERROR_CANNOT_DROP => 'can not drop',
|
|
||||||
DB_ERROR_CONNECT_FAILED => 'connect failed',
|
|
||||||
DB_ERROR_CONSTRAINT => 'constraint violation',
|
|
||||||
DB_ERROR_CONSTRAINT_NOT_NULL=> 'null value violates not-null constraint',
|
|
||||||
DB_ERROR_DIVZERO => 'division by zero',
|
|
||||||
DB_ERROR_EXTENSION_NOT_FOUND=> 'extension not found',
|
|
||||||
DB_ERROR_INVALID => 'invalid',
|
|
||||||
DB_ERROR_INVALID_DATE => 'invalid date or time',
|
|
||||||
DB_ERROR_INVALID_DSN => 'invalid DSN',
|
|
||||||
DB_ERROR_INVALID_NUMBER => 'invalid number',
|
|
||||||
DB_ERROR_MISMATCH => 'mismatch',
|
|
||||||
DB_ERROR_NEED_MORE_DATA => 'insufficient data supplied',
|
|
||||||
DB_ERROR_NODBSELECTED => 'no database selected',
|
|
||||||
DB_ERROR_NOSUCHDB => 'no such database',
|
|
||||||
DB_ERROR_NOSUCHFIELD => 'no such field',
|
|
||||||
DB_ERROR_NOSUCHTABLE => 'no such table',
|
|
||||||
DB_ERROR_NOT_CAPABLE => 'DB backend not capable',
|
|
||||||
DB_ERROR_NOT_FOUND => 'not found',
|
|
||||||
DB_ERROR_NOT_LOCKED => 'not locked',
|
|
||||||
DB_ERROR_SYNTAX => 'syntax error',
|
|
||||||
DB_ERROR_UNSUPPORTED => 'not supported',
|
|
||||||
DB_ERROR_TRUNCATED => 'truncated',
|
|
||||||
DB_ERROR_VALUE_COUNT_ON_ROW => 'value count on row',
|
|
||||||
DB_OK => 'no error',
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (DB::isError($value)) {
|
|
||||||
$value = $value->getCode();
|
|
||||||
}
|
|
||||||
|
|
||||||
return isset($errorMessages[$value]) ? $errorMessages[$value]
|
|
||||||
: $errorMessages[DB_ERROR];
|
|
||||||
}
|
|
||||||
|
|
||||||
// }}}
|
|
||||||
// {{{ parseDSN()
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Parse a data source name
|
* Parse a data source name
|
||||||
*
|
*
|
||||||
|
@ -734,14 +622,14 @@ class DB
|
||||||
public static function parseDSN($dsn)
|
public static function parseDSN($dsn)
|
||||||
{
|
{
|
||||||
$parsed = array(
|
$parsed = array(
|
||||||
'phptype' => false,
|
'phptype' => false,
|
||||||
'dbsyntax' => false,
|
'dbsyntax' => false,
|
||||||
'username' => false,
|
'username' => false,
|
||||||
'password' => false,
|
'password' => false,
|
||||||
'protocol' => false,
|
'protocol' => false,
|
||||||
'hostspec' => false,
|
'hostspec' => false,
|
||||||
'port' => false,
|
'port' => false,
|
||||||
'socket' => false,
|
'socket' => false,
|
||||||
'database' => false,
|
'database' => false,
|
||||||
);
|
);
|
||||||
|
|
||||||
|
@ -765,10 +653,10 @@ class DB
|
||||||
// Get phptype and dbsyntax
|
// Get phptype and dbsyntax
|
||||||
// $str => phptype(dbsyntax)
|
// $str => phptype(dbsyntax)
|
||||||
if (preg_match('|^(.+?)\((.*?)\)$|', $str, $arr)) {
|
if (preg_match('|^(.+?)\((.*?)\)$|', $str, $arr)) {
|
||||||
$parsed['phptype'] = $arr[1];
|
$parsed['phptype'] = $arr[1];
|
||||||
$parsed['dbsyntax'] = !$arr[2] ? $arr[1] : $arr[2];
|
$parsed['dbsyntax'] = !$arr[2] ? $arr[1] : $arr[2];
|
||||||
} else {
|
} else {
|
||||||
$parsed['phptype'] = $str;
|
$parsed['phptype'] = $str;
|
||||||
$parsed['dbsyntax'] = $str;
|
$parsed['dbsyntax'] = $str;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -778,7 +666,7 @@ class DB
|
||||||
|
|
||||||
// Get (if found): username and password
|
// Get (if found): username and password
|
||||||
// $dsn => username:password@protocol+hostspec/database
|
// $dsn => username:password@protocol+hostspec/database
|
||||||
if (($at = strrpos($dsn,'@')) !== false) {
|
if (($at = strrpos($dsn, '@')) !== false) {
|
||||||
$str = substr($dsn, 0, $at);
|
$str = substr($dsn, 0, $at);
|
||||||
$dsn = substr($dsn, $at + 1);
|
$dsn = substr($dsn, $at + 1);
|
||||||
if (($pos = strpos($str, ':')) !== false) {
|
if (($pos = strpos($str, ':')) !== false) {
|
||||||
|
@ -793,9 +681,9 @@ class DB
|
||||||
|
|
||||||
if (preg_match('|^([^(]+)\((.*?)\)/?(.*?)$|', $dsn, $match)) {
|
if (preg_match('|^([^(]+)\((.*?)\)/?(.*?)$|', $dsn, $match)) {
|
||||||
// $dsn => proto(proto_opts)/database
|
// $dsn => proto(proto_opts)/database
|
||||||
$proto = $match[1];
|
$proto = $match[1];
|
||||||
$proto_opts = $match[2] ? $match[2] : false;
|
$proto_opts = $match[2] ? $match[2] : false;
|
||||||
$dsn = $match[3];
|
$dsn = $match[3];
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
// $dsn => protocol+hostspec/database (old format)
|
// $dsn => protocol+hostspec/database (old format)
|
||||||
|
@ -851,7 +739,7 @@ class DB
|
||||||
}
|
}
|
||||||
|
|
||||||
// }}}
|
// }}}
|
||||||
// {{{ getDSNString()
|
// {{{ isConnection()
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns the given DSN in a string format suitable for output.
|
* Returns the given DSN in a string format suitable for output.
|
||||||
|
@ -860,12 +748,13 @@ class DB
|
||||||
* @param boolean true to hide the password, false to include it
|
* @param boolean true to hide the password, false to include it
|
||||||
* @return string
|
* @return string
|
||||||
*/
|
*/
|
||||||
public static function getDSNString($dsn, $hidePassword) {
|
public static function getDSNString($dsn, $hidePassword)
|
||||||
|
{
|
||||||
/* Calling parseDSN will ensure that we have all the array elements
|
/* Calling parseDSN will ensure that we have all the array elements
|
||||||
* defined, and means that we deal with strings and array in the same
|
* defined, and means that we deal with strings and array in the same
|
||||||
* manner. */
|
* manner. */
|
||||||
$dsnArray = DB::parseDSN($dsn);
|
$dsnArray = DB::parseDSN($dsn);
|
||||||
|
|
||||||
if ($hidePassword) {
|
if ($hidePassword) {
|
||||||
$dsnArray['password'] = 'PASSWORD';
|
$dsnArray['password'] = 'PASSWORD';
|
||||||
}
|
}
|
||||||
|
@ -875,42 +764,42 @@ class DB
|
||||||
if (is_string($dsn) && strpos($dsn, 'tcp') === false && $dsnArray['protocol'] == 'tcp') {
|
if (is_string($dsn) && strpos($dsn, 'tcp') === false && $dsnArray['protocol'] == 'tcp') {
|
||||||
$dsnArray['protocol'] = false;
|
$dsnArray['protocol'] = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Now we just have to construct the actual string. This is ugly.
|
// Now we just have to construct the actual string. This is ugly.
|
||||||
$dsnString = $dsnArray['phptype'];
|
$dsnString = $dsnArray['phptype'];
|
||||||
if ($dsnArray['dbsyntax']) {
|
if ($dsnArray['dbsyntax']) {
|
||||||
$dsnString .= '('.$dsnArray['dbsyntax'].')';
|
$dsnString .= '(' . $dsnArray['dbsyntax'] . ')';
|
||||||
}
|
}
|
||||||
$dsnString .= '://'
|
$dsnString .= '://'
|
||||||
.$dsnArray['username']
|
. $dsnArray['username']
|
||||||
.':'
|
. ':'
|
||||||
.$dsnArray['password']
|
. $dsnArray['password']
|
||||||
.'@'
|
. '@'
|
||||||
.$dsnArray['protocol'];
|
. $dsnArray['protocol'];
|
||||||
if ($dsnArray['socket']) {
|
if ($dsnArray['socket']) {
|
||||||
$dsnString .= '('.$dsnArray['socket'].')';
|
$dsnString .= '(' . $dsnArray['socket'] . ')';
|
||||||
}
|
}
|
||||||
if ($dsnArray['protocol'] && $dsnArray['hostspec']) {
|
if ($dsnArray['protocol'] && $dsnArray['hostspec']) {
|
||||||
$dsnString .= '+';
|
$dsnString .= '+';
|
||||||
}
|
}
|
||||||
$dsnString .= $dsnArray['hostspec'];
|
$dsnString .= $dsnArray['hostspec'];
|
||||||
if ($dsnArray['port']) {
|
if ($dsnArray['port']) {
|
||||||
$dsnString .= ':'.$dsnArray['port'];
|
$dsnString .= ':' . $dsnArray['port'];
|
||||||
}
|
}
|
||||||
$dsnString .= '/'.$dsnArray['database'];
|
$dsnString .= '/' . $dsnArray['database'];
|
||||||
|
|
||||||
/* Option handling. Unfortunately, parseDSN simply places options into
|
/* Option handling. Unfortunately, parseDSN simply places options into
|
||||||
* the top-level array, so we'll first get rid of the fields defined by
|
* the top-level array, so we'll first get rid of the fields defined by
|
||||||
* DB and see what's left. */
|
* DB and see what's left. */
|
||||||
unset($dsnArray['phptype'],
|
unset($dsnArray['phptype'],
|
||||||
$dsnArray['dbsyntax'],
|
$dsnArray['dbsyntax'],
|
||||||
$dsnArray['username'],
|
$dsnArray['username'],
|
||||||
$dsnArray['password'],
|
$dsnArray['password'],
|
||||||
$dsnArray['protocol'],
|
$dsnArray['protocol'],
|
||||||
$dsnArray['socket'],
|
$dsnArray['socket'],
|
||||||
$dsnArray['hostspec'],
|
$dsnArray['hostspec'],
|
||||||
$dsnArray['port'],
|
$dsnArray['port'],
|
||||||
$dsnArray['database']
|
$dsnArray['database']
|
||||||
);
|
);
|
||||||
if (count($dsnArray) > 0) {
|
if (count($dsnArray) > 0) {
|
||||||
$dsnString .= '?';
|
$dsnString .= '?';
|
||||||
|
@ -919,13 +808,125 @@ class DB
|
||||||
if (++$i > 1) {
|
if (++$i > 1) {
|
||||||
$dsnString .= '&';
|
$dsnString .= '&';
|
||||||
}
|
}
|
||||||
$dsnString .= $key.'='.$value;
|
$dsnString .= $key . '=' . $value;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return $dsnString;
|
return $dsnString;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// }}}
|
||||||
|
// {{{ isManip()
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Determines if a value is a DB_<driver> object
|
||||||
|
*
|
||||||
|
* @param mixed $value the value to test
|
||||||
|
*
|
||||||
|
* @return bool whether $value is a DB_<driver> object
|
||||||
|
*/
|
||||||
|
public static function isConnection($value)
|
||||||
|
{
|
||||||
|
return (is_object($value) &&
|
||||||
|
is_subclass_of($value, 'db_common') &&
|
||||||
|
method_exists($value, 'simpleQuery'));
|
||||||
|
}
|
||||||
|
|
||||||
|
// }}}
|
||||||
|
// {{{ errorMessage()
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Tell whether a query is a data manipulation or data definition query
|
||||||
|
*
|
||||||
|
* Examples of data manipulation queries are INSERT, UPDATE and DELETE.
|
||||||
|
* Examples of data definition queries are CREATE, DROP, ALTER, GRANT,
|
||||||
|
* REVOKE.
|
||||||
|
*
|
||||||
|
* @param string $query the query
|
||||||
|
*
|
||||||
|
* @return boolean whether $query is a data manipulation query
|
||||||
|
*/
|
||||||
|
public static function isManip($query)
|
||||||
|
{
|
||||||
|
$manips = 'INSERT|UPDATE|DELETE|REPLACE|'
|
||||||
|
. 'CREATE|DROP|'
|
||||||
|
. 'LOAD DATA|SELECT .* INTO .* FROM|COPY|'
|
||||||
|
. 'ALTER|GRANT|REVOKE|'
|
||||||
|
. 'LOCK|UNLOCK';
|
||||||
|
if (preg_match('/^\s*"?(' . $manips . ')\s+/i', $query)) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
// }}}
|
||||||
|
// {{{ parseDSN()
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Return a textual error message for a DB error code
|
||||||
|
*
|
||||||
|
* @param integer $value the DB error code
|
||||||
|
*
|
||||||
|
* @return string the error message or false if the error code was
|
||||||
|
* not recognized
|
||||||
|
*/
|
||||||
|
public static function errorMessage($value)
|
||||||
|
{
|
||||||
|
static $errorMessages;
|
||||||
|
if (!isset($errorMessages)) {
|
||||||
|
$errorMessages = array(
|
||||||
|
DB_ERROR => 'unknown error',
|
||||||
|
DB_ERROR_ACCESS_VIOLATION => 'insufficient permissions',
|
||||||
|
DB_ERROR_ALREADY_EXISTS => 'already exists',
|
||||||
|
DB_ERROR_CANNOT_CREATE => 'can not create',
|
||||||
|
DB_ERROR_CANNOT_DROP => 'can not drop',
|
||||||
|
DB_ERROR_CONNECT_FAILED => 'connect failed',
|
||||||
|
DB_ERROR_CONSTRAINT => 'constraint violation',
|
||||||
|
DB_ERROR_CONSTRAINT_NOT_NULL => 'null value violates not-null constraint',
|
||||||
|
DB_ERROR_DIVZERO => 'division by zero',
|
||||||
|
DB_ERROR_EXTENSION_NOT_FOUND => 'extension not found',
|
||||||
|
DB_ERROR_INVALID => 'invalid',
|
||||||
|
DB_ERROR_INVALID_DATE => 'invalid date or time',
|
||||||
|
DB_ERROR_INVALID_DSN => 'invalid DSN',
|
||||||
|
DB_ERROR_INVALID_NUMBER => 'invalid number',
|
||||||
|
DB_ERROR_MISMATCH => 'mismatch',
|
||||||
|
DB_ERROR_NEED_MORE_DATA => 'insufficient data supplied',
|
||||||
|
DB_ERROR_NODBSELECTED => 'no database selected',
|
||||||
|
DB_ERROR_NOSUCHDB => 'no such database',
|
||||||
|
DB_ERROR_NOSUCHFIELD => 'no such field',
|
||||||
|
DB_ERROR_NOSUCHTABLE => 'no such table',
|
||||||
|
DB_ERROR_NOT_CAPABLE => 'DB backend not capable',
|
||||||
|
DB_ERROR_NOT_FOUND => 'not found',
|
||||||
|
DB_ERROR_NOT_LOCKED => 'not locked',
|
||||||
|
DB_ERROR_SYNTAX => 'syntax error',
|
||||||
|
DB_ERROR_UNSUPPORTED => 'not supported',
|
||||||
|
DB_ERROR_TRUNCATED => 'truncated',
|
||||||
|
DB_ERROR_VALUE_COUNT_ON_ROW => 'value count on row',
|
||||||
|
DB_OK => 'no error',
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (DB::isError($value)) {
|
||||||
|
$value = $value->getCode();
|
||||||
|
}
|
||||||
|
|
||||||
|
return isset($errorMessages[$value]) ? $errorMessages[$value]
|
||||||
|
: $errorMessages[DB_ERROR];
|
||||||
|
}
|
||||||
|
|
||||||
|
// }}}
|
||||||
|
// {{{ getDSNString()
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Return the DB API version
|
||||||
|
*
|
||||||
|
* @return string the DB API version number
|
||||||
|
*/
|
||||||
|
function apiVersion()
|
||||||
|
{
|
||||||
|
return '1.9.2';
|
||||||
|
}
|
||||||
|
|
||||||
// }}}
|
// }}}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -951,23 +952,23 @@ class DB_Error extends PEAR_Error
|
||||||
/**
|
/**
|
||||||
* DB_Error constructor
|
* DB_Error constructor
|
||||||
*
|
*
|
||||||
* @param mixed $code DB error code, or string with error message
|
* @param mixed $code DB error code, or string with error message
|
||||||
* @param int $mode what "error mode" to operate in
|
* @param int $mode what "error mode" to operate in
|
||||||
* @param int $level what error level to use for $mode &
|
* @param int $level what error level to use for $mode &
|
||||||
* PEAR_ERROR_TRIGGER
|
* PEAR_ERROR_TRIGGER
|
||||||
* @param mixed $debuginfo additional debug info, such as the last query
|
* @param mixed $debuginfo additional debug info, such as the last query
|
||||||
*
|
*
|
||||||
* @see PEAR_Error
|
* @see PEAR_Error
|
||||||
*/
|
*/
|
||||||
function __construct($code = DB_ERROR, $mode = PEAR_ERROR_RETURN,
|
function __construct($code = DB_ERROR, $mode = PEAR_ERROR_RETURN,
|
||||||
$level = E_USER_NOTICE, $debuginfo = null)
|
$level = E_USER_NOTICE, $debuginfo = null)
|
||||||
{
|
{
|
||||||
if (is_int($code)) {
|
if (is_int($code)) {
|
||||||
parent::__construct('DB Error: ' . DB::errorMessage($code), $code,
|
parent::__construct('DB Error: ' . DB::errorMessage($code), $code,
|
||||||
$mode, $level, $debuginfo);
|
$mode, $level, $debuginfo);
|
||||||
} else {
|
} else {
|
||||||
parent::__construct("DB Error: $code", DB_ERROR,
|
parent::__construct("DB Error: $code", DB_ERROR,
|
||||||
$mode, $level, $debuginfo);
|
$mode, $level, $debuginfo);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -975,6 +976,9 @@ class DB_Error extends PEAR_Error
|
||||||
* Workaround to both avoid the "Redefining already defined constructor"
|
* Workaround to both avoid the "Redefining already defined constructor"
|
||||||
* PHP error and provide backward compatibility in case someone is calling
|
* PHP error and provide backward compatibility in case someone is calling
|
||||||
* DB_Error() dynamically
|
* DB_Error() dynamically
|
||||||
|
* @param $method
|
||||||
|
* @param $arguments
|
||||||
|
* @return bool|mixed
|
||||||
*/
|
*/
|
||||||
public function __call($method, $arguments)
|
public function __call($method, $arguments)
|
||||||
{
|
{
|
||||||
|
@ -984,6 +988,7 @@ class DB_Error extends PEAR_Error
|
||||||
trigger_error(
|
trigger_error(
|
||||||
'Call to undefined method DB_Error::' . $method . '()', E_USER_ERROR
|
'Call to undefined method DB_Error::' . $method . '()', E_USER_ERROR
|
||||||
);
|
);
|
||||||
|
return false;
|
||||||
}
|
}
|
||||||
// }}}
|
// }}}
|
||||||
}
|
}
|
||||||
|
@ -1103,22 +1108,22 @@ class DB_result
|
||||||
/**
|
/**
|
||||||
* This constructor sets the object's properties
|
* This constructor sets the object's properties
|
||||||
*
|
*
|
||||||
* @param object &$dbh the DB object reference
|
* @param object &$dbh the DB object reference
|
||||||
* @param resource $result the result resource id
|
* @param resource $result the result resource id
|
||||||
* @param array $options an associative array with result options
|
* @param array $options an associative array with result options
|
||||||
*
|
*
|
||||||
* @return void
|
* @return void
|
||||||
*/
|
*/
|
||||||
function __construct(&$dbh, $result, $options = array())
|
function __construct(&$dbh, $result, $options = array())
|
||||||
{
|
{
|
||||||
$this->autofree = $dbh->options['autofree'];
|
$this->autofree = $dbh->options['autofree'];
|
||||||
$this->dbh = &$dbh;
|
$this->dbh = &$dbh;
|
||||||
$this->fetchmode = $dbh->fetchmode;
|
$this->fetchmode = $dbh->fetchmode;
|
||||||
$this->fetchmode_object_class = $dbh->fetchmode_object_class;
|
$this->fetchmode_object_class = $dbh->fetchmode_object_class;
|
||||||
$this->parameters = $dbh->last_parameters;
|
$this->parameters = $dbh->last_parameters;
|
||||||
$this->query = $dbh->last_query;
|
$this->query = $dbh->last_query;
|
||||||
$this->result = $result;
|
$this->result = $result;
|
||||||
$this->statement = empty($dbh->last_stmt) ? null : $dbh->last_stmt;
|
$this->statement = empty($dbh->last_stmt) ? null : $dbh->last_stmt;
|
||||||
foreach ($options as $key => $value) {
|
foreach ($options as $key => $value) {
|
||||||
$this->setOption($key, $value);
|
$this->setOption($key, $value);
|
||||||
}
|
}
|
||||||
|
@ -1127,8 +1132,8 @@ class DB_result
|
||||||
/**
|
/**
|
||||||
* Set options for the DB_result object
|
* Set options for the DB_result object
|
||||||
*
|
*
|
||||||
* @param string $key the option to set
|
* @param string $key the option to set
|
||||||
* @param mixed $value the value to set the option to
|
* @param mixed $value the value to set the option to
|
||||||
*
|
*
|
||||||
* @return void
|
* @return void
|
||||||
*/
|
*/
|
||||||
|
@ -1164,8 +1169,8 @@ class DB_result
|
||||||
* + <var>DB_PORTABILITY_RTRIM</var>
|
* + <var>DB_PORTABILITY_RTRIM</var>
|
||||||
* right trim the data
|
* right trim the data
|
||||||
*
|
*
|
||||||
* @param int $fetchmode the constant indicating how to format the data
|
* @param int $fetchmode the constant indicating how to format the data
|
||||||
* @param int $rownum the row number to fetch (index starts at 0)
|
* @param int $rownum the row number to fetch (index starts at 0)
|
||||||
*
|
*
|
||||||
* @return mixed an array or object containing the row's data,
|
* @return mixed an array or object containing the row's data,
|
||||||
* NULL when the end of the result set is reached
|
* NULL when the end of the result set is reached
|
||||||
|
@ -1193,8 +1198,7 @@ class DB_result
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if ($this->row_counter >= ($this->limit_from + $this->limit_count))
|
if ($this->row_counter >= ($this->limit_from + $this->limit_count)) {
|
||||||
{
|
|
||||||
if ($this->autofree) {
|
if ($this->autofree) {
|
||||||
$this->free();
|
$this->free();
|
||||||
}
|
}
|
||||||
|
@ -1212,7 +1216,7 @@ class DB_result
|
||||||
// The default mode is specified in the
|
// The default mode is specified in the
|
||||||
// DB_common::fetchmode_object_class property
|
// DB_common::fetchmode_object_class property
|
||||||
if ($object_class == 'stdClass') {
|
if ($object_class == 'stdClass') {
|
||||||
$arr = (object) $arr;
|
$arr = (object)$arr;
|
||||||
} else {
|
} else {
|
||||||
$arr = new $object_class($arr);
|
$arr = new $object_class($arr);
|
||||||
}
|
}
|
||||||
|
@ -1228,6 +1232,25 @@ class DB_result
|
||||||
// }}}
|
// }}}
|
||||||
// {{{ fetchInto()
|
// {{{ fetchInto()
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Frees the resources allocated for this result set
|
||||||
|
*
|
||||||
|
* @return bool true on success. A DB_Error object on failure.
|
||||||
|
*/
|
||||||
|
function free()
|
||||||
|
{
|
||||||
|
$err = $this->dbh->freeResult($this->result);
|
||||||
|
if (DB::isError($err)) {
|
||||||
|
return $err;
|
||||||
|
}
|
||||||
|
$this->result = false;
|
||||||
|
$this->statement = false;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
// }}}
|
||||||
|
// {{{ numCols()
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Fetch a row of data into an array which is passed by reference
|
* Fetch a row of data into an array which is passed by reference
|
||||||
*
|
*
|
||||||
|
@ -1246,9 +1269,9 @@ class DB_result
|
||||||
* + <var>DB_PORTABILITY_RTRIM</var>
|
* + <var>DB_PORTABILITY_RTRIM</var>
|
||||||
* right trim the data
|
* right trim the data
|
||||||
*
|
*
|
||||||
* @param array &$arr the variable where the data should be placed
|
* @param array &$arr the variable where the data should be placed
|
||||||
* @param int $fetchmode the constant indicating how to format the data
|
* @param int $fetchmode the constant indicating how to format the data
|
||||||
* @param int $rownum the row number to fetch (index starts at 0)
|
* @param int $rownum the row number to fetch (index starts at 0)
|
||||||
*
|
*
|
||||||
* @return mixed DB_OK if a row is processed, NULL when the end of the
|
* @return mixed DB_OK if a row is processed, NULL when the end of the
|
||||||
* result set is reached or a DB_Error object on failure
|
* result set is reached or a DB_Error object on failure
|
||||||
|
@ -1276,8 +1299,7 @@ class DB_result
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if ($this->row_counter >= (
|
if ($this->row_counter >= (
|
||||||
$this->limit_from + $this->limit_count))
|
$this->limit_from + $this->limit_count)) {
|
||||||
{
|
|
||||||
if ($this->autofree) {
|
if ($this->autofree) {
|
||||||
$this->free();
|
$this->free();
|
||||||
}
|
}
|
||||||
|
@ -1295,7 +1317,7 @@ class DB_result
|
||||||
// default mode specified in the
|
// default mode specified in the
|
||||||
// DB_common::fetchmode_object_class property
|
// DB_common::fetchmode_object_class property
|
||||||
if ($object_class == 'stdClass') {
|
if ($object_class == 'stdClass') {
|
||||||
$arr = (object) $arr;
|
$arr = (object)$arr;
|
||||||
} else {
|
} else {
|
||||||
$arr = new $object_class($arr);
|
$arr = new $object_class($arr);
|
||||||
}
|
}
|
||||||
|
@ -1309,7 +1331,7 @@ class DB_result
|
||||||
}
|
}
|
||||||
|
|
||||||
// }}}
|
// }}}
|
||||||
// {{{ numCols()
|
// {{{ numRows()
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Get the the number of columns in a result set
|
* Get the the number of columns in a result set
|
||||||
|
@ -1322,7 +1344,7 @@ class DB_result
|
||||||
}
|
}
|
||||||
|
|
||||||
// }}}
|
// }}}
|
||||||
// {{{ numRows()
|
// {{{ nextResult()
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Get the number of rows in a result set
|
* Get the number of rows in a result set
|
||||||
|
@ -1332,8 +1354,7 @@ class DB_result
|
||||||
function numRows()
|
function numRows()
|
||||||
{
|
{
|
||||||
if ($this->dbh->features['numrows'] === 'emulate'
|
if ($this->dbh->features['numrows'] === 'emulate'
|
||||||
&& $this->dbh->options['portability'] & DB_PORTABILITY_NUMROWS)
|
&& $this->dbh->options['portability'] & DB_PORTABILITY_NUMROWS) {
|
||||||
{
|
|
||||||
if ($this->dbh->features['prepare']) {
|
if ($this->dbh->features['prepare']) {
|
||||||
$res = $this->dbh->query($this->query, $this->parameters);
|
$res = $this->dbh->query($this->query, $this->parameters);
|
||||||
} else {
|
} else {
|
||||||
|
@ -1360,7 +1381,7 @@ class DB_result
|
||||||
* because that only gets the result resource, rather than the full
|
* because that only gets the result resource, rather than the full
|
||||||
* DB_Result object. */
|
* DB_Result object. */
|
||||||
if (($this->dbh->features['limit'] === 'emulate'
|
if (($this->dbh->features['limit'] === 'emulate'
|
||||||
&& $this->limit_from !== null)
|
&& $this->limit_from !== null)
|
||||||
|| $this->dbh->phptype == 'fbsql') {
|
|| $this->dbh->phptype == 'fbsql') {
|
||||||
$limit_count = is_null($this->limit_count) ? $count : $this->limit_count;
|
$limit_count = is_null($this->limit_count) ? $count : $this->limit_count;
|
||||||
if ($count < $this->limit_from) {
|
if ($count < $this->limit_from) {
|
||||||
|
@ -1376,7 +1397,7 @@ class DB_result
|
||||||
}
|
}
|
||||||
|
|
||||||
// }}}
|
// }}}
|
||||||
// {{{ nextResult()
|
// {{{ free()
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Get the next result if a batch of queries was executed
|
* Get the next result if a batch of queries was executed
|
||||||
|
@ -1388,29 +1409,12 @@ class DB_result
|
||||||
return $this->dbh->nextResult($this->result);
|
return $this->dbh->nextResult($this->result);
|
||||||
}
|
}
|
||||||
|
|
||||||
// }}}
|
|
||||||
// {{{ free()
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Frees the resources allocated for this result set
|
|
||||||
*
|
|
||||||
* @return bool true on success. A DB_Error object on failure.
|
|
||||||
*/
|
|
||||||
function free()
|
|
||||||
{
|
|
||||||
$err = $this->dbh->freeResult($this->result);
|
|
||||||
if (DB::isError($err)) {
|
|
||||||
return $err;
|
|
||||||
}
|
|
||||||
$this->result = false;
|
|
||||||
$this->statement = false;
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
// }}}
|
// }}}
|
||||||
// {{{ tableInfo()
|
// {{{ tableInfo()
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
* @param null $mode
|
||||||
|
* @return
|
||||||
* @see DB_common::tableInfo()
|
* @see DB_common::tableInfo()
|
||||||
* @deprecated Method deprecated some time before Release 1.2
|
* @deprecated Method deprecated some time before Release 1.2
|
||||||
*/
|
*/
|
||||||
|
@ -1499,6 +1503,4 @@ class DB_row
|
||||||
* tab-width: 4
|
* tab-width: 4
|
||||||
* c-basic-offset: 4
|
* c-basic-offset: 4
|
||||||
* End:
|
* End:
|
||||||
*/
|
*/
|
||||||
|
|
||||||
?>
|
|
1056
extlib/PEAR.php
1056
extlib/PEAR.php
File diff suppressed because it is too large
Load Diff
|
@ -1,7 +1,7 @@
|
||||||
<?php
|
<?php
|
||||||
/**
|
/**
|
||||||
* Error Stack Implementation
|
* Error Stack Implementation
|
||||||
*
|
*
|
||||||
* This is an incredibly simple implementation of a very complex error handling
|
* This is an incredibly simple implementation of a very complex error handling
|
||||||
* facility. It contains the ability
|
* facility. It contains the ability
|
||||||
* to track multiple errors from multiple packages simultaneously. In addition,
|
* to track multiple errors from multiple packages simultaneously. In addition,
|
||||||
|
@ -9,10 +9,10 @@
|
||||||
* information such as the exact file, line number, class and function that
|
* information such as the exact file, line number, class and function that
|
||||||
* generated the error, and if necessary, it can raise a traditional PEAR_Error.
|
* generated the error, and if necessary, it can raise a traditional PEAR_Error.
|
||||||
* It has built-in support for PEAR::Log, to log errors as they occur
|
* It has built-in support for PEAR::Log, to log errors as they occur
|
||||||
*
|
*
|
||||||
* Since version 0.2alpha, it is also possible to selectively ignore errors,
|
* Since version 0.2alpha, it is also possible to selectively ignore errors,
|
||||||
* through the use of an error callback, see {@link pushCallback()}
|
* through the use of an error callback, see {@link pushCallback()}
|
||||||
*
|
*
|
||||||
* Since version 0.3alpha, it is possible to specify the exception class
|
* Since version 0.3alpha, it is possible to specify the exception class
|
||||||
* returned from {@link push()}
|
* returned from {@link push()}
|
||||||
*
|
*
|
||||||
|
@ -23,13 +23,12 @@
|
||||||
* @author Greg Beaver <cellog@php.net>
|
* @author Greg Beaver <cellog@php.net>
|
||||||
* @copyright 2004-2008 Greg Beaver
|
* @copyright 2004-2008 Greg Beaver
|
||||||
* @license http://opensource.org/licenses/bsd-license.php New BSD License
|
* @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
|
* @link http://pear.php.net/package/PEAR_ErrorStack
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Singleton storage
|
* Singleton storage
|
||||||
*
|
*
|
||||||
* Format:
|
* Format:
|
||||||
* <pre>
|
* <pre>
|
||||||
* array(
|
* array(
|
||||||
|
@ -45,7 +44,7 @@ $GLOBALS['_PEAR_ERRORSTACK_SINGLETON'] = array();
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Global error callback (default)
|
* Global error callback (default)
|
||||||
*
|
*
|
||||||
* This is only used if set to non-false. * is the default callback for
|
* This is only used if set to non-false. * is the default callback for
|
||||||
* all packages, whereas specific packages may set a default callback
|
* all packages, whereas specific packages may set a default callback
|
||||||
* for all instances, regardless of whether they are a singleton or not.
|
* for all instances, regardless of whether they are a singleton or not.
|
||||||
|
@ -61,7 +60,7 @@ $GLOBALS['_PEAR_ERRORSTACK_DEFAULT_CALLBACK'] = array(
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Global Log object (default)
|
* Global Log object (default)
|
||||||
*
|
*
|
||||||
* This is only used if set to non-false. Use to set a default log object for
|
* This is only used if set to non-false. Use to set a default log object for
|
||||||
* all stacks, regardless of instantiation order or location
|
* all stacks, regardless of instantiation order or location
|
||||||
* @see PEAR_ErrorStack::setDefaultLogger()
|
* @see PEAR_ErrorStack::setDefaultLogger()
|
||||||
|
@ -72,7 +71,7 @@ $GLOBALS['_PEAR_ERRORSTACK_DEFAULT_LOGGER'] = false;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Global Overriding Callback
|
* Global Overriding Callback
|
||||||
*
|
*
|
||||||
* This callback will override any error callbacks that specific loggers have set.
|
* This callback will override any error callbacks that specific loggers have set.
|
||||||
* Use with EXTREME caution
|
* Use with EXTREME caution
|
||||||
* @see PEAR_ErrorStack::staticPushCallback()
|
* @see PEAR_ErrorStack::staticPushCallback()
|
||||||
|
@ -132,12 +131,11 @@ define('PEAR_ERRORSTACK_ERR_OBJTOSTRING', 2);
|
||||||
* $local_stack = new PEAR_ErrorStack('MyPackage');
|
* $local_stack = new PEAR_ErrorStack('MyPackage');
|
||||||
* </code>
|
* </code>
|
||||||
* @author Greg Beaver <cellog@php.net>
|
* @author Greg Beaver <cellog@php.net>
|
||||||
* @version 1.9.4
|
* @version @package_version@
|
||||||
* @package PEAR_ErrorStack
|
* @package PEAR_ErrorStack
|
||||||
* @category Debugging
|
* @category Debugging
|
||||||
* @copyright 2004-2008 Greg Beaver
|
* @copyright 2004-2008 Greg Beaver
|
||||||
* @license http://opensource.org/licenses/bsd-license.php New BSD License
|
* @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
|
* @link http://pear.php.net/package/PEAR_ErrorStack
|
||||||
*/
|
*/
|
||||||
class PEAR_ErrorStack {
|
class PEAR_ErrorStack {
|
||||||
|
@ -167,14 +165,14 @@ class PEAR_ErrorStack {
|
||||||
* @access protected
|
* @access protected
|
||||||
*/
|
*/
|
||||||
var $_package;
|
var $_package;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Determines whether a PEAR_Error is thrown upon every error addition
|
* Determines whether a PEAR_Error is thrown upon every error addition
|
||||||
* @var boolean
|
* @var boolean
|
||||||
* @access private
|
* @access private
|
||||||
*/
|
*/
|
||||||
var $_compat = false;
|
var $_compat = false;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* If set to a valid callback, this will be used to generate the error
|
* If set to a valid callback, this will be used to generate the error
|
||||||
* message from the error code, otherwise the message passed in will be
|
* message from the error code, otherwise the message passed in will be
|
||||||
|
@ -183,7 +181,7 @@ class PEAR_ErrorStack {
|
||||||
* @access private
|
* @access private
|
||||||
*/
|
*/
|
||||||
var $_msgCallback = false;
|
var $_msgCallback = false;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* If set to a valid callback, this will be used to generate the error
|
* If set to a valid callback, this will be used to generate the error
|
||||||
* context for an error. For PHP-related errors, this will be a file
|
* context for an error. For PHP-related errors, this will be a file
|
||||||
|
@ -194,43 +192,43 @@ class PEAR_ErrorStack {
|
||||||
* @access protected
|
* @access protected
|
||||||
*/
|
*/
|
||||||
var $_contextCallback = false;
|
var $_contextCallback = false;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* If set to a valid callback, this will be called every time an error
|
* If set to a valid callback, this will be called every time an error
|
||||||
* is pushed onto the stack. The return value will be used to determine
|
* is pushed onto the stack. The return value will be used to determine
|
||||||
* whether to allow an error to be pushed or logged.
|
* whether to allow an error to be pushed or logged.
|
||||||
*
|
*
|
||||||
* The return value must be one an PEAR_ERRORSTACK_* constant
|
* The return value must be one an PEAR_ERRORSTACK_* constant
|
||||||
* @see PEAR_ERRORSTACK_PUSHANDLOG, PEAR_ERRORSTACK_PUSH, PEAR_ERRORSTACK_LOG
|
* @see PEAR_ERRORSTACK_PUSHANDLOG, PEAR_ERRORSTACK_PUSH, PEAR_ERRORSTACK_LOG
|
||||||
* @var false|string|array
|
* @var false|string|array
|
||||||
* @access protected
|
* @access protected
|
||||||
*/
|
*/
|
||||||
var $_errorCallback = array();
|
var $_errorCallback = array();
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* PEAR::Log object for logging errors
|
* PEAR::Log object for logging errors
|
||||||
* @var false|Log
|
* @var false|Log
|
||||||
* @access protected
|
* @access protected
|
||||||
*/
|
*/
|
||||||
var $_logger = false;
|
var $_logger = false;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Error messages - designed to be overridden
|
* Error messages - designed to be overridden
|
||||||
* @var array
|
* @var array
|
||||||
* @abstract
|
* @abstract
|
||||||
*/
|
*/
|
||||||
var $_errorMsgs = array();
|
var $_errorMsgs = array();
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Set up a new error stack
|
* Set up a new error stack
|
||||||
*
|
*
|
||||||
* @param string $package name of the package this error stack represents
|
* @param string $package name of the package this error stack represents
|
||||||
* @param callback $msgCallback callback used for error message generation
|
* @param callback $msgCallback callback used for error message generation
|
||||||
* @param callback $contextCallback callback used for context generation,
|
* @param callback $contextCallback callback used for context generation,
|
||||||
* defaults to {@link getFileLine()}
|
* defaults to {@link getFileLine()}
|
||||||
* @param boolean $throwPEAR_Error
|
* @param boolean $throwPEAR_Error
|
||||||
*/
|
*/
|
||||||
function PEAR_ErrorStack($package, $msgCallback = false, $contextCallback = false,
|
function __construct($package, $msgCallback = false, $contextCallback = false,
|
||||||
$throwPEAR_Error = false)
|
$throwPEAR_Error = false)
|
||||||
{
|
{
|
||||||
$this->_package = $package;
|
$this->_package = $package;
|
||||||
|
@ -238,10 +236,10 @@ class PEAR_ErrorStack {
|
||||||
$this->setContextCallback($contextCallback);
|
$this->setContextCallback($contextCallback);
|
||||||
$this->_compat = $throwPEAR_Error;
|
$this->_compat = $throwPEAR_Error;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Return a single error stack for this package.
|
* Return a single error stack for this package.
|
||||||
*
|
*
|
||||||
* Note that all parameters are ignored if the stack for package $package
|
* Note that all parameters are ignored if the stack for package $package
|
||||||
* has already been instantiated
|
* has already been instantiated
|
||||||
* @param string $package name of the package this error stack represents
|
* @param string $package name of the package this error stack represents
|
||||||
|
@ -250,12 +248,13 @@ class PEAR_ErrorStack {
|
||||||
* defaults to {@link getFileLine()}
|
* defaults to {@link getFileLine()}
|
||||||
* @param boolean $throwPEAR_Error
|
* @param boolean $throwPEAR_Error
|
||||||
* @param string $stackClass class to instantiate
|
* @param string $stackClass class to instantiate
|
||||||
* @static
|
*
|
||||||
* @return PEAR_ErrorStack
|
* @return PEAR_ErrorStack
|
||||||
*/
|
*/
|
||||||
function &singleton($package, $msgCallback = false, $contextCallback = false,
|
public static function &singleton(
|
||||||
$throwPEAR_Error = false, $stackClass = 'PEAR_ErrorStack')
|
$package, $msgCallback = false, $contextCallback = false,
|
||||||
{
|
$throwPEAR_Error = false, $stackClass = 'PEAR_ErrorStack'
|
||||||
|
) {
|
||||||
if (isset($GLOBALS['_PEAR_ERRORSTACK_SINGLETON'][$package])) {
|
if (isset($GLOBALS['_PEAR_ERRORSTACK_SINGLETON'][$package])) {
|
||||||
return $GLOBALS['_PEAR_ERRORSTACK_SINGLETON'][$package];
|
return $GLOBALS['_PEAR_ERRORSTACK_SINGLETON'][$package];
|
||||||
}
|
}
|
||||||
|
@ -276,7 +275,7 @@ class PEAR_ErrorStack {
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Internal error handler for PEAR_ErrorStack class
|
* Internal error handler for PEAR_ErrorStack class
|
||||||
*
|
*
|
||||||
* Dies if the error is an exception (and would have died anyway)
|
* Dies if the error is an exception (and would have died anyway)
|
||||||
* @access private
|
* @access private
|
||||||
*/
|
*/
|
||||||
|
@ -293,24 +292,23 @@ class PEAR_ErrorStack {
|
||||||
die($message);
|
die($message);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Set up a PEAR::Log object for all error stacks that don't have one
|
* Set up a PEAR::Log object for all error stacks that don't have one
|
||||||
* @param Log $log
|
* @param Log $log
|
||||||
* @static
|
|
||||||
*/
|
*/
|
||||||
function setDefaultLogger(&$log)
|
public static function setDefaultLogger(&$log)
|
||||||
{
|
{
|
||||||
if (is_object($log) && method_exists($log, 'log') ) {
|
if (is_object($log) && method_exists($log, 'log') ) {
|
||||||
$GLOBALS['_PEAR_ERRORSTACK_DEFAULT_LOGGER'] = &$log;
|
$GLOBALS['_PEAR_ERRORSTACK_DEFAULT_LOGGER'] = &$log;
|
||||||
} elseif (is_callable($log)) {
|
} elseif (is_callable($log)) {
|
||||||
$GLOBALS['_PEAR_ERRORSTACK_DEFAULT_LOGGER'] = &$log;
|
$GLOBALS['_PEAR_ERRORSTACK_DEFAULT_LOGGER'] = &$log;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Set up a PEAR::Log object for this error stack
|
* Set up a PEAR::Log object for this error stack
|
||||||
* @param Log $log
|
* @param Log $log
|
||||||
*/
|
*/
|
||||||
function setLogger(&$log)
|
function setLogger(&$log)
|
||||||
{
|
{
|
||||||
|
@ -320,10 +318,10 @@ class PEAR_ErrorStack {
|
||||||
$this->_logger = &$log;
|
$this->_logger = &$log;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Set an error code => error message mapping callback
|
* Set an error code => error message mapping callback
|
||||||
*
|
*
|
||||||
* This method sets the callback that can be used to generate error
|
* This method sets the callback that can be used to generate error
|
||||||
* messages for any instance
|
* messages for any instance
|
||||||
* @param array|string Callback function/method
|
* @param array|string Callback function/method
|
||||||
|
@ -338,10 +336,10 @@ class PEAR_ErrorStack {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Get an error code => error message mapping callback
|
* Get an error code => error message mapping callback
|
||||||
*
|
*
|
||||||
* This method returns the current callback that can be used to generate error
|
* This method returns the current callback that can be used to generate error
|
||||||
* messages
|
* messages
|
||||||
* @return array|string|false Callback function/method or false if none
|
* @return array|string|false Callback function/method or false if none
|
||||||
|
@ -350,17 +348,16 @@ class PEAR_ErrorStack {
|
||||||
{
|
{
|
||||||
return $this->_msgCallback;
|
return $this->_msgCallback;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Sets a default callback to be used by all error stacks
|
* Sets a default callback to be used by all error stacks
|
||||||
*
|
*
|
||||||
* This method sets the callback that can be used to generate error
|
* This method sets the callback that can be used to generate error
|
||||||
* messages for a singleton
|
* messages for a singleton
|
||||||
* @param array|string Callback function/method
|
* @param array|string Callback function/method
|
||||||
* @param string Package name, or false for all packages
|
* @param string Package name, or false for all packages
|
||||||
* @static
|
|
||||||
*/
|
*/
|
||||||
function setDefaultCallback($callback = false, $package = false)
|
public static function setDefaultCallback($callback = false, $package = false)
|
||||||
{
|
{
|
||||||
if (!is_callable($callback)) {
|
if (!is_callable($callback)) {
|
||||||
$callback = false;
|
$callback = false;
|
||||||
|
@ -368,14 +365,16 @@ class PEAR_ErrorStack {
|
||||||
$package = $package ? $package : '*';
|
$package = $package ? $package : '*';
|
||||||
$GLOBALS['_PEAR_ERRORSTACK_DEFAULT_CALLBACK'][$package] = $callback;
|
$GLOBALS['_PEAR_ERRORSTACK_DEFAULT_CALLBACK'][$package] = $callback;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Set a callback that generates context information (location of error) for an error stack
|
* Set a callback that generates context information (location of error) for an error stack
|
||||||
*
|
*
|
||||||
* This method sets the callback that can be used to generate context
|
* This method sets the callback that can be used to generate context
|
||||||
* information for an error. Passing in NULL will disable context generation
|
* information for an error. Passing in NULL will disable context generation
|
||||||
* and remove the expensive call to debug_backtrace()
|
* and remove the expensive call to debug_backtrace()
|
||||||
* @param array|string|null Callback function/method
|
* @param array|string|null Callback function/method
|
||||||
|
* @return bool
|
||||||
|
* @return array|bool|callable|false|string
|
||||||
*/
|
*/
|
||||||
function setContextCallback($contextCallback)
|
function setContextCallback($contextCallback)
|
||||||
{
|
{
|
||||||
|
@ -383,22 +382,23 @@ class PEAR_ErrorStack {
|
||||||
return $this->_contextCallback = false;
|
return $this->_contextCallback = false;
|
||||||
}
|
}
|
||||||
if (!$contextCallback) {
|
if (!$contextCallback) {
|
||||||
$this->_contextCallback = array(&$this, 'getFileLine');
|
$this->_contextCallback = [&$this, 'getFileLine'];
|
||||||
} else {
|
} else {
|
||||||
if (is_callable($contextCallback)) {
|
if (is_callable($contextCallback)) {
|
||||||
$this->_contextCallback = $contextCallback;
|
$this->_contextCallback = $contextCallback;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
return $this->_contextCallback;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Set an error Callback
|
* Set an error Callback
|
||||||
* If set to a valid callback, this will be called every time an error
|
* If set to a valid callback, this will be called every time an error
|
||||||
* is pushed onto the stack. The return value will be used to determine
|
* is pushed onto the stack. The return value will be used to determine
|
||||||
* whether to allow an error to be pushed or logged.
|
* whether to allow an error to be pushed or logged.
|
||||||
*
|
*
|
||||||
* The return value must be one of the ERRORSTACK_* constants.
|
* The return value must be one of the ERRORSTACK_* constants.
|
||||||
*
|
*
|
||||||
* This functionality can be used to emulate PEAR's pushErrorHandling, and
|
* This functionality can be used to emulate PEAR's pushErrorHandling, and
|
||||||
* the PEAR_ERROR_CALLBACK mode, without affecting the integrity of
|
* the PEAR_ERROR_CALLBACK mode, without affecting the integrity of
|
||||||
* the error stack or logging
|
* the error stack or logging
|
||||||
|
@ -410,7 +410,7 @@ class PEAR_ErrorStack {
|
||||||
{
|
{
|
||||||
array_push($this->_errorCallback, $cb);
|
array_push($this->_errorCallback, $cb);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Remove a callback from the error callback stack
|
* Remove a callback from the error callback stack
|
||||||
* @see pushCallback()
|
* @see pushCallback()
|
||||||
|
@ -423,7 +423,7 @@ class PEAR_ErrorStack {
|
||||||
}
|
}
|
||||||
return array_pop($this->_errorCallback);
|
return array_pop($this->_errorCallback);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Set a temporary overriding error callback for every package error stack
|
* Set a temporary overriding error callback for every package error stack
|
||||||
*
|
*
|
||||||
|
@ -432,20 +432,18 @@ class PEAR_ErrorStack {
|
||||||
* @see PEAR_ERRORSTACK_PUSHANDLOG, PEAR_ERRORSTACK_PUSH, PEAR_ERRORSTACK_LOG
|
* @see PEAR_ERRORSTACK_PUSHANDLOG, PEAR_ERRORSTACK_PUSH, PEAR_ERRORSTACK_LOG
|
||||||
* @see staticPopCallback(), pushCallback()
|
* @see staticPopCallback(), pushCallback()
|
||||||
* @param string|array $cb
|
* @param string|array $cb
|
||||||
* @static
|
|
||||||
*/
|
*/
|
||||||
function staticPushCallback($cb)
|
public static function staticPushCallback($cb)
|
||||||
{
|
{
|
||||||
array_push($GLOBALS['_PEAR_ERRORSTACK_OVERRIDE_CALLBACK'], $cb);
|
array_push($GLOBALS['_PEAR_ERRORSTACK_OVERRIDE_CALLBACK'], $cb);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Remove a temporary overriding error callback
|
* Remove a temporary overriding error callback
|
||||||
* @see staticPushCallback()
|
* @see staticPushCallback()
|
||||||
* @return array|string|false
|
* @return array|string|false
|
||||||
* @static
|
|
||||||
*/
|
*/
|
||||||
function staticPopCallback()
|
public static function staticPopCallback()
|
||||||
{
|
{
|
||||||
$ret = array_pop($GLOBALS['_PEAR_ERRORSTACK_OVERRIDE_CALLBACK']);
|
$ret = array_pop($GLOBALS['_PEAR_ERRORSTACK_OVERRIDE_CALLBACK']);
|
||||||
if (!is_array($GLOBALS['_PEAR_ERRORSTACK_OVERRIDE_CALLBACK'])) {
|
if (!is_array($GLOBALS['_PEAR_ERRORSTACK_OVERRIDE_CALLBACK'])) {
|
||||||
|
@ -453,15 +451,15 @@ class PEAR_ErrorStack {
|
||||||
}
|
}
|
||||||
return $ret;
|
return $ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Add an error to the stack
|
* Add an error to the stack
|
||||||
*
|
*
|
||||||
* If the message generator exists, it is called with 2 parameters.
|
* If the message generator exists, it is called with 2 parameters.
|
||||||
* - the current Error Stack object
|
* - the current Error Stack object
|
||||||
* - an array that is in the same format as an error. Available indices
|
* - an array that is in the same format as an error. Available indices
|
||||||
* are 'code', 'package', 'time', 'params', 'level', and 'context'
|
* are 'code', 'package', 'time', 'params', 'level', and 'context'
|
||||||
*
|
*
|
||||||
* Next, if the error should contain context information, this is
|
* Next, if the error should contain context information, this is
|
||||||
* handled by the context grabbing method.
|
* handled by the context grabbing method.
|
||||||
* Finally, the error is pushed onto the proper error stack
|
* Finally, the error is pushed onto the proper error stack
|
||||||
|
@ -479,7 +477,7 @@ class PEAR_ErrorStack {
|
||||||
* @return PEAR_Error|array if compatibility mode is on, a PEAR_Error is also
|
* @return PEAR_Error|array if compatibility mode is on, a PEAR_Error is also
|
||||||
* thrown. If a PEAR_Error is returned, the userinfo
|
* thrown. If a PEAR_Error is returned, the userinfo
|
||||||
* property is set to the following array:
|
* property is set to the following array:
|
||||||
*
|
*
|
||||||
* <code>
|
* <code>
|
||||||
* array(
|
* array(
|
||||||
* 'code' => $code,
|
* 'code' => $code,
|
||||||
|
@ -492,7 +490,7 @@ 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.
|
* Normally, the previous array is returned.
|
||||||
*/
|
*/
|
||||||
function push($code, $level = 'error', $params = array(), $msg = false,
|
function push($code, $level = 'error', $params = array(), $msg = false,
|
||||||
|
@ -506,19 +504,19 @@ class PEAR_ErrorStack {
|
||||||
}
|
}
|
||||||
$context = call_user_func($this->_contextCallback, $code, $params, $backtrace);
|
$context = call_user_func($this->_contextCallback, $code, $params, $backtrace);
|
||||||
}
|
}
|
||||||
|
|
||||||
// save error
|
// save error
|
||||||
$time = explode(' ', microtime());
|
$time = explode(' ', microtime());
|
||||||
$time = $time[1] + $time[0];
|
$time = $time[1] + $time[0];
|
||||||
$err = array(
|
$err = array(
|
||||||
'code' => $code,
|
'code' => $code,
|
||||||
'params' => $params,
|
'params' => $params,
|
||||||
'package' => $this->_package,
|
'package' => $this->_package,
|
||||||
'level' => $level,
|
'level' => $level,
|
||||||
'time' => $time,
|
'time' => $time,
|
||||||
'context' => $context,
|
'context' => $context,
|
||||||
'message' => $msg,
|
'message' => $msg,
|
||||||
);
|
);
|
||||||
|
|
||||||
if ($repackage) {
|
if ($repackage) {
|
||||||
$err['repackage'] = $repackage;
|
$err['repackage'] = $repackage;
|
||||||
|
@ -527,9 +525,9 @@ class PEAR_ErrorStack {
|
||||||
// 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;
|
||||||
}
|
}
|
||||||
$push = $log = true;
|
$push = $log = true;
|
||||||
$die = false;
|
$die = false;
|
||||||
// try the overriding callback first
|
// try the overriding callback first
|
||||||
|
@ -551,18 +549,18 @@ class PEAR_ErrorStack {
|
||||||
}
|
}
|
||||||
if (is_callable($callback)) {
|
if (is_callable($callback)) {
|
||||||
switch(call_user_func($callback, $err)){
|
switch(call_user_func($callback, $err)){
|
||||||
case PEAR_ERRORSTACK_IGNORE:
|
case PEAR_ERRORSTACK_IGNORE:
|
||||||
return $err;
|
return $err;
|
||||||
break;
|
break;
|
||||||
case PEAR_ERRORSTACK_PUSH:
|
case PEAR_ERRORSTACK_PUSH:
|
||||||
$log = false;
|
$log = false;
|
||||||
break;
|
break;
|
||||||
case PEAR_ERRORSTACK_LOG:
|
case PEAR_ERRORSTACK_LOG:
|
||||||
$push = false;
|
$push = false;
|
||||||
break;
|
break;
|
||||||
case PEAR_ERRORSTACK_DIE:
|
case PEAR_ERRORSTACK_DIE:
|
||||||
$die = true;
|
$die = true;
|
||||||
break;
|
break;
|
||||||
// anything else returned has the same effect as pushandlog
|
// anything else returned has the same effect as pushandlog
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -586,10 +584,10 @@ class PEAR_ErrorStack {
|
||||||
}
|
}
|
||||||
return $err;
|
return $err;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Static version of {@link push()}
|
* Static version of {@link push()}
|
||||||
*
|
*
|
||||||
* @param string $package Package name this error belongs to
|
* @param string $package Package name this error belongs to
|
||||||
* @param int $code Package-specific error code
|
* @param int $code Package-specific error code
|
||||||
* @param string $level Error level. This is NOT spell-checked
|
* @param string $level Error level. This is NOT spell-checked
|
||||||
|
@ -604,11 +602,11 @@ class PEAR_ErrorStack {
|
||||||
* to find error context
|
* to find error context
|
||||||
* @return PEAR_Error|array if compatibility mode is on, a PEAR_Error is also
|
* @return PEAR_Error|array if compatibility mode is on, a PEAR_Error is also
|
||||||
* thrown. see docs for {@link push()}
|
* thrown. see docs for {@link push()}
|
||||||
* @static
|
|
||||||
*/
|
*/
|
||||||
function staticPush($package, $code, $level = 'error', $params = array(),
|
public static function staticPush(
|
||||||
$msg = false, $repackage = false, $backtrace = false)
|
$package, $code, $level = 'error', $params = array(),
|
||||||
{
|
$msg = false, $repackage = false, $backtrace = false
|
||||||
|
) {
|
||||||
$s = &PEAR_ErrorStack::singleton($package);
|
$s = &PEAR_ErrorStack::singleton($package);
|
||||||
if ($s->_contextCallback) {
|
if ($s->_contextCallback) {
|
||||||
if (!$backtrace) {
|
if (!$backtrace) {
|
||||||
|
@ -619,7 +617,7 @@ class PEAR_ErrorStack {
|
||||||
}
|
}
|
||||||
return $s->push($code, $level, $params, $msg, $repackage, $backtrace);
|
return $s->push($code, $level, $params, $msg, $repackage, $backtrace);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Log an error using PEAR::Log
|
* Log an error using PEAR::Log
|
||||||
* @param array $err Error array
|
* @param array $err Error array
|
||||||
|
@ -654,10 +652,10 @@ class PEAR_ErrorStack {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Pop an error off of the error stack
|
* Pop an error off of the error stack
|
||||||
*
|
*
|
||||||
* @return false|array
|
* @return false|array
|
||||||
* @since 0.4alpha it is no longer possible to specify a specific error
|
* @since 0.4alpha it is no longer possible to specify a specific error
|
||||||
* level to return - the last error pushed will be returned, instead
|
* level to return - the last error pushed will be returned, instead
|
||||||
|
@ -681,7 +679,7 @@ class PEAR_ErrorStack {
|
||||||
* @return boolean
|
* @return boolean
|
||||||
* @since PEAR1.5.0a1
|
* @since PEAR1.5.0a1
|
||||||
*/
|
*/
|
||||||
function staticPop($package)
|
static function staticPop($package)
|
||||||
{
|
{
|
||||||
if ($package) {
|
if ($package) {
|
||||||
if (!isset($GLOBALS['_PEAR_ERRORSTACK_SINGLETON'][$package])) {
|
if (!isset($GLOBALS['_PEAR_ERRORSTACK_SINGLETON'][$package])) {
|
||||||
|
@ -689,11 +687,12 @@ class PEAR_ErrorStack {
|
||||||
}
|
}
|
||||||
return $GLOBALS['_PEAR_ERRORSTACK_SINGLETON'][$package]->pop();
|
return $GLOBALS['_PEAR_ERRORSTACK_SINGLETON'][$package]->pop();
|
||||||
}
|
}
|
||||||
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Determine whether there are any errors on the stack
|
* Determine whether there are any errors on the stack
|
||||||
* @param string|array Level name. Use to determine if any errors
|
* @param string|array|bool $level name. Use to determine if any errors
|
||||||
* of level (string), or levels (array) have been pushed
|
* of level (string), or levels (array) have been pushed
|
||||||
* @return boolean
|
* @return boolean
|
||||||
*/
|
*/
|
||||||
|
@ -704,10 +703,10 @@ class PEAR_ErrorStack {
|
||||||
}
|
}
|
||||||
return count($this->_errors);
|
return count($this->_errors);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Retrieve all errors since last purge
|
* Retrieve all errors since last purge
|
||||||
*
|
*
|
||||||
* @param boolean set in order to empty the error stack
|
* @param boolean set in order to empty the error stack
|
||||||
* @param string level name, to return only errors of a particular severity
|
* @param string level name, to return only errors of a particular severity
|
||||||
* @return array
|
* @return array
|
||||||
|
@ -741,7 +740,7 @@ class PEAR_ErrorStack {
|
||||||
$this->_errorsByLevel = array();
|
$this->_errorsByLevel = array();
|
||||||
return $ret;
|
return $ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Determine whether there are any errors on a single error stack, or on any error stack
|
* Determine whether there are any errors on a single error stack, or on any error stack
|
||||||
*
|
*
|
||||||
|
@ -750,9 +749,8 @@ class PEAR_ErrorStack {
|
||||||
* @param string|false Package name to check for errors
|
* @param string|false Package name to check for errors
|
||||||
* @param string Level name to check for a particular severity
|
* @param string Level name to check for a particular severity
|
||||||
* @return boolean
|
* @return boolean
|
||||||
* @static
|
|
||||||
*/
|
*/
|
||||||
function staticHasErrors($package = false, $level = false)
|
public static function staticHasErrors($package = false, $level = false)
|
||||||
{
|
{
|
||||||
if ($package) {
|
if ($package) {
|
||||||
if (!isset($GLOBALS['_PEAR_ERRORSTACK_SINGLETON'][$package])) {
|
if (!isset($GLOBALS['_PEAR_ERRORSTACK_SINGLETON'][$package])) {
|
||||||
|
@ -767,7 +765,7 @@ class PEAR_ErrorStack {
|
||||||
}
|
}
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Get a list of all errors since last purge, organized by package
|
* Get a list of all errors since last purge, organized by package
|
||||||
* @since PEAR 1.4.0dev BC break! $level is now in the place $merge used to be
|
* @since PEAR 1.4.0dev BC break! $level is now in the place $merge used to be
|
||||||
|
@ -776,12 +774,13 @@ class PEAR_ErrorStack {
|
||||||
* @param boolean $merge Set to return a flat array, not organized by package
|
* @param boolean $merge Set to return a flat array, not organized by package
|
||||||
* @param array $sortfunc Function used to sort a merged array - default
|
* @param array $sortfunc Function used to sort a merged array - default
|
||||||
* sorts by time, and should be good for most cases
|
* sorts by time, and should be good for most cases
|
||||||
* @static
|
*
|
||||||
* @return array
|
* @return array
|
||||||
*/
|
*/
|
||||||
function staticGetErrors($purge = false, $level = false, $merge = false,
|
public static function staticGetErrors(
|
||||||
$sortfunc = array('PEAR_ErrorStack', '_sortErrors'))
|
$purge = false, $level = false, $merge = false,
|
||||||
{
|
$sortfunc = array('PEAR_ErrorStack', '_sortErrors')
|
||||||
|
) {
|
||||||
$ret = array();
|
$ret = array();
|
||||||
if (!is_callable($sortfunc)) {
|
if (!is_callable($sortfunc)) {
|
||||||
$sortfunc = array('PEAR_ErrorStack', '_sortErrors');
|
$sortfunc = array('PEAR_ErrorStack', '_sortErrors');
|
||||||
|
@ -801,12 +800,12 @@ class PEAR_ErrorStack {
|
||||||
}
|
}
|
||||||
return $ret;
|
return $ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Error sorting function, sorts by time
|
* Error sorting function, sorts by time
|
||||||
* @access private
|
* @access private
|
||||||
*/
|
*/
|
||||||
function _sortErrors($a, $b)
|
public static function _sortErrors($a, $b)
|
||||||
{
|
{
|
||||||
if ($a['time'] == $b['time']) {
|
if ($a['time'] == $b['time']) {
|
||||||
return 0;
|
return 0;
|
||||||
|
@ -829,9 +828,8 @@ class PEAR_ErrorStack {
|
||||||
* @param unused
|
* @param unused
|
||||||
* @param integer backtrace frame.
|
* @param integer backtrace frame.
|
||||||
* @param array Results of debug_backtrace()
|
* @param array Results of debug_backtrace()
|
||||||
* @static
|
|
||||||
*/
|
*/
|
||||||
function getFileLine($code, $params, $backtrace = null)
|
public static function getFileLine($code, $params, $backtrace = null)
|
||||||
{
|
{
|
||||||
if ($backtrace === null) {
|
if ($backtrace === null) {
|
||||||
return false;
|
return false;
|
||||||
|
@ -842,8 +840,8 @@ class PEAR_ErrorStack {
|
||||||
$functionframe = 0;
|
$functionframe = 0;
|
||||||
} else {
|
} else {
|
||||||
while (isset($backtrace[$functionframe]['function']) &&
|
while (isset($backtrace[$functionframe]['function']) &&
|
||||||
$backtrace[$functionframe]['function'] == 'eval' &&
|
$backtrace[$functionframe]['function'] == 'eval' &&
|
||||||
isset($backtrace[$functionframe + 1])) {
|
isset($backtrace[$functionframe + 1])) {
|
||||||
$functionframe++;
|
$functionframe++;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -854,11 +852,11 @@ class PEAR_ErrorStack {
|
||||||
$funcbacktrace = $backtrace[$functionframe];
|
$funcbacktrace = $backtrace[$functionframe];
|
||||||
$filebacktrace = $backtrace[$frame];
|
$filebacktrace = $backtrace[$frame];
|
||||||
$ret = array('file' => $filebacktrace['file'],
|
$ret = array('file' => $filebacktrace['file'],
|
||||||
'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+)\) : (.*?)\\z;', $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;
|
||||||
}
|
}
|
||||||
|
@ -878,35 +876,35 @@ class PEAR_ErrorStack {
|
||||||
}
|
}
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Standard error message generation callback
|
* Standard error message generation callback
|
||||||
*
|
*
|
||||||
* This method may also be called by a custom error message generator
|
* This method may also be called by a custom error message generator
|
||||||
* to fill in template values from the params array, simply
|
* to fill in template values from the params array, simply
|
||||||
* set the third parameter to the error message template string to use
|
* set the third parameter to the error message template string to use
|
||||||
*
|
*
|
||||||
* The special variable %__msg% is reserved: use it only to specify
|
* The special variable %__msg% is reserved: use it only to specify
|
||||||
* where a message passed in by the user should be placed in the template,
|
* where a message passed in by the user should be placed in the template,
|
||||||
* like so:
|
* like so:
|
||||||
*
|
*
|
||||||
* Error message: %msg% - internal error
|
* Error message: %msg% - internal error
|
||||||
*
|
*
|
||||||
* If the message passed like so:
|
* If the message passed like so:
|
||||||
*
|
*
|
||||||
* <code>
|
* <code>
|
||||||
* $stack->push(ERROR_CODE, 'error', array(), 'server error 500');
|
* $stack->push(ERROR_CODE, 'error', array(), 'server error 500');
|
||||||
* </code>
|
* </code>
|
||||||
*
|
*
|
||||||
* The returned error message will be "Error message: server error 500 -
|
* The returned error message will be "Error message: server error 500 -
|
||||||
* internal error"
|
* internal error"
|
||||||
* @param PEAR_ErrorStack
|
* @param PEAR_ErrorStack
|
||||||
* @param array
|
* @param array
|
||||||
* @param string|false Pre-generated error message template
|
* @param string|false Pre-generated error message template
|
||||||
* @static
|
*
|
||||||
* @return string
|
* @return string
|
||||||
*/
|
*/
|
||||||
function getErrorMessage(&$stack, $err, $template = false)
|
public static function getErrorMessage(&$stack, $err, $template = false)
|
||||||
{
|
{
|
||||||
if ($template) {
|
if ($template) {
|
||||||
$mainmsg = $template;
|
$mainmsg = $template;
|
||||||
|
@ -935,7 +933,7 @@ class PEAR_ErrorStack {
|
||||||
}
|
}
|
||||||
return $mainmsg;
|
return $mainmsg;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Standard Error Message Template generator from code
|
* Standard Error Message Template generator from code
|
||||||
* @return string
|
* @return string
|
||||||
|
@ -947,39 +945,42 @@ class PEAR_ErrorStack {
|
||||||
}
|
}
|
||||||
return $this->_errorMsgs[$code];
|
return $this->_errorMsgs[$code];
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Set the Error Message Template array
|
* Set the Error Message Template array
|
||||||
*
|
*
|
||||||
* The array format must be:
|
* The array format must be:
|
||||||
* <pre>
|
* <pre>
|
||||||
* array(error code => 'message template',...)
|
* array(error code => 'message template',...)
|
||||||
* </pre>
|
* </pre>
|
||||||
*
|
*
|
||||||
* Error message parameters passed into {@link push()} will be used as input
|
* Error message parameters passed into {@link push()} will be used as input
|
||||||
* for the error message. If the template is 'message %foo% was %bar%', and the
|
* for the error message. If the template is 'message %foo% was %bar%', and the
|
||||||
* parameters are array('foo' => 'one', 'bar' => 'six'), the error message returned will
|
* parameters are array('foo' => 'one', 'bar' => 'six'), the error message returned will
|
||||||
* be 'message one was six'
|
* be 'message one was six'
|
||||||
* @return string
|
*
|
||||||
|
* Returns string via property
|
||||||
|
* @param $template
|
||||||
|
* @return null
|
||||||
*/
|
*/
|
||||||
function setErrorMessageTemplate($template)
|
function setErrorMessageTemplate($template)
|
||||||
{
|
{
|
||||||
$this->_errorMsgs = $template;
|
$this->_errorMsgs = $template;
|
||||||
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* emulate PEAR::raiseError()
|
* emulate PEAR::raiseError()
|
||||||
*
|
*
|
||||||
* @return PEAR_Error
|
* @return PEAR_Error
|
||||||
*/
|
*/
|
||||||
function raiseError()
|
function raiseError()
|
||||||
{
|
{
|
||||||
require_once 'PEAR.php';
|
require_once '../PEAR.php';
|
||||||
$args = func_get_args();
|
$args = func_get_args();
|
||||||
return call_user_func_array(array('PEAR', 'raiseError'), $args);
|
return call_user_func_array(array('PEAR', 'raiseError'), $args);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
$stack = &PEAR_ErrorStack::singleton('PEAR_ErrorStack');
|
$stack = &PEAR_ErrorStack::singleton('PEAR_ErrorStack');
|
||||||
$stack->pushCallback(array('PEAR_ErrorStack', '_handleError'));
|
$stack->pushCallback(array('PEAR_ErrorStack', '_handleError'));
|
||||||
?>
|
|
|
@ -99,9 +99,9 @@ class PEAR_Exception extends Exception
|
||||||
const OBSERVER_PRINT = -2;
|
const OBSERVER_PRINT = -2;
|
||||||
const OBSERVER_TRIGGER = -4;
|
const OBSERVER_TRIGGER = -4;
|
||||||
const OBSERVER_DIE = -8;
|
const OBSERVER_DIE = -8;
|
||||||
protected $cause;
|
|
||||||
private static $_observers = array();
|
private static $_observers = array();
|
||||||
private static $_uniqueid = 0;
|
private static $_uniqueid = 0;
|
||||||
|
protected $cause;
|
||||||
private $_trace;
|
private $_trace;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -117,6 +117,7 @@ class PEAR_Exception extends Exception
|
||||||
* @param string exception message
|
* @param string exception message
|
||||||
* @param int|Exception|PEAR_Error|array|null exception cause
|
* @param int|Exception|PEAR_Error|array|null exception cause
|
||||||
* @param int|null exception code or null
|
* @param int|null exception code or null
|
||||||
|
* @throws PEAR_Exception
|
||||||
*/
|
*/
|
||||||
public function __construct($message, $p2 = null, $p3 = null)
|
public function __construct($message, $p2 = null, $p3 = null)
|
||||||
{
|
{
|
||||||
|
@ -145,32 +146,6 @@ class PEAR_Exception extends Exception
|
||||||
$this->signal();
|
$this->signal();
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* @param mixed $callback - A valid php callback, see php func is_callable()
|
|
||||||
* - A PEAR_Exception::OBSERVER_* constant
|
|
||||||
* - An array(const PEAR_Exception::OBSERVER_*,
|
|
||||||
* mixed $options)
|
|
||||||
* @param string $label The name of the observer. Use this if you want
|
|
||||||
* to remove it later with removeObserver()
|
|
||||||
*/
|
|
||||||
public static function addObserver($callback, $label = 'default')
|
|
||||||
{
|
|
||||||
self::$_observers[$label] = $callback;
|
|
||||||
}
|
|
||||||
|
|
||||||
public static function removeObserver($label = 'default')
|
|
||||||
{
|
|
||||||
unset(self::$_observers[$label]);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @return int unique identifier for an observer
|
|
||||||
*/
|
|
||||||
public static function getUniqueId()
|
|
||||||
{
|
|
||||||
return self::$_uniqueid++;
|
|
||||||
}
|
|
||||||
|
|
||||||
private function signal()
|
private function signal()
|
||||||
{
|
{
|
||||||
foreach (self::$_observers as $func) {
|
foreach (self::$_observers as $func) {
|
||||||
|
@ -198,6 +173,32 @@ class PEAR_Exception extends Exception
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param mixed $callback - A valid php callback, see php func is_callable()
|
||||||
|
* - A PEAR_Exception::OBSERVER_* constant
|
||||||
|
* - An array(const PEAR_Exception::OBSERVER_*,
|
||||||
|
* mixed $options)
|
||||||
|
* @param string $label The name of the observer. Use this if you want
|
||||||
|
* to remove it later with removeObserver()
|
||||||
|
*/
|
||||||
|
public static function addObserver($callback, $label = 'default')
|
||||||
|
{
|
||||||
|
self::$_observers[$label] = $callback;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static function removeObserver($label = 'default')
|
||||||
|
{
|
||||||
|
unset(self::$_observers[$label]);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return int unique identifier for an observer
|
||||||
|
*/
|
||||||
|
public static function getUniqueId()
|
||||||
|
{
|
||||||
|
return self::$_uniqueid++;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Return specific error information that can be used for more detailed
|
* Return specific error information that can be used for more detailed
|
||||||
* error messages or translation.
|
* error messages or translation.
|
||||||
|
@ -227,79 +228,6 @@ class PEAR_Exception extends Exception
|
||||||
return $this->cause;
|
return $this->cause;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* Function must be public to call on caused exceptions
|
|
||||||
* @param array
|
|
||||||
*/
|
|
||||||
public function getCauseMessage(&$causes)
|
|
||||||
{
|
|
||||||
$trace = $this->getTraceSafe();
|
|
||||||
$cause = array('class' => get_class($this),
|
|
||||||
'message' => $this->message,
|
|
||||||
'file' => 'unknown',
|
|
||||||
'line' => 'unknown');
|
|
||||||
if (isset($trace[0])) {
|
|
||||||
if (isset($trace[0]['file'])) {
|
|
||||||
$cause['file'] = $trace[0]['file'];
|
|
||||||
$cause['line'] = $trace[0]['line'];
|
|
||||||
}
|
|
||||||
}
|
|
||||||
$causes[] = $cause;
|
|
||||||
if ($this->cause instanceof PEAR_Exception) {
|
|
||||||
$this->cause->getCauseMessage($causes);
|
|
||||||
} elseif ($this->cause instanceof Exception) {
|
|
||||||
$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) {
|
|
||||||
if ($cause instanceof PEAR_Exception) {
|
|
||||||
$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'])) {
|
|
||||||
// PEAR_ErrorStack warning
|
|
||||||
$causes[] = array(
|
|
||||||
'class' => $cause['package'],
|
|
||||||
'message' => $cause['message'],
|
|
||||||
'file' => isset($cause['context']['file']) ?
|
|
||||||
$cause['context']['file'] :
|
|
||||||
'unknown',
|
|
||||||
'line' => isset($cause['context']['line']) ?
|
|
||||||
$cause['context']['line'] :
|
|
||||||
'unknown',
|
|
||||||
);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public function getTraceSafe()
|
|
||||||
{
|
|
||||||
if (!isset($this->_trace)) {
|
|
||||||
$this->_trace = $this->getTrace();
|
|
||||||
if (empty($this->_trace)) {
|
|
||||||
$backtrace = debug_backtrace();
|
|
||||||
$this->_trace = array($backtrace[count($backtrace)-1]);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return $this->_trace;
|
|
||||||
}
|
|
||||||
|
|
||||||
public function getErrorClass()
|
public function getErrorClass()
|
||||||
{
|
{
|
||||||
$trace = $this->getTraceSafe();
|
$trace = $this->getTraceSafe();
|
||||||
|
@ -325,22 +253,22 @@ class PEAR_Exception extends Exception
|
||||||
$trace = $this->getTraceSafe();
|
$trace = $this->getTraceSafe();
|
||||||
$causes = array();
|
$causes = array();
|
||||||
$this->getCauseMessage($causes);
|
$this->getCauseMessage($causes);
|
||||||
$html = '<table style="border: 1px" 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" style="background: #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" style="background-color: #aaaaaa; text-align: center; font-weight: bold;">Exception trace</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 style="text-align: center; background: #cccccc; width:20px; font-weight: bold;">#</td>'
|
. '<tr><td style="text-align: center; background: #cccccc; width:20px; font-weight: bold;">#</td>'
|
||||||
. '<td style="text-align: center; background: #cccccc; font-weight: bold;">Function</td>'
|
. '<td style="text-align: center; background: #cccccc; font-weight: bold;">Function</td>'
|
||||||
. '<td style="text-align: center; background: #cccccc; font-weight: bold;">Location</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 style="text-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'];
|
||||||
}
|
}
|
||||||
|
@ -350,7 +278,7 @@ class PEAR_Exception extends Exception
|
||||||
foreach ($v['args'] as $arg) {
|
foreach ($v['args'] as $arg) {
|
||||||
if (is_null($arg)) $args[] = 'null';
|
if (is_null($arg)) $args[] = 'null';
|
||||||
elseif (is_array($arg)) $args[] = 'Array';
|
elseif (is_array($arg)) $args[] = 'Array';
|
||||||
elseif (is_object($arg)) $args[] = 'Object('.get_class($arg).')';
|
elseif (is_object($arg)) $args[] = 'Object(' . get_class($arg) . ')';
|
||||||
elseif (is_bool($arg)) $args[] = $arg ? 'true' : 'false';
|
elseif (is_bool($arg)) $args[] = $arg ? 'true' : 'false';
|
||||||
elseif (is_int($arg) || is_double($arg)) $args[] = $arg;
|
elseif (is_int($arg) || is_double($arg)) $args[] = $arg;
|
||||||
else {
|
else {
|
||||||
|
@ -361,19 +289,92 @@ class PEAR_Exception extends Exception
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
$html .= '(' . implode(', ',$args) . ')'
|
$html .= '(' . implode(', ', $args) . ')'
|
||||||
. '</td>'
|
. '</td>'
|
||||||
. '<td>' . (isset($v['file']) ? $v['file'] : 'unknown')
|
. '<td>' . (isset($v['file']) ? $v['file'] : 'unknown')
|
||||||
. ':' . (isset($v['line']) ? $v['line'] : 'unknown')
|
. ':' . (isset($v['line']) ? $v['line'] : 'unknown')
|
||||||
. '</td></tr>' . "\n";
|
. '</td></tr>' . "\n";
|
||||||
}
|
}
|
||||||
$html .= '<tr><td style="text-align: center;">' . ($k+1) . '</td>'
|
$html .= '<tr><td style="text-align: center;">' . ($k + 1) . '</td>'
|
||||||
. '<td>{main}</td>'
|
. '<td>{main}</td>'
|
||||||
. '<td> </td></tr>' . "\n"
|
. '<td> </td></tr>' . "\n"
|
||||||
. '</table>';
|
. '</table>';
|
||||||
return $html;
|
return $html;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Function must be public to call on caused exceptions
|
||||||
|
* @param array
|
||||||
|
*/
|
||||||
|
public function getCauseMessage(&$causes)
|
||||||
|
{
|
||||||
|
$trace = $this->getTraceSafe();
|
||||||
|
$cause = array('class' => get_class($this),
|
||||||
|
'message' => $this->message,
|
||||||
|
'file' => 'unknown',
|
||||||
|
'line' => 'unknown');
|
||||||
|
if (isset($trace[0])) {
|
||||||
|
if (isset($trace[0]['file'])) {
|
||||||
|
$cause['file'] = $trace[0]['file'];
|
||||||
|
$cause['line'] = $trace[0]['line'];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
$causes[] = $cause;
|
||||||
|
if ($this->cause instanceof PEAR_Exception) {
|
||||||
|
$this->cause->getCauseMessage($causes);
|
||||||
|
} elseif ($this->cause instanceof Exception) {
|
||||||
|
$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) {
|
||||||
|
if ($cause instanceof PEAR_Exception) {
|
||||||
|
$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'])) {
|
||||||
|
// PEAR_ErrorStack warning
|
||||||
|
$causes[] = array(
|
||||||
|
'class' => $cause['package'],
|
||||||
|
'message' => $cause['message'],
|
||||||
|
'file' => isset($cause['context']['file']) ?
|
||||||
|
$cause['context']['file'] :
|
||||||
|
'unknown',
|
||||||
|
'line' => isset($cause['context']['line']) ?
|
||||||
|
$cause['context']['line'] :
|
||||||
|
'unknown',
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public function getTraceSafe()
|
||||||
|
{
|
||||||
|
if (!isset($this->_trace)) {
|
||||||
|
$this->_trace = $this->getTrace();
|
||||||
|
if (empty($this->_trace)) {
|
||||||
|
$backtrace = debug_backtrace();
|
||||||
|
$this->_trace = array($backtrace[count($backtrace) - 1]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return $this->_trace;
|
||||||
|
}
|
||||||
|
|
||||||
public function toText()
|
public function toText()
|
||||||
{
|
{
|
||||||
$causes = array();
|
$causes = array();
|
||||||
|
@ -381,8 +382,8 @@ class PEAR_Exception extends Exception
|
||||||
$causeMsg = '';
|
$causeMsg = '';
|
||||||
foreach ($causes as $i => $cause) {
|
foreach ($causes as $i => $cause) {
|
||||||
$causeMsg .= str_repeat(' ', $i) . $cause['class'] . ': '
|
$causeMsg .= str_repeat(' ', $i) . $cause['class'] . ': '
|
||||||
. $cause['message'] . ' in ' . $cause['file']
|
. $cause['message'] . ' in ' . $cause['file']
|
||||||
. ' on line ' . $cause['line'] . "\n";
|
. ' on line ' . $cause['line'] . "\n";
|
||||||
}
|
}
|
||||||
return $causeMsg . $this->getTraceAsString();
|
return $causeMsg . $this->getTraceAsString();
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,7 +0,0 @@
|
||||||
<?php
|
|
||||||
if ($skipmsg) {
|
|
||||||
$a = &new $ec($code, $mode, $options, $userinfo);
|
|
||||||
} else {
|
|
||||||
$a = &new $ec($message, $code, $mode, $options, $userinfo);
|
|
||||||
}
|
|
||||||
?>
|
|
|
@ -1,33 +0,0 @@
|
||||||
<?php
|
|
||||||
/**
|
|
||||||
* This is only meant for PHP 5 to get rid of certain strict warning
|
|
||||||
* that doesn't get hidden since it's in the shutdown function
|
|
||||||
*/
|
|
||||||
class PEAR5
|
|
||||||
{
|
|
||||||
/**
|
|
||||||
* If you have a class that's mostly/entirely static, and you need static
|
|
||||||
* properties, you can use this method to simulate them. Eg. in your method(s)
|
|
||||||
* do this: $myVar = &PEAR5::getStaticProperty('myclass', 'myVar');
|
|
||||||
* You MUST use a reference, or they will not persist!
|
|
||||||
*
|
|
||||||
* @access public
|
|
||||||
* @param string $class The calling classname, to prevent clashes
|
|
||||||
* @param string $var The variable to retrieve.
|
|
||||||
* @return mixed A reference to the variable. If not set it will be
|
|
||||||
* auto initialised to NULL.
|
|
||||||
*/
|
|
||||||
static function &getStaticProperty($class, $var)
|
|
||||||
{
|
|
||||||
static $properties;
|
|
||||||
if (!isset($properties[$class])) {
|
|
||||||
$properties[$class] = array();
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!array_key_exists($var, $properties[$class])) {
|
|
||||||
$properties[$class][$var] = null;
|
|
||||||
}
|
|
||||||
|
|
||||||
return $properties[$class][$var];
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -9,7 +9,6 @@
|
||||||
* @author Tomas V.V.Cox <cox@idecnet.com>
|
* @author Tomas V.V.Cox <cox@idecnet.com>
|
||||||
* @copyright 1997-2009 The Authors
|
* @copyright 1997-2009 The Authors
|
||||||
* @license http://opensource.org/licenses/bsd-license.php New BSD License
|
* @license http://opensource.org/licenses/bsd-license.php New BSD License
|
||||||
* @version CVS: $Id: System.php 313024 2011-07-06 19:51:24Z dufuz $
|
|
||||||
* @link http://pear.php.net/package/PEAR
|
* @link http://pear.php.net/package/PEAR
|
||||||
* @since File available since Release 0.1
|
* @since File available since Release 0.1
|
||||||
*/
|
*/
|
||||||
|
@ -23,65 +22,102 @@ require_once 'Console/Getopt.php';
|
||||||
$GLOBALS['_System_temp_files'] = array();
|
$GLOBALS['_System_temp_files'] = array();
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* System offers cross plattform compatible system functions
|
* System offers cross platform compatible system functions
|
||||||
*
|
*
|
||||||
* Static functions for different operations. Should work under
|
* Static functions for different operations. Should work under
|
||||||
* Unix and Windows. The names and usage has been taken from its respectively
|
* Unix and Windows. The names and usage has been taken from its respectively
|
||||||
* GNU commands. The functions will return (bool) false on error and will
|
* GNU commands. The functions will return (bool) false on error and will
|
||||||
* trigger the error with the PHP trigger_error() function (you can silence
|
* trigger the error with the PHP trigger_error() function (you can silence
|
||||||
* the error by prefixing a '@' sign after the function call, but this
|
* the error by prefixing a '@' sign after the function call, but this
|
||||||
* is not recommended practice. Instead use an error handler with
|
* is not recommended practice. Instead use an error handler with
|
||||||
* {@link set_error_handler()}).
|
* {@link set_error_handler()}).
|
||||||
*
|
*
|
||||||
* Documentation on this class you can find in:
|
* Documentation on this class you can find in:
|
||||||
* http://pear.php.net/manual/
|
* http://pear.php.net/manual/
|
||||||
*
|
*
|
||||||
* Example usage:
|
* Example usage:
|
||||||
* if (!@System::rm('-r file1 dir1')) {
|
* if (!@System::rm('-r file1 dir1')) {
|
||||||
* print "could not delete file1 or dir1";
|
* print "could not delete file1 or dir1";
|
||||||
* }
|
* }
|
||||||
*
|
*
|
||||||
* In case you need to to pass file names with spaces,
|
* In case you need to to pass file names with spaces,
|
||||||
* pass the params as an array:
|
* pass the params as an array:
|
||||||
*
|
*
|
||||||
* System::rm(array('-r', $file1, $dir1));
|
* System::rm(array('-r', $file1, $dir1));
|
||||||
*
|
*
|
||||||
* @category pear
|
* @category pear
|
||||||
* @package System
|
* @package System
|
||||||
* @author Tomas V.V. Cox <cox@idecnet.com>
|
* @author Tomas V.V. Cox <cox@idecnet.com>
|
||||||
* @copyright 1997-2006 The PHP Group
|
* @copyright 1997-2006 The PHP Group
|
||||||
* @license http://opensource.org/licenses/bsd-license.php New BSD License
|
* @license http://opensource.org/licenses/bsd-license.php New BSD License
|
||||||
* @version Release: 1.9.4
|
* @version Release: @package_version@
|
||||||
* @link http://pear.php.net/package/PEAR
|
* @link http://pear.php.net/package/PEAR
|
||||||
* @since Class available since Release 0.1
|
* @since Class available since Release 0.1
|
||||||
* @static
|
* @static
|
||||||
*/
|
*/
|
||||||
class System
|
class System
|
||||||
{
|
{
|
||||||
/**
|
/**
|
||||||
* returns the commandline arguments of a function
|
* Concatenate files
|
||||||
*
|
*
|
||||||
* @param string $argv the commandline
|
* Usage:
|
||||||
* @param string $short_options the allowed option short-tags
|
* 1) $var = System::cat('sample.txt test.txt');
|
||||||
* @param string $long_options the allowed option long-tags
|
* 2) System::cat('sample.txt test.txt > final.txt');
|
||||||
* @return array the given options and there values
|
* 3) System::cat('sample.txt test.txt >> final.txt');
|
||||||
* @static
|
*
|
||||||
* @access private
|
* Note: as the class use fopen, urls should work also
|
||||||
|
*
|
||||||
|
* @param string $args the arguments
|
||||||
|
* @return boolean true on success
|
||||||
*/
|
*/
|
||||||
function _parseArgs($argv, $short_options, $long_options = null)
|
public static function &cat($args)
|
||||||
{
|
{
|
||||||
if (!is_array($argv) && $argv !== null) {
|
$ret = null;
|
||||||
// Find all items, quoted or otherwise
|
$files = array();
|
||||||
preg_match_all("/(?:[\"'])(.*?)(?:['\"])|([^\s]+)/", $argv, $av);
|
if (!is_array($args)) {
|
||||||
$argv = $av[1];
|
$args = preg_split('/\s+/', $args, -1, PREG_SPLIT_NO_EMPTY);
|
||||||
foreach ($av[2] as $k => $a) {
|
}
|
||||||
if (empty($a)) {
|
|
||||||
continue;
|
$count_args = count($args);
|
||||||
}
|
for ($i = 0; $i < $count_args; $i++) {
|
||||||
$argv[$k] = trim($a) ;
|
if ($args[$i] == '>') {
|
||||||
|
$mode = 'wb';
|
||||||
|
$outputfile = $args[$i + 1];
|
||||||
|
break;
|
||||||
|
} elseif ($args[$i] == '>>') {
|
||||||
|
$mode = 'ab+';
|
||||||
|
$outputfile = $args[$i + 1];
|
||||||
|
break;
|
||||||
|
} else {
|
||||||
|
$files[] = $args[$i];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return Console_Getopt::getopt2($argv, $short_options, $long_options);
|
$outputfd = false;
|
||||||
|
if (isset($mode)) {
|
||||||
|
if (!$outputfd = fopen($outputfile, $mode)) {
|
||||||
|
$err = System::raiseError("Could not open $outputfile");
|
||||||
|
return $err;
|
||||||
|
}
|
||||||
|
$ret = true;
|
||||||
|
}
|
||||||
|
foreach ($files as $file) {
|
||||||
|
if (!$fd = fopen($file, 'r')) {
|
||||||
|
System::raiseError("Could not open $file");
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
while ($cont = fread($fd, 2048)) {
|
||||||
|
if (is_resource($outputfd)) {
|
||||||
|
fwrite($outputfd, $cont);
|
||||||
|
} else {
|
||||||
|
$ret .= $cont;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
fclose($fd);
|
||||||
|
}
|
||||||
|
if (is_resource($outputfd)) {
|
||||||
|
fclose($outputfd);
|
||||||
|
}
|
||||||
|
return $ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -90,10 +126,8 @@ class System
|
||||||
*
|
*
|
||||||
* @param mixed $error a PEAR error or a string with the error message
|
* @param mixed $error a PEAR error or a string with the error message
|
||||||
* @return bool false
|
* @return bool false
|
||||||
* @static
|
|
||||||
* @access private
|
|
||||||
*/
|
*/
|
||||||
function raiseError($error)
|
protected static function raiseError($error)
|
||||||
{
|
{
|
||||||
if (PEAR::isError($error)) {
|
if (PEAR::isError($error)) {
|
||||||
$error = $error->getMessage();
|
$error = $error->getMessage();
|
||||||
|
@ -103,100 +137,233 @@ class System
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Creates a nested array representing the structure of a directory
|
* Creates temporary files or directories. This function will remove
|
||||||
|
* the created files when the scripts finish its execution.
|
||||||
*
|
*
|
||||||
* System::_dirToStruct('dir1', 0) =>
|
* Usage:
|
||||||
* Array
|
* 1) $tempfile = System::mktemp("prefix");
|
||||||
* (
|
* 2) $tempdir = System::mktemp("-d prefix");
|
||||||
* [dirs] => Array
|
* 3) $tempfile = System::mktemp();
|
||||||
* (
|
* 4) $tempfile = System::mktemp("-t /var/tmp prefix");
|
||||||
* [0] => dir1
|
|
||||||
* )
|
|
||||||
*
|
*
|
||||||
* [files] => Array
|
* prefix -> The string that will be prepended to the temp name
|
||||||
* (
|
* (defaults to "tmp").
|
||||||
* [0] => dir1/file2
|
* -d -> A temporary dir will be created instead of a file.
|
||||||
* [1] => dir1/file3
|
* -t -> The target dir where the temporary (file|dir) will be created. If
|
||||||
* )
|
* this param is missing by default the env vars TMP on Windows or
|
||||||
* )
|
* TMPDIR in Unix will be used. If these vars are also missing
|
||||||
* @param string $sPath Name of the directory
|
* c:\windows\temp or /tmp will be used.
|
||||||
* @param integer $maxinst max. deep of the lookup
|
*
|
||||||
* @param integer $aktinst starting deep of the lookup
|
* @param string $args The arguments
|
||||||
* @param bool $silent if true, do not emit errors.
|
* @return mixed the full path of the created (file|dir) or false
|
||||||
* @return array the structure of the dir
|
* @see System::tmpdir()
|
||||||
* @static
|
|
||||||
* @access private
|
|
||||||
*/
|
*/
|
||||||
function _dirToStruct($sPath, $maxinst, $aktinst = 0, $silent = false)
|
public static function mktemp($args = null)
|
||||||
{
|
{
|
||||||
$struct = array('dirs' => array(), 'files' => array());
|
static $first_time = true;
|
||||||
if (($dir = @opendir($sPath)) === false) {
|
$opts = System::_parseArgs($args, 't:d');
|
||||||
if (!$silent) {
|
if (PEAR::isError($opts)) {
|
||||||
System::raiseError("Could not open dir $sPath");
|
return System::raiseError($opts);
|
||||||
}
|
|
||||||
return $struct; // XXX could not open error
|
|
||||||
}
|
}
|
||||||
|
|
||||||
$struct['dirs'][] = $sPath = realpath($sPath); // XXX don't add if '.' or '..' ?
|
foreach ($opts[0] as $opt) {
|
||||||
$list = array();
|
if ($opt[0] == 'd') {
|
||||||
while (false !== ($file = readdir($dir))) {
|
$tmp_is_dir = true;
|
||||||
if ($file != '.' && $file != '..') {
|
} elseif ($opt[0] == 't') {
|
||||||
$list[] = $file;
|
$tmpdir = $opt[1];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
closedir($dir);
|
$prefix = (isset($opts[1][0])) ? $opts[1][0] : 'tmp';
|
||||||
natsort($list);
|
if (!isset($tmpdir)) {
|
||||||
if ($aktinst < $maxinst || $maxinst == 0) {
|
$tmpdir = System::tmpdir();
|
||||||
foreach ($list as $val) {
|
}
|
||||||
$path = $sPath . DIRECTORY_SEPARATOR . $val;
|
|
||||||
if (is_dir($path) && !is_link($path)) {
|
if (!System::mkDir(['-p', $tmpdir])) {
|
||||||
$tmp = System::_dirToStruct($path, $maxinst, $aktinst+1, $silent);
|
return false;
|
||||||
$struct = array_merge_recursive($struct, $tmp);
|
}
|
||||||
} else {
|
|
||||||
$struct['files'][] = $path;
|
$tmp = tempnam($tmpdir, $prefix);
|
||||||
}
|
if (isset($tmp_is_dir)) {
|
||||||
|
unlink($tmp); // be careful possible race condition here
|
||||||
|
if (!mkdir($tmp, 0700)) {
|
||||||
|
return System::raiseError("Unable to create temporary directory $tmpdir");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return $struct;
|
$GLOBALS['_System_temp_files'][] = $tmp;
|
||||||
|
/*if (isset($tmp_is_dir)) {
|
||||||
|
//$GLOBALS['_System_temp_files'][] = dirname($tmp);
|
||||||
|
}*/
|
||||||
|
|
||||||
|
if ($first_time) {
|
||||||
|
PEAR::registerShutdownFunc(array('System', '_removeTmpFiles'));
|
||||||
|
$first_time = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
return $tmp;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Creates a nested array representing the structure of a directory and files
|
* returns the commandline arguments of a function
|
||||||
*
|
*
|
||||||
* @param array $files Array listing files and dirs
|
* @param string $argv the commandline
|
||||||
* @return array
|
* @param string $short_options the allowed option short-tags
|
||||||
* @static
|
* @param string $long_options the allowed option long-tags
|
||||||
* @see System::_dirToStruct()
|
* @return array the given options and there values
|
||||||
*/
|
*/
|
||||||
function _multipleToStruct($files)
|
public static function _parseArgs($argv, $short_options, $long_options = null)
|
||||||
{
|
{
|
||||||
$struct = array('dirs' => array(), 'files' => array());
|
if (!is_array($argv) && $argv !== null) {
|
||||||
settype($files, 'array');
|
/*
|
||||||
foreach ($files as $file) {
|
// Quote all items that are a short option
|
||||||
if (is_dir($file) && !is_link($file)) {
|
$av = preg_split('/(\A| )--?[a-z0-9]+[ =]?((?<!\\\\)((,\s*)|((?<!,)\s+))?)/i', $argv, -1, PREG_SPLIT_NO_EMPTY | PREG_SPLIT_OFFSET_CAPTURE);
|
||||||
$tmp = System::_dirToStruct($file, 0);
|
$offset = 0;
|
||||||
$struct = array_merge_recursive($tmp, $struct);
|
foreach ($av as $a) {
|
||||||
} else {
|
$b = trim($a[0]);
|
||||||
if (!in_array($file, $struct['files'])) {
|
if ($b{0} == '"' || $b{0} == "'") {
|
||||||
$struct['files'][] = $file;
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
$escape = escapeshellarg($b);
|
||||||
|
$pos = $a[1] + $offset;
|
||||||
|
$argv = substr_replace($argv, $escape, $pos, strlen($b));
|
||||||
|
$offset += 2;
|
||||||
|
}
|
||||||
|
*/
|
||||||
|
|
||||||
|
// Find all items, quoted or otherwise
|
||||||
|
preg_match_all("/(?:[\"'])(.*?)(?:['\"])|([^\s]+)/", $argv, $av);
|
||||||
|
$argv = $av[1];
|
||||||
|
foreach ($av[2] as $k => $a) {
|
||||||
|
if (empty($a)) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
$argv[$k] = trim($a);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return (new Console_Getopt)->getopt2($argv, $short_options, $long_options);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get the path of the temporal directory set in the system
|
||||||
|
* by looking in its environments variables.
|
||||||
|
* Note: php.ini-recommended removes the "E" from the variables_order setting,
|
||||||
|
* making unavaible the $_ENV array, that s why we do tests with _ENV
|
||||||
|
*
|
||||||
|
* @return string The temporary directory on the system
|
||||||
|
*/
|
||||||
|
public static function tmpdir()
|
||||||
|
{
|
||||||
|
if (OS_WINDOWS) {
|
||||||
|
if ($var = isset($_ENV['TMP']) ? $_ENV['TMP'] : getenv('TMP')) {
|
||||||
|
return $var;
|
||||||
|
}
|
||||||
|
if ($var = isset($_ENV['TEMP']) ? $_ENV['TEMP'] : getenv('TEMP')) {
|
||||||
|
return $var;
|
||||||
|
}
|
||||||
|
if ($var = isset($_ENV['USERPROFILE']) ? $_ENV['USERPROFILE'] : getenv('USERPROFILE')) {
|
||||||
|
return $var;
|
||||||
|
}
|
||||||
|
if ($var = isset($_ENV['windir']) ? $_ENV['windir'] : getenv('windir')) {
|
||||||
|
return $var;
|
||||||
|
}
|
||||||
|
return getenv('SystemRoot') . '\temp';
|
||||||
|
}
|
||||||
|
if ($var = isset($_ENV['TMPDIR']) ? $_ENV['TMPDIR'] : getenv('TMPDIR')) {
|
||||||
|
return $var;
|
||||||
|
}
|
||||||
|
return realpath('/tmp');
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Make directories.
|
||||||
|
*
|
||||||
|
* The -p option will create parent directories
|
||||||
|
* @param string $args the name of the director(y|ies) to create
|
||||||
|
* @return bool True for success
|
||||||
|
*/
|
||||||
|
public static function mkDir($args)
|
||||||
|
{
|
||||||
|
$opts = System::_parseArgs($args, 'pm:');
|
||||||
|
if (PEAR::isError($opts)) {
|
||||||
|
return System::raiseError($opts);
|
||||||
|
}
|
||||||
|
|
||||||
|
$mode = 0777; // default mode
|
||||||
|
foreach ($opts[0] as $opt) {
|
||||||
|
if ($opt[0] == 'p') {
|
||||||
|
$create_parents = true;
|
||||||
|
} elseif ($opt[0] == 'm') {
|
||||||
|
// if the mode is clearly an octal number (starts with 0)
|
||||||
|
// convert it to decimal
|
||||||
|
if (strlen($opt[1]) && $opt[1]{0} == '0') {
|
||||||
|
$opt[1] = octdec($opt[1]);
|
||||||
|
} else {
|
||||||
|
// convert to int
|
||||||
|
$opt[1] += 0;
|
||||||
|
}
|
||||||
|
$mode = $opt[1];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
$ret = true;
|
||||||
|
if (isset($create_parents)) {
|
||||||
|
foreach ($opts[1] as $dir) {
|
||||||
|
$dirstack = array();
|
||||||
|
while ((!file_exists($dir) || !is_dir($dir)) &&
|
||||||
|
$dir != DIRECTORY_SEPARATOR) {
|
||||||
|
array_unshift($dirstack, $dir);
|
||||||
|
$dir = dirname($dir);
|
||||||
|
}
|
||||||
|
|
||||||
|
while ($newdir = array_shift($dirstack)) {
|
||||||
|
if (!is_writeable(dirname($newdir))) {
|
||||||
|
$ret = false;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!mkdir($newdir, $mode)) {
|
||||||
|
$ret = false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
foreach ($opts[1] as $dir) {
|
||||||
|
if ((@file_exists($dir) || !is_dir($dir)) && !mkdir($dir, $mode)) {
|
||||||
|
$ret = false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return $struct;
|
|
||||||
|
return $ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Remove temporary files created my mkTemp. This function is executed
|
||||||
|
* at script shutdown time
|
||||||
|
*/
|
||||||
|
public static function _removeTmpFiles()
|
||||||
|
{
|
||||||
|
if (count($GLOBALS['_System_temp_files'])) {
|
||||||
|
$delete = $GLOBALS['_System_temp_files'];
|
||||||
|
array_unshift($delete, '-r');
|
||||||
|
System::rm($delete);
|
||||||
|
$GLOBALS['_System_temp_files'] = array();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* The rm command for removing files.
|
* The rm command for removing files.
|
||||||
* Supports multiple files and dirs and also recursive deletes
|
* Supports multiple files and dirs and also recursive deletes
|
||||||
*
|
*
|
||||||
* @param string $args the arguments for rm
|
* @param string $args the arguments for rm
|
||||||
* @return mixed PEAR_Error or true for success
|
* @return mixed PEAR_Error or true for success
|
||||||
* @static
|
* @static
|
||||||
* @access public
|
* @access public
|
||||||
*/
|
*/
|
||||||
function rm($args)
|
public static function rm($args)
|
||||||
{
|
{
|
||||||
$opts = System::_parseArgs($args, 'rf'); // "f" does nothing but I like it :-)
|
$opts = System::_parseArgs($args, 'rf'); // "f" does nothing but I like it :-)
|
||||||
if (PEAR::isError($opts)) {
|
if (PEAR::isError($opts)) {
|
||||||
|
@ -234,265 +401,98 @@ class System
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Make directories.
|
* Creates a nested array representing the structure of a directory and files
|
||||||
*
|
*
|
||||||
* The -p option will create parent directories
|
* @param array $files Array listing files and dirs
|
||||||
* @param string $args the name of the director(y|ies) to create
|
* @return array
|
||||||
* @return bool True for success
|
|
||||||
* @static
|
* @static
|
||||||
* @access public
|
* @see System::_dirToStruct()
|
||||||
*/
|
*/
|
||||||
function mkDir($args)
|
protected static function _multipleToStruct($files)
|
||||||
{
|
{
|
||||||
$opts = System::_parseArgs($args, 'pm:');
|
$struct = array('dirs' => array(), 'files' => array());
|
||||||
if (PEAR::isError($opts)) {
|
settype($files, 'array');
|
||||||
return System::raiseError($opts);
|
|
||||||
}
|
|
||||||
|
|
||||||
$mode = 0777; // default mode
|
|
||||||
foreach ($opts[0] as $opt) {
|
|
||||||
if ($opt[0] == 'p') {
|
|
||||||
$create_parents = true;
|
|
||||||
} elseif ($opt[0] == 'm') {
|
|
||||||
// if the mode is clearly an octal number (starts with 0)
|
|
||||||
// convert it to decimal
|
|
||||||
if (strlen($opt[1]) && $opt[1]{0} == '0') {
|
|
||||||
$opt[1] = octdec($opt[1]);
|
|
||||||
} else {
|
|
||||||
// convert to int
|
|
||||||
$opt[1] += 0;
|
|
||||||
}
|
|
||||||
$mode = $opt[1];
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
$ret = true;
|
|
||||||
if (isset($create_parents)) {
|
|
||||||
foreach ($opts[1] as $dir) {
|
|
||||||
$dirstack = array();
|
|
||||||
while ((!file_exists($dir) || !is_dir($dir)) &&
|
|
||||||
$dir != DIRECTORY_SEPARATOR) {
|
|
||||||
array_unshift($dirstack, $dir);
|
|
||||||
$dir = dirname($dir);
|
|
||||||
}
|
|
||||||
|
|
||||||
while ($newdir = array_shift($dirstack)) {
|
|
||||||
if (!is_writeable(dirname($newdir))) {
|
|
||||||
$ret = false;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!mkdir($newdir, $mode)) {
|
|
||||||
$ret = false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
foreach($opts[1] as $dir) {
|
|
||||||
if ((@file_exists($dir) || !is_dir($dir)) && !mkdir($dir, $mode)) {
|
|
||||||
$ret = false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return $ret;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Concatenate files
|
|
||||||
*
|
|
||||||
* Usage:
|
|
||||||
* 1) $var = System::cat('sample.txt test.txt');
|
|
||||||
* 2) System::cat('sample.txt test.txt > final.txt');
|
|
||||||
* 3) System::cat('sample.txt test.txt >> final.txt');
|
|
||||||
*
|
|
||||||
* Note: as the class use fopen, urls should work also (test that)
|
|
||||||
*
|
|
||||||
* @param string $args the arguments
|
|
||||||
* @return boolean true on success
|
|
||||||
* @static
|
|
||||||
* @access public
|
|
||||||
*/
|
|
||||||
function &cat($args)
|
|
||||||
{
|
|
||||||
$ret = null;
|
|
||||||
$files = array();
|
|
||||||
if (!is_array($args)) {
|
|
||||||
$args = preg_split('/\s+/', $args, -1, PREG_SPLIT_NO_EMPTY);
|
|
||||||
}
|
|
||||||
|
|
||||||
$count_args = count($args);
|
|
||||||
for ($i = 0; $i < $count_args; $i++) {
|
|
||||||
if ($args[$i] == '>') {
|
|
||||||
$mode = 'wb';
|
|
||||||
$outputfile = $args[$i+1];
|
|
||||||
break;
|
|
||||||
} elseif ($args[$i] == '>>') {
|
|
||||||
$mode = 'ab+';
|
|
||||||
$outputfile = $args[$i+1];
|
|
||||||
break;
|
|
||||||
} else {
|
|
||||||
$files[] = $args[$i];
|
|
||||||
}
|
|
||||||
}
|
|
||||||
$outputfd = false;
|
|
||||||
if (isset($mode)) {
|
|
||||||
if (!$outputfd = fopen($outputfile, $mode)) {
|
|
||||||
$err = System::raiseError("Could not open $outputfile");
|
|
||||||
return $err;
|
|
||||||
}
|
|
||||||
$ret = true;
|
|
||||||
}
|
|
||||||
foreach ($files as $file) {
|
foreach ($files as $file) {
|
||||||
if (!$fd = fopen($file, 'r')) {
|
if (is_dir($file) && !is_link($file)) {
|
||||||
System::raiseError("Could not open $file");
|
$tmp = System::_dirToStruct($file, 0);
|
||||||
continue;
|
$struct = array_merge_recursive($tmp, $struct);
|
||||||
}
|
} else {
|
||||||
while ($cont = fread($fd, 2048)) {
|
if (!in_array($file, $struct['files'])) {
|
||||||
if (is_resource($outputfd)) {
|
$struct['files'][] = $file;
|
||||||
fwrite($outputfd, $cont);
|
|
||||||
} else {
|
|
||||||
$ret .= $cont;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
fclose($fd);
|
|
||||||
}
|
}
|
||||||
if (is_resource($outputfd)) {
|
return $struct;
|
||||||
fclose($outputfd);
|
|
||||||
}
|
|
||||||
return $ret;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Creates temporary files or directories. This function will remove
|
* Creates a nested array representing the structure of a directory
|
||||||
* the created files when the scripts finish its execution.
|
|
||||||
*
|
*
|
||||||
* Usage:
|
* System::_dirToStruct('dir1', 0) =>
|
||||||
* 1) $tempfile = System::mktemp("prefix");
|
* Array
|
||||||
* 2) $tempdir = System::mktemp("-d prefix");
|
* (
|
||||||
* 3) $tempfile = System::mktemp();
|
* [dirs] => Array
|
||||||
* 4) $tempfile = System::mktemp("-t /var/tmp prefix");
|
* (
|
||||||
|
* [0] => dir1
|
||||||
|
* )
|
||||||
*
|
*
|
||||||
* prefix -> The string that will be prepended to the temp name
|
* [files] => Array
|
||||||
* (defaults to "tmp").
|
* (
|
||||||
* -d -> A temporary dir will be created instead of a file.
|
* [0] => dir1/file2
|
||||||
* -t -> The target dir where the temporary (file|dir) will be created. If
|
* [1] => dir1/file3
|
||||||
* this param is missing by default the env vars TMP on Windows or
|
* )
|
||||||
* TMPDIR in Unix will be used. If these vars are also missing
|
* )
|
||||||
* c:\windows\temp or /tmp will be used.
|
* @param string $sPath Name of the directory
|
||||||
*
|
* @param integer $maxinst max. deep of the lookup
|
||||||
* @param string $args The arguments
|
* @param integer $aktinst starting deep of the lookup
|
||||||
* @return mixed the full path of the created (file|dir) or false
|
* @param bool $silent if true, do not emit errors.
|
||||||
* @see System::tmpdir()
|
* @return array the structure of the dir
|
||||||
* @static
|
|
||||||
* @access public
|
|
||||||
*/
|
*/
|
||||||
function mktemp($args = null)
|
protected static function _dirToStruct($sPath, $maxinst, $aktinst = 0, $silent = false)
|
||||||
{
|
{
|
||||||
static $first_time = true;
|
$struct = array('dirs' => array(), 'files' => array());
|
||||||
$opts = System::_parseArgs($args, 't:d');
|
if (($dir = @opendir($sPath)) === false) {
|
||||||
if (PEAR::isError($opts)) {
|
if (!$silent) {
|
||||||
return System::raiseError($opts);
|
System::raiseError("Could not open dir $sPath");
|
||||||
|
}
|
||||||
|
return $struct; // XXX could not open error
|
||||||
}
|
}
|
||||||
|
|
||||||
foreach ($opts[0] as $opt) {
|
$struct['dirs'][] = $sPath = realpath($sPath); // XXX don't add if '.' or '..' ?
|
||||||
if ($opt[0] == 'd') {
|
$list = array();
|
||||||
$tmp_is_dir = true;
|
while (false !== ($file = readdir($dir))) {
|
||||||
} elseif ($opt[0] == 't') {
|
if ($file != '.' && $file != '..') {
|
||||||
$tmpdir = $opt[1];
|
$list[] = $file;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
$prefix = (isset($opts[1][0])) ? $opts[1][0] : 'tmp';
|
closedir($dir);
|
||||||
if (!isset($tmpdir)) {
|
natsort($list);
|
||||||
$tmpdir = System::tmpdir();
|
if ($aktinst < $maxinst || $maxinst == 0) {
|
||||||
}
|
foreach ($list as $val) {
|
||||||
|
$path = $sPath . DIRECTORY_SEPARATOR . $val;
|
||||||
if (!System::mkDir(array('-p', $tmpdir))) {
|
if (is_dir($path) && !is_link($path)) {
|
||||||
return false;
|
$tmp = System::_dirToStruct($path, $maxinst, $aktinst + 1, $silent);
|
||||||
}
|
$struct = array_merge_recursive($struct, $tmp);
|
||||||
|
} else {
|
||||||
$tmp = tempnam($tmpdir, $prefix);
|
$struct['files'][] = $path;
|
||||||
if (isset($tmp_is_dir)) {
|
}
|
||||||
unlink($tmp); // be careful possible race condition here
|
|
||||||
if (!mkdir($tmp, 0700)) {
|
|
||||||
return System::raiseError("Unable to create temporary directory $tmpdir");
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
$GLOBALS['_System_temp_files'][] = $tmp;
|
return $struct;
|
||||||
if (isset($tmp_is_dir)) {
|
|
||||||
//$GLOBALS['_System_temp_files'][] = dirname($tmp);
|
|
||||||
}
|
|
||||||
|
|
||||||
if ($first_time) {
|
|
||||||
PEAR::registerShutdownFunc(array('System', '_removeTmpFiles'));
|
|
||||||
$first_time = false;
|
|
||||||
}
|
|
||||||
|
|
||||||
return $tmp;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Remove temporary files created my mkTemp. This function is executed
|
|
||||||
* at script shutdown time
|
|
||||||
*
|
|
||||||
* @static
|
|
||||||
* @access private
|
|
||||||
*/
|
|
||||||
function _removeTmpFiles()
|
|
||||||
{
|
|
||||||
if (count($GLOBALS['_System_temp_files'])) {
|
|
||||||
$delete = $GLOBALS['_System_temp_files'];
|
|
||||||
array_unshift($delete, '-r');
|
|
||||||
System::rm($delete);
|
|
||||||
$GLOBALS['_System_temp_files'] = array();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Get the path of the temporal directory set in the system
|
|
||||||
* by looking in its environments variables.
|
|
||||||
* Note: php.ini-recommended removes the "E" from the variables_order setting,
|
|
||||||
* making unavaible the $_ENV array, that s why we do tests with _ENV
|
|
||||||
*
|
|
||||||
* @static
|
|
||||||
* @return string The temporary directory on the system
|
|
||||||
*/
|
|
||||||
function tmpdir()
|
|
||||||
{
|
|
||||||
if (OS_WINDOWS) {
|
|
||||||
if ($var = isset($_ENV['TMP']) ? $_ENV['TMP'] : getenv('TMP')) {
|
|
||||||
return $var;
|
|
||||||
}
|
|
||||||
if ($var = isset($_ENV['TEMP']) ? $_ENV['TEMP'] : getenv('TEMP')) {
|
|
||||||
return $var;
|
|
||||||
}
|
|
||||||
if ($var = isset($_ENV['USERPROFILE']) ? $_ENV['USERPROFILE'] : getenv('USERPROFILE')) {
|
|
||||||
return $var;
|
|
||||||
}
|
|
||||||
if ($var = isset($_ENV['windir']) ? $_ENV['windir'] : getenv('windir')) {
|
|
||||||
return $var;
|
|
||||||
}
|
|
||||||
return getenv('SystemRoot') . '\temp';
|
|
||||||
}
|
|
||||||
if ($var = isset($_ENV['TMPDIR']) ? $_ENV['TMPDIR'] : getenv('TMPDIR')) {
|
|
||||||
return $var;
|
|
||||||
}
|
|
||||||
return realpath('/tmp');
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* The "which" command (show the full path of a command)
|
* The "which" command (show the full path of a command)
|
||||||
*
|
*
|
||||||
* @param string $program The command to search for
|
* @param string $program The command to search for
|
||||||
* @param mixed $fallback Value to return if $program is not found
|
* @param mixed $fallback Value to return if $program is not found
|
||||||
*
|
*
|
||||||
* @return mixed A string with the full path or false if not found
|
* @return mixed A string with the full path or false if not found
|
||||||
* @static
|
|
||||||
* @author Stig Bakken <ssb@php.net>
|
* @author Stig Bakken <ssb@php.net>
|
||||||
*/
|
*/
|
||||||
function which($program, $fallback = false)
|
public static function which($program, $fallback = false)
|
||||||
{
|
{
|
||||||
// enforce API
|
// enforce API
|
||||||
if (!is_string($program) || '' == $program) {
|
if (!is_string($program) || '' == $program) {
|
||||||
|
@ -504,36 +504,37 @@ class System
|
||||||
$path_elements[] = dirname($program);
|
$path_elements[] = dirname($program);
|
||||||
$program = basename($program);
|
$program = basename($program);
|
||||||
} else {
|
} else {
|
||||||
// Honor safe mode
|
$path = getenv('PATH');
|
||||||
if (!ini_get('safe_mode') || !$path = ini_get('safe_mode_exec_dir')) {
|
if (!$path) {
|
||||||
$path = getenv('PATH');
|
$path = getenv('Path'); // some OSes are just stupid enough to do this
|
||||||
if (!$path) {
|
|
||||||
$path = getenv('Path'); // some OSes are just stupid enough to do this
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
$path_elements = explode(PATH_SEPARATOR, $path);
|
$path_elements = explode(PATH_SEPARATOR, $path);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (OS_WINDOWS) {
|
if (OS_WINDOWS) {
|
||||||
$exe_suffixes = getenv('PATHEXT')
|
$exe_suffixes = getenv('PATHEXT')
|
||||||
? explode(PATH_SEPARATOR, getenv('PATHEXT'))
|
? explode(PATH_SEPARATOR, getenv('PATHEXT'))
|
||||||
: array('.exe','.bat','.cmd','.com');
|
: array('.exe', '.bat', '.cmd', '.com');
|
||||||
// allow passing a command.exe param
|
// allow passing a command.exe param
|
||||||
if (strpos($program, '.') !== false) {
|
if (strpos($program, '.') !== false) {
|
||||||
array_unshift($exe_suffixes, '');
|
array_unshift($exe_suffixes, '');
|
||||||
}
|
}
|
||||||
// is_executable() is not available on windows for PHP4
|
|
||||||
$pear_is_executable = (function_exists('is_executable')) ? 'is_executable' : 'is_file';
|
|
||||||
} else {
|
} else {
|
||||||
$exe_suffixes = array('');
|
$exe_suffixes = array('');
|
||||||
$pear_is_executable = 'is_executable';
|
|
||||||
}
|
}
|
||||||
|
|
||||||
foreach ($exe_suffixes as $suff) {
|
foreach ($exe_suffixes as $suff) {
|
||||||
foreach ($path_elements as $dir) {
|
foreach ($path_elements as $dir) {
|
||||||
$file = $dir . DIRECTORY_SEPARATOR . $program . $suff;
|
$file = $dir . DIRECTORY_SEPARATOR . $program . $suff;
|
||||||
if (@$pear_is_executable($file)) {
|
// It's possible to run a .bat on Windows that is_executable
|
||||||
|
// would return false for. The is_executable check is meaningless...
|
||||||
|
if (OS_WINDOWS) {
|
||||||
return $file;
|
return $file;
|
||||||
|
} else {
|
||||||
|
if (is_executable($file)) {
|
||||||
|
return $file;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -552,19 +553,17 @@ class System
|
||||||
* System::find("$dir -name *.php -name *.htm*");
|
* System::find("$dir -name *.php -name *.htm*");
|
||||||
* System::find("$dir -maxdepth 1");
|
* System::find("$dir -maxdepth 1");
|
||||||
*
|
*
|
||||||
* Params implmented:
|
* Params implemented:
|
||||||
* $dir -> Start the search at this directory
|
* $dir -> Start the search at this directory
|
||||||
* -type d -> return only directories
|
* -type d -> return only directories
|
||||||
* -type f -> return only files
|
* -type f -> return only files
|
||||||
* -maxdepth <n> -> max depth of recursion
|
* -maxdepth <n> -> max depth of recursion
|
||||||
* -name <pattern> -> search pattern (bash style). Multiple -name param allowed
|
* -name <pattern> -> search pattern (bash style). Multiple -name param allowed
|
||||||
*
|
*
|
||||||
* @param mixed Either array or string with the command line
|
* @param mixed Either array or string with the command line
|
||||||
* @return array Array of found files
|
* @return array Array of found files
|
||||||
* @static
|
|
||||||
*
|
|
||||||
*/
|
*/
|
||||||
function find($args)
|
public static function find($args)
|
||||||
{
|
{
|
||||||
if (!is_array($args)) {
|
if (!is_array($args)) {
|
||||||
$args = preg_split('/\s+/', $args, -1, PREG_SPLIT_NO_EMPTY);
|
$args = preg_split('/\s+/', $args, -1, PREG_SPLIT_NO_EMPTY);
|
||||||
|
@ -580,8 +579,8 @@ class System
|
||||||
for ($i = 0; $i < $args_count; $i++) {
|
for ($i = 0; $i < $args_count; $i++) {
|
||||||
switch ($args[$i]) {
|
switch ($args[$i]) {
|
||||||
case '-type':
|
case '-type':
|
||||||
if (in_array($args[$i+1], array('d', 'f'))) {
|
if (in_array($args[$i + 1], array('d', 'f'))) {
|
||||||
if ($args[$i+1] == 'd') {
|
if ($args[$i + 1] == 'd') {
|
||||||
$do_files = false;
|
$do_files = false;
|
||||||
} else {
|
} else {
|
||||||
$do_dirs = false;
|
$do_dirs = false;
|
||||||
|
@ -590,15 +589,15 @@ class System
|
||||||
$i++;
|
$i++;
|
||||||
break;
|
break;
|
||||||
case '-name':
|
case '-name':
|
||||||
$name = preg_quote($args[$i+1], '#');
|
$name = preg_quote($args[$i + 1], '#');
|
||||||
// our magic characters ? and * have just been escaped,
|
// our magic characters ? and * have just been escaped,
|
||||||
// so now we change the escaped versions to PCRE operators
|
// so now we change the escaped versions to PCRE operators
|
||||||
$name = strtr($name, array('\?' => '.', '\*' => '.*'));
|
$name = strtr($name, array('\?' => '.', '\*' => '.*'));
|
||||||
$patterns[] = '('.$name.')';
|
$patterns[] = '(' . $name . ')';
|
||||||
$i++;
|
$i++;
|
||||||
break;
|
break;
|
||||||
case '-maxdepth':
|
case '-maxdepth':
|
||||||
$depth = $args[$i+1];
|
$depth = $args[$i + 1];
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -612,7 +611,7 @@ class System
|
||||||
}
|
}
|
||||||
if (count($patterns)) {
|
if (count($patterns)) {
|
||||||
$dsq = preg_quote(DIRECTORY_SEPARATOR, '#');
|
$dsq = preg_quote(DIRECTORY_SEPARATOR, '#');
|
||||||
$pattern = '#(^|'.$dsq.')'.implode('|', $patterns).'($|'.$dsq.')#';
|
$pattern = '#(^|' . $dsq . ')' . implode('|', $patterns) . '($|' . $dsq . ')#';
|
||||||
$ret = array();
|
$ret = array();
|
||||||
$files_count = count($files);
|
$files_count = count($files);
|
||||||
for ($i = 0; $i < $files_count; $i++) {
|
for ($i = 0; $i < $files_count; $i++) {
|
||||||
|
@ -626,4 +625,4 @@ class System
|
||||||
}
|
}
|
||||||
return $files;
|
return $files;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue
Block a user