summaryrefslogtreecommitdiff
path: root/ext/dba/dba.c
diff options
context:
space:
mode:
Diffstat (limited to 'ext/dba/dba.c')
-rw-r--r--ext/dba/dba.c211
1 files changed, 115 insertions, 96 deletions
diff --git a/ext/dba/dba.c b/ext/dba/dba.c
index 50a94dd2ad..de4ea4c464 100644
--- a/ext/dba/dba.c
+++ b/ext/dba/dba.c
@@ -1,8 +1,8 @@
/*
+----------------------------------------------------------------------+
- | PHP Version 5 |
+ | PHP Version 7 |
+----------------------------------------------------------------------+
- | Copyright (c) 1997-2013 The PHP Group |
+ | Copyright (c) 1997-2014 The PHP Group |
+----------------------------------------------------------------------+
| This source file is subject to version 3.01 of the PHP license, |
| that is bundled with this package in the file LICENSE, and is |
@@ -57,14 +57,14 @@ ZEND_BEGIN_ARG_INFO_EX(arginfo_dba_popen, 0, 0, 2)
ZEND_ARG_INFO(0, path)
ZEND_ARG_INFO(0, mode)
ZEND_ARG_INFO(0, handlername)
- ZEND_ARG_INFO(0, ...)
+ ZEND_ARG_VARIADIC_INFO(0, handler_parameters)
ZEND_END_ARG_INFO()
ZEND_BEGIN_ARG_INFO_EX(arginfo_dba_open, 0, 0, 2)
ZEND_ARG_INFO(0, path)
ZEND_ARG_INFO(0, mode)
ZEND_ARG_INFO(0, handlername)
- ZEND_ARG_INFO(0, ...)
+ ZEND_ARG_VARIADIC_INFO(0, handler_parameters)
ZEND_END_ARG_INFO()
ZEND_BEGIN_ARG_INFO(arginfo_dba_close, 0)
@@ -203,7 +203,7 @@ ZEND_GET_MODULE(dba)
static size_t php_dba_make_key(zval *key, char **key_str, char **key_free TSRMLS_DC)
{
if (Z_TYPE_P(key) == IS_ARRAY) {
- zval **group, **name;
+ zval *group, *name;
HashPosition pos;
size_t len;
@@ -212,30 +212,30 @@ static size_t php_dba_make_key(zval *key, char **key_str, char **key_free TSRMLS
return -1;
}
zend_hash_internal_pointer_reset_ex(Z_ARRVAL_P(key), &pos);
- zend_hash_get_current_data_ex(Z_ARRVAL_P(key), (void **) &group, &pos);
+ group = zend_hash_get_current_data_ex(Z_ARRVAL_P(key), &pos);
zend_hash_move_forward_ex(Z_ARRVAL_P(key), &pos);
- zend_hash_get_current_data_ex(Z_ARRVAL_P(key), (void **) &name, &pos);
+ name = zend_hash_get_current_data_ex(Z_ARRVAL_P(key), &pos);
convert_to_string_ex(group);
convert_to_string_ex(name);
- if (Z_STRLEN_PP(group) == 0) {
- *key_str = Z_STRVAL_PP(name);
+ if (Z_STRLEN_P(group) == 0) {
+ *key_str = Z_STRVAL_P(name);
*key_free = NULL;
- return Z_STRLEN_PP(name);
+ return Z_STRLEN_P(name);
}
- len = spprintf(key_str, 0, "[%s]%s", Z_STRVAL_PP(group), Z_STRVAL_PP(name));
+ len = spprintf(key_str, 0, "[%s]%s", Z_STRVAL_P(group), Z_STRVAL_P(name));
*key_free = *key_str;
return len;
} else {
- zval tmp = *key;
+ zval tmp;
int len;
- zval_copy_ctor(&tmp);
+ ZVAL_COPY(&tmp, key);
convert_to_string(&tmp);
*key_free = *key_str = estrndup(Z_STRVAL(tmp), Z_STRLEN(tmp));
len = Z_STRLEN(tmp);
- zval_dtor(&tmp);
+ zval_ptr_dtor(&tmp);
return len;
}
}
@@ -256,7 +256,7 @@ static size_t php_dba_make_key(zval *key, char **key_str, char **key_free TSRMLS
zval *key; \
char *key_str, *key_free; \
size_t key_len; \
- long skip = 0; \
+ zend_long skip = 0; \
switch(ac) { \
case 2: \
if (zend_parse_parameters(ac TSRMLS_CC, "zr", &key, &id) == FAILURE) { \
@@ -279,8 +279,8 @@ static size_t php_dba_make_key(zval *key, char **key_str, char **key_free TSRMLS
#define DBA_FETCH_RESOURCE(info, id) \
ZEND_FETCH_RESOURCE2(info, dba_info *, id, -1, "DBA identifier", le_db, le_pdb);
-#define DBA_ID_GET2 DBA_ID_PARS; DBA_GET2; DBA_FETCH_RESOURCE(info, &id)
-#define DBA_ID_GET2_3 DBA_ID_PARS; DBA_GET2_3; DBA_FETCH_RESOURCE(info, &id)
+#define DBA_ID_GET2 DBA_ID_PARS; DBA_GET2; DBA_FETCH_RESOURCE(info, id)
+#define DBA_ID_GET2_3 DBA_ID_PARS; DBA_GET2_3; DBA_FETCH_RESOURCE(info, id)
#define DBA_ID_DONE \
if (key_free) efree(key_free)
@@ -416,15 +416,15 @@ static void dba_close(dba_info *info TSRMLS_DC)
if (info->path) {
pefree(info->path, info->flags&DBA_PERSISTENT);
}
- if (info->fp && info->fp!=info->lock.fp) {
- if(info->flags&DBA_PERSISTENT) {
+ if (info->fp && info->fp != info->lock.fp) {
+ if (info->flags & DBA_PERSISTENT) {
php_stream_pclose(info->fp);
} else {
php_stream_close(info->fp);
}
}
if (info->lock.fp) {
- if(info->flags&DBA_PERSISTENT) {
+ if (info->flags & DBA_PERSISTENT) {
php_stream_pclose(info->lock.fp);
} else {
php_stream_close(info->lock.fp);
@@ -439,7 +439,7 @@ static void dba_close(dba_info *info TSRMLS_DC)
/* {{{ dba_close_rsrc
*/
-static void dba_close_rsrc(zend_rsrc_list_entry *rsrc TSRMLS_DC)
+static void dba_close_rsrc(zend_resource *rsrc TSRMLS_DC)
{
dba_info *info = (dba_info *)rsrc->ptr;
@@ -448,19 +448,19 @@ static void dba_close_rsrc(zend_rsrc_list_entry *rsrc TSRMLS_DC)
/* }}} */
/* {{{ dba_close_pe_rsrc_deleter */
-int dba_close_pe_rsrc_deleter(zend_rsrc_list_entry *le, void *pDba TSRMLS_DC)
+int dba_close_pe_rsrc_deleter(zval *el, void *pDba TSRMLS_DC)
{
- return le->ptr == pDba;
+ return ((zend_resource *)Z_PTR_P(el))->ptr == pDba ? ZEND_HASH_APPLY_REMOVE: ZEND_HASH_APPLY_KEEP;
}
/* }}} */
/* {{{ dba_close_pe_rsrc */
-static void dba_close_pe_rsrc(zend_rsrc_list_entry *rsrc TSRMLS_DC)
+static void dba_close_pe_rsrc(zend_resource *rsrc TSRMLS_DC)
{
dba_info *info = (dba_info *)rsrc->ptr;
/* closes the resource by calling dba_close_rsrc() */
- zend_hash_apply_with_argument(&EG(persistent_list), (apply_func_arg_t) dba_close_pe_rsrc_deleter, info TSRMLS_CC);
+ zend_hash_apply_with_argument(&EG(persistent_list), dba_close_pe_rsrc_deleter, info TSRMLS_CC);
}
/* }}} */
@@ -470,19 +470,19 @@ ZEND_INI_MH(OnUpdateDefaultHandler)
{
dba_handler *hptr;
- if (!strlen(new_value)) {
+ if (!new_value->len) {
DBA_G(default_hptr) = NULL;
- return OnUpdateString(entry, new_value, new_value_length, mh_arg1, mh_arg2, mh_arg3, stage TSRMLS_CC);
+ return OnUpdateString(entry, new_value, mh_arg1, mh_arg2, mh_arg3, stage TSRMLS_CC);
}
- for (hptr = handler; hptr->name && strcasecmp(hptr->name, new_value); hptr++);
+ for (hptr = handler; hptr->name && strcasecmp(hptr->name, new_value->val); hptr++);
if (!hptr->name) {
- php_error_docref(NULL TSRMLS_CC, E_WARNING, "No such handler: %s", new_value);
+ php_error_docref(NULL TSRMLS_CC, E_WARNING, "No such handler: %s", new_value->val);
return FAILURE;
}
DBA_G(default_hptr) = hptr;
- return OnUpdateString(entry, new_value, new_value_length, mh_arg1, mh_arg2, mh_arg3, stage TSRMLS_CC);
+ return OnUpdateString(entry, new_value, mh_arg1, mh_arg2, mh_arg3, stage TSRMLS_CC);
}
PHP_INI_BEGIN()
@@ -519,7 +519,7 @@ PHP_MSHUTDOWN_FUNCTION(dba)
}
/* }}} */
-#include "ext/standard/php_smart_str.h"
+#include "zend_smart_str.h"
/* {{{ PHP_MINFO_FUNCTION
*/
@@ -535,9 +535,9 @@ PHP_MINFO_FUNCTION(dba)
php_info_print_table_start();
php_info_print_table_row(2, "DBA support", "enabled");
- if (handlers.c) {
+ if (handlers.s) {
smart_str_0(&handlers);
- php_info_print_table_row(2, "Supported handlers", handlers.c);
+ php_info_print_table_row(2, "Supported handlers", handlers.s->val);
smart_str_free(&handlers);
} else {
php_info_print_table_row(2, "Supported handlers", "none");
@@ -551,7 +551,7 @@ PHP_MINFO_FUNCTION(dba)
*/
static void php_dba_update(INTERNAL_FUNCTION_PARAMETERS, int mode)
{
- int val_len;
+ size_t val_len;
zval *id;
dba_info *info = NULL;
int ac = ZEND_NUM_ARGS();
@@ -568,7 +568,7 @@ static void php_dba_update(INTERNAL_FUNCTION_PARAMETERS, int mode)
RETURN_FALSE;
}
- DBA_FETCH_RESOURCE(info, &id);
+ DBA_FETCH_RESOURCE(info, id);
DBA_WRITE_CHECK_WITH_ID;
@@ -582,22 +582,22 @@ static void php_dba_update(INTERNAL_FUNCTION_PARAMETERS, int mode)
}
/* }}} */
-#define FREENOW if(args) efree(args); if(key) efree(key)
+#define FREENOW if(args) {int i; for (i=0; i<ac; i++) { zval_ptr_dtor(&args[i]); } efree(args);} if(key) efree(key)
/* {{{ php_find_dbm
*/
dba_info *php_dba_find(const char* path TSRMLS_DC)
{
- zend_rsrc_list_entry *le;
+ zend_resource *le;
dba_info *info;
int numitems, i;
numitems = zend_hash_next_free_element(&EG(regular_list));
for (i=1; i<numitems; i++) {
- if (zend_hash_index_find(&EG(regular_list), i, (void **) &le)==FAILURE) {
+ if ((le = zend_hash_index_find_ptr(&EG(regular_list), i)) == NULL) {
continue;
}
- if (Z_TYPE_P(le) == le_db || Z_TYPE_P(le) == le_pdb) {
+ if (le->type == le_db || le->type == le_pdb) {
info = (dba_info *)(le->ptr);
if (!strcmp(info->path, path)) {
return (dba_info *)(le->ptr);
@@ -613,7 +613,7 @@ dba_info *php_dba_find(const char* path TSRMLS_DC)
*/
static void php_dba_open(INTERNAL_FUNCTION_PARAMETERS, int persistent)
{
- zval ***args = (zval ***) NULL;
+ zval *args = NULL;
int ac = ZEND_NUM_ARGS();
dba_mode_t modenr;
dba_info *info, *other;
@@ -625,27 +625,32 @@ static void php_dba_open(INTERNAL_FUNCTION_PARAMETERS, int persistent)
char *file_mode;
char mode[4], *pmode, *lock_file_mode = NULL;
int persistent_flag = persistent ? STREAM_OPEN_PERSISTENT : 0;
- char *opened_path, *lock_name;
+ char *opened_path = NULL;
+ char *lock_name;
- if(ac < 2) {
+ if (ac < 2) {
WRONG_PARAM_COUNT;
}
/* we pass additional args to the respective handler */
- args = safe_emalloc(ac, sizeof(zval *), 0);
+ args = safe_emalloc(ac, sizeof(zval), 0);
if (zend_get_parameters_array_ex(ac, args) != SUCCESS) {
- FREENOW;
+ efree(args);
WRONG_PARAM_COUNT;
}
/* we only take string arguments */
for (i = 0; i < ac; i++) {
- convert_to_string_ex(args[i]);
- keylen += Z_STRLEN_PP(args[i]);
+ if (Z_TYPE(args[i]) != IS_STRING) {
+ convert_to_string_ex(&args[i]);
+ } else if (Z_REFCOUNTED(args[i])) {
+ Z_ADDREF(args[i]);
+ }
+ keylen += Z_STRLEN(args[i]);
}
if (persistent) {
- zend_rsrc_list_entry *le;
+ zend_resource *le;
/* calculate hash */
key = safe_emalloc(keylen, 1, 1);
@@ -653,21 +658,22 @@ static void php_dba_open(INTERNAL_FUNCTION_PARAMETERS, int persistent)
keylen = 0;
for(i = 0; i < ac; i++) {
- memcpy(key+keylen, Z_STRVAL_PP(args[i]), Z_STRLEN_PP(args[i]));
- keylen += Z_STRLEN_PP(args[i]);
+ memcpy(key+keylen, Z_STRVAL(args[i]), Z_STRLEN(args[i]));
+ keylen += Z_STRLEN(args[i]);
}
/* try to find if we already have this link in our persistent list */
- if (zend_hash_find(&EG(persistent_list), key, keylen+1, (void **) &le) == SUCCESS) {
+ if ((le = zend_hash_str_find_ptr(&EG(persistent_list), key, keylen)) != NULL) {
FREENOW;
- if (Z_TYPE_P(le) != le_pdb) {
+ if (le->type != le_pdb) {
RETURN_FALSE;
}
info = (dba_info *)le->ptr;
- ZEND_REGISTER_RESOURCE(return_value, info, le_pdb);
+ GC_REFCOUNT(le)++;
+ RETURN_RES(le);
return;
}
}
@@ -675,16 +681,16 @@ static void php_dba_open(INTERNAL_FUNCTION_PARAMETERS, int persistent)
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");
+ php_error_docref2(NULL TSRMLS_CC, Z_STRVAL(args[0]), Z_STRVAL(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++);
+ for (hptr = handler; hptr->name && strcasecmp(hptr->name, Z_STRVAL(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]));
+ php_error_docref2(NULL TSRMLS_CC, Z_STRVAL(args[0]), Z_STRVAL(args[1]), E_WARNING, "No such handler: %s", Z_STRVAL(args[2]));
FREENOW;
RETURN_FALSE;
}
@@ -701,7 +707,7 @@ static void php_dba_open(INTERNAL_FUNCTION_PARAMETERS, int persistent)
*
* t: test open database, warning if locked
*/
- strlcpy(mode, Z_STRVAL_PP(args[1]), sizeof(mode));
+ strlcpy(mode, Z_STRVAL(args[1]), sizeof(mode));
pmode = &mode[0];
if (pmode[0] && (pmode[1]=='d' || pmode[1]=='l' || pmode[1]=='-')) { /* force lock on db file or lck file or disable locking */
switch (pmode[1]) {
@@ -715,13 +721,13 @@ static void php_dba_open(INTERNAL_FUNCTION_PARAMETERS, int persistent)
case 'l':
lock_flag = DBA_LOCK_ALL;
if ((hptr->flags & DBA_LOCK_ALL) == 0) {
- php_error_docref2(NULL TSRMLS_CC, Z_STRVAL_PP(args[0]), Z_STRVAL_PP(args[1]), E_NOTICE, "Handler %s does locking internally", hptr->name);
+ php_error_docref2(NULL TSRMLS_CC, Z_STRVAL(args[0]), Z_STRVAL(args[1]), E_NOTICE, "Handler %s does locking internally", hptr->name);
}
break;
default:
case '-':
if ((hptr->flags & DBA_LOCK_ALL) == 0) {
- php_error_docref2(NULL TSRMLS_CC, Z_STRVAL_PP(args[0]), Z_STRVAL_PP(args[1]), E_WARNING, "Locking cannot be disabled for handler %s", hptr->name);
+ php_error_docref2(NULL TSRMLS_CC, Z_STRVAL(args[0]), Z_STRVAL(args[1]), E_WARNING, "Locking cannot be disabled for handler %s", hptr->name);
FREENOW;
RETURN_FALSE;
}
@@ -770,7 +776,7 @@ static void php_dba_open(INTERNAL_FUNCTION_PARAMETERS, int persistent)
file_mode = "w+b";
break;
default:
- php_error_docref2(NULL TSRMLS_CC, Z_STRVAL_PP(args[0]), Z_STRVAL_PP(args[1]), E_WARNING, "Illegal DBA mode");
+ php_error_docref2(NULL TSRMLS_CC, Z_STRVAL(args[0]), Z_STRVAL(args[1]), E_WARNING, "Illegal DBA mode");
FREENOW;
RETURN_FALSE;
}
@@ -783,17 +789,17 @@ static void php_dba_open(INTERNAL_FUNCTION_PARAMETERS, int persistent)
if (*pmode=='t') {
pmode++;
if (!lock_flag) {
- php_error_docref2(NULL TSRMLS_CC, Z_STRVAL_PP(args[0]), Z_STRVAL_PP(args[1]), E_WARNING, "You cannot combine modifiers - (no lock) and t (test lock)");
+ php_error_docref2(NULL TSRMLS_CC, Z_STRVAL(args[0]), Z_STRVAL(args[1]), E_WARNING, "You cannot combine modifiers - (no lock) and t (test lock)");
FREENOW;
RETURN_FALSE;
}
if (!lock_mode) {
if ((hptr->flags & DBA_LOCK_ALL) == 0) {
- php_error_docref2(NULL TSRMLS_CC, Z_STRVAL_PP(args[0]), Z_STRVAL_PP(args[1]), E_WARNING, "Handler %s uses its own locking which doesn't support mode modifier t (test lock)", hptr->name);
+ php_error_docref2(NULL TSRMLS_CC, Z_STRVAL(args[0]), Z_STRVAL(args[1]), E_WARNING, "Handler %s uses its own locking which doesn't support mode modifier t (test lock)", hptr->name);
FREENOW;
RETURN_FALSE;
} else {
- php_error_docref2(NULL TSRMLS_CC, Z_STRVAL_PP(args[0]), Z_STRVAL_PP(args[1]), E_WARNING, "Handler %s doesn't uses locking for this mode which makes modifier t (test lock) obsolete", hptr->name);
+ php_error_docref2(NULL TSRMLS_CC, Z_STRVAL(args[0]), Z_STRVAL(args[1]), E_WARNING, "Handler %s doesn't uses locking for this mode which makes modifier t (test lock) obsolete", hptr->name);
FREENOW;
RETURN_FALSE;
}
@@ -802,14 +808,14 @@ static void php_dba_open(INTERNAL_FUNCTION_PARAMETERS, int persistent)
}
}
if (*pmode) {
- php_error_docref2(NULL TSRMLS_CC, Z_STRVAL_PP(args[0]), Z_STRVAL_PP(args[1]), E_WARNING, "Illegal DBA mode");
+ php_error_docref2(NULL TSRMLS_CC, Z_STRVAL(args[0]), Z_STRVAL(args[1]), E_WARNING, "Illegal DBA mode");
FREENOW;
RETURN_FALSE;
}
info = pemalloc(sizeof(dba_info), persistent);
memset(info, 0, sizeof(dba_info));
- info->path = pestrdup(Z_STRVAL_PP(args[0]), persistent);
+ info->path = pestrdup(Z_STRVAL(args[0]), persistent);
info->mode = modenr;
info->argc = ac - 3;
info->argv = args + 3;
@@ -832,7 +838,7 @@ static void php_dba_open(INTERNAL_FUNCTION_PARAMETERS, int persistent)
if (!error && lock_mode) {
if (lock_dbf) {
- lock_name = Z_STRVAL_PP(args[0]);
+ lock_name = Z_STRVAL(args[0]);
} else {
spprintf(&lock_name, 0, "%s.lck", info->path);
if (!strcmp(file_mode, "r")) {
@@ -848,8 +854,10 @@ static void php_dba_open(INTERNAL_FUNCTION_PARAMETERS, int persistent)
if (!persistent) {
info->lock.name = opened_path;
} else {
- info->lock.name = pestrdup(opened_path, persistent);
- efree(opened_path);
+ if (opened_path) {
+ info->lock.name = pestrdup(opened_path, persistent);
+ efree(opened_path);
+ }
}
}
}
@@ -921,7 +929,7 @@ static void php_dba_open(INTERNAL_FUNCTION_PARAMETERS, int persistent)
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", hptr->name, error?": ":"", error?error:"");
+ php_error_docref2(NULL TSRMLS_CC, Z_STRVAL(args[0]), Z_STRVAL(args[1]), E_WARNING, "Driver initialization failed for handler: %s%s%s", hptr->name, error?": ":"", error?error:"");
FREENOW;
RETURN_FALSE;
}
@@ -931,13 +939,13 @@ static void php_dba_open(INTERNAL_FUNCTION_PARAMETERS, int persistent)
info->argv = NULL;
if (persistent) {
- zend_rsrc_list_entry new_le;
+ zend_resource new_le;
- Z_TYPE(new_le) = le_pdb;
+ new_le.type = le_pdb;
new_le.ptr = info;
- if (zend_hash_update(&EG(persistent_list), key, keylen+1, &new_le, sizeof(zend_rsrc_list_entry), NULL) == FAILURE) {
+ if (zend_hash_str_update_mem(&EG(persistent_list), key, keylen, &new_le, sizeof(zend_resource)) == NULL) {
dba_close(info TSRMLS_CC);
- php_error_docref2(NULL TSRMLS_CC, Z_STRVAL_PP(args[0]), Z_STRVAL_PP(args[1]), E_WARNING, "Could not register persistent resource");
+ php_error_docref2(NULL TSRMLS_CC, Z_STRVAL(args[0]), Z_STRVAL(args[1]), E_WARNING, "Could not register persistent resource");
FREENOW;
RETURN_FALSE;
}
@@ -976,9 +984,9 @@ PHP_FUNCTION(dba_close)
return;
}
- DBA_FETCH_RESOURCE(info, &id);
+ DBA_FETCH_RESOURCE(info, id);
- zend_list_delete(Z_RESVAL_P(id));
+ zend_list_close(Z_RES_P(id));
}
/* }}} */
@@ -1031,7 +1039,9 @@ PHP_FUNCTION(dba_fetch)
}
if((val = info->hnd->fetch(info, key_str, key_len, skip, &len TSRMLS_CC)) != NULL) {
DBA_ID_DONE;
- RETURN_STRINGL(val, len, 0);
+ RETVAL_STRINGL(val, len);
+ efree(val);
+ return;
}
DBA_ID_DONE;
RETURN_FALSE;
@@ -1044,13 +1054,13 @@ PHP_FUNCTION(dba_key_split)
{
zval *zkey;
char *key, *name;
- int key_len;
+ size_t key_len;
if (ZEND_NUM_ARGS() != 1) {
WRONG_PARAM_COUNT;
}
if (zend_parse_parameters_ex(ZEND_PARSE_PARAMS_QUIET, ZEND_NUM_ARGS() TSRMLS_CC, "z", &zkey) == SUCCESS) {
- if (Z_TYPE_P(zkey) == IS_NULL || (Z_TYPE_P(zkey) == IS_BOOL && !Z_LVAL_P(zkey))) {
+ if (Z_TYPE_P(zkey) == IS_NULL || (Z_TYPE_P(zkey) == IS_FALSE)) {
RETURN_BOOL(0);
}
}
@@ -1059,11 +1069,11 @@ PHP_FUNCTION(dba_key_split)
}
array_init(return_value);
if (key[0] == '[' && (name = strchr(key, ']')) != NULL) {
- add_next_index_stringl(return_value, key+1, name - (key + 1), 1);
- add_next_index_stringl(return_value, name+1, key_len - (name - key + 1), 1);
+ add_next_index_stringl(return_value, key+1, name - (key + 1));
+ add_next_index_stringl(return_value, name+1, key_len - (name - key + 1));
} else {
- add_next_index_stringl(return_value, "", 0, 1);
- add_next_index_stringl(return_value, key, key_len, 1);
+ add_next_index_stringl(return_value, "", 0);
+ add_next_index_stringl(return_value, key, key_len);
}
}
/* }}} */
@@ -1081,12 +1091,15 @@ PHP_FUNCTION(dba_firstkey)
return;
}
- DBA_FETCH_RESOURCE(info, &id);
+ DBA_FETCH_RESOURCE(info, id);
fkey = info->hnd->firstkey(info, &len TSRMLS_CC);
- if (fkey)
- RETURN_STRINGL(fkey, len, 0);
+ if (fkey) {
+ RETVAL_STRINGL(fkey, len);
+ efree(fkey);
+ return;
+ }
RETURN_FALSE;
}
@@ -1105,12 +1118,15 @@ PHP_FUNCTION(dba_nextkey)
return;
}
- DBA_FETCH_RESOURCE(info, &id);
+ DBA_FETCH_RESOURCE(info, id);
nkey = info->hnd->nextkey(info, &len TSRMLS_CC);
- if (nkey)
- RETURN_STRINGL(nkey, len, 0);
+ if (nkey) {
+ RETVAL_STRINGL(nkey, len);
+ efree(nkey);
+ return;
+ }
RETURN_FALSE;
}
@@ -1164,7 +1180,7 @@ PHP_FUNCTION(dba_optimize)
return;
}
- DBA_FETCH_RESOURCE(info, &id);
+ DBA_FETCH_RESOURCE(info, id);
DBA_WRITE_CHECK;
@@ -1187,7 +1203,7 @@ PHP_FUNCTION(dba_sync)
return;
}
- DBA_FETCH_RESOURCE(info, &id);
+ DBA_FETCH_RESOURCE(info, id);
if (info->hnd->sync(info TSRMLS_CC) == SUCCESS) {
RETURN_TRUE;
@@ -1212,9 +1228,12 @@ PHP_FUNCTION(dba_handlers)
for(hptr = handler; hptr->name; hptr++) {
if (full_info) {
- add_assoc_string(return_value, hptr->name, hptr->info(hptr, NULL TSRMLS_CC), 0);
+ // TODO: avoid reallocation ???
+ char *str = hptr->info(hptr, NULL TSRMLS_CC);
+ add_assoc_string(return_value, hptr->name, str);
+ efree(str);
} else {
- add_next_index_string(return_value, hptr->name, 1);
+ add_next_index_string(return_value, hptr->name);
}
}
}
@@ -1224,8 +1243,8 @@ PHP_FUNCTION(dba_handlers)
List opened databases */
PHP_FUNCTION(dba_list)
{
- ulong numitems, i;
- zend_rsrc_list_entry *le;
+ zend_ulong numitems, i;
+ zend_resource *le;
dba_info *info;
if (zend_parse_parameters_none() == FAILURE) {
@@ -1236,12 +1255,12 @@ PHP_FUNCTION(dba_list)
numitems = zend_hash_next_free_element(&EG(regular_list));
for (i=1; i<numitems; i++) {
- if (zend_hash_index_find(&EG(regular_list), i, (void **) &le)==FAILURE) {
+ if ((le = zend_hash_index_find_ptr(&EG(regular_list), i)) == NULL) {
continue;
}
- if (Z_TYPE_P(le) == le_db || Z_TYPE_P(le) == le_pdb) {
+ if (le->type == le_db || le->type == le_pdb) {
info = (dba_info *)(le->ptr);
- add_index_string(return_value, i, info->path, 1);
+ add_index_string(return_value, i, info->path);
}
}
}