cvs: php4 /pear DB.php Makefile.in PEAR.php PEAR_Error.php pear.in /pear/File Find.php /pear/PEAR Installer.php /pear/Payment Verisign.php

From: Date: Mon, 24 Jul 2000 08:05:52 +0000
Subject: cvs: php4 /pear DB.php Makefile.in PEAR.php PEAR_Error.php pear.in /pear/File Find.php /pear/PEAR Installer.php /pear/Payment Verisign.php
Groups: php.cvs 
Request: Send a blank email to php-cvs+get-885@lists.php.net to get a copy of this message
ssb Mon Jul 24 01:05:52 2000 EDT Added files: /php4/pear PEAR.php /php4/pear/PEAR Installer.php Removed files: /php4/pear PEAR_Error.php Modified files: /php4/pear DB.php Makefile.in pear.in /php4/pear/File Find.php /php4/pear/Payment Verisign.php Log: * new class: PEAR - can be used as a base class for others. * PEAR_Error moved into PEAR.php to reduce the number of files that are always included * cleaned up the PEAR_Error API a bit and changed the two classes using it * added PEAR_Installer - an administration class for installing packages and maintaining a "class/file cache" Index: php4/pear/DB.php diff -u php4/pear/DB.php:1.22 php4/pear/DB.php:1.23 --- php4/pear/DB.php:1.22 Sun Jul 23 22:41:00 2000 +++ php4/pear/DB.php Mon Jul 24 01:05:51 2000 @@ -17,11 +17,13 @@ // | | // +----------------------------------------------------------------------+ // -// $Id: DB.php,v 1.22 2000/07/24 05:41:00 david Exp $ +// $Id: DB.php,v 1.23 2000/07/24 08:05:51 ssb Exp $ // // Database independent query interface. // +require_once "PEAR.php"; + // {{{ Database independent error codes. /* @@ -220,12 +222,12 @@ /** * Tell whether a result code from a DB method is an error * - * @param $code int result code + * @param $value int result code * - * @return bool whether $code is an error + * @return bool whether $value is an error */ - function isError($code) { - return is_int($code) && ($code < 0) && ($code > -1000); + function isError($value) { + return is_object($value) && is_subclass_of($value, "DB_Error"); } // }}} @@ -236,12 +238,12 @@ * Warnings differ from errors in that they are generated by DB, * and are not fatal. * - * @param $code int result code + * @param $value mixed result value * - * @return bool whether $code is a warning + * @return bool whether $value is a warning */ - function isWarning($code) { - return is_int($code) && ($code <= -1000); + function isWarning($value) { + return is_object($value) && is_subclass_of($value, "DB_Warning"); } // }}} @@ -250,12 +252,12 @@ /** * Return a textual error message for a DB error code * - * @param $code int error code + * @param $value int error code * * @return string error message, or false if the error code was * not recognized */ - function errorMessage($code) { + function errorMessage($value) { if (!isset($errorMessages)) { $errorMessages = array( DB_OK => "no error", @@ -280,7 +282,7 @@ DB_WARNING_READ_ONLY => "warning: read only" ); } - return $errorMessages[$code]; + return $errorMessages[$value]; } // }}} @@ -401,6 +403,8 @@ * This class implements a wrapper for a DB result set. * A new instance of this class will be returned by the DB implementation * after processing a query that returns data. + * + * @author Stig Bakken <ssb@fast.no> */ class DB_result { // {{{ properties @@ -474,6 +478,34 @@ } // }}} +} + +/** + * DB_Error implements a class for reporting portable database error + * messages. + * + * @author Stig Bakken <ssb@fast.no> + */ +class DB_Error extends PEAR_Error { + function DB_Error($code = DB_ERROR, + $mode = PEAR_ERROR_RETURN, + $level = E_USER_NOTICE) { + $this->PEAR_Error("DB Error: " . DB::errorMessage($code), $code, $mode, $level); + } +} + +/** + * DB_Warning implements a class for reporting portable database + * warning messages. + * + * @author Stig Bakken <ssb@fast.no> + */ +class DB_Warning extends PEAR_Error { + function DB_Error($code = DB_WARNING, + $mode = PEAR_ERROR_RETURN, + $level = E_USER_NOTICE) { + $this->PEAR_Error("DB Warning: " . DB::errorMessage($code), $code, $mode, $level); + } } // Local variables: Index: php4/pear/Makefile.in diff -u php4/pear/Makefile.in:1.27 php4/pear/Makefile.in:1.28 --- php4/pear/Makefile.in:1.27 Fri Jul 21 11:34:37 2000 +++ php4/pear/Makefile.in Mon Jul 24 01:05:51 2000 @@ -19,7 +19,8 @@ DB/storage.php \ HTTP.php \ File/Find.php \ - PEAR_Error.php + PEAR.php \ + PEAR/Installer.php install-data-local: @if $(mkinstalldirs) $(peardir); then \ Index: php4/pear/pear.in diff -u php4/pear/pear.in:1.1 php4/pear/pear.in:1.2 --- php4/pear/pear.in:1.1 Mon Jul 17 15:52:08 2000 +++ php4/pear/pear.in Mon Jul 24 01:05:51 2000 @@ -15,220 +15,5 @@ if (!$pkgfile) { die("Usage: pear <packagefile>\n"); } -if (!file_exists($pkgfile)) { - die("No such file: $pkgfile\n"); -} - -$fp = popen("gzip -dc $pkgfile | tar -tf -", "r"); -if (!$fp) { - die("Unable to examine $pkgfile (gzip or tar failed)\n"); -} -while ($line = fgets($fp, 4096)) { - $line = rtrim($line); - if (preg_match('!^[^/]+/package.xml$!', $line)) { - if ($descfile) { - die("Invalid package: multiple package.xml files at depth one!\n"); - } - $descfile = $line; - } -} -pclose($fp); - -if (!$descfile) { - die("Invalid package: no package.xml file found!\n"); -} - -$tmpdir = tempnam("/tmp", "pear"); -if (!mkdir($tmpdir, 0755)) { - die("Unable to create temporary directory $tmpdir.\n"); -} - -register_shutdown_function("cleanup"); - -$pwd = trim(pwd); - -if (substr($pkgfile, 0, 1) == "/") { - $pkgfilepath = $pkgfile; -} else { - $pkgfilepath = $pwd.'/'.$pkgfile; -} - -if (!chdir($tmpdir)) { - die("Unable to chdir to $tmpdir.\n"); -} - -system("gzip -dc $pkgfilepath | tar -xf -"); - -if (!file_exists($descfile)) { - die("Huh? No package.xml file after extracting the archive.\n"); -} - -$pkgdir = dirname($descfile); - -$fp = fopen($descfile, "r"); -$xp = xml_parser_create(); -if (!$xp) { - die("Unable to create XML parser.\n"); -} -xml_set_element_handler($xp, "start_handler", "end_handler"); -xml_set_character_data_handler($xp, "char_handler"); -xml_parser_set_option($xp, XML_OPTION_CASE_FOLDING, false); - -$element_stack = array(); -$current_element = false; -$destdir = ''; -$pkginfo = array(); - -while ($data = fread($fp, 2048)) { - if (!xml_parse($xp, $data, feof($fp))) { - die(sprintf("XML error: %s at line %d", - xml_error_string(xml_get_error_code($xp)), - xml_get_current_line_number($xp))); - } -} - -if ($pkginfo['pkgtype'] != "binary") { - die("Invalid package: only binary packages supported yet.\n"); -} - -print "ok so far\n"; -exit; - -function start_handler($xp, $name, $attribs) { - global $element_stack, $current_element, $pkginfo; - array_push($element_stack, $name); - $current_element = $name; - switch ($name) { - case "Package": - $pkginfo['pkgtype'] = strtolower($attribs["Type"]); - break; - } -} - -function end_handler($xp, $name) { - global $element_stack, $current_element; - array_pop($element_stack); - $current_element = $element_stack[sizeof($element_stack)-1]; -} - -function char_handler($xp, $data) { - global $element_stack, $current_element, $pkginfo; - global $phpfiles, $extfiles, $docfiles, $pkgdir; - global $pear_phpdir, $pear_extdir, $pear_docdir; - global $destdir, $debug; - - switch ($current_element) { - case "DestDir": - $destdir = trim($data); - if (substr($destdir, 0, 1) == "/") { - $destdir = substr($destdir, 1); - } - break; - case "Dir": - if (!$pear_phpdir) { - break; - } - $dir = trim($data); - $d = "$pear_phpdir/$destdir/$dir"; - if (is_file($d)) { - print "Error: wanted to create the directory $d\n"; - print " but it was already a file.\n"; - continue 2; - } - if (is_dir($d)) { - continue 2; - } - if (!mkdir($d, 0755)) { - print "Error: could not mkdir $d\n"; - continue 2; - } - if ($debug) print "[debug] created directory $d\n"; - break; - case "File": - if (!$pear_phpdir) { - break; - } - $file = trim($data); - $d = "$pear_phpdir/$destdir"; - if (!copy("$pkgdir/$file", "$d/$file")) { - print "Error: failed to copy $pkgdir/$file to $d\n"; - continue 2; - } - if ($debug) print "[debug] installed $d/$file\n"; - break; - case "ExtDir": - if (!$pear_extdir) { - break; - } - $dir = trim($data); - $d = "$pear_extdir/$destdir/$dir"; - if (is_file($d)) { - print "Error: wanted to create the directory $d\n"; - print " but it was already a file.\n"; - continue 2; - } - if (is_dir($d)) { - continue 2; - } - if (!mkdir($d, 0755)) { - print "Error: could not mkdir $d\n"; - continue 2; - } - if ($debug) print "[debug] created directory $d\n"; - break; - case "ExtFile": - if (!$pear_extdir) { - break; - } - $file = trim($data); - $d = "$pear_extdir/$destdir"; - if (!copy("$pkgdir/$file", "$d/$file")) { - print "Error: failed to copy $pkgdir/$file to $d\n"; - continue 2; - } - if ($debug) print "[debug] installed $d/$file\n"; - break; - case "DocDir": - if (!$pear_docdir) { - break; - } - $dir = trim($data); - $d = "$pear_docdir/$destdir/$dir"; - if (is_file($d)) { - print "Error: wanted to create the directory $d\n"; - print " but it was already a file.\n"; - continue 2; - } - if (is_dir($d)) { - continue 2; - } - if (!mkdir($d, 0755)) { - print "Error: could not mkdir $d\n"; - continue 2; - } - if ($debug) print "[debug] created directory $d\n"; - break; - case "DocFile": - if (!$pear_docdir) { - break; - } - $file = trim($data); - $d = "$pear_docdir/$destdir"; - if (!copy("$pkgdir/$file", "$d/$file")) { - print "Error: failed to copy $pkgdir/$file to $d\n"; - continue 2; - } - if ($debug) print "[debug] installed $d/$file\n"; - break; - } -} - -function cleanup() { - global $tmpdir; - if ($tmpdir && is_dir($tmpdir)) { - system("rm -rf $tmpdir"); - } - $tmpdir = null; -} ?> Index: php4/pear/File/Find.php diff -u php4/pear/File/Find.php:1.8 php4/pear/File/Find.php:1.9 --- php4/pear/File/Find.php:1.8 Sun Jul 23 22:41:01 2000 +++ php4/pear/File/Find.php Mon Jul 24 01:05:51 2000 @@ -16,12 +16,12 @@ // | Authors: Sterling Hughes <sterling@php.net> | // +----------------------------------------------------------------------+ // -// $Id: Find.php,v 1.8 2000/07/24 05:41:01 david Exp $ +// $Id: Find.php,v 1.9 2000/07/24 08:05:51 ssb Exp $ // // Commonly needed functions searching directory trees // -include_once 'PEAR_Error.php'; +require_once 'PEAR.php'; class File_Find { @@ -107,10 +107,9 @@ * bool isError ($var) * Determine whether or not a variable is a PEAR exception */ - function isError ($var) + function isError (&$var) { - return (is_object ($var) && - substr (get_class ($var), -9) == 'Exception'); + return PEAR::isError($var); } /* @@ -176,10 +175,18 @@ var $classname = 'FileFindException'; var $error_message_prepend = 'Error in File_Find'; - function FileFindException ($message) + function FileFindException ($message, $mode = PEAR_ERROR_RETURN, $level = E_USER_NOTICE) { - PEAR_Error::PEAR_Error ($message); + $this->PEAR_Error ($message, $mode, $level); } } -?> \ No newline at end of file + +/* + * Local variables: + * tab-width: 4 + * c-basic-offset: 4 + * End: + */ + +?> Index: php4/pear/Payment/Verisign.php diff -u php4/pear/Payment/Verisign.php:1.1 php4/pear/Payment/Verisign.php:1.2 --- php4/pear/Payment/Verisign.php:1.1 Sun Jul 23 22:47:36 2000 +++ php4/pear/Payment/Verisign.php Mon Jul 24 01:05:51 2000 @@ -17,7 +17,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: Verisign.php,v 1.1 2000/07/24 05:47:36 david Exp $ */ +/* $Id: Verisign.php,v 1.2 2000/07/24 08:05:51 ssb Exp $ */ /* ******** NOTICE ******** * @@ -35,7 +35,7 @@ * Visa: 4242424242424242 or 4111111111111111 */ -require_once 'PEAR_Error.php'; +require_once 'PEAR.php'; /* Symbolic names for decoded response codes */ @@ -533,9 +533,9 @@ var $classname = 'VerisignException'; var $error_message_prepend = 'Error in Payment_Verisign'; - function FileFindException($message) + function VerisignException($message) { - PEAR_Error::PEAR_Error($message); + $this->PEAR_Error($message); } } Index: php4/pear/PEAR.php +++ php4/pear/PEAR.php <?php // // +----------------------------------------------------------------------+ // | PHP version 4.0 | // +----------------------------------------------------------------------+ // | Copyright (c) 1997, 1998, 1999, 2000 The PHP Group | // +----------------------------------------------------------------------+ // | This source file is subject to version 2.0 of the PHP license, | // | that is bundled with this package in the file LICENSE, and is | // | available at through the world-wide-web at | // | http://www.php.net/license/2_0.txt. | // | If you did not receive a copy of the PHP license and are unable to | // | obtain it through the world-wide-web, please send a note to | // | license@php.net so we can mail you a copy immediately. | // +----------------------------------------------------------------------+ // | Authors: Sterling Hughes <sterling@php.net> | // | Stig Bakken <ssb@fast.no> | // +----------------------------------------------------------------------+ // // $Id: PEAR.php,v 1.1 2000/07/24 08:05:51 ssb Exp $ // define('PEAR_ERROR_RETURN', 0); define('PEAR_ERROR_PRINT', 1); define('PEAR_ERROR_TRIGGER', 2); define('PEAR_ERROR_DIE', 3); $_PEAR_destructor_object_list = array(); /** * Base class for other PEAR classes. Provides rudimentary * emulation of destructors. * * If you want a destructor in your class, inherit PEAR and make a * destructor method called _yourclassname (same name as the * constructor, but with a "_" prefix). Also, in your constructor you * have to call the PEAR constructor: "$this->PEAR();". The * destructor method will be called without parameters. Note that at * in some SAPI implementations (such as Apache), any output during * the request shutdown (in which destructors are called) seems to be * discarded. If you need to get any debug information from your * destructor, use error_log(), syslog() or something like that * instead. * * @since PHP 4.0.2 * @author Stig Bakken <ssb@fast.no> */ class PEAR { // {{{ constructor /** * Constructor. Registers this object in * $_PEAR_destructor_object_list for destructor emulation. */ function PEAR() { global $_PEAR_destructor_object_list; $_PEAR_destructor_object_list[] = &$this; } // }}} // {{{ destructor /** * Destructor (the emulated type of...). * * See the note in the class desciption about output from * destructors. */ function _PEAR() { } // }}} // {{{ isError() /** * Tell whether a value is a PEAR error. * * @param $data the value to test * * @return bool true if $data is an error */ function isError(&$data) { return is_object($data) && is_subclass_of($data, "PEAR_Error"); } // }}} } // {{{ _PEAR_call_destructors() function _PEAR_call_destructors() { global $_PEAR_destructor_object_list; if (is_array($_PEAR_destructor_object_list) && sizeof($_PEAR_destructor_object_list)) { reset($_PEAR_destructor_object_list); while (list($k, $objref) = each($_PEAR_destructor_object_list)) { $destructor = "_".get_class($objref); if (method_exists($objref, $destructor)) { $objref->$destructor(); } } // Empty the object list to ensure that destructors are // not called more than once. $_PEAR_destructor_object_list = array(); } } // }}} class PEAR_Error { // {{{ properties var $classname = ''; var $error_message_prefix = ''; var $error_prepend = ''; var $error_append = ''; var $mode = PEAR_ERROR_RETURN; var $level = E_USER_NOTICE; var $message = ''; // Wait until we have a stack-groping function in PHP. //var $file = ''; //var $line = 0; // }}} // {{{ constructor /** * PEAR_Error constructor * * @param $message error message * @param $code (optional) error code * */ function PEAR_Error($message = 'unknown error', $code = 0, $mode = PEAR_ERROR_RETURN, $level = E_USER_NOTICE) { $this->message = $message; $this->code = $code; $this->mode = $mode; $this->level = $level; if (!$this->classname) { $this->classname = get_class($this); } switch ($this->mode) { case PEAR_ERROR_PRINT: print $this->getMessage(); break; case PEAR_ERROR_TRIGGER: trigger_error($this->getMessage(), $this->level); break; case PEAR_ERROR_DIE: die($this->getMessage()); break; case PEAR_ERROR_RETURN: default: break; } } // }}} // {{{ getMessage() /** * Get the error message from an error object. * * @return string full error message */ function getMessage () { return ($this->error_prepend . $this->error_message_prefix . $this->message . $this->error_append); } // }}} // {{{ getType() /** * Get the name of this error/exception. * * @return string error/exception name (type) */ function getType () { return $this->classname; } // }}} // {{{ toString() /** * Make a string representation of this object. * * @return string a string with an object "summary" */ function toString() { $modes = array(PEAR_ERROR_RETURN => "return", PEAR_ERROR_PRINT => "print", PEAR_ERROR_TRIGGER => "trigger", PEAR_ERROR_DIE => "die"); $levels = array(E_USER_NOTICE => "notice", E_USER_WARNING => "warning", E_USER_ERROR => "error"); return sprintf("[%s: message=%s code=%d mode=%s level=%s prefix=%s prepend=%s append=%s]", $this->message, $this->code, $modes[$this->mode], $levels[$this->level], $this->error_message_prefix, $this->error_prepend, $this->error_append); } // }}} } register_shutdown_function("_PEAR_call_destructors"); /* * Local Variables: * tab-width: 4 * c-basic-offset: 4 * End: */ ?> Index: php4/pear/PEAR/Installer.php +++ php4/pear/PEAR/Installer.php <?php // // +----------------------------------------------------------------------+ // | PHP version 4.0 | // +----------------------------------------------------------------------+ // | Copyright (c) 1997, 1998, 1999, 2000 The PHP Group | // +----------------------------------------------------------------------+ // | This source file is subject to version 2.02 of the PHP license, | // | that is bundled with this package in the file LICENSE, and is | // | available at through the world-wide-web at | // | http://www.php.net/license/2_02.txt. | // | If you did not receive a copy of the PHP license and are unable to | // | obtain it through the world-wide-web, please send a note to | // | license@php.net so we can mail you a copy immediately. | // +----------------------------------------------------------------------+ // | Authors: Stig Bakken <ssb@fast.no> | // | | // +----------------------------------------------------------------------+ // require_once "PEAR.php"; /** * Administration class used to install PEAR packages and maintain the * class definition cache. * * @since PHP 4.0.2 * @author Stig Bakken <ssb@fast.no> */ class PEAR_Installer extends PEAR { // {{{ properties /** stack of elements, gives some sort of XML context */ var $element_stack; /** name of currently parsed XML element */ var $current_element; /** assoc with information about the package */ var $pkginfo = array(); /** name of the package directory, for example Foo-1.0 */ var $pkgdir; /** directory where PHP code files go */ var $pear_phpdir = '/usr/local/lib/php'; /** directory where PHP extension files go */ var $pear_extdir = '/usr/local/lib/php/extensions/debug-non-zts-20000609'; /** directory where documentation goes */ var $pear_docdir = ''; /** directory where the package wants to put files, relative * to one of the three previous dirs */ var $destdir = ''; /** debug mode (boolean) */ var $debug = false; /** class loading cache */ var $cache = array(); /** temporary directory */ var $tmpdir; /** file pointer for cache file if open */ var $cache_fp; // }}} // {{{ constructor function PEAR_Installer() { $this->PEAR(); $this->cacheLoad("$this->pear_phpdir/.cache"); } // }}} // {{{ destructor function _PEAR_Installer() { $this->_PEAR(); if ($this->tmpdir && is_dir($this->tmpdir)) { system("rm -rf $this->tmpdir"); } if ($this->cache_fp && is_resource($this->cache_fp)) { flock($this->cache_fp, LOCK_UN); fclose($this->cache_fp); } $this->tmpdir = null; $this->cache_fp = null; } // }}} // {{{ cacheLock() function cacheLock() { $fp = $this->cache_fp; if (!is_resource($fp)) { $this->cache_fp = $fp = fopen($this->cache_file, "r"); } return flock($fp, LOCK_EX); } // }}} // {{{ cacheUnlock() function cacheUnlock() { $fp = $this->cache_fp; if (!is_resource($fp)) { $this->cache_fp = $fp = fopen($this->cache_file, "r"); $doclose = true; } $ret = flock($fp, LOCK_EX); if ($doclose) { fclose($fp); } return $ret; } // }}} // {{{ cacheLoad() function cacheLoad($file) { $this->cache_file = $file; if (!file_exists($file)) { touch($file); } $fp = $this->cache_fp = fopen($file, "r"); $this->cacheLock(); while ($line = fgets($fp, 2048)) { list($type, $name, $file) = explode(" ", trim($line)); $this->cache[$type][$name] = $file; } } // }}} // {{{ cacheSave() function cacheSave() { $fp = $this->cache_fp; $wfp = fopen($this->cache_file, "w"); if (!$wfp) { return false; } if (is_resource($fp)) { fclose($fp); } $this->cache_fp = $fp = $wfp; reset($this->cache); while (list($type, $entry) = each($this->cache)) { reset($entry); while (list($name, $file) = each($entry)) { fwrite($fp, "$type $name $file\n"); } } fclose($fp); $this->cache_fp = $fp = null; } // }}} // {{{ cacheUpdateFrom() function cacheUpdateFrom($file) { $new = $this->classesDeclaredBy($file); reset($new); while (list($i, $name) = each($new)) { $this->cache['class'][$name] = $file; } } // }}} // {{{ install() /** * Installs the files within the package file specified. * * @param $pkgfile path to the package file * * @return bool true if successful, false if not */ function install($pkgfile) { if (!file_exists($pkgfile)) { return new PEAR_Installer_Error("No such file: $pkgfile"); } $fp = popen("gzip -dc $pkgfile | tar -tf -", "r"); if (!$fp) { return new PEAR_Installer_Error("Unable to examine $pkgfile (gzip or tar failed)\n"); } while ($line = fgets($fp, 4096)) { $line = rtrim($line); if (preg_match('!^[^/]+/package.xml$!', $line)) { if ($descfile) { return new PEAR_Installer_Error("Invalid package: multiple package.xml files at depth one!\n"); } $descfile = $line; } } pclose($fp); if (!$descfile) { return new PEAR_Installer_Error("Invalid package: no package.xml file found!\n"); } $this->tmpdir = tempnam("/tmp", "pear"); if (!mkdir($this->tmpdir, 0755)) { return new PEAR_Installer_Error("Unable to create temporary directory $this->tmpdir.\n"); } $pwd = trim(pwd); if (substr($pkgfile, 0, 1) == "/") { $pkgfilepath = $pkgfile; } else { $pkgfilepath = $pwd.'/'.$pkgfile; } if (!chdir($this->tmpdir)) { return new PEAR_Installer_Error("Unable to chdir to $this->tmpdir.\n"); } system("gzip -dc $pkgfilepath | tar -xf -"); if (!file_exists($descfile)) { return new PEAR_Installer_Error("Huh? No package.xml file after extracting the archive.\n"); } $this->pkgdir = dirname($descfile); $fp = fopen($descfile, "r"); $xp = xml_parser_create(); if (!$xp) { return new PEAR_Installer_Error("Unable to create XML parser.\n"); } xml_set_object($xp, &$this); xml_set_element_handler($xp, "start_handler", "end_handler"); xml_set_character_data_handler($xp, "char_handler"); xml_parser_set_option($xp, XML_OPTION_CASE_FOLDING, false); $this->element_stack = array(); $this->pkginfo = array(); $this->current_element = false; $destdir = ''; while ($data = fread($fp, 2048)) { if (!xml_parse($xp, $data, feof($fp))) { return new PEAR_Installer_Error(sprintf("XML error: %s at line %d", xml_error_string(xml_get_error_code($xp)), xml_get_current_line_number($xp))); xml_parser_free($xp); } } xml_parser_free($xp); if ($this->pkginfo['pkgtype'] != "binary") { return new PEAR_Installer_Error("Invalid package: only binary packages supported yet.\n"); } return true; } // }}} // {{{ start_handler() function start_handler($xp, $name, $attribs) { array_push($this->element_stack, $name); $this->current_element = $name; switch ($name) { case "Package": $this->pkginfo['pkgtype'] = strtolower($attribs["Type"]); break; } } // }}} // {{{ end_handler() function end_handler($xp, $name) { array_pop($this->element_stack); $this->current_element = $this->element_stack[sizeof($this->element_stack)-1]; } // }}} // {{{ char_handler() function char_handler($xp, $data) { global $debug; switch ($this->current_element) { case "DestDir": $this->destdir = trim($data); if (substr($this->destdir, 0, 1) == "/") { $this->destdir = substr($this->destdir, 1); } break; case "Dir": if (!$this->pear_phpdir) { break; } $dir = trim($data); $d = "$this->pear_phpdir/$this->destdir/$dir"; if (is_file($d)) { print "Error: wanted to create the directory $d\n"; print " but it was already a file.\n"; break; } if (is_dir($d)) { break; } if (!mkdir($d, 0755)) { print "Error: could not mkdir $d\n"; break; } if ($debug) print "[debug] created directory $d\n"; break; case "File": if (!$this->pear_phpdir) { break; } $file = trim($data); $d = "$this->pear_phpdir/$this->destdir"; if (!copy("$this->pkgdir/$file", "$d/$file")) { print "Error: failed to copy $this->pkgdir/$file to $d\n"; break; } if ($debug) print "[debug] installed $d/$file\n"; break; case "ExtDir": if (!$this->pear_extdir) { break; } $dir = trim($data); $d = "$this->pear_extdir/$this->destdir/$dir"; if (is_file($d)) { print "Error: wanted to create the directory $d\n"; print " but it was already a file.\n"; break; } if (is_dir($d)) { continue 2; } if (!mkdir($d, 0755)) { print "Error: could not mkdir $d\n"; break; } if ($debug) print "[debug] created directory $d\n"; break; case "ExtFile": if (!$this->pear_extdir) { break; } $file = trim($data); $d = "$this->pear_extdir/$this->destdir"; if (!copy("$this->pkgdir/$file", "$d/$file")) { print "Error: failed to copy $this->pkgdir/$file to $d\n"; break; } if ($debug) print "[debug] installed $d/$file\n"; break; case "DocDir": if (!$this->pear_docdir) { break; } $dir = trim($data); $d = "$this->pear_docdir/$this->destdir/$dir"; if (is_file($d)) { print "Error: wanted to create the directory $d\n"; print " but it was already a file.\n"; break; } if (is_dir($d)) { break; } if (!mkdir($d, 0755)) { print "Error: could not mkdir $d\n"; break; } if ($debug) print "[debug] created directory $d\n"; break; case "DocFile": if (!$this->pear_docdir) { break; } $file = trim($data); $d = "$this->pear_docdir/$this->destdir"; if (!copy("$this->pkgdir/$file", "$d/$file")) { print "Error: failed to copy $this->pkgdir/$file to $d\n"; break; } if ($debug) { print "[debug] installed $d/$file\n"; } break; } } // }}} // {{{ classesDeclaredBy() /** * Find out which new classes are defined by a file. * * @param $file file name passed to "include" * * @return array classes that were defined */ function classesDeclaredBy($file) { $before = get_declared_classes(); include($file); $after = get_declared_classes(); // using array_slice to renumber array $diff = array_slice(array_diff($after, $before), 0); return $diff; } // }}} // {{{ lockDir() /** * Uses advisory locking (flock) to temporarily claim $dir as its * own. * * @param $dir the directory to lock * * @return bool true if successful, false if not */ function lockDir($dir) { $lockfile = "$dir/.lock"; if (!file_exists($lockfile)) { if (!touch($lockfile)) { // could not create lockfile! return false; } } $fp = fopen($lockfile, "r"); if (!flock($fp, LOCK_EX)) { // could not create lock! return false; } return true; } // }}} } class PEAR_Installer_Error extends PEAR_Error { // {{{ constructor function PEAR_Installer_Error($msg) { $this->PEAR_Error($msg, 0, PEAR_ERROR_DIE); } // }}} } ?>

« previous php.cvs (#885) next »