helly Wed Feb 26 17:07:50 2003 EDT
Modified files:
/php4/ext/dba dba.c
Log:
allow keys as array(group, name) for handler inifile
Index: php4/ext/dba/dba.c
diff -u php4/ext/dba/dba.c:1.83 php4/ext/dba/dba.c:1.84
--- php4/ext/dba/dba.c:1.83 Sat Feb 22 12:20:05 2003
+++ php4/ext/dba/dba.c Wed Feb 26 17:07:50 2003
@@ -17,7 +17,7 @@
+----------------------------------------------------------------------+
*/
-/* $Id: dba.c,v 1.83 2003/02/22 17:20:05 helly Exp $ */
+/* $Id: dba.c,v 1.84 2003/02/26 22:07:50 helly Exp $ */
#ifdef HAVE_CONFIG_H
#include "config.h"
@@ -103,19 +103,60 @@
/* these are used to get the standard arguments */
#define DBA_GET1
\
- if(ac != 1 || zend_get_parameters_ex(ac, &id) != SUCCESS) { \
+ if(ac != 1 || zend_get_parameters_ex(ac, &id) != SUCCESS) { \
WRONG_PARAM_COUNT;
\
}
+/* {{{ php_dba_myke_key */
+static size_t php_dba_make_key(zval **key, char **key_str, char **key_free TSRMLS_DC)
+{
+ if (Z_TYPE_PP(key) == IS_ARRAY) {
+ zval **group, **name;
+ HashPosition pos;
+ size_t len;
+
+ if (zend_hash_num_elements(Z_ARRVAL_PP(key)) != 2) {
+ php_error_docref(NULL TSRMLS_CC, E_ERROR, "Key does not have
exactly two elements: (key, name)");
+ return -1;
+ }
+ zend_hash_internal_pointer_reset_ex(Z_ARRVAL_PP(key), &pos);
+ zend_hash_get_current_data_ex(Z_ARRVAL_PP(key), (void **) &group,
&pos);
+ zend_hash_move_forward_ex(Z_ARRVAL_PP(key), &pos);
+ zend_hash_get_current_data_ex(Z_ARRVAL_PP(key), (void **) &name, &pos);
+ convert_to_string_ex(group);
+ convert_to_string_ex(name);
+ if (Z_STRLEN_PP(group) == 0) {
+ *key_str = Z_STRVAL_PP(name);
+ *key_free = NULL;
+ return Z_STRLEN_PP(name);
+ }
+ len = spprintf(key_str, 0, "[%s]%s", Z_STRVAL_PP(group),
Z_STRVAL_PP(name));
+ *key_free = *key_str;
+ return len;
+ } else {
+ convert_to_string_ex(key);
+ *key_str = Z_STRVAL_PP(key);
+ *key_free = NULL;
+ return Z_STRLEN_PP(key);
+ }
+}
+/* }}} */
+
#define DBA_GET2
\
zval **key;
\
+ char *key_str, *key_free;
\
+ size_t key_len;
\
if(ac != 2 || zend_get_parameters_ex(ac, &key, &id) != SUCCESS) { \
WRONG_PARAM_COUNT;
\
}
\
- convert_to_string_ex(key)
+ if ((key_len = php_dba_make_key(key, &key_str, &key_free TSRMLS_CC) < 0)) {\
+ RETURN_FALSE;
\
+ }
#define DBA_GET2_3
\
zval **key;
\
+ char *key_str, *key_free;
\
+ size_t key_len;
\
zval **tmp;
\
int skip = 0;
\
switch(ac) {
\
@@ -134,7 +175,21 @@
default:
\
WRONG_PARAM_COUNT;
\
}
\
- convert_to_string_ex(key)
+ if ((key_len = php_dba_make_key(key, &key_str, &key_free TSRMLS_CC) < 0)) {\
+ RETURN_FALSE;
\
+ }
+
+#define DBA_GET3
\
+ zval **key, **val;
\
+ char *key_str, *key_free;
\
+ size_t key_len;
\
+ if(ac != 3 || zend_get_parameters_ex(ac, &key, &val, &id) != SUCCESS) {
\
+ WRONG_PARAM_COUNT;
\
+ }
\
+ convert_to_string_ex(val);
\
+ if ((key_len = php_dba_make_key(key, &key_str, &key_free TSRMLS_CC) < 0)) {\
+ RETURN_FALSE;
\
+ }
#define DBA_ID_GET
\
ZEND_FETCH_RESOURCE2(info, dba_info *, id, -1, "DBA identifier", le_db,
le_pdb);
@@ -142,7 +197,10 @@
#define DBA_ID_GET1 DBA_ID_PARS; DBA_GET1; DBA_ID_GET
#define DBA_ID_GET2 DBA_ID_PARS; DBA_GET2; DBA_ID_GET
#define DBA_ID_GET2_3 DBA_ID_PARS; DBA_GET2_3; DBA_ID_GET
+#define DBA_ID_GET3 DBA_ID_PARS; DBA_GET3; DBA_ID_GET
+#define DBA_ID_DONE
\
+ if (key_free) efree(key_free)
/* a DBA handler must have specific routines */
#define DBA_NAMED_HND(alias, name, flags) \
@@ -233,6 +291,25 @@
static int le_db;
static int le_pdb;
+
+/* {{{ dba_fetch_resource
+PHPAPI void dba_fetch_resource(dba_info **pinfo, zval **id TSRMLS_DC)
+{
+ dba_info *info;
+ DBA_ID_FETCH
+ *pinfo = info;
+}
+*/
+/* }}} */
+
+/* {{{ dba_get_handler
+PHPAPI dba_handler *dba_get_handler(const char* handler_name)
+{
+ dba_handler *hptr;
+ for (hptr = handler; hptr->name && strcasecmp(hptr->name, handler_name);
hptr++);
+ return hptr;
+}
+*/
/* }}} */
/* {{{ dba_close
@@ -350,17 +427,9 @@
*/
static void php_dba_update(INTERNAL_FUNCTION_PARAMETERS, int mode)
{
- DBA_ID_PARS;
- zval **val, **key;
char *v;
int len;
-
- if(ac != 3 || zend_get_parameters_ex(ac, &key, &val, &id) != SUCCESS) {
- WRONG_PARAM_COUNT;
- }
- convert_to_string_ex(key);
- convert_to_string_ex(val);
- DBA_ID_GET;
+ DBA_ID_GET3;
DBA_WRITE_CHECK;
@@ -368,15 +437,20 @@
len = Z_STRLEN_PP(val);
v = estrndup(Z_STRVAL_PP(val), len);
php_stripslashes(v, &len TSRMLS_CC);
- if(info->hnd->update(info, VALLEN(key), v, len, mode TSRMLS_CC) ==
SUCCESS) {
+ if(info->hnd->update(info, key_str, key_len, v, len, mode TSRMLS_CC)
== SUCCESS) {
efree(v);
+ DBA_ID_DONE;
RETURN_TRUE;
}
efree(v);
} else {
- if(info->hnd->update(info, VALLEN(key), VALLEN(val), mode TSRMLS_CC)
== SUCCESS)
+ if(info->hnd->update(info, key_str, key_len, VALLEN(val), mode
TSRMLS_CC) == SUCCESS)
+ {
+ DBA_ID_DONE;
RETURN_TRUE;
+ }
}
+ DBA_ID_DONE;
RETURN_FALSE;
}
/* }}} */
@@ -719,9 +793,11 @@
{
DBA_ID_GET2;
- if(info->hnd->exists(info, VALLEN(key) TSRMLS_CC) == SUCCESS) {
+ if(info->hnd->exists(info, key_str, key_len TSRMLS_CC) == SUCCESS) {
+ DBA_ID_DONE;
RETURN_TRUE;
}
+ DBA_ID_DONE;
RETURN_FALSE;
}
/* }}} */
@@ -758,12 +834,14 @@
} else {
skip = 0;
}
- if((val = info->hnd->fetch(info, VALLEN(key), skip, &len TSRMLS_CC)) != NULL) {
+ if((val = info->hnd->fetch(info, key_str, key_len, skip, &len TSRMLS_CC)) !=
NULL) {
if (val && PG(magic_quotes_runtime)) {
val = php_addslashes(val, len, &len, 1 TSRMLS_CC);
}
+ DBA_ID_DONE;
RETURN_STRINGL(val, len, 0);
}
+ DBA_ID_DONE;
RETURN_FALSE;
}
/* }}} */
@@ -807,8 +885,12 @@
DBA_WRITE_CHECK;
- if(info->hnd->delete(info, VALLEN(key) TSRMLS_CC) == SUCCESS)
+ if(info->hnd->delete(info, key_str, key_len TSRMLS_CC) == SUCCESS)
+ {
+ DBA_ID_DONE;
RETURN_TRUE;
+ }
+ DBA_ID_DONE;
RETURN_FALSE;
}
/* }}} */
--
PHP CVS Mailing List (http://www.php.net/)
To unsubscribe, visit: http://www.php.net/unsub.php