Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit 08a9d5d

Browse files
yatsukhnenkomichael-grunder
authored andcommitted
Issue #2055
1 parent a64a0c3 commit 08a9d5d

4 files changed

Lines changed: 91 additions & 2 deletions

File tree

redis_array.c

Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1113,6 +1113,56 @@ PHP_METHOD(RedisArray, unlink) {
11131113
ra_generic_del(INTERNAL_FUNCTION_PARAM_PASSTHRU, "UNLINK", sizeof("UNLINK") - 1);
11141114
}
11151115

1116+
static void
1117+
ra_generic_scan_cmd(INTERNAL_FUNCTION_PARAMETERS, const char *kw, int kw_len)
1118+
{
1119+
RedisArray *ra;
1120+
zend_string *key, *pattern = NULL;
1121+
zval *object, *redis_inst, *z_iter, z_fun, z_args[4];
1122+
zend_long count = 0;
1123+
1124+
if (zend_parse_method_parameters(ZEND_NUM_ARGS(), getThis(), "OSz/|S!l",
1125+
&object, redis_array_ce, &key, &z_iter, &pattern, &count) == FAILURE) {
1126+
RETURN_FALSE;
1127+
}
1128+
1129+
if ((ra = redis_array_get(object)) == NULL) {
1130+
RETURN_FALSE;
1131+
}
1132+
1133+
if ((redis_inst = ra_find_node(ra, ZSTR_VAL(key), ZSTR_LEN(key), NULL)) == NULL) {
1134+
php_error_docref(NULL, E_ERROR, "Could not find any redis servers for this key.");
1135+
RETURN_FALSE;
1136+
}
1137+
1138+
ZVAL_STR(&z_args[0], key);
1139+
ZVAL_NEW_REF(&z_args[1], z_iter);
1140+
if (pattern) ZVAL_STR(&z_args[2], pattern);
1141+
ZVAL_LONG(&z_args[3], count);
1142+
1143+
ZVAL_STRINGL(&z_fun, kw, kw_len);
1144+
call_user_function(&redis_ce->function_table, redis_inst, &z_fun, return_value, ZEND_NUM_ARGS(), z_args);
1145+
zval_dtor(&z_fun);
1146+
1147+
ZVAL_ZVAL(z_iter, &z_args[1], 0, 1);
1148+
}
1149+
1150+
PHP_METHOD(RedisArray, hscan)
1151+
{
1152+
ra_generic_scan_cmd(INTERNAL_FUNCTION_PARAM_PASSTHRU, "HSCAN", sizeof("HSCAN") - 1);
1153+
}
1154+
1155+
PHP_METHOD(RedisArray, sscan)
1156+
{
1157+
ra_generic_scan_cmd(INTERNAL_FUNCTION_PARAM_PASSTHRU, "SSCAN", sizeof("SSCAN") - 1);
1158+
}
1159+
1160+
PHP_METHOD(RedisArray, zscan)
1161+
{
1162+
ra_generic_scan_cmd(INTERNAL_FUNCTION_PARAM_PASSTHRU, "ZSCAN", sizeof("ZSCAN") - 1);
1163+
}
1164+
1165+
11161166
PHP_METHOD(RedisArray, multi)
11171167
{
11181168
zval *object;

redis_array.stub.php

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,8 @@ public function flushdb(): bool|array;
3939

4040
public function getOption(int $opt): bool|array;
4141

42+
public function hscan(string $key, int &$iterator, ?string $pattern = null, int $count = 0): bool|array;
43+
4244
public function info(): bool|array;
4345

4446
public function keys(string $pattern): bool|array;
@@ -57,8 +59,11 @@ public function select(int $index): bool|array;
5759

5860
public function setOption(int $opt, string $value): bool|array;
5961

62+
public function sscan(string $key, int &$iterator, ?string $pattern = null, int $count = 0): bool|array;
63+
6064
public function unlink(string|array $key, string ...$otherkeys): bool|int;
6165

6266
public function unwatch(): bool|null;
6367

68+
public function zscan(string $key, int &$iterator, ?string $pattern = null, int $count = 0): bool|array;
6469
}

redis_array_arginfo.h

Lines changed: 18 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/* This is a generated file, edit the .stub.php file instead.
2-
* Stub hash: e7f3cbb6cba7b52d3cc2d8b2f311dcb37c93ea5b */
2+
* Stub hash: 16a0857d62817f14eef16a00e80e587f318b9052 */
33

44
ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_class_RedisArray___call, 0, 2, IS_MIXED, 0)
55
ZEND_ARG_TYPE_INFO(0, function_name, IS_STRING, 0)
@@ -54,6 +54,13 @@ ZEND_BEGIN_ARG_WITH_RETURN_TYPE_MASK_EX(arginfo_class_RedisArray_getOption, 0, 1
5454
ZEND_ARG_TYPE_INFO(0, opt, IS_LONG, 0)
5555
ZEND_END_ARG_INFO()
5656

57+
ZEND_BEGIN_ARG_WITH_RETURN_TYPE_MASK_EX(arginfo_class_RedisArray_hscan, 0, 2, MAY_BE_BOOL|MAY_BE_ARRAY)
58+
ZEND_ARG_TYPE_INFO(0, key, IS_STRING, 0)
59+
ZEND_ARG_TYPE_INFO(1, iterator, IS_LONG, 0)
60+
ZEND_ARG_TYPE_INFO_WITH_DEFAULT_VALUE(0, pattern, IS_STRING, 1, "null")
61+
ZEND_ARG_TYPE_INFO_WITH_DEFAULT_VALUE(0, count, IS_LONG, 0, "0")
62+
ZEND_END_ARG_INFO()
63+
5764
#define arginfo_class_RedisArray_info arginfo_class_RedisArray__continuum
5865

5966
ZEND_BEGIN_ARG_WITH_RETURN_TYPE_MASK_EX(arginfo_class_RedisArray_keys, 0, 1, MAY_BE_BOOL|MAY_BE_ARRAY)
@@ -86,10 +93,14 @@ ZEND_BEGIN_ARG_WITH_RETURN_TYPE_MASK_EX(arginfo_class_RedisArray_setOption, 0, 2
8693
ZEND_ARG_TYPE_INFO(0, value, IS_STRING, 0)
8794
ZEND_END_ARG_INFO()
8895

96+
#define arginfo_class_RedisArray_sscan arginfo_class_RedisArray_hscan
97+
8998
#define arginfo_class_RedisArray_unlink arginfo_class_RedisArray_del
9099

91100
#define arginfo_class_RedisArray_unwatch arginfo_class_RedisArray_discard
92101

102+
#define arginfo_class_RedisArray_zscan arginfo_class_RedisArray_hscan
103+
93104

94105
ZEND_METHOD(RedisArray, __call);
95106
ZEND_METHOD(RedisArray, __construct);
@@ -107,6 +118,7 @@ ZEND_METHOD(RedisArray, exec);
107118
ZEND_METHOD(RedisArray, flushall);
108119
ZEND_METHOD(RedisArray, flushdb);
109120
ZEND_METHOD(RedisArray, getOption);
121+
ZEND_METHOD(RedisArray, hscan);
110122
ZEND_METHOD(RedisArray, info);
111123
ZEND_METHOD(RedisArray, keys);
112124
ZEND_METHOD(RedisArray, mget);
@@ -116,8 +128,10 @@ ZEND_METHOD(RedisArray, ping);
116128
ZEND_METHOD(RedisArray, save);
117129
ZEND_METHOD(RedisArray, select);
118130
ZEND_METHOD(RedisArray, setOption);
131+
ZEND_METHOD(RedisArray, sscan);
119132
ZEND_METHOD(RedisArray, unlink);
120133
ZEND_METHOD(RedisArray, unwatch);
134+
ZEND_METHOD(RedisArray, zscan);
121135

122136

123137
static const zend_function_entry class_RedisArray_methods[] = {
@@ -137,6 +151,7 @@ static const zend_function_entry class_RedisArray_methods[] = {
137151
ZEND_ME(RedisArray, flushall, arginfo_class_RedisArray_flushall, ZEND_ACC_PUBLIC)
138152
ZEND_ME(RedisArray, flushdb, arginfo_class_RedisArray_flushdb, ZEND_ACC_PUBLIC)
139153
ZEND_ME(RedisArray, getOption, arginfo_class_RedisArray_getOption, ZEND_ACC_PUBLIC)
154+
ZEND_ME(RedisArray, hscan, arginfo_class_RedisArray_hscan, ZEND_ACC_PUBLIC)
140155
ZEND_ME(RedisArray, info, arginfo_class_RedisArray_info, ZEND_ACC_PUBLIC)
141156
ZEND_ME(RedisArray, keys, arginfo_class_RedisArray_keys, ZEND_ACC_PUBLIC)
142157
ZEND_ME(RedisArray, mget, arginfo_class_RedisArray_mget, ZEND_ACC_PUBLIC)
@@ -146,7 +161,9 @@ static const zend_function_entry class_RedisArray_methods[] = {
146161
ZEND_ME(RedisArray, save, arginfo_class_RedisArray_save, ZEND_ACC_PUBLIC)
147162
ZEND_ME(RedisArray, select, arginfo_class_RedisArray_select, ZEND_ACC_PUBLIC)
148163
ZEND_ME(RedisArray, setOption, arginfo_class_RedisArray_setOption, ZEND_ACC_PUBLIC)
164+
ZEND_ME(RedisArray, sscan, arginfo_class_RedisArray_sscan, ZEND_ACC_PUBLIC)
149165
ZEND_ME(RedisArray, unlink, arginfo_class_RedisArray_unlink, ZEND_ACC_PUBLIC)
150166
ZEND_ME(RedisArray, unwatch, arginfo_class_RedisArray_unwatch, ZEND_ACC_PUBLIC)
167+
ZEND_ME(RedisArray, zscan, arginfo_class_RedisArray_zscan, ZEND_ACC_PUBLIC)
151168
ZEND_FE_END
152169
};

redis_array_legacy_arginfo.h

Lines changed: 18 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/* This is a generated file, edit the .stub.php file instead.
2-
* Stub hash: e7f3cbb6cba7b52d3cc2d8b2f311dcb37c93ea5b */
2+
* Stub hash: 16a0857d62817f14eef16a00e80e587f318b9052 */
33

44
ZEND_BEGIN_ARG_INFO_EX(arginfo_class_RedisArray___call, 0, 0, 2)
55
ZEND_ARG_INFO(0, function_name)
@@ -51,6 +51,13 @@ ZEND_BEGIN_ARG_INFO_EX(arginfo_class_RedisArray_getOption, 0, 0, 1)
5151
ZEND_ARG_INFO(0, opt)
5252
ZEND_END_ARG_INFO()
5353

54+
ZEND_BEGIN_ARG_INFO_EX(arginfo_class_RedisArray_hscan, 0, 0, 2)
55+
ZEND_ARG_INFO(0, key)
56+
ZEND_ARG_INFO(1, iterator)
57+
ZEND_ARG_INFO(0, pattern)
58+
ZEND_ARG_INFO(0, count)
59+
ZEND_END_ARG_INFO()
60+
5461
#define arginfo_class_RedisArray_info arginfo_class_RedisArray__continuum
5562

5663
ZEND_BEGIN_ARG_INFO_EX(arginfo_class_RedisArray_keys, 0, 0, 1)
@@ -83,10 +90,14 @@ ZEND_BEGIN_ARG_INFO_EX(arginfo_class_RedisArray_setOption, 0, 0, 2)
8390
ZEND_ARG_INFO(0, value)
8491
ZEND_END_ARG_INFO()
8592

93+
#define arginfo_class_RedisArray_sscan arginfo_class_RedisArray_hscan
94+
8695
#define arginfo_class_RedisArray_unlink arginfo_class_RedisArray_del
8796

8897
#define arginfo_class_RedisArray_unwatch arginfo_class_RedisArray__continuum
8998

99+
#define arginfo_class_RedisArray_zscan arginfo_class_RedisArray_hscan
100+
90101

91102
ZEND_METHOD(RedisArray, __call);
92103
ZEND_METHOD(RedisArray, __construct);
@@ -104,6 +115,7 @@ ZEND_METHOD(RedisArray, exec);
104115
ZEND_METHOD(RedisArray, flushall);
105116
ZEND_METHOD(RedisArray, flushdb);
106117
ZEND_METHOD(RedisArray, getOption);
118+
ZEND_METHOD(RedisArray, hscan);
107119
ZEND_METHOD(RedisArray, info);
108120
ZEND_METHOD(RedisArray, keys);
109121
ZEND_METHOD(RedisArray, mget);
@@ -113,8 +125,10 @@ ZEND_METHOD(RedisArray, ping);
113125
ZEND_METHOD(RedisArray, save);
114126
ZEND_METHOD(RedisArray, select);
115127
ZEND_METHOD(RedisArray, setOption);
128+
ZEND_METHOD(RedisArray, sscan);
116129
ZEND_METHOD(RedisArray, unlink);
117130
ZEND_METHOD(RedisArray, unwatch);
131+
ZEND_METHOD(RedisArray, zscan);
118132

119133

120134
static const zend_function_entry class_RedisArray_methods[] = {
@@ -134,6 +148,7 @@ static const zend_function_entry class_RedisArray_methods[] = {
134148
ZEND_ME(RedisArray, flushall, arginfo_class_RedisArray_flushall, ZEND_ACC_PUBLIC)
135149
ZEND_ME(RedisArray, flushdb, arginfo_class_RedisArray_flushdb, ZEND_ACC_PUBLIC)
136150
ZEND_ME(RedisArray, getOption, arginfo_class_RedisArray_getOption, ZEND_ACC_PUBLIC)
151+
ZEND_ME(RedisArray, hscan, arginfo_class_RedisArray_hscan, ZEND_ACC_PUBLIC)
137152
ZEND_ME(RedisArray, info, arginfo_class_RedisArray_info, ZEND_ACC_PUBLIC)
138153
ZEND_ME(RedisArray, keys, arginfo_class_RedisArray_keys, ZEND_ACC_PUBLIC)
139154
ZEND_ME(RedisArray, mget, arginfo_class_RedisArray_mget, ZEND_ACC_PUBLIC)
@@ -143,7 +158,9 @@ static const zend_function_entry class_RedisArray_methods[] = {
143158
ZEND_ME(RedisArray, save, arginfo_class_RedisArray_save, ZEND_ACC_PUBLIC)
144159
ZEND_ME(RedisArray, select, arginfo_class_RedisArray_select, ZEND_ACC_PUBLIC)
145160
ZEND_ME(RedisArray, setOption, arginfo_class_RedisArray_setOption, ZEND_ACC_PUBLIC)
161+
ZEND_ME(RedisArray, sscan, arginfo_class_RedisArray_sscan, ZEND_ACC_PUBLIC)
146162
ZEND_ME(RedisArray, unlink, arginfo_class_RedisArray_unlink, ZEND_ACC_PUBLIC)
147163
ZEND_ME(RedisArray, unwatch, arginfo_class_RedisArray_unwatch, ZEND_ACC_PUBLIC)
164+
ZEND_ME(RedisArray, zscan, arginfo_class_RedisArray_zscan, ZEND_ACC_PUBLIC)
148165
ZEND_FE_END
149166
};

0 commit comments

Comments
 (0)