From: Stig Bakken Date: Mon, 22 Nov 1999 11:00:53 +0000 (+0000) Subject: @Introduced PECL - PHP Extension and Code Library (prounounced "picke") X-Git-Tag: PRE_RETURN_REF_PATCH~315 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=541087d17a6c55e8d42d73f06f3886b12fe82504;p=php @Introduced PECL - PHP Extension and Code Library (prounounced "picke") Introduced PECL - PHP Extension and Code Library (prounounced "picke"), in the "pecl" subdir. "make install" will now install the database abstraction layer in PREFIX/lib/php. I hereby dedicate this part of PHP to my daughter-of-yesterday Malin. :-) --- diff --git a/Makefile.am b/Makefile.am index d57126e236..a5e10f4299 100644 --- a/Makefile.am +++ b/Makefile.am @@ -1,7 +1,7 @@ AUTOMAKE_OPTIONS = foreign ZEND_DIR = $(srcdir)/libzend -SUBDIRS = libzend ext sapi $(TSRM_DIR) $(REGEX_DIR) +SUBDIRS = libzend ext sapi $(TSRM_DIR) $(REGEX_DIR) . pecl BUILDLDFLAGS = $(EXTRA_LDFLAGS) $(LDFLAGS) @@ -21,9 +21,9 @@ libphp4_la_DEPENDENCIES = \ $(TSRM_LIB) libphp4_la_LIBADD = $(libphp4_la_DEPENDENCIES) $(EXTRA_LIBS) - + libphp4_la_LDFLAGS = $(BUILDLDFLAGS) $(PHP_RPATHS) - + configuration-parser.h configuration-parser.c: configuration-parser.y $(YACC) -p cfg -v -d $< -o configuration-parser.c diff --git a/build.mk b/build.mk index 69c52cee2c..b2bddd2ac3 100644 --- a/build.mk +++ b/build.mk @@ -15,7 +15,7 @@ LT_TARGETS = ltconfig ltmain.sh config.guess config.sub SUBDIRS = libzend TSRM -makefile_am_files = Makefile.am $(shell find ext sapi regex -name Makefile.am) +makefile_am_files = Makefile.am $(shell find ext sapi regex pecl -name Makefile.am) makefile_in_files = $(makefile_am_files:.am=.in) makefile_files = $(makefile_am_files:e.am=e) diff --git a/configure.in b/configure.in index f9782e9c98..22de9d3452 100644 --- a/configure.in +++ b/configure.in @@ -689,7 +689,8 @@ AC_SUBST(PHP_SAPI) AC_SUBST(INSTALL_IT) #libphp4.module -AC_OUTPUT([Makefile php4.spec ext/Makefile sapi/Makefile $PHP_OUTPUT_FILES +AC_OUTPUT([Makefile php4.spec ext/Makefile sapi/Makefile pecl/Makefile + $PHP_OUTPUT_FILES scripts/mkextlib regex/Makefile build-defs.h], [], [ if test ! -f $srcdir/ext/bcmath/number.c; then diff --git a/pear/DB.php b/pear/DB.php new file mode 100644 index 0000000000..cab6b7a4d3 --- /dev/null +++ b/pear/DB.php @@ -0,0 +1,190 @@ + | +// | | +// +----------------------------------------------------------------------+ +// +// Database independent query interface. +// + +// {{{ Database independent error codes. + +define("DB_OK", 0); +define("DB_ERROR", -1); +define("DB_ERROR_SYNTAX", -2); +define("DB_ERROR_CONSTRAINT", -3); +define("DB_ERROR_NOT_FOUND", -4); +define("DB_ERROR_ALREADY_EXISTS", -5); +define("DB_ERROR_UNSUPPORTED", -6); +define("DB_ERROR_MISMATCH", -7); +define("DB_ERROR_INVALID", -8); +define("DB_ERROR_NOT_CAPABLE", -9); +define("DB_ERROR_TRUNCATED", -10); +define("DB_ERROR_INVALID_NUMBER", -11); +define("DB_ERROR_INVALID_DATE", -12); +define("DB_ERROR_DIVZERO", -13); + +// }}} +// {{{ Prepare/execute parameter types + +define("DB_PARAM_SCALAR", 1); +define("DB_PARAM_OPAQUE", 2); + +// }}} +// {{{ Binary data modes + +define("DB_BINMODE_PASSTHRU", 1); +define("DB_BINMODE_RETURN", 2); +define("DB_BINMODE_CONVERT", 3); + +// }}} + +// {{{ class DB + +/** + * This class implements a factory method for creating DB objects, + * as well as some "static methods". + * + * @version 100 + * @author Stig Bakken + * @since 4.0b4 + */ +class DB { + /** + * Create a new DB object for the specified database type. + * @param $type database type + * @return object a newly created DB object, or false on error + */ + function factory($type) { + global $USED_PACKAGES; + // "include" should be replaced with "use" once PHP gets it + $pkgname = 'DB/' . $type; + if (!is_array($USED_PACKAGES) || !$USED_PACKAGES[$pkgname]) { + if (!@include("DB/${type}.php")) { + return DB_ERROR_NOT_FOUND; + } else { + $USED_PACKAGES[$pkgname] = true; + } + } + $classname = 'DB_' . $type; + $obj = new $classname; + return $obj; + } + + /** + * Return the DB API version. + * @return int the DB API version number + */ + function apiVersion() { + return 100; + } + + /** + * Tell whether a result code from a DB method is an error. + * @param $code result code + * @return bool whether $code is an error + */ + function isError($code) { + return is_int($code) && ($code < 0); + } + + /** + * Return a textual error message for an error code. + * @param $code error code + * @return string error message + */ + function errorMessage($code) { + if (!is_array($errorMessages)) { + $errorMessages = array( + DB_OK => "no error", + DB_ERROR => "unknown error", + DB_ERROR_SYNTAX => "syntax error", + DB_ERROR_CONSTRAINT => "constraint violation", + DB_ERROR_NOT_FOUND => "not found", + DB_ERROR_ALREADY_EXISTS => "already exists", + DB_ERROR_UNSUPPORTED => "not supported", + DB_ERROR_MISMATCH => "mismatch", + DB_ERROR_INVALID => "invalid", + DB_ERROR_NOT_CAPABLE => "DB implementation not capable", + DB_ERROR_INVALID_NUMBER => "invalid number", + DB_ERROR_INVALID_DATE => "invalid date or time", + DB_ERROR_DIVZERO => "division by zero" + ); + } + return $errorMessages[$code]; + } +} + +// }}} +// {{{ class DB_result + +/** + * This class implements a wrapper for a DB result set. + * A new instance of this class will be returned by the DB implementation + * after processing a query that returns data. + */ +class DB_result { + var $dbh; + var $result; + + /** + * DB_result constructor. + * @param $dbh DB object reference + * @param $result result resource id + */ + function DB_result($dbh, $result) { + $this->dbh = $dbh; + $this->result = $result; + } + + /** + * Fetch and return a row of data. + * @return array a row of data, or false on error + */ + function fetchRow() { + return $this->dbh->fetchRow($this->result); + } + + /** + * Fetch a row of data into an existing array. + * @param $arr reference to data array + * @return int error code + */ + function fetchInto(const $arr) { + return $this->dbh->fetchInto($this->result, &$arr); + } + + /** + * Frees the resource for this result and reset ourselves. + * @return int error code + */ + function free() { + $err = $this->dbh->freeResult($this->result); + if (DB::isError($err)) { + return $err; + } + $this->dbh = $this->result = false; + return true; + } +} + +// }}} + +// Local variables: +// tab-width: 4 +// c-basic-offset: 4 +// End: +?> diff --git a/pear/Makefile.am b/pear/Makefile.am new file mode 100644 index 0000000000..2dd988ac9c --- /dev/null +++ b/pear/Makefile.am @@ -0,0 +1,9 @@ +## Process this file with automake to produce Makefile.in + +pecldir=$(prefix)/lib/php +pecl_DBdir=$(prefix)/lib/php/DB + +install-data-local: + $(mkinstalldirs) $(pecldir) $(pecl_DBdir) + $(INSTALL_DATA) $(srcdir)/DB.php $(pecldir) + $(INSTALL_DATA) $(srcdir)/DB/odbc.php $(pecl_DBdir) diff --git a/pear/README b/pear/README new file mode 100644 index 0000000000..b8ca9c09c6 --- /dev/null +++ b/pear/README @@ -0,0 +1,29 @@ + PECL (pronounced "pickle") - PHP Extension and Code Library + ----------------------------------------------------------- + +WHAT IS PECL? + +PECL is a code repository for PHP extensions and PHP library code +similar to TeX's CTAN and Perl's CPAN. + +The intention behind PECL is to provide a means for library code +authors to organize their code in a defined way shared by other +developers, and to give the PHP community a single source for such +code. + + +ADMINISTRATION + +This section will describe the rules for how files are structured and +how functions and classes should be named. + + +TOOLS + +This section will describe the tools provided to PECL users. + + +CODING RULES AND GUIDELINES + +* All PHP code _must_ use . and other formats are not + portable.