Skip to content

HTTPS clone URL

Subversion checkout URL

You can clone with
or
.
Download ZIP
Browse files

This commit was manufactured by cvs2svn to create tag 'RELEASE_1_0_2'.

  • Loading branch information...
commit 64ed05bf8ed66726a318df16b7933cc1c6eb5eb4 1 parent 985f1c2
SVN Migration authored
Showing with 13,267 additions and 2,684 deletions.
  1. +2 −0  ext/enchant/CREDITS
  2. +36 −0 ext/enchant/config.m4
  3. +13 −0 ext/enchant/config.w32
  4. +25 −0 ext/enchant/docs/examples/example1.php
  5. +774 −0 ext/enchant/enchant.c
  6. +146 −0 ext/enchant/package.xml
  7. +83 −0 ext/enchant/php_enchant.h
  8. +28 −0 ext/enchant/tests/broker_describe.phpt
  9. +21 −0 ext/enchant/tests/broker_free.phpt
  10. +15 −0 ext/enchant/tests/broker_init.phpt
  11. +31 −0 ext/enchant/tests/broker_request_dict.phpt
  12. +1 −0  ext/enchant/tests/hindi_correct.txt
  13. +1 −0  ext/enchant/tests/hindi_incorrect.txt
  14. +2 −0  ext/fileinfo/CREDITS
  15. 0  ext/fileinfo/EXPERIMENTAL
  16. +62 −0 ext/fileinfo/config.m4
  17. +437 −0 ext/fileinfo/fileinfo.c
  18. +29 −0 ext/fileinfo/fileinfo.php
  19. +43 −0 ext/fileinfo/package.xml
  20. +61 −0 ext/fileinfo/php_fileinfo.h
  21. +2 −0  ext/pdo/CREDITS
  22. +26 −0 ext/pdo/Makefile.frag
  23. +56 −0 ext/pdo/README
  24. +97 −0 ext/pdo/TODO
  25. +68 −0 ext/pdo/config.m4
  26. +10 −0 ext/pdo/config.w32
  27. +119 −0 ext/pdo/package.xml
  28. +399 −0 ext/pdo/pdo.c
  29. +62 −0 ext/pdo/pdo.php
  30. +1,443 −0 ext/pdo/pdo_dbh.c
  31. +712 −0 ext/pdo/pdo_sql_parser.c
  32. +487 −0 ext/pdo/pdo_sql_parser.re
  33. +340 −0 ext/pdo/pdo_sqlstate.c
  34. +2,499 −0 ext/pdo/pdo_stmt.c
  35. +91 −0 ext/pdo/php_pdo.h
  36. +663 −0 ext/pdo/php_pdo_driver.h
  37. +84 −0 ext/pdo/php_pdo_int.h
  38. +3 −0  ext/pdo_mysql/CREDITS
  39. +134 −0 ext/pdo_mysql/config.m4
  40. +15 −0 ext/pdo_mysql/config.w32
  41. +27 −0 ext/pdo_mysql/get_error_codes.php
  42. +573 −0 ext/pdo_mysql/mysql_driver.c
  43. +642 −0 ext/pdo_mysql/mysql_statement.c
  44. +93 −0 ext/pdo_mysql/package2.xml
  45. +116 −0 ext/pdo_mysql/pdo_mysql.c
  46. +53 −0 ext/pdo_mysql/php_pdo_mysql.h
  47. +90 −0 ext/pdo_mysql/php_pdo_mysql_int.h
  48. +388 −0 ext/pdo_mysql/php_pdo_mysql_sqlstate.h
  49. +50 −0 ext/pdo_mysql/tests/bug_33689.phpt
  50. +28 −0 ext/pdo_mysql/tests/common.phpt
  51. +19 −0 ext/pdo_mysql/tests/config.inc
  52. +30 −0 ext/pdo_mysql/tests/pecl_bug_5200.phpt
  53. +41 −0 ext/pdo_mysql/tests/pecl_bug_5780.phpt
  54. +52 −0 ext/pdo_mysql/tests/pecl_bug_5802.phpt
  55. +20 −0 ext/pdo_mysql/tests/show_tables.phpt
  56. +2 −0  ext/pdo_pgsql/CREDITS
  57. +131 −0 ext/pdo_pgsql/config.m4
  58. +22 −0 ext/pdo_pgsql/config.w32
  59. +87 −0 ext/pdo_pgsql/package2.xml
  60. +139 −0 ext/pdo_pgsql/pdo_pgsql.c
  61. +711 −0 ext/pdo_pgsql/pgsql_driver.c
  62. +664 −0 ext/pdo_pgsql/pgsql_statement.c
  63. +55 −0 ext/pdo_pgsql/php_pdo_pgsql.h
  64. +114 −0 ext/pdo_pgsql/php_pdo_pgsql_int.h
  65. +0 −10 ext/sqlite/tests/bug26911.phpt
  66. +0 −13 ext/sqlite/tests/sqlite_018.phpt
  67. +0 −46 ext/sqlite/tests/sqlite_019.phpt
  68. +0 −98 ext/sqlite/tests/sqlite_022.phpt
  69. +0 −2  ext/tidy/CREDITS
  70. +0 −122 ext/tidy/README
  71. +0 −3  ext/tidy/TODO
  72. +0 −35 ext/tidy/config.m4
  73. +0 −38 ext/tidy/examples/cleanhtml.php
  74. +0 −93 ext/tidy/examples/dumpit.php
  75. +0 −60 ext/tidy/examples/urlgrab.php
  76. +0 −64 ext/tidy/package.xml
  77. +0 −238 ext/tidy/php_tidy.h
  78. +0 −24 ext/tidy/tests/001.phpt
  79. +0 −22 ext/tidy/tests/002.phpt
  80. +0 −25 ext/tidy/tests/003.phpt
  81. +0 −21 ext/tidy/tests/004.phpt
  82. +0 −1  ext/tidy/tests/005.html
  83. +0 −23 ext/tidy/tests/005.phpt
  84. +0 −21 ext/tidy/tests/006.phpt
  85. +0 −36 ext/tidy/tests/007.phpt
  86. +0 −1,689 ext/tidy/tidy.c
View
2  ext/enchant/CREDITS
@@ -0,0 +1,2 @@
+enchant
+Pierre-Alain Joye, Ilia Alshanetsky
View
36 ext/enchant/config.m4
@@ -0,0 +1,36 @@
+dnl
+dnl $Id$
+dnl
+
+PHP_ARG_WITH(enchant,for ENCHANT support,
+[ --with-enchant[=DIR] Include enchant support.
+ GNU Aspell version 1.1.3 or higher required.])
+
+if test "$PHP_ENCHANT" != "no"; then
+ PHP_NEW_EXTENSION(enchant, enchant.c, $ext_shared)
+ if test "$PHP_ENCHANT" != "yes"; then
+ ENCHANT_SEARCH_DIRS=$PHP_ENCHANT
+ else
+ ENCHANT_SEARCH_DIRS="/usr/local /usr"
+ fi
+ for i in $ENCHANT_SEARCH_DIRS; do
+ if test -f $i/include/enchant/enchant.h; then
+ ENCHANT_DIR=$i
+ ENCHANT_INCDIR=$i/include/enchant
+ elif test -f $i/include/enchant.h; then
+ ENCHANT_DIR=$i
+ ENCHANT_INCDIR=$i/include
+ fi
+ done
+
+ if test -z "$ENCHANT_DIR"; then
+ AC_MSG_ERROR(Cannot find enchant)
+ fi
+
+ ENCHANT_LIBDIR=$ENCHANT_DIR/lib
+
+ AC_DEFINE(HAVE_ENCHANT,1,[ ])
+ PHP_SUBST(ENCHANT_SHARED_LIBADD)
+ PHP_ADD_LIBRARY_WITH_PATH(enchant, $ENCHANT_LIBDIR, ENCHANT_SHARED_LIBADD)
+ PHP_ADD_INCLUDE($ENCHANT_INCDIR)
+fi
View
13 ext/enchant/config.w32
@@ -0,0 +1,13 @@
+// $Id$
+// vim:ft=javascript
+
+ARG_ENABLE("enchant", "Enchant Support", "no");
+
+if (PHP_ENCHANT == "yes") {
+ if (CHECK_HEADER_ADD_INCLUDE("enchant.h", "CFLAGS_ENCHANT", PHP_ENCHANT)) {
+ EXTENSION("enchant", "enchant.c");
+ AC_DEFINE('HAVE_ENCHANT', 1, 'Have Enchant support', false);
+ } else {
+ WARNING('Could not find enchant.h; skipping');
+ }
+}
View
25 ext/enchant/docs/examples/example1.php
@@ -0,0 +1,25 @@
+<?php
+$tag = 'en_US';
+$r = enchant_broker_init();
+$bprovides = enchant_broker_describe($r);
+echo "Current broker provides the following backend(s):\n";
+print_r($bprovides);
+
+
+if (enchant_broker_dict_exists($r,$tag)) {
+ $d = enchant_broker_request_dict($r, $tag);
+ $dprovides = enchant_dict_describe($d);
+ echo "dictionary $tag provides:\n";
+ $spellerrors = enchant_dict_check($d, "soong");
+ print_r($dprovides);
+ echo "found $spellerrors spell errors\n";
+ if ($spellerrors) {
+ $suggs = enchant_dict_suggest($d, "soong");
+ echo "Suggestions for 'soong':";
+ print_r($suggs);
+ }
+ enchant_broker_free_dict($d);
+} else {
+}
+enchant_broker_free($r);
+?>
View
774 ext/enchant/enchant.c
@@ -0,0 +1,774 @@
+/*
+ +----------------------------------------------------------------------+
+ | PHP Version 5 |
+ +----------------------------------------------------------------------+
+ | Copyright (c) 1997-2004 The PHP Group |
+ +----------------------------------------------------------------------+
+ | This source file is subject to version 3.0 of the PHP license, |
+ | that is bundled with this package in the file LICENSE, and is |
+ | available at through the world-wide-web at |
+ | http://www.php.net/license/3_0.txt. |
+ | If you did not receive a copy of the PHP license and are unable to |
+ | obtain it through the world-wide-web, please send a note to |
+ | license@php.net so we can mail you a copy immediately. |
+ +----------------------------------------------------------------------+
+ | Author: Pierre-Alain Joye <paj@pearfr.org> |
+ | Ilia Alshanetsky <ilia@prohost.org> |
+ +----------------------------------------------------------------------+
+
+ $Id$
+*/
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+#include <enchant.h>
+#include "php.h"
+#include "php_ini.h"
+#include "ext/standard/info.h"
+#include "php_enchant.h"
+
+
+typedef EnchantBroker * EnchantBrokerPtr;
+typedef struct _broker_struct enchant_broker;
+typedef struct _dict_struct enchant_dict;
+
+typedef enchant_broker * enchant_brokerPtr;
+typedef enchant_dict * enchant_dictPtr;
+
+typedef struct _broker_struct {
+ EnchantBroker *pbroker;
+ enchant_dict **dict;
+ unsigned int dictcnt;
+ long rsrc_id;
+} _enchant_broker;
+
+typedef struct _dict_struct {
+ unsigned int id;
+ EnchantDict *pdict;
+ enchant_broker *pbroker;
+ long rsrc_id;
+ enchant_dict *next;
+ enchant_dict *prev;
+} _enchant_dict;
+
+
+/* True global resources - no need for thread safety here */
+static int le_enchant_broker;
+static int le_enchant_dict;
+
+/* If you declare any globals in php_enchant.h uncomment this:*/
+/*ZEND_DECLARE_MODULE_GLOBALS(enchant)*/
+
+/* {{{ enchant_functions[]
+ *
+ * Every user visible function must have an entry in enchant_functions[].
+ */
+function_entry enchant_functions[] = {
+ PHP_FE(enchant_broker_init, NULL)
+ PHP_FE(enchant_broker_free, NULL)
+ PHP_FE(enchant_broker_get_error, NULL)
+ PHP_FE(enchant_broker_list_dicts, NULL)
+ PHP_FE(enchant_broker_request_dict, NULL)
+ PHP_FE(enchant_broker_request_pwl_dict, NULL)
+ PHP_FE(enchant_broker_free_dict, NULL)
+ PHP_FE(enchant_broker_dict_exists, NULL)
+ PHP_FE(enchant_broker_set_ordering, NULL)
+ PHP_FE(enchant_broker_describe, NULL)
+ PHP_FE(enchant_dict_check, NULL)
+ PHP_FE(enchant_dict_suggest, NULL)
+ PHP_FE(enchant_dict_add_to_personal, NULL)
+ PHP_FE(enchant_dict_add_to_session, NULL)
+ PHP_FE(enchant_dict_is_in_session, NULL)
+ PHP_FE(enchant_dict_store_replacement, NULL)
+ PHP_FE(enchant_dict_get_error, NULL)
+ PHP_FE(enchant_dict_describe, NULL)
+ PHP_FE(enchant_dict_quick_check, third_arg_force_ref)
+
+ {NULL, NULL, NULL} /* Must be the last line in enchant_functions[] */
+};
+/* }}} */
+
+/* {{{ enchant_module_entry
+ */
+zend_module_entry enchant_module_entry = {
+#if ZEND_MODULE_API_NO >= 20010901
+ STANDARD_MODULE_HEADER,
+#endif
+ "enchant",
+ enchant_functions,
+ PHP_MINIT(enchant),
+ PHP_MSHUTDOWN(enchant),
+ NULL, /* Replace with NULL if there's nothing to do at request start */
+ NULL, /* Replace with NULL if there's nothing to do at request end */
+ PHP_MINFO(enchant),
+#if ZEND_MODULE_API_NO >= 20010901
+ PHP_ENCHANT_VERSION,
+#endif
+ STANDARD_MODULE_PROPERTIES
+};
+/* }}} */
+
+#ifdef COMPILE_DL_ENCHANT
+ZEND_GET_MODULE(enchant)
+#endif
+
+static void
+enumerate_providers_fn (const char * const name,
+ const char * const desc,
+ const char * const file,
+ void * ud) /* {{{ */
+{
+ zval *zdesc = (zval *) ud;
+ zval *tmp_array;
+
+ MAKE_STD_ZVAL(tmp_array);
+ array_init(tmp_array);
+
+ add_assoc_string(tmp_array, "name", (char *)name, 1);
+ add_assoc_string(tmp_array, "desc", (char *)desc, 1);
+ add_assoc_string(tmp_array, "file", (char *)file, 1);
+
+ if (Z_TYPE_P(zdesc)!=IS_ARRAY) {
+ array_init(zdesc);
+ }
+
+ add_next_index_zval(zdesc, tmp_array);
+}
+/* }}} */
+
+static void
+describe_dict_fn (const char * const lang,
+ const char * const name,
+ const char * const desc,
+ const char * const file,
+ void * ud) /* {{{ */
+{
+ zval *zdesc = (zval *) ud;
+ array_init(zdesc);
+ add_assoc_string(zdesc, "lang", (char *)lang, 1);
+ add_assoc_string(zdesc, "name", (char *)name, 1);
+ add_assoc_string(zdesc, "desc", (char *)desc, 1);
+ add_assoc_string(zdesc, "file", (char *)file, 1);
+}
+/* }}} */
+
+static void php_enchant_list_dicts_fn( const char * const lang_tag,
+ const char * const provider_name, const char * const provider_desc,
+ const char * const provider_file, void * ud) /* {{{ */
+{
+ zval *zdesc = (zval *) ud;
+ zval *tmp_array;
+
+ MAKE_STD_ZVAL(tmp_array);
+ array_init(tmp_array);
+ add_assoc_string(tmp_array, "lang_tag", (char *)lang_tag, 1);
+ add_assoc_string(tmp_array, "provider_name", (char *)provider_name, 1);
+ add_assoc_string(tmp_array, "provider_desc", (char *)provider_desc, 1);
+ add_assoc_string(tmp_array, "provider_file", (char *)provider_file, 1);
+
+ if (Z_TYPE_P(zdesc) != IS_ARRAY) {
+ array_init(zdesc);
+ }
+ add_next_index_zval(zdesc, tmp_array);
+
+}
+/* }}} */
+
+static void php_enchant_broker_free(zend_rsrc_list_entry *rsrc TSRMLS_DC) /* {{{ */
+{
+ if (rsrc->ptr) {
+ enchant_broker *broker = (enchant_broker *)rsrc->ptr;
+ if (broker) {
+ if (broker->pbroker) {
+ if (broker->dictcnt && broker->dict) {
+ if (broker->dict) {
+ int total, tofree;
+ tofree = total = broker->dictcnt-1;
+ do {
+ zend_list_delete(broker->dict[total]->rsrc_id);
+ efree(broker->dict[total]);
+ total--;
+ } while (total>=0);
+ }
+ efree(broker->dict);
+ broker->dict = NULL;
+ }
+ enchant_broker_free(broker->pbroker);
+ }
+ efree(broker);
+ }
+ }
+}
+/* }}} */
+
+static void php_enchant_dict_free(zend_rsrc_list_entry *rsrc TSRMLS_DC) /* {{{ */
+
+{
+ if (rsrc->ptr) {
+ enchant_dict *pdict = (enchant_dict *)rsrc->ptr;
+ if (pdict) {
+ if (pdict->pdict && pdict->pbroker) {
+ enchant_broker_free_dict(pdict->pbroker->pbroker, pdict->pdict);
+ if (pdict->id) {
+ pdict->pbroker->dict[pdict->id-1]->next = NULL;
+ }
+ zend_list_delete(pdict->pbroker->rsrc_id);
+ }
+
+ }
+ }
+}
+/* }}} */
+
+/* {{{ PHP_MINIT_FUNCTION
+ */
+PHP_MINIT_FUNCTION(enchant)
+{
+ le_enchant_broker = zend_register_list_destructors_ex(php_enchant_broker_free, NULL, "enchant_broker", module_number);
+ le_enchant_dict = zend_register_list_destructors_ex(php_enchant_dict_free, NULL, "enchant_dict", module_number);
+
+ return SUCCESS;
+}
+/* }}} */
+
+/* {{{ PHP_MSHUTDOWN_FUNCTION
+ */
+PHP_MSHUTDOWN_FUNCTION(enchant)
+{
+ return SUCCESS;
+}
+/* }}} */
+
+static void __enumerate_providers_fn (const char * const name,
+ const char * const desc,
+ const char * const file,
+ void * ud) /* {{{ */
+{
+ php_info_print_table_row(3, name, desc, file);
+}
+/* }}} */
+
+/* {{{ PHP_MINFO_FUNCTION
+ */
+PHP_MINFO_FUNCTION(enchant)
+{
+ EnchantBroker *pbroker;
+
+ pbroker = enchant_broker_init();
+ php_info_print_table_start();
+ php_info_print_table_header(2, "enchant support", "enabled");
+ php_info_print_table_row(2, "Version", PHP_ENCHANT_VERSION);
+ php_info_print_table_row(2, "Revision", "$Revision$");
+ php_info_print_table_end();
+
+ php_info_print_table_start();
+ enchant_broker_describe(pbroker, __enumerate_providers_fn, NULL);
+ php_info_print_table_end();
+ enchant_broker_free(pbroker);
+}
+/* }}} */
+
+#define PHP_ENCHANT_GET_BROKER \
+ ZEND_FETCH_RESOURCE(pbroker, enchant_broker *, &broker, -1, "enchant_broker", le_enchant_broker); \
+ if (!pbroker || !pbroker->pbroker) { \
+ php_error_docref(NULL TSRMLS_CC, E_WARNING, "%s", "Resource broker invalid"); \
+ RETURN_FALSE; \
+ }
+
+#define PHP_ENCHANT_GET_DICT \
+ ZEND_FETCH_RESOURCE(pdict, enchant_dict *, &dict, -1, "enchant_dict", le_enchant_dict); \
+ if (!pdict || !pdict->pdict) { \
+ php_error_docref(NULL TSRMLS_CC, E_WARNING, "%s", "Invalid dictionary resource."); \
+ RETURN_FALSE; \
+ }
+
+/* {{{ proto resource enchant_broker_init()
+ create a new broker object capable of requesting */
+PHP_FUNCTION(enchant_broker_init)
+{
+ enchant_broker *broker;
+ EnchantBroker *pbroker;
+
+ if (ZEND_NUM_ARGS()) {
+ ZEND_WRONG_PARAM_COUNT();
+ }
+
+ pbroker = enchant_broker_init();
+
+ if (pbroker) {
+ broker = (enchant_broker *) emalloc(sizeof(enchant_broker));
+ broker->pbroker = pbroker;
+ broker->dict = NULL;
+ broker->dictcnt = 0;
+ broker->rsrc_id = ZEND_REGISTER_RESOURCE(return_value, broker, le_enchant_broker);
+ } else {
+ RETURN_FALSE;
+ }
+}
+/* }}} */
+
+/* {{{ proto boolean enchant_broker_free(resource broker)
+ Destroys the broker object and its dictionnaries */
+PHP_FUNCTION(enchant_broker_free)
+{
+ zval *broker;
+ enchant_broker *pbroker;
+
+ if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "r", &broker) == FAILURE) {
+ RETURN_FALSE;
+ }
+ PHP_ENCHANT_GET_BROKER;
+
+ zend_list_delete(Z_RESVAL_P(broker));
+ RETURN_TRUE;
+}
+/* }}} */
+
+/* {{{ proto string enchant_broker_get_error(resource broker)
+ Returns the last error of the broker */
+PHP_FUNCTION(enchant_broker_get_error)
+{
+ zval *broker;
+ enchant_broker *pbroker;
+ char *msg;
+
+ if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "r", &broker) == FAILURE) {
+ RETURN_FALSE;
+ }
+
+ PHP_ENCHANT_GET_BROKER;
+
+ msg = enchant_broker_get_error(pbroker->pbroker);
+ if (msg) {
+ RETURN_STRING((char *)msg, 1);
+ }
+ RETURN_FALSE;
+}
+/* }}} */
+
+/* {{{ proto string enchant_broker_list_dicts(resource broker)
+ Lists the dictionaries available for the given broker */
+PHP_FUNCTION(enchant_broker_list_dicts)
+{
+ zval *broker;
+ enchant_broker *pbroker;
+ EnchantDictDescribeFn describetozval = php_enchant_list_dicts_fn;
+
+ char *msg;
+
+ if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "r", &broker) == FAILURE) {
+ RETURN_FALSE;
+ }
+
+ PHP_ENCHANT_GET_BROKER;
+
+ enchant_broker_list_dicts(pbroker->pbroker, php_enchant_list_dicts_fn, (void *)return_value);
+}
+/* }}} */
+
+/* {{{ proto resource enchant_broker_request_dict(resource broker, string tag)
+ create a new dictionary using tag, the non-empty language tag you wish to request
+ a dictionary for ("en_US", "de_DE", ...) */
+PHP_FUNCTION(enchant_broker_request_dict)
+{
+ zval *broker;
+ enchant_broker *pbroker;
+ enchant_dict *dict;
+ EnchantDict *d;
+ char *tag;
+ int taglen;
+ int pos;
+
+ if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "rs", &broker, &tag, &taglen) == FAILURE) {
+ RETURN_FALSE;
+ }
+
+ PHP_ENCHANT_GET_BROKER;
+
+ d = enchant_broker_request_dict(pbroker->pbroker, (const char *)tag);
+ if (d) {
+ if (pbroker->dictcnt) {
+ pbroker->dict = (enchant_dict **)erealloc(pbroker->dict, sizeof(enchant_dict *) * pbroker->dictcnt);
+ pos = pbroker->dictcnt++;
+ } else {
+ pbroker->dict = (enchant_dict **)emalloc(sizeof(enchant_dict *));
+ pos = 0;
+ pbroker->dictcnt++;
+ }
+
+ dict = pbroker->dict[pos] = (enchant_dict *)emalloc(sizeof(enchant_dict));
+ dict->id = pos;
+ dict->pbroker = pbroker;
+ dict->pdict = d;
+ dict->prev = pos ? pbroker->dict[pos-1] : NULL;
+ dict->next = NULL;
+ pbroker->dict[pos] = dict;
+
+ if (pos) {
+ pbroker->dict[pos-1]->next = dict;
+ }
+
+ dict->rsrc_id = ZEND_REGISTER_RESOURCE(return_value, dict, le_enchant_dict);
+ zend_list_addref(pbroker->rsrc_id);
+ } else {
+ RETURN_FALSE;
+ }
+}
+/* }}} */
+
+/* {{{ proto resource enchant_broker_request_pwl_dict(resource broker, string filename)
+ creates a dictionary using a PWL file. A PWL file is personal word file one word per line. It must exist before the call.*/
+PHP_FUNCTION(enchant_broker_request_pwl_dict)
+{
+ zval *broker;
+ enchant_broker *pbroker;
+ enchant_dict *dict;
+ EnchantDict *d;
+ char *pwl;
+ int pwllen;
+ int pos;
+
+ if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "rs", &broker, &pwl, &pwllen) == FAILURE) {
+ RETURN_FALSE;
+ }
+
+ if ((PG(safe_mode) && (!php_checkuid(pwl, NULL, CHECKUID_CHECK_FILE_AND_DIR))) || php_check_open_basedir(pwl TSRMLS_CC)) {
+ RETURN_FALSE;
+ }
+
+ PHP_ENCHANT_GET_BROKER;
+
+ d = enchant_broker_request_pwl_dict(pbroker->pbroker, (const char *)pwl);
+ if (d) {
+ if (pbroker->dictcnt) {
+ pos = pbroker->dictcnt++;
+ pbroker->dict = (enchant_dict **)erealloc(pbroker->dict, sizeof(enchant_dict *) * pbroker->dictcnt);
+ } else {
+ pbroker->dict = (enchant_dict **)emalloc(sizeof(enchant_dict *));
+ pos = 0;
+ pbroker->dictcnt++;
+ }
+ dict = pbroker->dict[pos] = (enchant_dict *)emalloc(sizeof(enchant_dict));
+ dict->id = pos;
+ dict->pbroker = pbroker;
+ dict->pdict = d;
+ dict->prev = pos?pbroker->dict[pos-1]:NULL;
+ dict->next = NULL;
+ pbroker->dict[pos] = dict;
+ if (pos) {
+ pbroker->dict[pos-1]->next = dict;
+ }
+ dict->rsrc_id = ZEND_REGISTER_RESOURCE(return_value, dict, le_enchant_dict);
+ } else {
+ RETURN_FALSE;
+ }
+}
+/* }}} */
+
+/* {{{ proto resource enchant_broker_free_dict(resource dict)
+ Free the dictionary resource */
+PHP_FUNCTION(enchant_broker_free_dict)
+{
+ zval *dict;
+ enchant_dict *pdict;
+
+ if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "r", &dict) == FAILURE) {
+ RETURN_FALSE;
+ }
+
+ PHP_ENCHANT_GET_DICT;
+
+ zend_list_delete(Z_RESVAL_P(dict));
+ RETURN_TRUE;
+}
+/* }}} */
+
+/* {{{ proto bool enchant_broker_dict_exists(resource broker, string tag)
+ Wether a dictionary exists or not. Using non-empty tag */
+PHP_FUNCTION(enchant_broker_dict_exists)
+{
+ zval *broker;
+ char *tag;
+ int taglen;
+ enchant_broker * pbroker;
+
+ if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "rs", &broker, &tag, &taglen) == FAILURE) {
+ RETURN_FALSE;
+ }
+
+ PHP_ENCHANT_GET_BROKER;
+
+ RETURN_BOOL(enchant_broker_dict_exists(pbroker->pbroker, tag));
+}
+/* }}} */
+
+/* {{{ proto bool enchant_broker_set_ordering(resource broker, string tag, string ordering)
+ Declares a preference of dictionaries to use for the language
+ described/referred to by 'tag'. The ordering is a comma delimited
+ list of provider names. As a special exception, the "*" tag can
+ be used as a language tag to declare a default ordering for any
+ language that does not explictly declare an ordering. */
+
+PHP_FUNCTION(enchant_broker_set_ordering)
+{
+ zval *broker;
+ char *pordering;
+ int porderinglen;
+ char *ptag;
+ int ptaglen;
+ enchant_broker * pbroker;
+
+ if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "rss", &broker, &ptag, &ptaglen, &pordering, &porderinglen) == FAILURE) {
+ RETURN_FALSE;
+ }
+
+ PHP_ENCHANT_GET_BROKER;
+
+ enchant_broker_set_ordering(pbroker->pbroker, ptag, pordering);
+ RETURN_TRUE;
+}
+/* }}} */
+
+/* {{{ proto array enchant_broker_describe(resource broker)
+ Enumerates the Enchant providers and tells you some rudimentary information about them. The same info is provided through phpinfo() */
+PHP_FUNCTION(enchant_broker_describe)
+{
+ EnchantBrokerDescribeFn describetozval = enumerate_providers_fn;
+ zval *broker;
+ enchant_broker * pbroker;
+
+ if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "r", &broker) == FAILURE) {
+ RETURN_FALSE;
+ }
+
+ PHP_ENCHANT_GET_BROKER;
+
+ enchant_broker_describe(pbroker->pbroker, describetozval, (void *)return_value);
+}
+/* }}} */
+
+/* {{{ proto bool enchant_dict_quick_check(resource dict, string word [, array &suggestions])
+ If the word is correctly spelled return true, otherwise return false, if suggestions variable
+ is provided, fill it with spelling alternatives. */
+PHP_FUNCTION(enchant_dict_quick_check)
+{
+ zval *dict, *sugg = NULL;
+ char *word;
+ int wordlen;
+ enchant_dict *pdict;
+
+ if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "rs|z/", &dict, &word, &wordlen, &sugg) == FAILURE) {
+ RETURN_FALSE;
+ }
+
+ if (sugg) {
+ zval_dtor(sugg);
+ }
+
+ PHP_ENCHANT_GET_DICT;
+
+ if (enchant_dict_check(pdict->pdict, word, wordlen) > 0) {
+ if (!sugg && ZEND_NUM_ARGS() == 2) {
+ RETURN_FALSE;
+ }
+
+ int n_sugg;
+ char **suggs;
+
+ array_init(sugg);
+
+ suggs = enchant_dict_suggest(pdict->pdict, word, wordlen, (size_t *) &n_sugg);
+ if (suggs && n_sugg) {
+ int i;
+ for (i = 0; i < n_sugg; i++) {
+ add_next_index_string(sugg, suggs[i], 1);
+ }
+ enchant_dict_free_suggestions(pdict->pdict, suggs);
+ }
+
+
+ RETURN_FALSE;
+ }
+ RETURN_TRUE;
+}
+/* }}} */
+
+/* {{{ proto bool enchant_dict_check(resource dict, string word)
+ If the word is correctly spelled return true, otherwise return false */
+PHP_FUNCTION(enchant_dict_check)
+{
+ zval *dict;
+ char *word;
+ int wordlen;
+ enchant_dict *pdict;
+
+ if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "rs", &dict, &word, &wordlen) == FAILURE) {
+ RETURN_FALSE;
+ }
+
+ PHP_ENCHANT_GET_DICT;
+
+ RETURN_BOOL(!enchant_dict_check(pdict->pdict, word, wordlen));
+}
+/* }}} */
+
+/* {{{ proto array enchant_dict_suggest(resource dict, string word)
+ Will return a list of values if any of those pre-conditions are not met.*/
+PHP_FUNCTION(enchant_dict_suggest)
+{
+ zval *dict;
+ char *word;
+ int wordlen;
+ char **suggs;
+ enchant_dict *pdict;
+ int n_sugg;
+
+ if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "rs", &dict, &word, &wordlen) == FAILURE) {
+ RETURN_FALSE;
+ }
+
+ PHP_ENCHANT_GET_DICT;
+
+ suggs = enchant_dict_suggest(pdict->pdict, word, wordlen, (size_t *)&n_sugg);
+ if (suggs && n_sugg) {
+ int i;
+
+ array_init(return_value);
+ for (i = 0; i < n_sugg; i++) {
+ add_next_index_string(return_value, suggs[i], 1);
+ }
+
+ enchant_dict_free_suggestions(pdict->pdict, suggs);
+ }
+}
+/* }}} */
+
+/* {{{ proto void enchant_dict_add_to_personal(resource dict, string word)
+ add 'word' to personal word list */
+PHP_FUNCTION(enchant_dict_add_to_personal)
+{
+ zval *dict;
+ char *word;
+ int wordlen;
+ enchant_dict *pdict;
+
+ if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "rs", &dict, &word, &wordlen) == FAILURE) {
+ RETURN_FALSE;
+ }
+
+ PHP_ENCHANT_GET_DICT;
+
+ enchant_dict_add_to_personal(pdict->pdict, word, wordlen);
+}
+/* }}} */
+
+/* {{{ proto void enchant_dict_add_to_session(resource dict, string word)
+ add 'word' to this spell-checking session */
+PHP_FUNCTION(enchant_dict_add_to_session)
+{
+ zval *dict;
+ char *word;
+ int wordlen;
+ enchant_dict *pdict;
+
+ if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "rs", &dict, &word, &wordlen) == FAILURE) {
+ RETURN_FALSE;
+ }
+
+ PHP_ENCHANT_GET_DICT;
+
+ enchant_dict_add_to_session(pdict->pdict, word, wordlen);
+}
+/* }}} */
+
+/* {{{ proto bool enchant_dict_is_in_session(resource dict, string word)
+ whether or not 'word' exists in this spelling-session */
+PHP_FUNCTION(enchant_dict_is_in_session)
+{
+ zval *dict;
+ char *word;
+ int wordlen;
+ enchant_dict *pdict;
+
+ if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "rs", &dict, &word, &wordlen) == FAILURE) {
+ RETURN_FALSE;
+ }
+
+ PHP_ENCHANT_GET_DICT;
+
+ RETURN_BOOL(enchant_dict_is_in_session(pdict->pdict, word, wordlen));
+}
+/* }}} */
+
+/* {{{ proto void enchant_dict_store_replacement(resource dict, string mis, string cor)
+ add a correction for 'mis' using 'cor'.
+ Notes that you replaced @mis with @cor, so it's possibly more likely
+ that future occurrences of @mis will be replaced with @cor. So it might
+ bump @cor up in the suggestion list.*/
+PHP_FUNCTION(enchant_dict_store_replacement)
+{
+ zval *dict;
+ char *mis, *cor;
+ int mislen, corlen;
+
+ enchant_dict *pdict;
+
+ if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "rss", &dict, &mis, &mislen, &cor, &corlen) == FAILURE) {
+ RETURN_FALSE;
+ }
+
+ PHP_ENCHANT_GET_DICT;
+
+ enchant_dict_store_replacement(pdict->pdict, mis, mislen, cor, corlen);
+}
+/* }}} */
+
+/* {{{ proto string enchant_dict_get_error(resource dict)
+ Returns the last error of the current spelling-session */
+PHP_FUNCTION(enchant_dict_get_error)
+{
+ zval *dict;
+ enchant_dict *pdict;
+ char *msg;
+
+ if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "r", &dict) == FAILURE) {
+ RETURN_FALSE;
+ }
+
+ PHP_ENCHANT_GET_DICT;
+
+ msg = enchant_dict_get_error(pdict->pdict);
+ if (msg) {
+ RETURN_STRING((char *)msg, 1);
+ }
+
+ RETURN_FALSE;
+}
+/* }}} */
+
+/* {{{ proto array enchant_dict_describe(resource dict)
+ Describes an individual dictionary 'dict' */
+PHP_FUNCTION(enchant_dict_describe)
+{
+ zval *dict;
+ enchant_dict *pdict;
+
+ if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "r", &dict) == FAILURE) {
+ RETURN_FALSE;
+ }
+
+ PHP_ENCHANT_GET_DICT;
+
+ enchant_dict_describe(pdict->pdict, describe_dict_fn, (void *)return_value);
+}
+/* }}} */
+
+/*
+ * Local variables:
+ * tab-width: 4
+ * c-basic-offset: 4
+ * End:
+ * vim600: noet sw=4 ts=4 fdm=marker
+ * vim<600: noet sw=4 ts=4
+ */
View
146 ext/enchant/package.xml
@@ -0,0 +1,146 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<package xmlns="http://pear.php.net/dtd/package-2.0" xmlns:tasks="http://pear.php.net/dtd/tasks-1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" packagerversion="1.4.8" version="2.0" xsi:schemaLocation="http://pear.php.net/dtd/tasks-1.0 http://pear.php.net/dtd/tasks-1.0.xsd http://pear.php.net/dtd/package-2.0 http://pear.php.net/dtd/package-2.0.xsd">
+ <name>enchant</name>
+ <channel>pecl.php.net</channel>
+ <summary>libenchant binder, support near all spelling tools</summary>
+ <description>Enchant is a binder for libenchant. Libenchant provides a common
+API for many spell libraries:
+- aspell/pspell (intended to replace ispell)
+- hspell (hebrew)
+- ispell
+- myspell/hunspell (OpenOffice project, mozilla)
+- uspell (primarily Yiddish, Hebrew, and Eastern European languages)
+A plugin system allows to add custom spell support.
+see www.abisource.com/enchant/
+ </description>
+ <lead>
+ <name>Pierre-Alain Joye</name>
+ <user>pajoye</user>
+ <email>paj@pearfr.org</email>
+ <active>yes</active>
+ </lead>
+ <lead>
+ <name>Ilia Alshanetsky</name>
+ <user>iliaa</user>
+ <email>ilia@php.net</email>
+ <active>yes</active>
+ </lead>
+ <date>2006-03-21</date>
+ <version>
+ <release>1.0.1</release>
+ <api>1.1.0</api>
+ </version>
+ <stability>
+ <release>stable</release>
+ <api>stable</api>
+ </stability>
+ <license uri="http://www.php.net/license">PHP</license>
+ <notes>- add enchant_broker_list_dicts to get a list of available dictionaries
+- fix compilation warnings
+- add examples
+- add tests</notes>
+ <contents>
+ <dir name="/">
+ <dir name="docs">
+ <dir name="examples">
+ <file name="example1.php" role="doc"/>
+ </dir>
+<!-- //docs/examples -->
+ </dir>
+<!-- //docs -->
+ <file name="config.m4" role="src"/>
+ <file name="config.w32" role="src"/>
+ <file name="CREDITS" role="doc"/>
+ <file name="enchant.c" role="src"/>
+ <file name="php_enchant.h" role="src"/>
+ <dir name="tests">
+ <file name="broker_describe.phpt" role="test"/>
+ <file name="broker_free.phpt" role="test"/>
+ <file name="broker_init.phpt" role="test"/>
+ <file name="broker_request_dict.phpt" role="test"/>
+ <file name="hindi_correct.txt" role="test"/>
+ <file name="hindi_incorrect.txt" role="test"/>
+ </dir>
+ </dir>
+<!-- / -->
+ </contents>
+ <dependencies>
+ <required>
+ <php>
+ <min>5</min>
+ </php>
+ <pearinstaller>
+ <min>1.4.0b1</min>
+ </pearinstaller>
+ </required>
+ </dependencies>
+ <providesextension>enchant</providesextension>
+ <extsrcrelease>
+ <configureoption default="shared" name="with-enchant" prompt="libenchant prefix?"/>
+ </extsrcrelease>
+ <changelog>
+ <release>
+ <date>2004-08-11</date>
+ <version>
+ <release>1.0</release>
+ <api>1.0</api>
+ </version>
+ <stability>
+ <release>stable</release>
+ <api>stable</api>
+ </stability>
+ <license uri="http://www.php.net/license">PHP</license>
+ <notes>- Fixed leak inside MINFO function.
+- Fixed crash inside enchant_dict_suggest() when there are no suggestions.
+- Added missing safe_mode/open_basedir check inside enchant_broker_request_pwl_dict().
+- Fixed various function prototypes.
+- Fixed possible leak in suggestions result.
+ </notes>
+ </release>
+ <release>
+ <version>
+ <release>0.2.1</release>
+ <api>0.2.1</api>
+ </version>
+ <stability>
+ <release>beta</release>
+ <api>beta</api>
+ </stability>
+ <date>2004-03-11</date>
+ <license uri="http://www.php.net/license">PHP</license>
+ <notes>- Fix possible leak in suggestions result
+- Move to beta status
+ </notes>
+ </release>
+ <release>
+ <version>
+ <release>0.2.0</release>
+ <api>0.2.0</api>
+ </version>
+ <stability>
+ <release>alpha</release>
+ <api>alpha</api>
+ </stability>
+ <date>2006-03-21</date>
+ <license uri="http://www.php.net/license">PHP</license>
+ <notes>- Add Ilia Alshanetsky as maintainer
+- Cleanup sources codes (ilia)
+- Add enchant_dict_quick_check (ilia)
+ </notes>
+ </release>
+ <release>
+ <version>
+ <release>0.1</release>
+ <api>0.1</api>
+ </version>
+ <stability>
+ <release>alpha</release>
+ <api>alpha</api>
+ </stability>
+ <date>2003-03-08</date>
+ <license uri="http://www.php.net/license">PHP</license>
+ <notes>Initial release
+ </notes>
+ </release>
+ </changelog>
+</package>
View
83 ext/enchant/php_enchant.h
@@ -0,0 +1,83 @@
+/*
+ +----------------------------------------------------------------------+
+ | PHP Version 4 |
+ +----------------------------------------------------------------------+
+ | Copyright (c) 1997-2003 The PHP Group |
+ +----------------------------------------------------------------------+
+ | This source file is subject to version 3.0 of the PHP license, |
+ | that is bundled with this package in the file LICENSE, and is |
+ | available at through the world-wide-web at |
+ | http://www.php.net/license/3_0.txt. |
+ | If you did not receive a copy of the PHP license and are unable to |
+ | obtain it through the world-wide-web, please send a note to |
+ | license@php.net so we can mail you a copy immediately. |
+ +----------------------------------------------------------------------+
+ | Author: Pierre-Alain Joye <paj@pearfr.org> |
+ +----------------------------------------------------------------------+
+
+ $Id$
+*/
+
+#ifndef PHP_ENCHANT_H
+#define PHP_ENCHANT_H
+
+extern zend_module_entry enchant_module_entry;
+#define phpext_enchant_ptr &enchant_module_entry
+
+#define PHP_ENCHANT_VERSION "1.0.2-dev"
+
+#ifdef PHP_WIN32
+#define PHP_ENCHANT_API __declspec(dllexport)
+#else
+#define PHP_ENCHANT_API
+#endif
+
+#ifdef ZTS
+#include "TSRM.h"
+#endif
+
+static void php_enchant_broker_free(zend_rsrc_list_entry *rsrc TSRMLS_DC);
+static void php_enchant_dict_free(zend_rsrc_list_entry *rsrc TSRMLS_DC);
+
+PHP_MINIT_FUNCTION(enchant);
+PHP_MSHUTDOWN_FUNCTION(enchant);
+PHP_MINFO_FUNCTION(enchant);
+
+PHP_FUNCTION(enchant_broker_init);
+PHP_FUNCTION(enchant_broker_free);
+PHP_FUNCTION(enchant_broker_get_error);
+PHP_FUNCTION(enchant_broker_list_dicts);
+PHP_FUNCTION(enchant_broker_request_dict);
+PHP_FUNCTION(enchant_broker_request_pwl_dict);
+PHP_FUNCTION(enchant_broker_free_dict);
+PHP_FUNCTION(enchant_broker_dict_exists);
+PHP_FUNCTION(enchant_broker_set_ordering);
+PHP_FUNCTION(enchant_broker_describe);
+
+PHP_FUNCTION(enchant_dict_check);
+PHP_FUNCTION(enchant_dict_suggest);
+PHP_FUNCTION(enchant_dict_add_to_personal);
+PHP_FUNCTION(enchant_dict_add_to_session);
+PHP_FUNCTION(enchant_dict_is_in_session);
+PHP_FUNCTION(enchant_dict_store_replacement);
+PHP_FUNCTION(enchant_dict_get_error);
+PHP_FUNCTION(enchant_dict_describe);
+PHP_FUNCTION(enchant_dict_quick_check);
+
+#ifdef ZTS
+#define ENCHANT_G(v) TSRMG(enchant_globals_id, zend_enchant_globals *, v)
+#else
+#define ENCHANT_G(v) (enchant_globals.v)
+#endif
+
+#endif /* PHP_ENCHANT_H */
+
+
+/*
+ * Local variables:
+ * tab-width: 4
+ * c-basic-offset: 4
+ * indent-tabs-mode: t
+ * End:
+ */
+
View
28 ext/enchant/tests/broker_describe.phpt
@@ -0,0 +1,28 @@
+--TEST--
+enchant_broker_describe() function
+--SKIPIF--
+<?php
+if(!extension_loaded('enchant')) die('skip, enchant not loader');
+
+ ?>
+--FILE--
+<?php
+$broker = enchant_broker_init();
+
+if(!$broker) exit("failed, broker_init failure\n");
+
+$provides = enchant_broker_describe($broker);
+
+if (is_array($provides)) {
+ foreach ($provides as $backend) {
+ if (!(isset($backend['name']) && isset($backend['desc']) && isset($backend['file']))) {
+ exit("failed\n");
+ }
+ }
+ exit("OK\n");
+} else {
+ echo "failed";
+}
+?>
+--EXPECTF--
+OK
View
21 ext/enchant/tests/broker_free.phpt
@@ -0,0 +1,21 @@
+--TEST--
+enchant_broker_free() function
+--SKIPIF--
+<?php
+if(!extension_loaded('enchant')) die('skip, enchant not loader');
+
+ ?>
+--FILE--
+<?php
+$broker = enchant_broker_init();
+if (is_resource($broker)) {
+ echo "OK\n";
+ enchant_broker_free($broker);
+} else {
+ exit("init failed\n");
+}
+echo "OK\n";
+?>
+--EXPECT--
+OK
+OK
View
15 ext/enchant/tests/broker_init.phpt
@@ -0,0 +1,15 @@
+--TEST--
+enchant_broker_init() function
+--SKIPIF--
+<?php
+if(!extension_loaded('enchant')) die('skip, enchant not loader');
+
+ ?>
+--FILE--
+<?php
+$broker = enchant_broker_init();
+echo is_resource($broker) ? "OK" : "Failure";
+echo "\n";
+?>
+--EXPECT--
+OK
View
31 ext/enchant/tests/broker_request_dict.phpt
@@ -0,0 +1,31 @@
+--TEST--
+enchant_broker_request_dict() function
+--SKIPIF--
+<?php
+if(!extension_loaded('enchant')) die('skip, enchant not loader');
+?>
+--FILE--
+<?php
+$broker = enchant_broker_init();
+if (!is_resource($broker)) {
+ exit("init failed\n");
+}
+
+$dicts = enchant_broker_list_dicts($broker);
+if (is_array($dicts)) {
+ if (count($dicts)) {
+ $dict = enchant_broker_request_dict($broker, $dicts[0]['lang_tag']);
+ if (is_resource($dict)) {
+ echo "OK\n";
+ } else {
+ echo "fail to request " . $dicts[0]['lang_tag'];
+ }
+ }
+} else {
+ exit("list dicts failed\n");
+}
+echo "OK\n";
+?>
+--EXPECT--
+OK
+OK
View
1  ext/enchant/tests/hindi_correct.txt
@@ -0,0 +1 @@
+इस पृष्ठ में एक लिंक बनाने के लिये इस प्रतीक को खीचें व छोड़ें
View
1  ext/enchant/tests/hindi_incorrect.txt
@@ -0,0 +1 @@
+इस पृष्ठ में एक लिंक बनाने के लिये इस प्रतीक को खच व छड
View
2  ext/fileinfo/CREDITS
@@ -0,0 +1,2 @@
+fileinfo
+Ilia Alshanetsky
View
0  ext/fileinfo/EXPERIMENTAL
No changes.
View
62 ext/fileinfo/config.m4
@@ -0,0 +1,62 @@
+dnl $Id$
+dnl config.m4 for extension fileinfo
+
+PHP_ARG_WITH(fileinfo, for fileinfo support,
+[ --with-fileinfo=DIR Include fileinfo support])
+
+if test "$PHP_FILEINFO" != "no"; then
+ SEARCH_PATH="/usr/local /usr /usr/share/file"
+ if test -r $PHP_FILEINFO/include/magic.h || test -r $PHP_FILEINFO/magic.h; then
+ FILEINFO_DIR=$PHP_FILEINFO
+ else
+ AC_MSG_CHECKING([for magic files in default path])
+ for i in $SEARCH_PATH ; do
+ if test -r $i/include/magic.h || test -r $i/magic.h; then
+ FILEINFO_DIR=$i
+ AC_MSG_RESULT(found in $i)
+ break
+ fi
+ done
+ fi
+
+ if test -z "$FILEINFO_DIR"; then
+ AC_MSG_RESULT([not found])
+ AC_MSG_ERROR([Please reinstall the libmagic distribution])
+ fi
+
+ if test -r "$FILEINFO_DIR/include/magic.h"; then
+ PHP_ADD_INCLUDE($FILEINFO_DIR/include)
+ else
+ PHP_ADD_INCLUDE($FILEINFO_DIR)
+ fi
+
+ LIBNAME=magic
+ LIBSYMBOL=magic_open
+
+ PHP_CHECK_FUNC(dl, dlopen)
+ PHP_CHECK_FUNC(gzgets, z)
+ PHP_CHECK_FUNC(round, m)
+
+ PHP_CHECK_LIBRARY($LIBNAME,$LIBSYMBOL,
+ [
+ PHP_ADD_LIBRARY_WITH_PATH($LIBNAME, $FILEINFO_DIR/lib, FILEINFO_SHARED_LIBADD)
+ AC_DEFINE(HAVE_FILEINFOLIB,1,[ ])
+ ],[
+ AC_MSG_ERROR([wrong magic lib version or lib not found])
+ ],[
+ -L$FILEINFO_DIR/lib
+ ])
+
+ MAGIC_MIME_LOCATIONS="/usr/local/share/file/magic /usr/share/file/magic /usr/share/misc/file/magic /etc/magic /usr/share/misc"
+ for i in $MAGIC_MIME_LOCATIONS; do
+ if test -f $i; then
+ PHP_DEFAULT_MAGIC_FILE=$i
+ break
+ fi
+ done
+ AC_DEFINE_UNQUOTED(PHP_DEFAULT_MAGIC_FILE,"$PHP_DEFAULT_MAGIC_FILE",[magic file path])
+
+ PHP_SUBST(FILEINFO_SHARED_LIBADD)
+
+ PHP_NEW_EXTENSION(fileinfo, fileinfo.c, $ext_shared)
+fi
View
437 ext/fileinfo/fileinfo.c
@@ -0,0 +1,437 @@
+/*
+ +----------------------------------------------------------------------+
+ | PHP Version 5 |
+ +----------------------------------------------------------------------+
+ | Copyright (c) 1997-2004 The PHP Group |
+ +----------------------------------------------------------------------+
+ | This source file is subject to version 3.0 of the PHP license, |
+ | that is bundled with this package in the file LICENSE, and is |
+ | available through the world-wide-web at the following url: |
+ | http://www.php.net/license/3_0.txt. |
+ | If you did not receive a copy of the PHP license and are unable to |
+ | obtain it through the world-wide-web, please send a note to |
+ | license@php.net so we can mail you a copy immediately. |
+ +----------------------------------------------------------------------+
+ | Author: Ilia Alshanetsky <ilia@php.net> |
+ +----------------------------------------------------------------------+
+*/
+
+/* $Id$ */
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+#include "php.h"
+
+#include <magic.h>
+/*
+ * HOWMANY specifies the maximum offset libmagic will look at
+ * this is currently hardcoded in the libmagic source but not exported
+ */
+#ifndef HOWMANY
+#define HOWMANY 65536
+#endif
+
+
+#include "php_ini.h"
+#include "ext/standard/info.h"
+#include "ext/standard/file.h" /* needed for context stuff */
+#include "php_fileinfo.h"
+#include "fopen_wrappers.h" /* needed for is_url */
+
+struct php_fileinfo {
+ long options;
+ struct magic_set *magic;
+};
+
+#ifndef PHP_DEFAULT_MAGIC_FILE
+#define PHP_DEFAULT_MAGIC_FILE NULL
+#endif
+
+#ifdef ZEND_ENGINE_2
+
+static zend_object_handlers finfo_object_handlers;
+zend_class_entry *finfo_class_entry;
+
+struct finfo_object {
+ zend_object zo;
+ struct php_fileinfo *ptr;
+};
+
+#define FILEINFO_DECLARE_INIT_OBJECT(object) \
+ zval *object = getThis();
+
+#define FILEINFO_REGISTER_OBJECT(_object, _ptr) \
+{ \
+ struct finfo_object *obj; \
+ obj = (struct finfo_object*)zend_object_store_get_object(_object TSRMLS_CC); \
+ obj->ptr = _ptr; \
+}
+
+#define FILEINFO_FROM_OBJECT(finfo, object) \
+{ \
+ struct finfo_object *obj = zend_object_store_get_object(object TSRMLS_CC); \
+ finfo = obj->ptr; \
+ if (!finfo) { \
+ php_error_docref(NULL TSRMLS_CC, E_WARNING, "The invalid fileinfo object."); \
+ RETURN_FALSE; \
+ } \
+}
+
+/* {{{ finfo_objects_dtor
+ */
+static void finfo_objects_dtor(void *object, zend_object_handle handle TSRMLS_DC)
+{
+ struct finfo_object *intern = (struct finfo_object *) object;
+
+ if (intern->ptr) {
+ magic_close(intern->ptr->magic);
+ efree(intern->ptr);
+ }
+
+ efree(intern);
+}
+/* }}} */
+
+/* {{{ finfo_objects_new
+ */
+PHP_FILEINFO_API zend_object_value finfo_objects_new(zend_class_entry *class_type TSRMLS_DC)
+{
+ zend_object_value retval;
+ struct finfo_object *intern;
+
+ intern = ecalloc(1, sizeof(struct finfo_object));
+ intern->zo.ce = class_type;
+ intern->zo.properties = NULL;
+#if ZEND_EXTENSION_API_NO > 220050000
+ intern->zo.guards = NULL;
+#else
+ intern->zo.in_get = 0;
+ intern->zo.in_set = 0;
+#endif
+ intern->ptr = NULL;
+
+ retval.handle = zend_objects_store_put(intern, finfo_objects_dtor, NULL, NULL TSRMLS_CC);
+ retval.handlers = (zend_object_handlers *) &finfo_object_handlers;
+
+ return retval;
+}
+/* }}} */
+
+/* {{{ finfo_class_functions
+ */
+function_entry finfo_class_functions[] = {
+ ZEND_ME_MAPPING(finfo, finfo_open, NULL)
+ ZEND_ME_MAPPING(set_flags, finfo_set_flags,NULL)
+ ZEND_ME_MAPPING(file, finfo_file, NULL)
+ ZEND_ME_MAPPING(buffer, finfo_buffer, NULL)
+ {NULL, NULL, NULL}
+};
+/* }}} */
+
+#else
+
+#define FILEINFO_REGISTER_OBJECT(_object, _ptr) {}
+#define FILEINFO_FROM_OBJECT(socket_id, object) {}
+
+#define FILEINFO_DECLARE_INIT_OBJECT(object)
+#define object 0
+
+#endif
+
+#define FINFO_SET_OPTION(magic, options) \
+ if (magic_setflags(magic, options) == -1) { \
+ php_error_docref(NULL TSRMLS_CC, E_WARNING, "Failed to set option '%ld' %d:%s", \
+ options, magic_errno(magic), magic_error(magic)); \
+ RETURN_FALSE; \
+ }
+
+/* True global resources - no need for thread safety here */
+static int le_fileinfo;
+
+void finfo_resource_destructor(zend_rsrc_list_entry *rsrc TSRMLS_DC)
+{
+ if (rsrc->ptr) {
+ struct php_fileinfo *finfo = (struct php_fileinfo *) rsrc->ptr;
+ magic_close(finfo->magic);
+ efree(rsrc->ptr);
+ rsrc->ptr = NULL;
+ }
+}
+
+/* {{{ fileinfo_functions[]
+ */
+function_entry fileinfo_functions[] = {
+ PHP_FE(finfo_open, NULL)
+ PHP_FE(finfo_close, NULL)
+ PHP_FE(finfo_set_flags, NULL)
+ PHP_FE(finfo_file, NULL)
+ PHP_FE(finfo_buffer, NULL)
+ {NULL, NULL, NULL}
+};
+/* }}} */
+
+/* {{{ PHP_MINIT_FUNCTION
+ */
+PHP_MINIT_FUNCTION(finfo)
+{
+#ifdef ZEND_ENGINE_2
+ zend_class_entry _finfo_class_entry;
+ INIT_CLASS_ENTRY(_finfo_class_entry, "finfo", finfo_class_functions);
+ _finfo_class_entry.create_object = finfo_objects_new;
+ finfo_class_entry = zend_register_internal_class(&_finfo_class_entry TSRMLS_CC);
+
+ /* copy the standard object handlers to you handler table */
+ memcpy(&finfo_object_handlers, zend_get_std_object_handlers(), sizeof(zend_object_handlers));
+#endif /* ZEND_ENGINE_2 */
+
+ le_fileinfo = zend_register_list_destructors_ex(finfo_resource_destructor, NULL, "file_info", module_number);
+
+ REGISTER_LONG_CONSTANT("FILEINFO_NONE", MAGIC_NONE, CONST_CS|CONST_PERSISTENT);
+ REGISTER_LONG_CONSTANT("FILEINFO_SYMLINK", MAGIC_SYMLINK, CONST_CS|CONST_PERSISTENT);
+ REGISTER_LONG_CONSTANT("FILEINFO_MIME", MAGIC_MIME, CONST_CS|CONST_PERSISTENT);
+ REGISTER_LONG_CONSTANT("FILEINFO_COMPRESS", MAGIC_COMPRESS, CONST_CS|CONST_PERSISTENT);
+ REGISTER_LONG_CONSTANT("FILEINFO_DEVICES", MAGIC_DEVICES, CONST_CS|CONST_PERSISTENT);
+ REGISTER_LONG_CONSTANT("FILEINFO_CONTINUE", MAGIC_CONTINUE, CONST_CS|CONST_PERSISTENT);
+ REGISTER_LONG_CONSTANT("FILEINFO_PRESERVE_ATIME", MAGIC_PRESERVE_ATIME, CONST_CS|CONST_PERSISTENT);
+ REGISTER_LONG_CONSTANT("FILEINFO_RAW", MAGIC_RAW, CONST_CS|CONST_PERSISTENT);
+
+ return SUCCESS;
+}
+/* }}} */
+
+/* {{{ fileinfo_module_entry
+ */
+zend_module_entry fileinfo_module_entry = {
+#if ZEND_MODULE_API_NO >= 20010901
+ STANDARD_MODULE_HEADER,
+#endif
+ "fileinfo",
+ fileinfo_functions,
+ PHP_MINIT(finfo),
+ NULL,
+ NULL,
+ NULL,
+ PHP_MINFO(fileinfo),
+#if ZEND_MODULE_API_NO >= 20010901
+ "0.1", /* Replace with version number for your extension */
+#endif
+ STANDARD_MODULE_PROPERTIES
+};
+/* }}} */
+
+#ifdef COMPILE_DL_FILEINFO
+ZEND_GET_MODULE(fileinfo)
+#endif
+
+/* {{{ PHP_MINFO_FUNCTION
+ */
+PHP_MINFO_FUNCTION(fileinfo)
+{
+ php_info_print_table_start();
+ php_info_print_table_header(2, "fileinfo support", "enabled");
+ php_info_print_table_end();
+}
+/* }}} */
+
+/* {{{ proto resource finfo_open([int options [, string arg]])
+ Create a new fileinfo resource. */
+PHP_FUNCTION(finfo_open)
+{
+ long options = MAGIC_NONE;
+ char *file = PHP_DEFAULT_MAGIC_FILE;
+ int file_len = 0;
+ struct php_fileinfo *finfo;
+ FILEINFO_DECLARE_INIT_OBJECT(object)
+ char resolved_path[MAXPATHLEN];
+
+ if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "|ls", &options, &file, &file_len) == FAILURE) {
+ RETURN_FALSE;
+ }
+
+ if (file_len) { /* user specified filed, perform open_basedir checks */
+ if (!VCWD_REALPATH(file, resolved_path)) {
+ RETURN_FALSE;
+ }
+ file = resolved_path;
+
+ if ((PG(safe_mode) && (!php_checkuid(file, NULL, CHECKUID_CHECK_FILE_AND_DIR))) || php_check_open_basedir(file TSRMLS_CC)) {
+ RETURN_FALSE;
+ }
+ }
+
+ finfo = emalloc(sizeof(struct php_fileinfo));
+
+ finfo->options = options;
+ finfo->magic = magic_open(options);
+
+ if (finfo->magic == NULL) {
+ efree(finfo);
+ php_error_docref(NULL TSRMLS_CC, E_WARNING, "Invalid mode '%ld'.", options);
+ RETURN_FALSE;
+ }
+
+ if (magic_load(finfo->magic, file) == -1) {
+ php_error_docref(NULL TSRMLS_CC, E_WARNING, "Failed to load magic database at '%s'.", file);
+ magic_close(finfo->magic);
+ efree(finfo);
+ RETURN_FALSE;
+ }
+
+ if (object) {
+ FILEINFO_REGISTER_OBJECT(object, finfo);
+ } else {
+ ZEND_REGISTER_RESOURCE(return_value, finfo, le_fileinfo);
+ }
+}
+/* }}} */
+
+/* {{{ proto resource finfo_close(resource finfo)
+ Close fileinfo resource. */
+PHP_FUNCTION(finfo_close)
+{
+ struct php_fileinfo *finfo;
+ zval *zfinfo;
+
+ if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "z", &zfinfo) == FAILURE) {
+ RETURN_FALSE;
+ }
+ ZEND_FETCH_RESOURCE(finfo, struct php_fileinfo *, &zfinfo, -1, "file_info", le_fileinfo);
+
+ zend_list_delete(Z_RESVAL_P(zfinfo));
+
+ RETURN_TRUE;
+}
+/* }}} */
+
+/* {{{ proto bool finfo_set_flags(resource finfo, int options)
+ Set libmagic configuration options. */
+PHP_FUNCTION(finfo_set_flags)
+{
+ long options;
+ struct php_fileinfo *finfo;
+ zval *zfinfo;
+ FILEINFO_DECLARE_INIT_OBJECT(object)
+
+ if (object) {
+ if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "l", &options) == FAILURE) {
+ RETURN_FALSE;
+ }
+ FILEINFO_FROM_OBJECT(finfo, object);
+ } else {
+ if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "zl", &zfinfo, &options) == FAILURE) {
+ RETURN_FALSE;
+ }
+ ZEND_FETCH_RESOURCE(finfo, struct php_fileinfo *, &zfinfo, -1, "file_info", le_fileinfo);
+ }
+
+ FINFO_SET_OPTION(finfo->magic, options)
+ finfo->options = options;
+
+ RETURN_TRUE;
+}
+/* }}} */
+
+static void _php_finfo_get_type(INTERNAL_FUNCTION_PARAMETERS, int mode)
+{
+ long options = 0;
+ char *buffer, *tmp, *ret_val;
+ int buffer_len;
+ struct php_fileinfo *finfo;
+ zval *zfinfo, *zcontext = NULL;
+ FILEINFO_DECLARE_INIT_OBJECT(object)
+
+ if (object) {
+ if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s|lbz", &buffer, &buffer_len, &options, &zcontext) == FAILURE) {
+ RETURN_FALSE;
+ }
+ FILEINFO_FROM_OBJECT(finfo, object);
+ } else {
+ if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "zs|lbz", &zfinfo, &buffer, &buffer_len, &options, &zcontext) == FAILURE) {
+ RETURN_FALSE;
+ }
+ ZEND_FETCH_RESOURCE(finfo, struct php_fileinfo *, &zfinfo, -1, "file_info", le_fileinfo);
+ }
+
+ /* Set options for the current file/buffer. */
+ if (options) {
+ FINFO_SET_OPTION(finfo->magic, options)
+ }
+
+ if (mode) { /* file */
+ /* determine if the file is a local file or remote URL */
+ char *tmp2;
+ php_stream_wrapper *wrap = php_stream_locate_url_wrapper(buffer, &tmp2, 0 TSRMLS_CC);
+ if (wrap && wrap->is_url) {
+#ifdef ZEND_ENGINE_2
+ php_stream_context *context = php_stream_context_from_zval(zcontext, 0);
+#else
+ php_stream_context *context = NULL;
+#endif
+ php_stream *stream = php_stream_open_wrapper_ex(buffer, "rb",
+ ENFORCE_SAFE_MODE | REPORT_ERRORS, NULL, context);
+ if (!stream) {
+ RETURN_FALSE;
+ }
+ buffer_len = php_stream_copy_to_mem(stream, &tmp, HOWMANY, 0);
+ php_stream_close(stream);
+
+ if (buffer_len == 0) {
+ RETURN_FALSE;
+ }
+ } else { /* local file */
+ char resolved_path[MAXPATHLEN];
+ if (!VCWD_REALPATH(buffer, resolved_path)) {
+ RETURN_FALSE;
+ }
+
+ ret_val = (char *) magic_file(finfo->magic, buffer);
+ goto common;
+ }
+ } else { /* buffer */
+ tmp = buffer;
+ }
+
+ ret_val = (char *) magic_buffer(finfo->magic, tmp, buffer_len);
+ if (mode) {
+ efree(tmp);
+ }
+common:
+ /* Restore options */
+ if (options) {
+ FINFO_SET_OPTION(finfo->magic, finfo->options)
+ }
+
+ if (!ret_val) {
+ php_error_docref(NULL TSRMLS_CC, E_WARNING, "Failed identify data %d:%s",
+ magic_errno(finfo->magic), magic_error(finfo->magic));
+ RETURN_FALSE;
+ } else {
+ RETURN_STRING(ret_val, 1);
+ }
+}
+
+/* {{{ proto string finfo_file(resource finfo, char *file_name [, int options [, resource context]])
+ Return information about a file. */
+PHP_FUNCTION(finfo_file)
+{
+ _php_finfo_get_type(INTERNAL_FUNCTION_PARAM_PASSTHRU, 1);
+}
+/* }}} */
+
+/* {{{ proto string finfo_buffer(resource finfo, char *string [, int options])
+ Return infromation about a string buffer. */
+PHP_FUNCTION(finfo_buffer)
+{
+ _php_finfo_get_type(INTERNAL_FUNCTION_PARAM_PASSTHRU, 0);
+}
+/* }}} */
+
+/*
+ * Local variables:
+ * tab-width: 4
+ * c-basic-offset: 4
+ * End:
+ * vim600: noet sw=4 ts=4 fdm=marker
+ * vim<600: noet sw=4 ts=4
+ */
View
29 ext/fileinfo/fileinfo.php
@@ -0,0 +1,29 @@
+<?php
+if(!extension_loaded('fileinfo')) {
+ dl('fileinfo.' . PHP_SHLIB_SUFFIX);
+}
+if(!extension_loaded('fileinfo')) {
+ die("fileinfo extension is not avaliable, please compile it.\n");
+}
+
+// normal operation
+$res = finfo_open(FILEINFO_MIME); /* return mime type ala mimetype extension */
+$files = glob("*");
+foreach ($files as $file) {
+ echo finfo_file($res, $file) . "\n";
+}
+finfo_close($res);
+
+// OO mode
+/*
+ * FILEINFO_PRESERVE_ATIME - if possible preserve the original access time
+ * FILEINFO_SYMLINK - follow symlinks
+ * FILEINFO_DEVICES - look at the contents of blocks or character special devices
+ * FILEINFO_COMPRESS - decompress compressed files
+ */
+$fi = new finfo(FILEINFO_PRESERVE_ATIME|FILEINFO_SYMLINK|FILEINFO_DEVICES|FILEINFO_COMPRESS);
+$files = glob("*");
+foreach ($files as $file) {
+ echo $fi->buffer(file_get_contents($file)) . "\n";
+}
+?>
View
43 ext/fileinfo/package.xml
@@ -0,0 +1,43 @@
+<?xml version="1.0" encoding="ISO-8859-1" ?>
+<!DOCTYPE package SYSTEM "../pear/package.dtd">
+<package>
+ <name>Fileinfo</name>
+ <summary>libmagic bindings</summary>
+ <maintainers>
+ <maintainer>
+ <user>iliaa</user>
+ <name>Ilia Alshanetsky</name>
+ <email>ilia@php.net</email>
+ <role>lead</role>
+ </maintainer>
+ </maintainers>
+ <description>
+This extension allows retrieval of information regarding vast majority of file.
+This information may include dimensions, quality, length etc...
+
+Additionally it can also be used to retrieve the mime type for a particular
+file and for text files proper language encoding.
+ </description>
+ <license>PHP</license>
+ <release>
+ <state>stable</state>
+ <version>1.0.2</version>
+ <date>2005-12-05</date>
+ <notes>
+ 1) Allow build against 5.1 and 5.0 versions of PHP
+ </notes>
+ <filelist>
+ <file role="src" name="config.m4"/>
+ <file role="src" name="fileinfo.c"/>
+ <file role="src" name="php_fileinfo.h"/>
+ <file role="doc" name="CREDITS"/>
+ <file role="doc" name="EXPERIMENTAL"/>
+ <file role="doc" name="fileinfo.php"/>
+ </filelist>
+ <deps>
+ </deps>
+ </release>
+</package>
+<!--
+vim:et:ts=1:sw=1
+-->
View
61 ext/fileinfo/php_fileinfo.h
@@ -0,0 +1,61 @@
+/*
+ +----------------------------------------------------------------------+
+ | PHP Version 5 |
+ +----------------------------------------------------------------------+
+ | Copyright (c) 1997-2004 The PHP Group |
+ +----------------------------------------------------------------------+
+ | This source file is subject to version 3.0 of the PHP license, |
+ | that is bundled with this package in the file LICENSE, and is |
+ | available through the world-wide-web at the following url: |
+ | http://www.php.net/license/3_0.txt. |
+ | If you did not receive a copy of the PHP license and are unable to |
+ | obtain it through the world-wide-web, please send a note to |
+ | license@php.net so we can mail you a copy immediately. |
+ +----------------------------------------------------------------------+
+ | Author: Ilia Alshanetsky <ilia@php.net> |
+ +----------------------------------------------------------------------+
+*/
+
+/* $Id$ */
+
+#ifndef PHP_FILEINFO_H
+#define PHP_FILEINFO_H
+
+extern zend_module_entry fileinfo_module_entry;
+#define phpext_fileinfo_ptr &fileinfo_module_entry
+
+#ifdef PHP_WIN32
+#define PHP_FILEINFO_API __declspec(dllexport)
+#else
+#define PHP_FILEINFO_API
+#endif
+
+#ifdef ZTS
+#include "TSRM.h"
+#endif
+
+PHP_MINFO_FUNCTION(fileinfo);
+
+PHP_FUNCTION(finfo_open);
+PHP_FUNCTION(finfo_close);
+PHP_FUNCTION(finfo_set_flags);
+PHP_FUNCTION(finfo_file);
+PHP_FUNCTION(finfo_buffer);
+
+#ifdef ZTS
+#define FILEINFO_G(v) TSRMG(fileinfo_globals_id, zend_fileinfo_globals *, v)
+#else
+#define FILEINFO_G(v) (fileinfo_globals.v)
+#endif
+
+#endif /* PHP_FILEINFO_H */
+
+
+/*
+ * Local variables:
+ * tab-width: 4
+ * c-basic-offset: 4
+ * End:
+ * vim600: noet sw=4 ts=4 fdm=marker
+ * vim<600: noet sw=4 ts=4
+ */
View
2  ext/pdo/CREDITS
@@ -0,0 +1,2 @@
+PHP Data Objects
+Wez Furlong, Marcus Boerger, Sterling Hughes, George Schlossnagle
View
26 ext/pdo/Makefile.frag
@@ -0,0 +1,26 @@
+phpincludedir=$(prefix)/include/php
+
+PDO_HEADER_FILES= \
+ php_pdo.h \
+ php_pdo_driver.h
+
+install-pdo-headers:
+ @echo "Installing PDO headers: $(INSTALL_ROOT)$(phpincludedir)/ext/pdo/"
+ @$(mkinstalldirs) $(INSTALL_ROOT)$(phpincludedir)/ext/pdo
+ @for f in $(PDO_HEADER_FILES); do \
+ if test -f "$(top_srcdir)/$$f"; then \
+ $(INSTALL_DATA) $(top_srcdir)/$$f $(INSTALL_ROOT)$(phpincludedir)/ext/pdo; \
+ elif test -f "$(top_builddir)/$$f"; then \
+ $(INSTALL_DATA) $(top_builddir)/$$f $(INSTALL_ROOT)$(phpincludedir)/ext/pdo; \
+ elif test -f "$(top_srcdir)/ext/pdo/$$f"; then \
+ $(INSTALL_DATA) $(top_srcdir)/ext/pdo/$$f $(INSTALL_ROOT)$(phpincludedir)/ext/pdo; \
+ elif test -f "$(top_builddir)/ext/pdo/$$f"; then \
+ $(INSTALL_DATA) $(top_builddir)/ext/pdo/$$f $(INSTALL_ROOT)$(phpincludedir)/ext/pdo; \
+ else \
+ echo "hmmm"; \
+ fi \
+ done;
+
+# mini hack
+install: $(all_targets) $(install_targets) install-pdo-headers
+
View
56 ext/pdo/README
@@ -0,0 +1,56 @@
+$Id$
+
+PHP Data Objects
+================
+
+Concept: Data Access Abstraction
+
+Goals:
+
+1/ Be light-weight
+2/ Provide common API for common database operations
+3/ Be performant
+4/ Keep majority of PHP specific stuff in the PDO core (such as persistent
+ resource management); drivers should only have to worry about getting the
+ data and not about PHP internals.
+
+
+Transactions and autocommit
+===========================
+
+When you create a database handle, you *should* specify the autocommit
+behaviour that you require. PDO will default to autocommit on.
+
+$dbh = new PDO("...", $user, $pass, array(PDO_ATTR_AUTOCOMMIT => true));
+
+When auto-commit is on, the driver will implicitly commit each query as it is
+executed. This works fine for most simple tasks but can be significantly
+slower when you are making a large number of udpates.
+
+$dbh = new PDO("...", $user, $pass, array(PDO_ATTR_AUTOCOMMIT => false));
+
+When auto-commit is off, you must then use $dbh->beginTransaction() to
+initiate a transaction. When your work is done, you then call $dbh->commit()
+or $dbh->rollBack() to persist or abort your changes respectively. Not all
+databases support transactions.
+
+You can change the auto-commit mode at run-time:
+
+$dbh->setAttribute(PDO_ATTR_AUTOCOMMIT, false);
+
+Regardless of the error handling mode set on the database handle, if the
+autocommit mode cannot be changed, an exception will be thrown.
+
+Some drivers will allow you to temporarily disable autocommit if you call
+$dbh->beginTransaction(). When you commit() or rollBack() such a transaction,
+the handle will switch back to autocommit mode again. If the mode could not
+be changed, an exception will be raised, as noted above.
+
+When the database handle is closed or destroyed (or at request end for
+persistent handles), the driver will implicitly rollBack(). It is your
+responsibility to call commit() when you are done making changes and
+autocommit is turned off.
+
+vim:tw=78:et
+
+
View
97 ext/pdo/TODO
@@ -0,0 +1,97 @@
+$Id$
+
+Roadmap for PDO
+
+Core, version 1.1:
+==================
+
+ - Add PDO::queryParams(), similar to PDO::query(), but accepts
+ an array of parameters as the second argument, pushing the remaining
+ args (which are args to setFetchMode()) up by one.
+
+ - Separate the handle factory call into two phases:
+ - handle creation
+ - connecting
+
+ This would then allow PDO to call setAttribute()
+ for each driver option specified in the constructor.
+ Right now, the handling of driver attributes is a bit sloppy.
+
+ - Add:
+ pdo.max_persistent
+ pdo.persistent_timeout
+ pdo.ping_interval
+
+ with the same meanings as those options from oci8.
+
+ - BLOB/CLOB.
+ Investigate the various APIs to determine if we can
+ transparently map BLOBs and CLOBs as PDO_PARAM_LOB.
+ If the API needs hints from the client side, we need
+ to introduce a PDO_PARAM_CLOB to differentiate between
+ binary and character data.
+
+ - Character set selection.
+ Generalize/standardize this.
+
+ - meta data.
+ Formalize getColumnMeta().
+ Look at retrieving lists of tables and other objects in the db.
+
+ - tracing/logging/debugging
+ Add ini options:
+
+ pdo.trace_file
+ pdo.enable_tracing
+
+ And corresponding attributes, ATTR_TRACE_FILE, ATTR_TRACING_ENABLE,
+ settable at dbh and stmt levels independently. If set at the dbh level,
+ the stmt will inherit its value. If not set explicitly in code, the
+ defaults for the dbh will come from the INI settings.
+
+ ATTR_TRACE_FILE will accept a string or a stream.
+
+ The INI options are useful for administrative tracing/debugging.
+ Trace mode will output very verbose info.
+
+
+General DB API Roundup:
+=========
+ Consider how the following can be implemented in PDO:
+
+ mysqli_change_user(); alters auth credentials on a live connection
+ mysqli_info(); info about rows affected by last query
+ mysqli_master_query(); force query to run on master
+ mysqli_ping(); ping / reconnect
+ mysqli_stat(); one line summary of server status
+
+ oci_password_change()
+
+ Also consider master/slave and/or failover server configuration.
+
+
+Postgres:
+=========
+
+ - Real large object support.
+ - Someone with more pgsql experience can suggest more features
+
+Oracle:
+=======
+
+ - Support for array types and collections.
+
+Userspace PDO Driver:
+=====================
+
+ - Will be hard.
+
+PDO Session module:
+===================
+
+ - Is it worth writing in C?
+ Probably not.
+
+
+vim:se et ts=2 sw=2 tw=78:
+
View
68 ext/pdo/config.m4
@@ -0,0 +1,68 @@
+dnl $Id$
+dnl config.m4 for extension pdo
+dnl vim:se ts=2 sw=2 et:
+
+AC_DEFUN([PHP_PDO_PEAR_CHECK],[
+ pdo_running_under_pear=0
+ case `pwd` in
+ /var/tmp/pear-build-*)
+ pdo_running_under_pear=1
+ ;;
+ esac
+
+ if test "$pdo_running_under_pear$PHP_PEAR_VERSION" = "1"; then
+ # we're running in an environment that smells like pear,
+ # and the PHP_PEAR_VERSION env var is not set. That implies
+ # that we're running under a slightly broken pear installer
+ AC_MSG_ERROR([
+PDO requires that you upgrade your PEAR installer tools. Please
+do so now by running:
+
+ % sudo pear upgrade pear
+
+or by manually downloading and installing PEAR version 1.3.5 or higher.
+
+Once you've upgraded, please re-try your PDO install.
+ ])
+ fi
+])
+
+PHP_ARG_ENABLE(pdo, whether to enable PDO support,
+[ --disable-pdo Disable PHP Data Objects support], yes)
+
+if test "$PHP_PDO" != "no"; then
+
+ PHP_PDO_PEAR_CHECK
+
+ if test "$ext_shared" = "yes" ; then
+ case $host_alias in
+ *darwin*)
+ if test "$pdo_running_under_pear" = "1"; then
+ AC_MSG_ERROR([
+Due to the way that loadable modules work on OSX/Darwin, you need to
+compile the PDO package statically into the PHP core.
+
+Please follow the instructions at: http://netevil.org/node.php?nid=202
+for more detail on this issue.
+ ])
+ fi
+ ext_shared=no
+ ;;
+ esac
+ fi
+ PHP_NEW_EXTENSION(pdo, pdo.c pdo_dbh.c pdo_stmt.c pdo_sql_parser.c pdo_sqlstate.c, $ext_shared)
+ ifdef([PHP_ADD_EXTENSION_DEP],
+ [
+ PHP_ADD_EXTENSION_DEP(pdo, spl, true)
+ ])
+
+ ifdef([PHP_INSTALL_HEADERS],
+ [
+ dnl Sadly, this is a complete NOP for pecl extensions
+ PHP_INSTALL_HEADERS(ext/pdo, [php_pdo.h php_pdo_driver.h])
+ ])
+
+ dnl so we always include the known-good working hack.
+ PHP_ADD_MAKEFILE_FRAGMENT
+fi
+
View
10 ext/pdo/config.w32
@@ -0,0 +1,10 @@
+// $Id$
+// vim:ft=javascript
+
+ARG_ENABLE("pdo", "Enable PHP Data Objects support", "no");
+
+if (PHP_PDO != "no") {
+ EXTENSION('pdo', 'pdo.c pdo_dbh.c pdo_stmt.c pdo_sql_parser.c pdo_sqlstate.c');
+ ADD_EXTENSION_DEP('pdo', 'spl', true);
+}
+
View
119 ext/pdo/package.xml
@@ -0,0 +1,119 @@
+<?xml version="1.0" encoding="iso-8859-1"?>
+<!DOCTYPE package SYSTEM "../pear/package.dtd">
+<package version="1.0">
+ <name>PDO</name>
+ <summary>PHP Data Objects Interface</summary>
+ <maintainers>
+ <maintainer>
+ <user>wez</user>
+ <name>Wez Furlong</name>
+ <email>wez@php.net</email>
+ <role>lead</role>
+ </maintainer>
+ <maintainer>
+ <user>helly</user>
+ <name>Marcus Boerger</name>
+ <email>helly@php.net</email>
+ <role>lead</role>
+ </maintainer>
+ <maintainer>
+ <user>iliaa</user>
+ <name>Ilia Alshanetsky</name>
+ <email>iliaa@php.net</email>
+ <role>lead</role>
+ </maintainer>
+ <maintainer>
+ <user>gschlossnagle</user>
+ <name>George Schlossnagle</name>
+ <email>george@omniti.com</email>
+ <role>lead</role>
+ </maintainer>
+ </maintainers>
+
+ <description>
+ PDO provides a uniform data access interface, sporting advanced features such
+ as prepared statements and bound parameters. PDO drivers are dynamically
+ loadable and may be developed independently from the core, but still accessed
+ using the same API.
+
+ Read the documentation at http://www.php.net/pdo for more information.
+ </description>
+ <license>PHP</license>
+ <release>
+ <state>stable</state>
+ <version>1.0.2</version>
+ <date>2005-11-28</date>
+
+ <notes>
+** NOTE WELL! **
+All the PDO_XXX constants have been renamed to PDO::XXX form for future
+compatibility with PHP namespaces. Sorry for the inconvenience, especially
+after Release Candidate 1.
+
+You need to install a PDO database driver to make use of PDO,
+check http://pecl.php.net/package-search.php?pkg_name=PDO
+for a list of available PDO drivers.
+
+It is highly recommended that you update to PHP 5.1 before using PDO.
+
+If you are running on Windows, you can find a precompiled binary at:
+http://pecl4win.php.net/ext.php/php_pdo.dll
+
+You can find additional PDO drivers at:
+http://pecl4win.php.net
+
+** Changes **
+- Fixed bug #35431 (PDO crashes when using LAZY fetch with fetchAll). (Wez)
+- Fixed bug #35430 (PDO crashes on incorrect FETCH_FUNC use). (Tony)
+
+- Changed PDO_XXX constants to PDO::XXX
+- It is now possible to extend PDO and PDOStatement and override their constructors
+
+- Fixed Bug #35303; PDO::prepare() can cause crashes with invalid parameters
+- Fixed Bug #35135; "new PDOStatement" can cause crashes.
+- Fixed Bug #35293 and PECL Bug #5589; segfault when creating persistent connections
+- Fixed PECL Bug #5010, problem installing headers
+- renamed pdo_drivers() to PDO::getAvailableDrivers()
+- Various fixes when building with SPL
+- PDO::setAttribute(PDO::ATTR_STATEMENT_CLASS) allows you to set your own
+ PDOStatement replacement when extending PDO and PDOStatement
+- Fixed Bug #34687; error information from PDO::query() was not always returned
+- Fixed PECL Bug #5750; uri: DSN was not handled correctly
+- Fixed PECL Bug #5589; segfault when persistent connection attempt fails
+- Fixed Bug #34590; User defined PDOStatement class methods are not callable
+- Fixed Bug #34908; FETCH_INTO segfaults without destination object
+- Fixed PECL Bug #5809; PDOStatement::execute(array(...)) modifies args
+- Fixed PECL Bug #5772; FETCH_FUNC cannot call functions with mixed case names
+
+** Note **
+
+You should uninstall and re-install your individual database drivers whenever
+you upgrade the base PDO package, otherwise you will see an error about PDO API
+numbers when you run your PHP scripts.
+
+ </notes>
+
+ <filelist>
+ <file role="src" name="config.m4"/>
+ <file role="src" name="config.w32"/>
+ <file role="src" name="pdo.c"/>
+ <file role="src" name="pdo_dbh.c"/>
+ <file role="src" name="pdo_stmt.c"/>
+ <file role="src" name="php_pdo.h"/>
+ <file role="src" name="php_pdo_driver.h"/>
+ <file role="src" name="php_pdo_int.h"/>
+ <file role="src" name="pdo_sql_parser.re"/>
+ <file role="src" name="pdo_sql_parser.c"/>
+ <file role="src" name="pdo_sqlstate.c"/>
+ <file role="src" name="Makefile.frag"/>
+
+ <file role="doc" name="README"/>
+ <file role="doc" name="TODO"/>
+ <file role="doc" name="pdo.php"/>
+ <file role="doc" name="CREDITS"/>
+ </filelist>
+ <deps>
+ <dep type="php" rel="ge" version="5.0.3"/>
+ </deps>
+ </release>
+</package>
View
399 ext/pdo/pdo.c
@@ -0,0 +1,399 @@
+/*
+ +----------------------------------------------------------------------+
+ | PHP Version 5 |
+ +----------------------------------------------------------------------+
+ | Copyright (c) 1997-2005 The PHP Group |
+ +----------------------------------------------------------------------+
+ | This source file is subject to version 3.0 of the PHP license, |
+ | that is bundled with this package in the file LICENSE, and is |
+ | available through the world-wide-web at the following url: |
+ | http://www.php.net/license/3_0.txt. |
+ | If you did not receive a copy of the PHP license and are unable to |
+ | obtain it through the world-wide-web, please send a note to |
+ | license@php.net so we can mail you a copy immediately. |
+ +----------------------------------------------------------------------+
+ | Author: Wez Furlong <wez@php.net> |
+ | Marcus Boerger <helly@php.net> |
+ | Sterling Hughes <sterling@php.net> |
+ +----------------------------------------------------------------------+
+*/
+
+/* $Id$ */
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include <ctype.h>
+#include "php.h"
+#include "php_ini.h"
+#include "ext/standard/info.h"
+#include "php_pdo.h"
+#include "php_pdo_driver.h"
+#include "php_pdo_int.h"
+#include "zend_exceptions.h"
+
+static zend_class_entry *spl_ce_RuntimeException;
+
+ZEND_DECLARE_MODULE_GLOBALS(pdo)
+
+/* True global resources - no need for thread safety here */
+
+/* the registry of PDO drivers */
+HashTable pdo_driver_hash;
+
+/* we use persistent resources for the driver connection stuff */
+static int le_ppdo;
+
+int php_pdo_list_entry(void)
+{
+ return le_ppdo;
+}
+
+/* for exceptional circumstances */
+zend_class_entry *pdo_exception_ce;
+
+PDO_API zend_class_entry *php_pdo_get_exception(void)
+{
+ return pdo_exception_ce;
+}
+
+PDO_API zend_class_entry *php_pdo_get_exception_base(int root TSRMLS_DC)
+{
+#if can_handle_soft_dependency_on_SPL && defined(HAVE_SPL) && ((PHP_MAJOR_VERSION > 5) || (PHP_MAJOR_VERSION == 5 && PHP_MINOR_VERSION >= 1))
+ if (!root) {
+ if (!spl_ce_RuntimeException) {
+ zend_class_entry **pce;
+
+ if (zend_hash_find(CG(class_table), "runtimeexception", sizeof("RuntimeException"), (void **) &pce) == SUCCESS) {
+ spl_ce_RuntimeException = *pce;
+ return *pce;
+ }
+ } else {
+ return spl_ce_RuntimeException;
+ }
+ }
+#endif
+#if (PHP_MAJOR_VERSION < 6)
+ return zend_exception_get_default();
+#else
+ return zend_exception_get_default(TSRMLS_C);
+#endif
+}
+
+zend_class_entry *pdo_dbh_ce, *pdo_dbstmt_ce, *pdo_row_ce;
+
+/* proto array pdo_drivers()
+ Return array of available PDO drivers */
+PHP_FUNCTION(pdo_drivers)
+{
+ HashPosition pos;
+ pdo_driver_t **pdriver;
+
+ array_init(return_value);
+
+ zend_hash_internal_pointer_reset_ex(&pdo_driver_hash, &pos);
+ while (SUCCESS == zend_hash_get_current_data_ex(&pdo_driver_hash, (void**)&pdriver, &pos)) {
+ add_next_index_stringl(return_value, (char*)(*pdriver)->driver_name, (*pdriver)->driver_name_len, 1);
+ zend_hash_move_forward_ex(&pdo_driver_hash, &pos);
+ }
+}
+/* }}} */
+
+/* {{{ pdo_functions[] */
+function_entry pdo_functions[] = {
+ PHP_FE(pdo_drivers, NULL)
+ {NULL, NULL, NULL}
+};
+/* }}} */
+
+/* {{{ pdo_functions[] */
+#if ZEND_MODULE_API_NO >= 20050922
+static zend_module_dep pdo_deps[] = {
+#ifdef HAVE_SPL
+ ZEND_MOD_REQUIRED("spl")
+#endif
+ {NULL, NULL, NULL}
+};
+#endif
+/* }}} */
+
+/* {{{ pdo_module_entry */
+zend_module_entry pdo_module_entry = {
+#if ZEND_MODULE_API_NO >= 20050922
+ STANDARD_MODULE_HEADER_EX, NULL,
+ pdo_deps,
+#else
+ STANDARD_MODULE_HEADER,
+#endif
+ "PDO",
+ pdo_functions,
+ PHP_MINIT(pdo),
+ PHP_MSHUTDOWN(pdo),