8000 Add hscan, sscan and zscan functions to RedisArray · phpredis/phpredis@35a2a8e · GitHub
[go: up one dir, main page]

Skip to content

Commit 35a2a8e

Browse files
committed
Add hscan, sscan and zscan functions to RedisArray
1 parent 5725c8a commit 35a2a8e

File tree

4 files changed

+85
-30
lines changed

4 files changed

+85
-30
lines changed

common.h

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -771,4 +771,15 @@ ZEND_BEGIN_ARG_INFO_EX(arginfo_xdel, 0, 0, 2)
771771
ZEND_ARG_ARRAY_INFO(0, arr_ids, 0)
772772
ZEND_END_ARG_INFO()
773773

774+
/**
775+
* Argument info for key scanning
776+
*/
777+
ZEND_BEGIN_ARG_INFO_EX(arginfo_kscan, 0, 0, 2)
778+
ZEND_ARG_INFO(0, str_key)
779+
ZEND_ARG_INFO(1, i_iterator)
780+
ZEND_ARG_INFO(0, str_pattern)
781+
ZEND_ARG_INFO(0, i_count)
782+
ZEND_END_ARG_INFO()
783+
784+
774785
#endif

redis.c

Lines changed: 0 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -243,16 +243,6 @@ ZEND_BEGIN_ARG_INFO_EX(arginfo_scan, 0, 0, 1)
243243
ZEND_ARG_INFO(0, i_count)
244244
ZEND_END_ARG_INFO()
245245

246-
/**
247-
* Argument info for key scanning
248-
*/
249-
ZEND_BEGIN_ARG_INFO_EX(arginfo_kscan, 0, 0, 2)
250-
ZEND_ARG_INFO(0, str_key)
251-
ZEND_ARG_INFO(1, i_iterator)
252-
ZEND_ARG_INFO(0, str_pattern)
253-
ZEND_ARG_INFO(0, i_count)
254-
ZEND_END_ARG_INFO()
255-
256246
static zend_function_entry redis_functions[] = {
257247
PHP_ME(Redis, __construct, arginfo_void, ZEND_ACC_PUBLIC)
258248
PHP_ME(Redis, __destruct, arginfo_void, ZEND_ACC_PUBLIC)

redis_array.c

Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -114,6 +114,7 @@ zend_function_entry redis_array_functions[] = {
114114
PHP_ME(RedisArray, flushall, arginfo_flush, ZEND_ACC_PUBLIC)
115115
PHP_ME(RedisArray, flushdb, arginfo_flush, ZEND_ACC_PUBLIC)
116116
PHP_ME(RedisArray, getOption, arginfo_getopt, ZEND_ACC_PUBLIC)
117+
PHP_ME(RedisArray, hscan, arginfo_kscan, ZEND_ACC_PUBLIC)
117118
PHP_ME(RedisArray, info, arginfo_void, ZEND_ACC_PUBLIC)
118119
PHP_ME(RedisArray, keys, arginfo_keys, ZEND_ACC_PUBLIC)
119120
PHP_ME(RedisArray, mget, arginfo_mget, ZEND_ACC_PUBLIC)
@@ -123,8 +124,10 @@ zend_function_entry redis_array_functions[] = {
123124
PHP_ME(RedisArray, save, arginfo_void, ZEND_ACC_PUBLIC)
124125
PHP_ME(RedisArray, select, arginfo_select, ZEND_ACC_PUBLIC)
125126
PHP_ME(RedisArray, setOption,arginfo_setopt, ZEND_ACC_PUBLIC)
127+
PHP_ME(RedisArray, sscan, arginfo_kscan, ZEND_ACC_PUBLIC)
126128
PHP_ME(RedisArray, unlink, arginfo_void, ZEND_ACC_PUBLIC)
127129
PHP_ME(RedisArray, unwatch, arginfo_void, ZEND_ACC_PUBLIC)
130+
PHP_ME(RedisArray, zscan, arginfo_kscan, ZEND_ACC_PUBLIC)
128131
PHP_MALIAS(RedisArray, delete, del, arginfo_del, ZEND_ACC_PUBLIC)
129132
PHP_MALIAS(RedisArray, getMultiple, mget, arginfo_mget, ZEND_ACC_PUBLIC)
130133
PHP_FE_END
@@ -1195,6 +1198,56 @@ PHP_METHOD(RedisArray, unlink) {
11951198
ra_generic_del(INTERNAL_FUNCTION_PARAM_PASSTHRU, "UNLINK", sizeof("UNLINK") - 1);
11961199
}
11971200

1201+
static void
1202+
ra_generic_scan_cmd(INTERNAL_FUNCTION_PARAMETERS, const char *kw, int kw_len)
1203+
{
1204+
RedisArray *ra;
1205+
zend_string *key, *pattern = NULL;
1206+
zval *object, *redis_inst, *z_iter, z_fun, z_args[4];
1207+
zend_long count = 0;
1208+
1209+
if (zend_parse_method_parameters(ZEND_NUM_ARGS(), getThis(), "OSz/|S!l",
1210+
&object, redis_array_ce, &key, &z_iter, &pattern, &count) == FAILURE) {
1211+
RETURN_FALSE;
1212+
}
1213+
1214+
if ((ra = redis_array_get(object)) == NULL) {
1215+
RETURN_FALSE;
1216+
}
1217+
1218+
if ((redis_inst = ra_find_node(ra, ZSTR_VAL(key), ZSTR_LEN(key), NULL)) == NULL) {
1219+
php_error_docref(NULL, E_ERROR, "Could not find any redis servers for this key.");
1220+
RETURN_FALSE;
1221+
}
1222+
1223+
ZVAL_STR(&z_args[0], key);
1224+
ZVAL_NEW_REF(&z_args[1], z_iter);
1225+
if (pattern) ZVAL_STR(&z_args[2], pattern);
1226+
ZVAL_LONG(&z_args[3], count);
1227+
1228+
ZVAL_STRINGL(&z_fun, kw, kw_len);
1229+
call_user_function(&redis_ce->function_table, redis_inst, &z_fun, return_value, ZEND_NUM_ARGS(), z_args);
1230+
zval_dtor(&z_fun);
1231+
1232+
ZVAL_ZVAL(z_iter, &z_args[1], 0, 1);
1233+
}
1234+
1235+
PHP_METHOD(RedisArray, hscan)
1236+
{
1237+
ra_generic_scan_cmd(INTERNAL_FUNCTION_PARAM_PASSTHRU, "HSCAN", sizeof("HSCAN") - 1);
1238+
}
1239+
1240+
PHP_METHOD(RedisArray, sscan)
1241+
{
1242+
ra_generic_scan_cmd(INTERNAL_FUNCTION_PARAM_PASSTHRU, "SSCAN", sizeof("SSCAN") - 1);
1243+
}
1244+
1245+
PHP_METHOD(RedisArray, zscan)
1246+
{
1247+
ra_generic_scan_cmd(INTERNAL_FUNCTION_PARAM_PASSTHRU, "ZSCAN", sizeof("ZSCAN") - 1);
1248+
}
1249+
1250+
11981251
PHP_METHOD(RedisArray, multi)
11991252
{
12001253
zval *object;

redis_array.h

Lines changed: 21 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -8,35 +8,36 @@
88
#endif
99
#include "common.h"
1010

11-
PHP_METHOD(RedisArray, __construct);
1211
PHP_METHOD(RedisArray, __call);
12+
PHP_METHOD(RedisArray, __construct);
13+
PHP_METHOD(RedisArray, _continuum);
14+
PHP_METHOD(RedisArray, _distributor);
15+
PHP_METHOD(RedisArray, _function);
1316
PHP_METHOD(RedisArray, _hosts);
14-
PHP_METHOD(RedisArray, _target);
1517
PHP_METHOD(RedisArray, _instance);
16-
PHP_METHOD(RedisArray, _function);
17-
PHP_METHOD(RedisArray, _distributor);
1818
PHP_METHOD(RedisArray, _rehash);
19-
PHP_METHOD(RedisArray, _continuum);
20-
21-
PHP_METHOD(RedisArray, select);
22-
PHP_METHOD(RedisArray, info);
23-
PHP_METHOD(RedisArray, ping);
24-
PHP_METHOD(RedisArray, flushdb);
19+
PHP_METHOD(RedisArray, _target);
20+
PHP_METHOD(RedisArray, bgsave);
21+
PHP_METHOD(RedisArray, del);
22+
PHP_METHOD(RedisArray, discard);
23+
PHP_METHOD(RedisArray, exec);
2524
PHP_METHOD(RedisArray, flushall);
25+
PHP_METHOD(RedisArray, flushdb);
26+
PHP_METHOD(RedisArray, getOption);
27+
PHP_METHOD(RedisArray, hscan);
28+
PHP_METHOD(RedisArray, info);
29+
PHP_METHOD(RedisArray, keys);
2630
PHP_METHOD(RedisArray, mget);
2731
PHP_METHOD(RedisArray, mset);
28-
PHP_METHOD(RedisArray, del);
29-
PHP_METHOD(RedisArray, unlink);
30-
PHP_METHOD(RedisArray, keys);
31-
PHP_METHOD(RedisArray, getOption);
32-
PHP_METHOD(RedisArray, setOption);
33-
PHP_METHOD(RedisArray, save);
34-
PHP_METHOD(RedisArray, bgsave);
35-
3632
PHP_METHOD(RedisArray, multi);
37-
PHP_METHOD(RedisArray, exec);
38-
PHP_METHOD(RedisArray, discard);
33+
PHP_METHOD(RedisArray, ping);
34+
PHP_METHOD(RedisArray, save);
35+
PHP_METHOD(RedisArray, select);
36+
PHP_METHOD(RedisArray, setOption);
37+
PHP_METHOD(RedisArray, sscan);
38+
PHP_METHOD(RedisArray, unlink);
3939
PHP_METHOD(RedisArray, unwatch);
40+
PHP_METHOD(RedisArray, zscan);
4041

4142
typedef struct {
4243
uint32_t value;

0 commit comments

Comments
 (0)
0