cvs: pecl /paradox CREDITS EXPERIMENTAL config.m4 paradox.c php_paradox.h
| From: | Uwe Steinmann | Date: | Wed, 23 Jul 2003 12:09:37 +0000 |
| Subject: | cvs: pecl /paradox CREDITS EXPERIMENTAL config.m4 paradox.c php_paradox.h | ||
| Groups: | php.pecl.cvs | ||
| Request: | Send a blank email to pecl-cvs+get-376@lists.php.net to get a copy of this message | ||
steinm Wed Jul 23 08:09:37 2003 EDT
Added files:
/pecl/paradox CREDITS EXPERIMENTAL config.m4 paradox.c
php_paradox.h
Log:
- this extension is for reading Paradox files
Index: pecl/paradox/config.m4 +++ pecl/paradox/config.m4 dnl $Id: config.m4,v 1.1 2003/07/23 12:09:37 steinm Exp $ dnl config.m4 for extension paradox PHP_ARG_WITH(paradox, for paradox support, Make sure that the comment is aligned: [ --with-paradox Include paradox support]) if test "$PHP_PARADOX" != "no"; then dnl Write more examples of tests here... dnl # --with-paradox -> check with-path SEARCH_PATH="/usr/local /usr" # you might want to change this SEARCH_FOR="/include/paradox.h" # you most likely want to change this if test -r $PHP_PARADOX/$SEARCH_FOR; then # path given as parameter PARADOX_DIR=$PHP_PARADOX else # search default path list AC_MSG_CHECKING([for paradox files in default path]) for i in $SEARCH_PATH ; do if test -r $i/$SEARCH_FOR; then PARADOX_DIR=$i AC_MSG_RESULT(found in $i) fi done fi if test -z "$PARADOX_DIR"; then AC_MSG_RESULT([not found]) AC_MSG_ERROR([Please reinstall the paradox distribution]) fi PHP_ADD_INCLUDE($PARADOX_DIR/include) LIBNAME=px # you may want to change this LIBSYMBOL=PX_new # you most likely want to change this PHP_CHECK_LIBRARY($LIBNAME,$LIBSYMBOL, [ PHP_ADD_LIBRARY_WITH_PATH($LIBNAME, $PARADOX_DIR/lib, PARADOX_SHARED_LIBADD) AC_DEFINE(HAVE_PARADOXLIB,1,[ ]) ],[ AC_MSG_ERROR([wrong paradox lib version or lib not found]) ],[ -L$PARADOX_DIR/lib -lm -ldl ]) PHP_SUBST(PARADOX_SHARED_LIBADD) PHP_NEW_EXTENSION(paradox, paradox.c, $ext_shared) fi Index: pecl/paradox/paradox.c +++ pecl/paradox/paradox.c /* +----------------------------------------------------------------------+ | 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 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: | +----------------------------------------------------------------------+ */ /* $Id: paradox.c,v 1.1 2003/07/23 12:09:37 steinm Exp $ */ #ifdef HAVE_CONFIG_H #include "config.h" #endif #include "php.h" #include "php_ini.h" #include "ext/standard/info.h" #include "ext/standard/php_string.h" #include "php_paradox.h" /* If you declare any globals in php_paradox.h uncomment this: ZEND_DECLARE_MODULE_GLOBALS(paradox) */ /* True global resources - no need for thread safety here */ static int le_pxdoc; /* {{{ paradox_functions[] * * Every user visible function must have an entry in paradox_functions[]. */ function_entry paradox_functions[] = { PHP_FE(px_new, NULL) PHP_FE(px_open_fp, NULL) PHP_FE(px_close, NULL) PHP_FE(px_delete, NULL) PHP_FE(px_numrecords, NULL) PHP_FE(px_numfields, NULL) PHP_FE(px_get_record, NULL) PHP_FE(px_get_field, NULL) PHP_FE(px_get_schema, NULL) PHP_FE(px_set_targetencoding, NULL) {NULL, NULL, NULL} /* Must be the last line in paradox_functions[] */ }; /* }}} */ /* {{{ paradox_module_entry */ zend_module_entry paradox_module_entry = { #if ZEND_MODULE_API_NO >= 20010901 STANDARD_MODULE_HEADER, #endif "paradox", paradox_functions, PHP_MINIT(paradox), PHP_MSHUTDOWN(paradox), PHP_RINIT(paradox), /* Replace with NULL if there's nothing to do at request start */ PHP_RSHUTDOWN(paradox), /* Replace with NULL if there's nothing to do at request end */ PHP_MINFO(paradox), #if ZEND_MODULE_API_NO >= 20010901 "0.1", /* Replace with version number for your extension */ #endif STANDARD_MODULE_PROPERTIES }; /* }}} */ #ifdef COMPILE_DL_PARADOX ZEND_GET_MODULE(paradox) #endif /* {{{ _free_px_doc */ static void _free_px_doc(zend_rsrc_list_entry *rsrc TSRMLS_DC) { pxdoc_t *pxdoc = (pxdoc_t *)rsrc->ptr; PX_delete(pxdoc); } /* }}} */ /* {{{ custom_errorhandler */ static void custom_errorhandler(pxdoc_t *p, int type, const char *shortmsg) { TSRMLS_FETCH(); php_error_docref(NULL TSRMLS_CC, E_ERROR, shortmsg); switch (type){ } } /* }}} */ /* {{{ px_emalloc */ static void *px_emalloc(pxdoc_t *p, size_t size, const char *caller) { return(emalloc(size)); } /* }}} */ /* {{{ px_realloc */ static void *px_realloc(pxdoc_t *p, void *mem, size_t size, const char *caller) { return(erealloc(mem, size)); } /* }}} */ /* {{{ px_efree */ static void px_efree(pxdoc_t *p, void *mem) { efree(mem); } /* }}} */ /* {{{ PHP_INI */ /* Remove comments and fill if you need to have entries in php.ini PHP_INI_BEGIN() STD_PHP_INI_ENTRY("paradox.global_value", "42", PHP_INI_ALL, OnUpdateLong, global_value, zend_paradox_globals, paradox_globals) STD_PHP_INI_ENTRY("paradox.global_string", "foobar", PHP_INI_ALL, OnUpdateString, global_string, zend_paradox_globals, paradox_globals) PHP_INI_END() */ /* }}} */ /* {{{ php_paradox_init_globals */ /* Uncomment this function if you have INI entries static void php_paradox_init_globals(zend_paradox_globals *paradox_globals) { paradox_globals->global_value = 0; paradox_globals->global_string = NULL; } */ /* }}} */ /* {{{ PHP_MINIT_FUNCTION */ PHP_MINIT_FUNCTION(paradox) { /* If you have INI entries, uncomment these lines ZEND_INIT_MODULE_GLOBALS(paradox, php_paradox_init_globals, NULL); REGISTER_INI_ENTRIES(); */ le_pxdoc = zend_register_list_destructors_ex(_free_px_doc, NULL, "px object", module_number); REGISTER_LONG_CONSTANT("PX_FIELD_ALPHA", pxfAlpha, CONST_CS | CONST_PERSISTENT); REGISTER_LONG_CONSTANT("PX_FIELD_DATE", pxfDate, CONST_CS | CONST_PERSISTENT); REGISTER_LONG_CONSTANT("PX_FIELD_SHORT", pxfShort, CONST_CS | CONST_PERSISTENT); REGISTER_LONG_CONSTANT("PX_FIELD_LONG", pxfLong, CONST_CS | CONST_PERSISTENT); REGISTER_LONG_CONSTANT("PX_FIELD_CURRENCY", pxfCurrency, CONST_CS | CONST_PERSISTENT); REGISTER_LONG_CONSTANT("PX_FIELD_NUMBER", pxfNumber, CONST_CS | CONST_PERSISTENT); REGISTER_LONG_CONSTANT("PX_FIELD_LOGICAL", pxfLogical, CONST_CS | CONST_PERSISTENT); REGISTER_LONG_CONSTANT("PX_FIELD_MEMOBLOB", pxfMemoBLOb, CONST_CS | CONST_PERSISTENT); REGISTER_LONG_CONSTANT("PX_FIELD_BLOB", pxfBLOb, CONST_CS | CONST_PERSISTENT); REGISTER_LONG_CONSTANT("PX_FIELD_FMTMEMOBLOB", pxfFmtMemoBLOb, CONST_CS | CONST_PERSISTENT); REGISTER_LONG_CONSTANT("PX_FIELD_OLE", pxfOLE, CONST_CS | CONST_PERSISTENT); REGISTER_LONG_CONSTANT("PX_FIELD_GRAPHIC", pxfGraphic, CONST_CS | CONST_PERSISTENT); REGISTER_LONG_CONSTANT("PX_FIELD_TIME", pxfTime, CONST_CS | CONST_PERSISTENT); REGISTER_LONG_CONSTANT("PX_FIELD_TIMESTAMP", pxfTimestamp, CONST_CS | CONST_PERSISTENT); REGISTER_LONG_CONSTANT("PX_FIELD_AUTOINC", pxfAutoInc, CONST_CS | CONST_PERSISTENT); REGISTER_LONG_CONSTANT("PX_FIELD_BCD", pxfBCD, CONST_CS | CONST_PERSISTENT); REGISTER_LONG_CONSTANT("PX_FIELD_BYTES", pxfBytes, CONST_CS | CONST_PERSISTENT); REGISTER_LONG_CONSTANT("PX_KEYTOLOWER", PX_KEYTOLOWER, CONST_CS | CONST_PERSISTENT); REGISTER_LONG_CONSTANT("PX_KEYTOUPPER", PX_KEYTOUPPER, CONST_CS | CONST_PERSISTENT); return SUCCESS; } /* }}} */ /* {{{ PHP_MSHUTDOWN_FUNCTION */ PHP_MSHUTDOWN_FUNCTION(paradox) { /* uncomment this line if you have INI entries UNREGISTER_INI_ENTRIES(); */ return SUCCESS; } /* }}} */ /* Remove if there's nothing to do at request start */ /* {{{ PHP_RINIT_FUNCTION */ PHP_RINIT_FUNCTION(paradox) { return SUCCESS; } /* }}} */ /* Remove if there's nothing to do at request end */ /* {{{ PHP_RSHUTDOWN_FUNCTION */ PHP_RSHUTDOWN_FUNCTION(paradox) { return SUCCESS; } /* }}} */ /* {{{ PHP_MINFO_FUNCTION */ PHP_MINFO_FUNCTION(paradox) { char tmp[32]; snprintf(tmp, 31, "%d.%d.%d", PX_get_majorversion(), PX_get_minorversion(), PX_get_subminorversion() ); php_info_print_table_start(); php_info_print_table_header(2, "paradox support", "enabled"); php_info_print_table_row(2, "pxlib Version", tmp ); php_info_print_table_row(2, "Revision", "$Revision: 1.1 $" ); php_info_print_table_end(); /* Remove comments if you have entries in php.ini DISPLAY_INI_ENTRIES(); */ } /* }}} */ /* {{{ proto resource px_new() Creates a new Paradox file object */ PHP_FUNCTION(px_new) { pxdoc_t *pxdoc; pxdoc = PX_new2(custom_errorhandler, px_emalloc, px_realloc, px_efree); ZEND_REGISTER_RESOURCE(return_value, pxdoc, le_pxdoc); } /* }}} */ /* {{{ proto bool px_open_fp(resource pxdoc, resource filedesc) Opens a new paradox document. */ PHP_FUNCTION(px_open_fp) { zval **arg1, **arg2; FILE *fp = NULL; pxdoc_t *pxdoc = NULL; int argc = ZEND_NUM_ARGS(); if (ZEND_NUM_ARGS() != 2 || zend_get_parameters_ex(2, &arg1, &arg2) == FAILURE) { WRONG_PARAM_COUNT; } php_stream *stream; php_stream_from_zval(stream, arg2); if (php_stream_cast(stream, PHP_STREAM_AS_STDIO, (void*)&fp, 1) == FAILURE) { RETURN_FALSE; } ZEND_FETCH_RESOURCE(pxdoc, pxdoc_t *, arg1, -1, "px object", le_pxdoc); if (PX_open_fp(pxdoc, fp) < 0) { RETURN_FALSE; } RETURN_TRUE; } /* }}} */ /* {{{ proto bool px_close(resource pxdoc) Closes the paradox document */ PHP_FUNCTION(px_close) { zval **arg1; pxdoc_t *pxdoc; if (ZEND_NUM_ARGS() != 1 || zend_get_parameters_ex(1, &arg1) == FAILURE) { WRONG_PARAM_COUNT; } ZEND_FETCH_RESOURCE(pxdoc, pxdoc_t *, arg1, -1, "px object", le_pxdoc); PX_close(pxdoc); RETURN_TRUE; } /* }}} */ /* {{{ proto bool px_delete(resource pxdoc) Deletes the paradox document */ PHP_FUNCTION(px_delete) { zval **arg1; pxdoc_t *pxdoc; if (ZEND_NUM_ARGS() != 1 || zend_get_parameters_ex(1, &arg1) == FAILURE) { WRONG_PARAM_COUNT; } ZEND_FETCH_RESOURCE(pxdoc, pxdoc_t *, arg1, -1, "px object", le_pxdoc); zend_list_delete(Z_RESVAL_PP(arg1)); RETURN_TRUE; } /* }}} */ /* {{{ proto bool px_get_record(resource pxdoc, int recno, int type) Returns a record from the database */ PHP_FUNCTION(px_get_record) { zval **arg1, **arg2, **arg3; pxdoc_t *pxdoc; pxhead_t *pxh; pxfield_t *pxf; char *selectedfields; char *data; int i, j, offset; int result_type = 0; switch (ZEND_NUM_ARGS()) { case 2: if (zend_get_parameters_ex(2, &arg1, &arg2) == FAILURE) { RETURN_FALSE; } break; case 3: if (zend_get_parameters_ex(3, &arg1, &arg2, &arg3) == FAILURE) { RETURN_FALSE; } convert_to_long_ex(arg3); result_type = Z_LVAL_PP(arg3); break; default: WRONG_PARAM_COUNT; break; } ZEND_FETCH_RESOURCE(pxdoc, pxdoc_t *, arg1, -1, "px object", le_pxdoc); convert_to_long_ex(arg2); pxh = pxdoc->px_head; if((selectedfields = (char *) px_malloc(pxdoc, pxh->px_numfields, "Could not allocate memory for array of selected fields.")) == NULL) { RETURN_FALSE; } memset(selectedfields, '\0', pxh->px_numfields); pxf = pxh->px_fields; for(i=0; i<pxh->px_numfields; i++) { selectedfields[i] = 1; pxf++; } if((data = (char *) px_malloc(pxdoc, pxh->px_recordsize, "Could not allocate memory for record.")) == NULL) { if(selectedfields) px_free(pxdoc, selectedfields); RETURN_FALSE; } if(PX_get_record(pxdoc, Z_LVAL_PP(arg2), data)) { char *fname; array_init(return_value); pxf = pxh->px_fields; offset = 0; for(i=0; i<pxh->px_numfields; i++) { if(selectedfields[i]) { int len; switch(result_type) { case PX_KEYTOLOWER: fname = php_strtolower(pxf->px_fname, strlen(pxf->px_fname)); break; case PX_KEYTOUPPER: fname = php_strtoupper(pxf->px_fname, strlen(pxf->px_fname)); break; default: fname = pxf->px_fname; } switch(pxf->px_ftype) { case pxfAlpha: { char *value; if(PX_get_data_alpha(pxdoc, &data[offset], pxf->px_flen, &value)) { len = strlen(value) < pxf->px_flen ? strlen(value) : pxf->px_flen; add_assoc_stringl(return_value, fname, value, len, 0); } else { add_assoc_null(return_value, fname); } break; } case pxfDate: { break; } case pxfShort: { short int value; if(PX_get_data_short(pxdoc, &data[offset], pxf->px_flen, &value)) { add_assoc_long(return_value, fname, value); } else { add_assoc_null(return_value, fname); } break; } case pxfAutoInc: case pxfLong: { long value; if(PX_get_data_long(pxdoc, &data[offset], pxf->px_flen, &value)) { add_assoc_long(return_value, fname, value); } else { add_assoc_null(return_value, fname); } break; } case pxfCurrency: case pxfNumber: { double value; if(PX_get_data_double(pxdoc, &data[offset], pxf->px_flen, &value)) { add_assoc_double(return_value, fname, value); } else { add_assoc_null(return_value, fname); } break; } case pxfLogical: if(*((char *)(&data[offset])) & 0x80) { data[offset] &= 0x7f; if(data[offset]) add_assoc_bool(return_value, fname, 1); else add_assoc_bool(return_value, fname, 0); } else { add_assoc_null(return_value, fname); } break; } offset += pxf->px_flen; pxf++; } } } px_free(pxdoc, selectedfields); px_free(pxdoc, data); } /* }}} */ /* {{{ proto int px_numrecords(resource pxdoc) Returns the number of records (columns) in the database */ PHP_FUNCTION(px_numrecords) { zval **arg1; pxdoc_t *pxdoc; int num; if (ZEND_NUM_ARGS() != 1 || zend_get_parameters_ex(1, &arg1) == FAILURE) { WRONG_PARAM_COUNT; } ZEND_FETCH_RESOURCE(pxdoc, pxdoc_t *, arg1, -1, "px object", le_pxdoc); if((num = PX_get_num_records(pxdoc)) < 0) { RETURN_FALSE; } else { RETURN_LONG(num); } } /* }}} */ /* {{{ proto int px_numfields(resource pxdoc) Returns the number of fields (columns) in the database */ PHP_FUNCTION(px_numfields) { zval **arg1; pxdoc_t *pxdoc; int num; if (ZEND_NUM_ARGS() != 1 || zend_get_parameters_ex(1, &arg1) == FAILURE) { WRONG_PARAM_COUNT; } ZEND_FETCH_RESOURCE(pxdoc, pxdoc_t *, arg1, -1, "px object", le_pxdoc); if((num = PX_get_num_fields(pxdoc)) < 0) { RETURN_FALSE; } else { RETURN_LONG(num); } } /* }}} */ /* {{{ proto array px_get_field(resource pxdoc, int recno) Returns meta data of a field */ PHP_FUNCTION(px_get_field) { zval **arg1, **arg2; pxdoc_t *pxdoc; pxfield_t *pxf; if (ZEND_NUM_ARGS() != 2 || zend_get_parameters_ex(2, &arg1, &arg2) == FAILURE) { WRONG_PARAM_COUNT; } ZEND_FETCH_RESOURCE(pxdoc, pxdoc_t *, arg1, -1, "px object", le_pxdoc); convert_to_long_ex(arg2); pxf = PX_get_field(pxdoc, Z_LVAL_PP(arg2)); array_init(return_value); add_assoc_string(return_value, "name", pxf->px_fname, 1); add_assoc_long(return_value, "type", pxf->px_ftype); add_assoc_long(return_value, "size", pxf->px_flen); } /* }}} */ /* {{{ proto array px_get_schema(resource pxdoc) Returns meta data of a table */ PHP_FUNCTION(px_get_schema) { zval **arg1; pxdoc_t *pxdoc; pxfield_t *pxf, *pxf1; int i, fn; if (ZEND_NUM_ARGS() != 1 || zend_get_parameters_ex(1, &arg1) == FAILURE) { WRONG_PARAM_COUNT; } ZEND_FETCH_RESOURCE(pxdoc, pxdoc_t *, arg1, -1, "px object", le_pxdoc); pxf = pxf1 = PX_get_fields(pxdoc); fn = PX_get_num_fields(pxdoc); if((pxf1 == NULL) || (fn < 0)) { RETURN_FALSE; } array_init(return_value); for(i=0; i<fn; i++) { zval *fieldarr; MAKE_STD_ZVAL(fieldarr); array_init(fieldarr); add_assoc_long(fieldarr, "type", pxf->px_ftype); add_assoc_long(fieldarr, "size", pxf->px_flen); zend_hash_add(Z_ARRVAL_P(return_value), pxf->px_fname, strlen(pxf->px_fname)+1, &fieldarr, sizeof(zval *), NULL); pxf++; } } /* }}} */ /* {{{ proto void px_set_targetencoding(resource pxdoc, string encoding) Sets encoding of field data when it is retrieved */ PHP_FUNCTION(px_set_targetencoding) { zval **arg1, **arg2; pxdoc_t *pxdoc; pxfield_t *pxf; if (ZEND_NUM_ARGS() != 2 || zend_get_parameters_ex(2, &arg1, &arg2) == FAILURE) { WRONG_PARAM_COUNT; } ZEND_FETCH_RESOURCE(pxdoc, pxdoc_t *, arg1, -1, "px object", le_pxdoc); convert_to_string_ex(arg2); PX_set_targetencoding(pxdoc, Z_STRVAL_PP(arg2)); } /* }}} */ /* * 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 */ Index: pecl/paradox/php_paradox.h +++ pecl/paradox/php_paradox.h /* +----------------------------------------------------------------------+ | 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 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: | +----------------------------------------------------------------------+ */ /* $Id: php_paradox.h,v 1.1 2003/07/23 12:09:37 steinm Exp $ */ #ifndef PHP_PARADOX_H #define PHP_PARADOX_H #include <paradox.h> extern zend_module_entry paradox_module_entry; #define phpext_paradox_ptr ¶dox_module_entry #ifdef PHP_WIN32 #define PHP_PARADOX_API __declspec(dllexport) #else #define PHP_PARADOX_API #endif #ifdef ZTS #include "TSRM.h" #endif #define PX_KEYTOLOWER 1 #define PX_KEYTOUPPER 2 PHP_MINIT_FUNCTION(paradox); PHP_MSHUTDOWN_FUNCTION(paradox); PHP_RINIT_FUNCTION(paradox); PHP_RSHUTDOWN_FUNCTION(paradox); PHP_MINFO_FUNCTION(paradox); PHP_FUNCTION(px_new); PHP_FUNCTION(px_open_fp); PHP_FUNCTION(px_close); PHP_FUNCTION(px_delete); PHP_FUNCTION(px_get_record); PHP_FUNCTION(px_numrecords); PHP_FUNCTION(px_numfields); PHP_FUNCTION(px_get_field); PHP_FUNCTION(px_get_schema); PHP_FUNCTION(px_set_targetencoding); /* Declare any global variables you may need between the BEGIN and END macros here: ZEND_BEGIN_MODULE_GLOBALS(paradox) long global_value; char *global_string; ZEND_END_MODULE_GLOBALS(paradox) */ /* In every utility function you add that needs to use variables in php_paradox_globals, call TSRM_FETCH(); after declaring other variables used by that function, or better yet, pass in TSRMLS_CC after the last function argument and declare your utility function with TSRMLS_DC after the last declared argument. Always refer to the globals in your function as PARADOX_G(variable). You are encouraged to rename these macros something shorter, see examples in any other php module directory. */ #ifdef ZTS #define PARADOX_G(v) TSRMG(paradox_globals_id, zend_paradox_globals *, v) #else #define PARADOX_G(v) (paradox_globals.v) #endif #endif /* PHP_PARADOX_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 */
Index: pecl/paradox/config.m4 +++ pecl/paradox/config.m4 dnl $Id: config.m4,v 1.1 2003/07/23 12:09:37 steinm Exp $ dnl config.m4 for extension paradox PHP_ARG_WITH(paradox, for paradox support, Make sure that the comment is aligned: [ --with-paradox Include paradox support]) if test "$PHP_PARADOX" != "no"; then dnl Write more examples of tests here... dnl # --with-paradox -> check with-path SEARCH_PATH="/usr/local /usr" # you might want to change this SEARCH_FOR="/include/paradox.h" # you most likely want to change this if test -r $PHP_PARADOX/$SEARCH_FOR; then # path given as parameter PARADOX_DIR=$PHP_PARADOX else # search default path list AC_MSG_CHECKING([for paradox files in default path]) for i in $SEARCH_PATH ; do if test -r $i/$SEARCH_FOR; then PARADOX_DIR=$i AC_MSG_RESULT(found in $i) fi done fi if test -z "$PARADOX_DIR"; then AC_MSG_RESULT([not found]) AC_MSG_ERROR([Please reinstall the paradox distribution]) fi PHP_ADD_INCLUDE($PARADOX_DIR/include) LIBNAME=px # you may want to change this LIBSYMBOL=PX_new # you most likely want to change this PHP_CHECK_LIBRARY($LIBNAME,$LIBSYMBOL, [ PHP_ADD_LIBRARY_WITH_PATH($LIBNAME, $PARADOX_DIR/lib, PARADOX_SHARED_LIBADD) AC_DEFINE(HAVE_PARADOXLIB,1,[ ]) ],[ AC_MSG_ERROR([wrong paradox lib version or lib not found]) ],[ -L$PARADOX_DIR/lib -lm -ldl ]) PHP_SUBST(PARADOX_SHARED_LIBADD) PHP_NEW_EXTENSION(paradox, paradox.c, $ext_shared) fi Index: pecl/paradox/paradox.c +++ pecl/paradox/paradox.c /* +----------------------------------------------------------------------+ | 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 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: | +----------------------------------------------------------------------+ */ /* $Id: paradox.c,v 1.1 2003/07/23 12:09:37 steinm Exp $ */ #ifdef HAVE_CONFIG_H #include "config.h" #endif #include "php.h" #include "php_ini.h" #include "ext/standard/info.h" #include "ext/standard/php_string.h" #include "php_paradox.h" /* If you declare any globals in php_paradox.h uncomment this: ZEND_DECLARE_MODULE_GLOBALS(paradox) */ /* True global resources - no need for thread safety here */ static int le_pxdoc; /* {{{ paradox_functions[] * * Every user visible function must have an entry in paradox_functions[]. */ function_entry paradox_functions[] = { PHP_FE(px_new, NULL) PHP_FE(px_open_fp, NULL) PHP_FE(px_close, NULL) PHP_FE(px_delete, NULL) PHP_FE(px_numrecords, NULL) PHP_FE(px_numfields, NULL) PHP_FE(px_get_record, NULL) PHP_FE(px_get_field, NULL) PHP_FE(px_get_schema, NULL) PHP_FE(px_set_targetencoding, NULL) {NULL, NULL, NULL} /* Must be the last line in paradox_functions[] */ }; /* }}} */ /* {{{ paradox_module_entry */ zend_module_entry paradox_module_entry = { #if ZEND_MODULE_API_NO >= 20010901 STANDARD_MODULE_HEADER, #endif "paradox", paradox_functions, PHP_MINIT(paradox), PHP_MSHUTDOWN(paradox), PHP_RINIT(paradox), /* Replace with NULL if there's nothing to do at request start */ PHP_RSHUTDOWN(paradox), /* Replace with NULL if there's nothing to do at request end */ PHP_MINFO(paradox), #if ZEND_MODULE_API_NO >= 20010901 "0.1", /* Replace with version number for your extension */ #endif STANDARD_MODULE_PROPERTIES }; /* }}} */ #ifdef COMPILE_DL_PARADOX ZEND_GET_MODULE(paradox) #endif /* {{{ _free_px_doc */ static void _free_px_doc(zend_rsrc_list_entry *rsrc TSRMLS_DC) { pxdoc_t *pxdoc = (pxdoc_t *)rsrc->ptr; PX_delete(pxdoc); } /* }}} */ /* {{{ custom_errorhandler */ static void custom_errorhandler(pxdoc_t *p, int type, const char *shortmsg) { TSRMLS_FETCH(); php_error_docref(NULL TSRMLS_CC, E_ERROR, shortmsg); switch (type){ } } /* }}} */ /* {{{ px_emalloc */ static void *px_emalloc(pxdoc_t *p, size_t size, const char *caller) { return(emalloc(size)); } /* }}} */ /* {{{ px_realloc */ static void *px_realloc(pxdoc_t *p, void *mem, size_t size, const char *caller) { return(erealloc(mem, size)); } /* }}} */ /* {{{ px_efree */ static void px_efree(pxdoc_t *p, void *mem) { efree(mem); } /* }}} */ /* {{{ PHP_INI */ /* Remove comments and fill if you need to have entries in php.ini PHP_INI_BEGIN() STD_PHP_INI_ENTRY("paradox.global_value", "42", PHP_INI_ALL, OnUpdateLong, global_value, zend_paradox_globals, paradox_globals) STD_PHP_INI_ENTRY("paradox.global_string", "foobar", PHP_INI_ALL, OnUpdateString, global_string, zend_paradox_globals, paradox_globals) PHP_INI_END() */ /* }}} */ /* {{{ php_paradox_init_globals */ /* Uncomment this function if you have INI entries static void php_paradox_init_globals(zend_paradox_globals *paradox_globals) { paradox_globals->global_value = 0; paradox_globals->global_string = NULL; } */ /* }}} */ /* {{{ PHP_MINIT_FUNCTION */ PHP_MINIT_FUNCTION(paradox) { /* If you have INI entries, uncomment these lines ZEND_INIT_MODULE_GLOBALS(paradox, php_paradox_init_globals, NULL); REGISTER_INI_ENTRIES(); */ le_pxdoc = zend_register_list_destructors_ex(_free_px_doc, NULL, "px object", module_number); REGISTER_LONG_CONSTANT("PX_FIELD_ALPHA", pxfAlpha, CONST_CS | CONST_PERSISTENT); REGISTER_LONG_CONSTANT("PX_FIELD_DATE", pxfDate, CONST_CS | CONST_PERSISTENT); REGISTER_LONG_CONSTANT("PX_FIELD_SHORT", pxfShort, CONST_CS | CONST_PERSISTENT); REGISTER_LONG_CONSTANT("PX_FIELD_LONG", pxfLong, CONST_CS | CONST_PERSISTENT); REGISTER_LONG_CONSTANT("PX_FIELD_CURRENCY", pxfCurrency, CONST_CS | CONST_PERSISTENT); REGISTER_LONG_CONSTANT("PX_FIELD_NUMBER", pxfNumber, CONST_CS | CONST_PERSISTENT); REGISTER_LONG_CONSTANT("PX_FIELD_LOGICAL", pxfLogical, CONST_CS | CONST_PERSISTENT); REGISTER_LONG_CONSTANT("PX_FIELD_MEMOBLOB", pxfMemoBLOb, CONST_CS | CONST_PERSISTENT); REGISTER_LONG_CONSTANT("PX_FIELD_BLOB", pxfBLOb, CONST_CS | CONST_PERSISTENT); REGISTER_LONG_CONSTANT("PX_FIELD_FMTMEMOBLOB", pxfFmtMemoBLOb, CONST_CS | CONST_PERSISTENT); REGISTER_LONG_CONSTANT("PX_FIELD_OLE", pxfOLE, CONST_CS | CONST_PERSISTENT); REGISTER_LONG_CONSTANT("PX_FIELD_GRAPHIC", pxfGraphic, CONST_CS | CONST_PERSISTENT); REGISTER_LONG_CONSTANT("PX_FIELD_TIME", pxfTime, CONST_CS | CONST_PERSISTENT); REGISTER_LONG_CONSTANT("PX_FIELD_TIMESTAMP", pxfTimestamp, CONST_CS | CONST_PERSISTENT); REGISTER_LONG_CONSTANT("PX_FIELD_AUTOINC", pxfAutoInc, CONST_CS | CONST_PERSISTENT); REGISTER_LONG_CONSTANT("PX_FIELD_BCD", pxfBCD, CONST_CS | CONST_PERSISTENT); REGISTER_LONG_CONSTANT("PX_FIELD_BYTES", pxfBytes, CONST_CS | CONST_PERSISTENT); REGISTER_LONG_CONSTANT("PX_KEYTOLOWER", PX_KEYTOLOWER, CONST_CS | CONST_PERSISTENT); REGISTER_LONG_CONSTANT("PX_KEYTOUPPER", PX_KEYTOUPPER, CONST_CS | CONST_PERSISTENT); return SUCCESS; } /* }}} */ /* {{{ PHP_MSHUTDOWN_FUNCTION */ PHP_MSHUTDOWN_FUNCTION(paradox) { /* uncomment this line if you have INI entries UNREGISTER_INI_ENTRIES(); */ return SUCCESS; } /* }}} */ /* Remove if there's nothing to do at request start */ /* {{{ PHP_RINIT_FUNCTION */ PHP_RINIT_FUNCTION(paradox) { return SUCCESS; } /* }}} */ /* Remove if there's nothing to do at request end */ /* {{{ PHP_RSHUTDOWN_FUNCTION */ PHP_RSHUTDOWN_FUNCTION(paradox) { return SUCCESS; } /* }}} */ /* {{{ PHP_MINFO_FUNCTION */ PHP_MINFO_FUNCTION(paradox) { char tmp[32]; snprintf(tmp, 31, "%d.%d.%d", PX_get_majorversion(), PX_get_minorversion(), PX_get_subminorversion() ); php_info_print_table_start(); php_info_print_table_header(2, "paradox support", "enabled"); php_info_print_table_row(2, "pxlib Version", tmp ); php_info_print_table_row(2, "Revision", "$Revision: 1.1 $" ); php_info_print_table_end(); /* Remove comments if you have entries in php.ini DISPLAY_INI_ENTRIES(); */ } /* }}} */ /* {{{ proto resource px_new() Creates a new Paradox file object */ PHP_FUNCTION(px_new) { pxdoc_t *pxdoc; pxdoc = PX_new2(custom_errorhandler, px_emalloc, px_realloc, px_efree); ZEND_REGISTER_RESOURCE(return_value, pxdoc, le_pxdoc); } /* }}} */ /* {{{ proto bool px_open_fp(resource pxdoc, resource filedesc) Opens a new paradox document. */ PHP_FUNCTION(px_open_fp) { zval **arg1, **arg2; FILE *fp = NULL; pxdoc_t *pxdoc = NULL; int argc = ZEND_NUM_ARGS(); if (ZEND_NUM_ARGS() != 2 || zend_get_parameters_ex(2, &arg1, &arg2) == FAILURE) { WRONG_PARAM_COUNT; } php_stream *stream; php_stream_from_zval(stream, arg2); if (php_stream_cast(stream, PHP_STREAM_AS_STDIO, (void*)&fp, 1) == FAILURE) { RETURN_FALSE; } ZEND_FETCH_RESOURCE(pxdoc, pxdoc_t *, arg1, -1, "px object", le_pxdoc); if (PX_open_fp(pxdoc, fp) < 0) { RETURN_FALSE; } RETURN_TRUE; } /* }}} */ /* {{{ proto bool px_close(resource pxdoc) Closes the paradox document */ PHP_FUNCTION(px_close) { zval **arg1; pxdoc_t *pxdoc; if (ZEND_NUM_ARGS() != 1 || zend_get_parameters_ex(1, &arg1) == FAILURE) { WRONG_PARAM_COUNT; } ZEND_FETCH_RESOURCE(pxdoc, pxdoc_t *, arg1, -1, "px object", le_pxdoc); PX_close(pxdoc); RETURN_TRUE; } /* }}} */ /* {{{ proto bool px_delete(resource pxdoc) Deletes the paradox document */ PHP_FUNCTION(px_delete) { zval **arg1; pxdoc_t *pxdoc; if (ZEND_NUM_ARGS() != 1 || zend_get_parameters_ex(1, &arg1) == FAILURE) { WRONG_PARAM_COUNT; } ZEND_FETCH_RESOURCE(pxdoc, pxdoc_t *, arg1, -1, "px object", le_pxdoc); zend_list_delete(Z_RESVAL_PP(arg1)); RETURN_TRUE; } /* }}} */ /* {{{ proto bool px_get_record(resource pxdoc, int recno, int type) Returns a record from the database */ PHP_FUNCTION(px_get_record) { zval **arg1, **arg2, **arg3; pxdoc_t *pxdoc; pxhead_t *pxh; pxfield_t *pxf; char *selectedfields; char *data; int i, j, offset; int result_type = 0; switch (ZEND_NUM_ARGS()) { case 2: if (zend_get_parameters_ex(2, &arg1, &arg2) == FAILURE) { RETURN_FALSE; } break; case 3: if (zend_get_parameters_ex(3, &arg1, &arg2, &arg3) == FAILURE) { RETURN_FALSE; } convert_to_long_ex(arg3); result_type = Z_LVAL_PP(arg3); break; default: WRONG_PARAM_COUNT; break; } ZEND_FETCH_RESOURCE(pxdoc, pxdoc_t *, arg1, -1, "px object", le_pxdoc); convert_to_long_ex(arg2); pxh = pxdoc->px_head; if((selectedfields = (char *) px_malloc(pxdoc, pxh->px_numfields, "Could not allocate memory for array of selected fields.")) == NULL) { RETURN_FALSE; } memset(selectedfields, '\0', pxh->px_numfields); pxf = pxh->px_fields; for(i=0; i<pxh->px_numfields; i++) { selectedfields[i] = 1; pxf++; } if((data = (char *) px_malloc(pxdoc, pxh->px_recordsize, "Could not allocate memory for record.")) == NULL) { if(selectedfields) px_free(pxdoc, selectedfields); RETURN_FALSE; } if(PX_get_record(pxdoc, Z_LVAL_PP(arg2), data)) { char *fname; array_init(return_value); pxf = pxh->px_fields; offset = 0; for(i=0; i<pxh->px_numfields; i++) { if(selectedfields[i]) { int len; switch(result_type) { case PX_KEYTOLOWER: fname = php_strtolower(pxf->px_fname, strlen(pxf->px_fname)); break; case PX_KEYTOUPPER: fname = php_strtoupper(pxf->px_fname, strlen(pxf->px_fname)); break; default: fname = pxf->px_fname; } switch(pxf->px_ftype) { case pxfAlpha: { char *value; if(PX_get_data_alpha(pxdoc, &data[offset], pxf->px_flen, &value)) { len = strlen(value) < pxf->px_flen ? strlen(value) : pxf->px_flen; add_assoc_stringl(return_value, fname, value, len, 0); } else { add_assoc_null(return_value, fname); } break; } case pxfDate: { break; } case pxfShort: { short int value; if(PX_get_data_short(pxdoc, &data[offset], pxf->px_flen, &value)) { add_assoc_long(return_value, fname, value); } else { add_assoc_null(return_value, fname); } break; } case pxfAutoInc: case pxfLong: { long value; if(PX_get_data_long(pxdoc, &data[offset], pxf->px_flen, &value)) { add_assoc_long(return_value, fname, value); } else { add_assoc_null(return_value, fname); } break; } case pxfCurrency: case pxfNumber: { double value; if(PX_get_data_double(pxdoc, &data[offset], pxf->px_flen, &value)) { add_assoc_double(return_value, fname, value); } else { add_assoc_null(return_value, fname); } break; } case pxfLogical: if(*((char *)(&data[offset])) & 0x80) { data[offset] &= 0x7f; if(data[offset]) add_assoc_bool(return_value, fname, 1); else add_assoc_bool(return_value, fname, 0); } else { add_assoc_null(return_value, fname); } break; } offset += pxf->px_flen; pxf++; } } } px_free(pxdoc, selectedfields); px_free(pxdoc, data); } /* }}} */ /* {{{ proto int px_numrecords(resource pxdoc) Returns the number of records (columns) in the database */ PHP_FUNCTION(px_numrecords) { zval **arg1; pxdoc_t *pxdoc; int num; if (ZEND_NUM_ARGS() != 1 || zend_get_parameters_ex(1, &arg1) == FAILURE) { WRONG_PARAM_COUNT; } ZEND_FETCH_RESOURCE(pxdoc, pxdoc_t *, arg1, -1, "px object", le_pxdoc); if((num = PX_get_num_records(pxdoc)) < 0) { RETURN_FALSE; } else { RETURN_LONG(num); } } /* }}} */ /* {{{ proto int px_numfields(resource pxdoc) Returns the number of fields (columns) in the database */ PHP_FUNCTION(px_numfields) { zval **arg1; pxdoc_t *pxdoc; int num; if (ZEND_NUM_ARGS() != 1 || zend_get_parameters_ex(1, &arg1) == FAILURE) { WRONG_PARAM_COUNT; } ZEND_FETCH_RESOURCE(pxdoc, pxdoc_t *, arg1, -1, "px object", le_pxdoc); if((num = PX_get_num_fields(pxdoc)) < 0) { RETURN_FALSE; } else { RETURN_LONG(num); } } /* }}} */ /* {{{ proto array px_get_field(resource pxdoc, int recno) Returns meta data of a field */ PHP_FUNCTION(px_get_field) { zval **arg1, **arg2; pxdoc_t *pxdoc; pxfield_t *pxf; if (ZEND_NUM_ARGS() != 2 || zend_get_parameters_ex(2, &arg1, &arg2) == FAILURE) { WRONG_PARAM_COUNT; } ZEND_FETCH_RESOURCE(pxdoc, pxdoc_t *, arg1, -1, "px object", le_pxdoc); convert_to_long_ex(arg2); pxf = PX_get_field(pxdoc, Z_LVAL_PP(arg2)); array_init(return_value); add_assoc_string(return_value, "name", pxf->px_fname, 1); add_assoc_long(return_value, "type", pxf->px_ftype); add_assoc_long(return_value, "size", pxf->px_flen); } /* }}} */ /* {{{ proto array px_get_schema(resource pxdoc) Returns meta data of a table */ PHP_FUNCTION(px_get_schema) { zval **arg1; pxdoc_t *pxdoc; pxfield_t *pxf, *pxf1; int i, fn; if (ZEND_NUM_ARGS() != 1 || zend_get_parameters_ex(1, &arg1) == FAILURE) { WRONG_PARAM_COUNT; } ZEND_FETCH_RESOURCE(pxdoc, pxdoc_t *, arg1, -1, "px object", le_pxdoc); pxf = pxf1 = PX_get_fields(pxdoc); fn = PX_get_num_fields(pxdoc); if((pxf1 == NULL) || (fn < 0)) { RETURN_FALSE; } array_init(return_value); for(i=0; i<fn; i++) { zval *fieldarr; MAKE_STD_ZVAL(fieldarr); array_init(fieldarr); add_assoc_long(fieldarr, "type", pxf->px_ftype); add_assoc_long(fieldarr, "size", pxf->px_flen); zend_hash_add(Z_ARRVAL_P(return_value), pxf->px_fname, strlen(pxf->px_fname)+1, &fieldarr, sizeof(zval *), NULL); pxf++; } } /* }}} */ /* {{{ proto void px_set_targetencoding(resource pxdoc, string encoding) Sets encoding of field data when it is retrieved */ PHP_FUNCTION(px_set_targetencoding) { zval **arg1, **arg2; pxdoc_t *pxdoc; pxfield_t *pxf; if (ZEND_NUM_ARGS() != 2 || zend_get_parameters_ex(2, &arg1, &arg2) == FAILURE) { WRONG_PARAM_COUNT; } ZEND_FETCH_RESOURCE(pxdoc, pxdoc_t *, arg1, -1, "px object", le_pxdoc); convert_to_string_ex(arg2); PX_set_targetencoding(pxdoc, Z_STRVAL_PP(arg2)); } /* }}} */ /* * 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 */ Index: pecl/paradox/php_paradox.h +++ pecl/paradox/php_paradox.h /* +----------------------------------------------------------------------+ | 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 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: | +----------------------------------------------------------------------+ */ /* $Id: php_paradox.h,v 1.1 2003/07/23 12:09:37 steinm Exp $ */ #ifndef PHP_PARADOX_H #define PHP_PARADOX_H #include <paradox.h> extern zend_module_entry paradox_module_entry; #define phpext_paradox_ptr ¶dox_module_entry #ifdef PHP_WIN32 #define PHP_PARADOX_API __declspec(dllexport) #else #define PHP_PARADOX_API #endif #ifdef ZTS #include "TSRM.h" #endif #define PX_KEYTOLOWER 1 #define PX_KEYTOUPPER 2 PHP_MINIT_FUNCTION(paradox); PHP_MSHUTDOWN_FUNCTION(paradox); PHP_RINIT_FUNCTION(paradox); PHP_RSHUTDOWN_FUNCTION(paradox); PHP_MINFO_FUNCTION(paradox); PHP_FUNCTION(px_new); PHP_FUNCTION(px_open_fp); PHP_FUNCTION(px_close); PHP_FUNCTION(px_delete); PHP_FUNCTION(px_get_record); PHP_FUNCTION(px_numrecords); PHP_FUNCTION(px_numfields); PHP_FUNCTION(px_get_field); PHP_FUNCTION(px_get_schema); PHP_FUNCTION(px_set_targetencoding); /* Declare any global variables you may need between the BEGIN and END macros here: ZEND_BEGIN_MODULE_GLOBALS(paradox) long global_value; char *global_string; ZEND_END_MODULE_GLOBALS(paradox) */ /* In every utility function you add that needs to use variables in php_paradox_globals, call TSRM_FETCH(); after declaring other variables used by that function, or better yet, pass in TSRMLS_CC after the last function argument and declare your utility function with TSRMLS_DC after the last declared argument. Always refer to the globals in your function as PARADOX_G(variable). You are encouraged to rename these macros something shorter, see examples in any other php module directory. */ #ifdef ZTS #define PARADOX_G(v) TSRMG(paradox_globals_id, zend_paradox_globals *, v) #else #define PARADOX_G(v) (paradox_globals.v) #endif #endif /* PHP_PARADOX_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 */