helly Sun Dec 29 10:31:00 2002 EDT Modified files: /php4/ext/dba dba.c Log: Add a default handler that makes handler parameter to open functions optional. @Improved dba extension (Marcus) @-Made handler parameter of dba_(p)open() optional. @-Added php.ini option 'dba.default_handler' to specify a default handler. Index: php4/ext/dba/dba.c diff -u php4/ext/dba/dba.c:1.74 php4/ext/dba/dba.c:1.75 --- php4/ext/dba/dba.c:1.74 Fri Dec 20 20:09:27 2002 +++ php4/ext/dba/dba.c Sun Dec 29 10:31:00 2002 @@ -17,7 +17,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: dba.c,v 1.74 2002/12/21 01:09:27 andrei Exp $ */ +/* $Id: dba.c,v 1.75 2002/12/29 15:31:00 helly Exp $ */ #ifdef HAVE_CONFIG_H #include "config.h" @@ -27,6 +27,7 @@ #if HAVE_DBA +#include "php_ini.h" #include "ext/standard/flock_compat.h" #include <stdio.h> #include <fcntl.h> @@ -71,6 +72,7 @@ /* }}} */ PHP_MINIT_FUNCTION(dba); +PHP_MSHUTDOWN_FUNCTION(dba); PHP_MINFO_FUNCTION(dba); zend_module_entry dba_module_entry = { @@ -78,7 +80,7 @@ "dba", dba_functions, PHP_MINIT(dba), - NULL, + PHP_MSHUTDOWN(dba), NULL, NULL, PHP_MINFO(dba), @@ -208,6 +210,37 @@ { NULL, 0, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL } }; +#if DBA_FLATFILE +#define DBA_DEFAULT "flatfile" +#elif DBA_DB4 +#define DBA_DEFAULT "db4" +#elif DBA_DB3 +#define DBA_DEFAULT "db3" +#elif DBA_DB2 +#define DBA_DEFAULT "db2" +#elif DBA_GDBM +#define DBA_DEFAULT "gdbm" +#elif DBA_NBBM +#define DBA_DEFAULT "ndbm" +#elif DBA_DBM +#define DBA_DEFAULT "dbm" +#else +#define DBA_DEFAULT "" +#endif + +ZEND_BEGIN_MODULE_GLOBALS(dba) + char *default_handler; + dba_handler *default_hptr; +ZEND_END_MODULE_GLOBALS(dba) + +ZEND_DECLARE_MODULE_GLOBALS(dba) + +#ifdef ZTS +#define DBA_G(v) TSRMG(dba_globals_id, zend_dba_globals *, v) +#else +#define DBA_G(v) (dba_globals.v) +#endif + static int le_db; static int le_pdb; /* }}} */ @@ -240,10 +273,47 @@ } /* }}} */ +/* {{{ PHP_INI + */ +ZEND_API ZEND_INI_MH(OnUpdateDefaultHandler) +{ + dba_handler *hptr; + + if (!strlen(new_value)) { + DBA_G(default_hptr) = NULL; + return OnUpdateString(entry, new_value, new_value_length, mh_arg1, +mh_arg2, mh_arg3, stage TSRMLS_CC); + } + + for (hptr = handler; hptr->name && strcasecmp(hptr->name, new_value); hptr++); + + if (!hptr->name) { + php_error_docref(NULL TSRMLS_CC, E_WARNING, "No such handler: %s", +new_value); + return FAILURE; + } + DBA_G(default_hptr) = hptr; + return OnUpdateString(entry, new_value, new_value_length, mh_arg1, mh_arg2, +mh_arg3, stage TSRMLS_CC); +} + +PHP_INI_BEGIN() + STD_PHP_INI_ENTRY("dba.default_handler", DBA_DEFAULT, PHP_INI_ALL, +OnUpdateDefaultHandler, default_handler, zend_dba_globals, dba_globals) +PHP_INI_END() +/* }}} */ + +/* {{{ php_dba_init_globals + */ +static void php_dba_init_globals(zend_dba_globals *dba_globals) +{ + dba_globals->default_handler = ""; + dba_globals->default_hptr = NULL; +} +/* }}} */ + /* {{{ PHP_MINIT_FUNCTION */ PHP_MINIT_FUNCTION(dba) { + ZEND_INIT_MODULE_GLOBALS(dba, php_dba_init_globals, NULL); + REGISTER_INI_ENTRIES(); le_db = zend_register_list_destructors_ex(dba_close_rsrc, NULL, "dba", module_number); le_pdb = zend_register_list_destructors_ex(NULL, dba_close_rsrc, "dba persistent", module_number); return SUCCESS; @@ -254,6 +324,7 @@ */ PHP_MSHUTDOWN_FUNCTION(dba) { + UNREGISTER_INI_ENTRIES(); return SUCCESS; } /* }}} */ @@ -361,9 +432,9 @@ int i; int lock_mode, lock_flag, lock_dbf = 0; char *file_mode; - char mode[4], *pmode, *lock_file_mode; + char mode[4], *pmode, *lock_file_mode = NULL; - if(ac < 3) { + if(ac < 2) { WRONG_PARAM_COUNT; } @@ -407,7 +478,16 @@ } } - for (hptr = handler; hptr->name && strcasecmp(hptr->name, Z_STRVAL_PP(args[2])); hptr++); + if (ac==2) { + hptr = DBA_G(default_hptr); + if (!hptr) { + php_error_docref2(NULL TSRMLS_CC, Z_STRVAL_PP(args[0]), +Z_STRVAL_PP(args[1]), E_WARNING, "No default handler selected"); + FREENOW; + RETURN_FALSE; + } + } else { + for (hptr = handler; hptr->name && strcasecmp(hptr->name, +Z_STRVAL_PP(args[2])); hptr++); + } if (!hptr->name) { php_error_docref2(NULL TSRMLS_CC, Z_STRVAL_PP(args[0]), Z_STRVAL_PP(args[1]), E_WARNING, "No such handler: %s", Z_STRVAL_PP(args[2])); @@ -587,7 +667,7 @@ if (error || hptr->open(info, &error TSRMLS_CC) != SUCCESS) { dba_close(info TSRMLS_CC); - php_error_docref2(NULL TSRMLS_CC, Z_STRVAL_PP(args[0]), Z_STRVAL_PP(args[1]), E_WARNING, "Driver initialization failed for handler: %s%s%s", Z_STRVAL_PP(args[2]), error?": ":"", error?error:""); + php_error_docref2(NULL TSRMLS_CC, Z_STRVAL_PP(args[0]), +Z_STRVAL_PP(args[1]), E_WARNING, "Driver initialization failed for handler: %s%s%s", +hptr->name, error?": ":"", error?error:""); FREENOW; RETURN_FALSE; } @@ -613,7 +693,7 @@ /* }}} */ #undef FREENOW -/* {{{ proto int dba_popen(string path, string mode, string handlername [, string ...]) +/* {{{ proto int dba_popen(string path [, string mode, string handlername, string +...]) Opens path using the specified handler in mode persistently */ PHP_FUNCTION(dba_popen) { @@ -621,7 +701,7 @@ } /* }}} */ -/* {{{ proto int dba_open(string path, string mode, string handlername [, string ...]) +/* {{{ proto int dba_open(string path, string mode [, string handlername, string ...]) Opens path using the specified handler in mode*/ PHP_FUNCTION(dba_open) { @@ -811,7 +891,7 @@ } /* }}} */ -#endif +#endif /* HAVE_DBA */ /* * Local variables:
-- PHP CVS Mailing List (http://www.php.net/) To unsubscribe, visit: http://www.php.net/unsub.php