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;
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;
}
}
#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)
if (info->path) {
pefree(info->path, info->flags&DBA_PERSISTENT);
}
- if (info->fp && info->fp!=info->lock.fp) {
+ if (info->fp && info->fp != info->lock.fp) {
if(info->flags&DBA_PERSISTENT) {
php_stream_pclose(info->fp);
} else {
}
}
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);
/* {{{ 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;
- dba_close(info TSRMLS_CC);
+ if (info) {
+ dba_close(info TSRMLS_CC);
+ }
}
/* }}} */
/* {{{ 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;
}
/* }}} */
/* {{{ 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);
}
/* }}} */
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");
RETURN_FALSE;
}
- DBA_FETCH_RESOURCE(info, &id);
+ DBA_FETCH_RESOURCE(info, id);
DBA_WRITE_CHECK_WITH_ID;
}
/* }}} */
-#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);
*/
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;
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);
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;
}
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;
}
*
* 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]) {
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;
}
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;
}
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;
}
}
}
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;
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")) {
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;
}
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;
}
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));
}
/* }}} */
}
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;
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);
}
}
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;
}
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;
}
return;
}
- DBA_FETCH_RESOURCE(info, &id);
+ DBA_FETCH_RESOURCE(info, id);
DBA_WRITE_CHECK;
return;
}
- DBA_FETCH_RESOURCE(info, &id);
+ DBA_FETCH_RESOURCE(info, id);
if (info->hnd->sync(info TSRMLS_CC) == SUCCESS) {
RETURN_TRUE;
PHP_FUNCTION(dba_list)
{
ulong numitems, i;
- zend_rsrc_list_entry *le;
+ zend_resource *le;
dba_info *info;
if (zend_parse_parameters_none() == FAILURE) {
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);
}