array support for dbmfetch
| From: | Gustaf Björklund | Date: | Thu, 10 May 2001 16:38:58 +0000 |
| Subject: | array support for dbmfetch | ||
| References: | 1 2 3 4 5 6 7 8 | Groups: | php.dev |
| Request: | Send a blank email to php-dev+get-54759@lists.php.net to get a copy of this message | ||
I'd like to propose a slight change of dbmfetch
adding support for arrays.
The best solution to this that I found was taking
the values of the array sent in as keys and returning
a associative array with the keys as keys and the
values from the dbm file as values.
Below is my little hack for this.
What do you think?
- Gustaf
=========================
PHP_FUNCTION(dbmfetch)
{
pval *id, *key;
pval **current_key, *current_data;
dbm_info *info;
char *ret, *result;
if (ZEND_NUM_ARGS()!=2||zend_get_parameters(ht,2,&id,&key)==FAILURE) {
WRONG_PARAM_COUNT;} info = php_find_dbm(id); if (!info) {
php_error(E_WARNING, "not a valid database identifier %d", Z_LVAL_P(id));
RETURN_FALSE;
}
/* Check that key isn't an array */
if (Z_TYPE_P(key) != IS_ARRAY) {
convert_to_string(key);
ret = php_dbm_fetch(info, Z_STRVAL_P(key));
if (ret) {
RETVAL_STRING(ret, 0);
} else {
RETURN_FALSE;
}
}
/* Key was an array, loop and fetch */
else {
if(array_init(return_value) != SUCCESS) {
zend_error(E_ERROR, "unable to create array");
RETURN_FALSE;
}
zend_hash_internal_pointer_reset(Z_ARRVAL_P(key));
/* Get value for each entry and try to find that "key"
* in the dbm file, add to return_value with "key" as
* key and dbm_value as value.
*
* It may seem backwards, but once you think about it
* it's logical since it's just about the only way to
* store the connection between the earlier value and
* the fetched value. */
while(zend_hash_get_current_data(Z_ARRVAL_P(key), (void **)¤t_key) == SUCCESS) {
/* Key is always considered a string for the dbm */
convert_to_string_ex(current_key);
ret = php_dbm_fetch(info, Z_STRVAL_PP(current_key));
/* Create new current_data ZVAL for this key.*/
MAKE_STD_ZVAL(current_data);
if(ret) {
ZVAL_STRING(current_data, ret, 1);
zend_printf("ret valid: %s<br>\n", Z_STRVAL_P(current_data));
add_assoc_zval_ex(return_value,
Z_STRVAL_PP(current_key),
Z_STRLEN_PP(current_key),
current_data);
} else {
ZVAL_STRING(current_data, empty_string, 1);
add_assoc_zval_ex(return_value,
Z_STRVAL_PP(current_key),
Z_STRLEN_PP(current_key),
current_data);
}
zend_hash_move_forward(Z_ARRVAL_P(key));
/* Shouldn't we free current_key's string pointer here? */
}
}
}