Skip to content

Commit 889b2f2

Browse files
RedisArray fixes
I created this branch to go through issues raised by @seansawyer regarding RedisArray functionality. The first commit addresses issue phpredis#205 (KEYS) command. More investigation is required for the two other issues raised.
1 parent f1231c9 commit 889b2f2

File tree

2 files changed

+47
-0
lines changed

2 files changed

+47
-0
lines changed

redis_array.c

+46
Original file line numberDiff line numberDiff line change
@@ -58,6 +58,7 @@ zend_function_entry redis_array_functions[] = {
5858
PHP_ME(RedisArray, del, NULL, ZEND_ACC_PUBLIC)
5959
PHP_ME(RedisArray, getOption, NULL, ZEND_ACC_PUBLIC)
6060
PHP_ME(RedisArray, setOption, NULL, ZEND_ACC_PUBLIC)
61+
PHP_ME(RedisArray, keys, NULL, ZEND_ACC_PUBLIC)
6162

6263
/* Multi/Exec */
6364
PHP_ME(RedisArray, multi, NULL, ZEND_ACC_PUBLIC)
@@ -553,6 +554,51 @@ PHP_METHOD(RedisArray, ping)
553554
multihost_distribute(INTERNAL_FUNCTION_PARAM_PASSTHRU, "PING");
554555
}
555556

557+
PHP_METHOD(RedisArray, keys)
558+
{
559+
zval *object, *z_args[1], *z_tmp, z_fun;
560+
RedisArray *ra;
561+
char *pattern;
562+
int pattern_len, i;
563+
564+
// Make sure the prototype is correct
565+
if(zend_parse_method_parameters(ZEND_NUM_ARGS() TSRMLS_CC, getThis(), "Os",
566+
&object, redis_array_ce, &pattern, &pattern_len) == FAILURE)
567+
{
568+
RETURN_FALSE;
569+
}
570+
571+
// Make sure we can grab our RedisArray object
572+
if(redis_array_get(object, &ra TSRMLS_CC) < 0) {
573+
RETURN_FALSE;
574+
}
575+
576+
// Set up our function call (KEYS)
577+
ZVAL_STRING(&z_fun, "KEYS", 0);
578+
579+
// We will be passing with one string argument (the pattern)
580+
MAKE_STD_ZVAL(z_args[0]);
581+
ZVAL_STRINGL(z_args[0], pattern, pattern_len, 0);
582+
583+
// Init our array return
584+
array_init(return_value);
585+
586+
// Iterate our RedisArray nodes
587+
for(i=0; i<ra->count; ++i) {
588+
// Return for this node
589+
MAKE_STD_ZVAL(z_tmp);
590+
591+
// Call KEYS on each node
592+
call_user_function(&redis_ce->function_table, &ra->redis[i], &z_fun, z_tmp, 1, z_args TSRMLS_CC);
593+
594+
// Add the result for this host
595+
add_assoc_zval(return_value, ra->hosts[i], z_tmp);
596+
}
597+
598+
// Free arg array
599+
efree(z_args[0]);
600+
}
601+
556602
PHP_METHOD(RedisArray, getOption)
557603
{
558604
zval *object, z_fun, *z_tmp, *z_args[1];

redis_array.h

+1
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ PHP_METHOD(RedisArray, ping);
2020
PHP_METHOD(RedisArray, mget);
2121
PHP_METHOD(RedisArray, mset);
2222
PHP_METHOD(RedisArray, del);
23+
PHP_METHOD(RedisArray, keys);
2324
PHP_METHOD(RedisArray, getOption);
2425
PHP_METHOD(RedisArray, setOption);
2526

0 commit comments

Comments
 (0)