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

Skip to content

Commit 8eb39a2

Browse files
yatsukhnenkomichael-grunder
authored andcommitted
Issue #1646
Add TYPE param to SCAN command. Arginfo wasn't updated so this change isn't breaking change :)
1 parent ba73fbe commit 8eb39a2

1 file changed

Lines changed: 13 additions & 6 deletions

File tree

redis.c

Lines changed: 13 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -3399,15 +3399,16 @@ PHP_METHOD(Redis, command) {
33993399
/* Helper to format any combination of SCAN arguments */
34003400
PHP_REDIS_API int
34013401
redis_build_scan_cmd(char **cmd, REDIS_SCAN_TYPE type, char *key, int key_len,
3402-
int iter, char *pattern, int pattern_len, int count)
3402+
int iter, char *pattern, int pattern_len, int count,
3403+
zend_string *match_type)
34033404
{
34043405
smart_string cmdstr = {0};
34053406
char *keyword;
34063407
int argc;
34073408

34083409
/* Count our arguments +1 for key if it's got one, and + 2 for pattern */
34093410
/* or count given that they each carry keywords with them. */
3410-
argc = 1 + (key_len > 0) + (pattern_len > 0 ? 2 : 0) + (count > 0 ? 2 : 0);
3411+
argc = 1 + (key_len > 0) + (pattern_len > 0 ? 2 : 0) + (count > 0 ? 2 : 0) + (match_type ? 2 : 0);
34113412

34123413
/* Turn our type into a keyword */
34133414
switch(type) {
@@ -3443,12 +3444,17 @@ redis_build_scan_cmd(char **cmd, REDIS_SCAN_TYPE type, char *key, int key_len,
34433444
redis_cmd_append_sstr(&cmdstr, pattern, pattern_len);
34443445
}
34453446

3447+
if (match_type) {
3448+
REDIS_CMD_APPEND_SSTR_STATIC(&cmdstr, "TYPE");
3449+
redis_cmd_append_sstr(&cmdstr, ZSTR_VAL(match_type), ZSTR_LEN(match_type));
3450+
}
3451+
34463452
/* Return our command length */
34473453
*cmd = cmdstr.c;
34483454
return cmdstr.len;
34493455
}
34503456

3451-
/* {{{ proto redis::scan(&$iterator, [pattern, [count]]) */
3457+
/* {{{ proto redis::scan(&$iterator, [pattern, [count, [type]]]) */
34523458
PHP_REDIS_API void
34533459
generic_scan_cmd(INTERNAL_FUNCTION_PARAMETERS, REDIS_SCAN_TYPE type) {
34543460
zval *object, *z_iter;
@@ -3457,6 +3463,7 @@ generic_scan_cmd(INTERNAL_FUNCTION_PARAMETERS, REDIS_SCAN_TYPE type) {
34573463
char *pattern = NULL, *cmd, *key = NULL;
34583464
int cmd_len, num_elements, key_free = 0;
34593465
size_t key_len = 0, pattern_len = 0;
3466+
zend_string *match_type = NULL;
34603467
zend_long count = 0, iter;
34613468

34623469
/* Different prototype depending on if this is a key based scan */
@@ -3472,8 +3479,8 @@ generic_scan_cmd(INTERNAL_FUNCTION_PARAMETERS, REDIS_SCAN_TYPE type) {
34723479
} else {
34733480
// Doesn't require a key
34743481
if(zend_parse_method_parameters(ZEND_NUM_ARGS(), getThis(),
3475-
"Oz/|s!l", &object, redis_ce, &z_iter,
3476-
&pattern, &pattern_len, &count)
3482+
"Oz/|s!lS", &object, redis_ce, &z_iter,
3483+
&pattern, &pattern_len, &count, &match_type)
34773484
== FAILURE)
34783485
{
34793486
RETURN_FALSE;
@@ -3530,7 +3537,7 @@ generic_scan_cmd(INTERNAL_FUNCTION_PARAMETERS, REDIS_SCAN_TYPE type) {
35303537

35313538
// Format our SCAN command
35323539
cmd_len = redis_build_scan_cmd(&cmd, type, key, key_len, (int)iter,
3533-
pattern, pattern_len, count);
3540+
pattern, pattern_len, count, match_type);
35343541

35353542
/* Execute our command getting our new iterator value */
35363543
REDIS_PROCESS_REQUEST(redis_sock, cmd, cmd_len);

0 commit comments

Comments
 (0)