Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/phpredis/phpredis.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPavlo Yatsukhnenko <yatsukhnenko@gmail.com>2019-10-09 23:56:14 +0300
committerMichael Grunder <michael.grunder@gmail.com>2020-02-07 01:01:52 +0300
commit8eb39a260c514030f47cf2d3be7a0609dbe18b97 (patch)
treef9b9b30423badf0c11609db1969215027af5e265 /redis.c
parentba73fbee747107ce9aaea44abd33dfa36a5f63ce (diff)
Issue #1646
Add TYPE param to SCAN command. Arginfo wasn't updated so this change isn't breaking change :)
Diffstat (limited to 'redis.c')
-rw-r--r--redis.c19
1 files changed, 13 insertions, 6 deletions
diff --git a/redis.c b/redis.c
index 9d7e7204..0b745389 100644
--- a/redis.c
+++ b/redis.c
@@ -3399,7 +3399,8 @@ PHP_METHOD(Redis, command) {
/* Helper to format any combination of SCAN arguments */
PHP_REDIS_API int
redis_build_scan_cmd(char **cmd, REDIS_SCAN_TYPE type, char *key, int key_len,
- int iter, char *pattern, int pattern_len, int count)
+ int iter, char *pattern, int pattern_len, int count,
+ zend_string *match_type)
{
smart_string cmdstr = {0};
char *keyword;
@@ -3407,7 +3408,7 @@ redis_build_scan_cmd(char **cmd, REDIS_SCAN_TYPE type, char *key, int key_len,
/* Count our arguments +1 for key if it's got one, and + 2 for pattern */
/* or count given that they each carry keywords with them. */
- argc = 1 + (key_len > 0) + (pattern_len > 0 ? 2 : 0) + (count > 0 ? 2 : 0);
+ argc = 1 + (key_len > 0) + (pattern_len > 0 ? 2 : 0) + (count > 0 ? 2 : 0) + (match_type ? 2 : 0);
/* Turn our type into a keyword */
switch(type) {
@@ -3443,12 +3444,17 @@ redis_build_scan_cmd(char **cmd, REDIS_SCAN_TYPE type, char *key, int key_len,
redis_cmd_append_sstr(&cmdstr, pattern, pattern_len);
}
+ if (match_type) {
+ REDIS_CMD_APPEND_SSTR_STATIC(&cmdstr, "TYPE");
+ redis_cmd_append_sstr(&cmdstr, ZSTR_VAL(match_type), ZSTR_LEN(match_type));
+ }
+
/* Return our command length */
*cmd = cmdstr.c;
return cmdstr.len;
}
-/* {{{ proto redis::scan(&$iterator, [pattern, [count]]) */
+/* {{{ proto redis::scan(&$iterator, [pattern, [count, [type]]]) */
PHP_REDIS_API void
generic_scan_cmd(INTERNAL_FUNCTION_PARAMETERS, REDIS_SCAN_TYPE type) {
zval *object, *z_iter;
@@ -3457,6 +3463,7 @@ generic_scan_cmd(INTERNAL_FUNCTION_PARAMETERS, REDIS_SCAN_TYPE type) {
char *pattern = NULL, *cmd, *key = NULL;
int cmd_len, num_elements, key_free = 0;
size_t key_len = 0, pattern_len = 0;
+ zend_string *match_type = NULL;
zend_long count = 0, iter;
/* 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) {
} else {
// Doesn't require a key
if(zend_parse_method_parameters(ZEND_NUM_ARGS(), getThis(),
- "Oz/|s!l", &object, redis_ce, &z_iter,
- &pattern, &pattern_len, &count)
+ "Oz/|s!lS", &object, redis_ce, &z_iter,
+ &pattern, &pattern_len, &count, &match_type)
== FAILURE)
{
RETURN_FALSE;
@@ -3530,7 +3537,7 @@ generic_scan_cmd(INTERNAL_FUNCTION_PARAMETERS, REDIS_SCAN_TYPE type) {
// Format our SCAN command
cmd_len = redis_build_scan_cmd(&cmd, type, key, key_len, (int)iter,
- pattern, pattern_len, count);
+ pattern, pattern_len, count, match_type);
/* Execute our command getting our new iterator value */
REDIS_PROCESS_REQUEST(redis_sock, cmd, cmd_len);