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:
authormichael-grunder <michael.grunder@gmail.com>2022-10-22 22:18:31 +0300
committerMichael Grunder <michael.grunder@gmail.com>2022-10-22 22:46:01 +0300
commit71bcbcb973413ae933cf30d58254dfb02425c1ed (patch)
tree4789de334e9f5900043a1e9fe7e680cb23b93c98 /redis.c
parentf3a408305a3df04b6aaaede5fa7f37ddca1f8efb (diff)
Implement ZRANGESTORE and add ZRANGE options
* Add ZRANGESTORE command. * Add Redis 6.2's `REV`, `BYLEX`, and `BYSCORE` to ZRANGE options. * Refactor several ZRANGE family commands into a single reply and options handler, using PHP's new argument parsing macros. * Extend our tests to use the new ZRANGE options. See #1894
Diffstat (limited to 'redis.c')
-rw-r--r--redis.c59
1 files changed, 10 insertions, 49 deletions
diff --git a/redis.c b/redis.c
index 016658f3..adfb6827 100644
--- a/redis.c
+++ b/redis.c
@@ -1906,77 +1906,38 @@ PHP_METHOD(Redis, zAdd) {
}
/* }}} */
-/* Handle ZRANGE and ZREVRANGE as they're the same except for keyword */
-static void generic_zrange_cmd(INTERNAL_FUNCTION_PARAMETERS, char *kw,
- zrange_cb fun)
-{
- char *cmd;
- int cmd_len;
- RedisSock *redis_sock;
- int withscores = 0;
-
- if ((redis_sock = redis_sock_get(getThis(), 0)) == NULL) {
- RETURN_FALSE;
- }
-
- if(fun(INTERNAL_FUNCTION_PARAM_PASSTHRU, redis_sock, kw, &cmd,
- &cmd_len, &withscores, NULL, NULL) == FAILURE)
- {
- RETURN_FALSE;
- }
-
- REDIS_PROCESS_REQUEST(redis_sock, cmd, cmd_len);
- if(withscores) {
- if (IS_ATOMIC(redis_sock)) {
- redis_mbulk_reply_zipped_keys_dbl(INTERNAL_FUNCTION_PARAM_PASSTHRU, redis_sock, NULL, NULL);
- }
- REDIS_PROCESS_RESPONSE(redis_mbulk_reply_zipped_keys_dbl);
- } else {
- if (IS_ATOMIC(redis_sock)) {
- if(redis_sock_read_multibulk_reply(INTERNAL_FUNCTION_PARAM_PASSTHRU,
- redis_sock, NULL, NULL) < 0)
- {
- RETURN_FALSE;
- }
- }
- REDIS_PROCESS_RESPONSE(redis_sock_read_multibulk_reply);
- }
-}
-
/* {{{ proto array Redis::zRandMember(string key, array options) */
-PHP_METHOD(Redis, zRandMember)
-{
+PHP_METHOD(Redis, zRandMember) {
REDIS_PROCESS_CMD(zrandmember, redis_zrandmember_response);
}
/* }}} */
/* {{{ proto array Redis::zRange(string key,int start,int end,bool scores = 0) */
-PHP_METHOD(Redis, zRange)
-{
- generic_zrange_cmd(INTERNAL_FUNCTION_PARAM_PASSTHRU, "ZRANGE",
- redis_zrange_cmd);
+PHP_METHOD(Redis, zRange) {
+ REDIS_PROCESS_KW_CMD("ZRANGE", redis_zrange_cmd, redis_zrange_response);
}
/* }}} */
+PHP_METHOD(Redis, zrangestore) {
+ REDIS_PROCESS_KW_CMD("ZRANGESTORE", redis_zrange_cmd, redis_long_response);
+}
+
/* {{{ proto array Redis::zRevRange(string k, long s, long e, bool scores = 0) */
PHP_METHOD(Redis, zRevRange) {
- generic_zrange_cmd(INTERNAL_FUNCTION_PARAM_PASSTHRU, "ZREVRANGE",
- redis_zrange_cmd);
+ REDIS_PROCESS_KW_CMD("ZREVRANGE", redis_zrange_cmd, redis_zrange_response);
}
/* }}} */
/* {{{ proto array Redis::zRangeByScore(string k,string s,string e,array opt) */
PHP_METHOD(Redis, zRangeByScore) {
- generic_zrange_cmd(INTERNAL_FUNCTION_PARAM_PASSTHRU, "ZRANGEBYSCORE",
- redis_zrangebyscore_cmd);
+ REDIS_PROCESS_KW_CMD("ZRANGEBYSCORE", redis_zrange_cmd, redis_zrange_response);
}
/* }}} */
/* {{{ proto array Redis::zRevRangeByScore(string key, string start, string end,
* array options) */
PHP_METHOD(Redis, zRevRangeByScore) {
- generic_zrange_cmd(INTERNAL_FUNCTION_PARAM_PASSTHRU, "ZREVRANGEBYSCORE",
- redis_zrangebyscore_cmd);
+ REDIS_PROCESS_KW_CMD("ZREVRANGEBYSCORE", redis_zrange_cmd, redis_zrange_response);
}
/* }}} */