diff options
author | Pavlo Yatsukhnenko <yatsukhnenko@gmail.com> | 2021-01-17 17:27:30 +0300 |
---|---|---|
committer | Pavlo Yatsukhnenko <yatsukhnenko@gmail.com> | 2021-01-17 21:44:04 +0300 |
commit | a534a2c36bb2fab0b27fbd651ae9f64115a2821e (patch) | |
tree | 544e584d78e402a3a4a2edd60ecbfe1907bdde96 | |
parent | a024a9a2bcbdd92c86656223e06a203f9f0a6022 (diff) |
[WIP] Issue #1894
Add Redis::zMscore command.
-rw-r--r-- | library.c | 44 | ||||
-rw-r--r-- | library.h | 1 | ||||
-rw-r--r-- | php_redis.h | 1 | ||||
-rw-r--r-- | redis.c | 8 | ||||
-rw-r--r-- | tests/RedisTest.php | 20 |
5 files changed, 74 insertions, 0 deletions
@@ -2511,6 +2511,50 @@ redis_mbulk_reply_raw(INTERNAL_FUNCTION_PARAMETERS, RedisSock *redis_sock, zval return 0; } +PHP_REDIS_API int +redis_mbulk_reply_double(INTERNAL_FUNCTION_PARAMETERS, RedisSock *redis_sock, zval *z_tab, void *ctx) +{ + char inbuf[4096], *line; + int i, numElems, len; + size_t buf_len; + zval z_multi_result; + + if (redis_sock_gets(redis_sock, inbuf, sizeof(inbuf) - 1, &buf_len) < 0) { + return FAILURE; + } + + if (*inbuf != TYPE_MULTIBULK) { + if (IS_ATOMIC(redis_sock)) { + if (*inbuf == TYPE_ERR) { + redis_sock_set_err(redis_sock, inbuf + 1, buf_len); + } + RETVAL_FALSE; + } else { + add_next_index_bool(z_tab, 0); + } + return FAILURE; + } + numElems = atoi(inbuf + 1); + + array_init(&z_multi_result); + for (i = 0; i < numElems; ++i) { + if ((line = redis_sock_read(redis_sock, &len)) == NULL) { + add_next_index_bool(&z_multi_result, 0); + continue; + } + add_next_index_double(&z_multi_result, atof(line)); + efree(line); + } + + if (IS_ATOMIC(redis_sock)) { + RETVAL_ZVAL(&z_multi_result, 0, 1); + } else { + add_next_index_zval(z_tab, &z_multi_result); + } + + return SUCCESS; +} + PHP_REDIS_API void redis_mbulk_reply_loop(RedisSock *redis_sock, zval *z_tab, int count, int unserialize) @@ -87,6 +87,7 @@ PHP_REDIS_API int redis_mbulk_reply_zipped_vals(INTERNAL_FUNCTION_PARAMETERS, Re PHP_REDIS_API int redis_mbulk_reply_zipped_keys_int(INTERNAL_FUNCTION_PARAMETERS, RedisSock *redis_sock, zval *z_tab, void *ctx); PHP_REDIS_API int redis_mbulk_reply_zipped_keys_dbl(INTERNAL_FUNCTION_PARAMETERS, RedisSock *redis_sock, zval *z_tab, void *ctx); PHP_REDIS_API int redis_mbulk_reply_assoc(INTERNAL_FUNCTION_PARAMETERS, RedisSock *redis_sock, zval *z_tab, void *ctx); +PHP_REDIS_API int redis_mbulk_reply_double(INTERNAL_FUNCTION_PARAMETERS, RedisSock *redis_sock, zval *z_tab, void *ctx); PHP_REDIS_API int redis_sock_read_scan_reply(INTERNAL_FUNCTION_PARAMETERS, RedisSock *redis_sock, REDIS_SCAN_TYPE type, zend_long *iter); diff --git a/php_redis.h b/php_redis.h index 88e9178f..92de1a45 100644 --- a/php_redis.h +++ b/php_redis.h @@ -126,6 +126,7 @@ PHP_METHOD(Redis, zCard); PHP_METHOD(Redis, zCount); PHP_METHOD(Redis, zIncrBy); PHP_METHOD(Redis, zLexCount); +PHP_METHOD(Redis, zMscore); PHP_METHOD(Redis, zPopMax); PHP_METHOD(Redis, zPopMin); PHP_METHOD(Redis, zRange); @@ -441,6 +441,7 @@ static zend_function_entry redis_functions[] = { PHP_ME(Redis, zCount, arginfo_key_min_max, ZEND_ACC_PUBLIC) PHP_ME(Redis, zIncrBy, arginfo_zincrby, ZEND_ACC_PUBLIC) PHP_ME(Redis, zLexCount, arginfo_key_min_max, ZEND_ACC_PUBLIC) + PHP_ME(Redis, zMscore, arginfo_key_members, ZEND_ACC_PUBLIC) PHP_ME(Redis, zPopMax, arginfo_key, ZEND_ACC_PUBLIC) PHP_ME(Redis, zPopMin, arginfo_key, ZEND_ACC_PUBLIC) PHP_ME(Redis, zRange, arginfo_zrange, ZEND_ACC_PUBLIC) @@ -2250,6 +2251,13 @@ PHP_METHOD(Redis, zScore) } /* }}} */ +/* {{{ proto array Redis::zMscore(string key, string member0, ...memberN) */ +PHP_METHOD(Redis, zMscore) +{ + REDIS_PROCESS_KW_CMD("ZMSCORE", redis_key_varval_cmd, redis_mbulk_reply_double); +} +/* }}} */ + /* {{{ proto long Redis::zRank(string key, string member) */ PHP_METHOD(Redis, zRank) { REDIS_PROCESS_KW_CMD("ZRANK", redis_kv_cmd, redis_long_response); diff --git a/tests/RedisTest.php b/tests/RedisTest.php index 961de889..197ceb2e 100644 --- a/tests/RedisTest.php +++ b/tests/RedisTest.php @@ -2506,6 +2506,26 @@ class Redis_Test extends TestSuite } } + public function testzMscore() + { + // Only available since 6.2.0 + if (version_compare($this->version, '6.2.0') < 0) { + $this->markTestSkipped(); + return; + } + + $this->redis->del('key'); + foreach (range('a', 'c') as $c) { + $this->redis->zAdd('key', 1, $c); + } + + $scores = $this->redis->zMscore('key', 'a', 'notamember', 'c'); + $this->assertEquals([1.0, false, 1.0], $scores); + + $scores = $this->redis->zMscore('wrongkey', 'a', 'b', 'c'); + $this->assertEquals([false, false, false], $scores); + } + public function testZRemRangeByLex() { if (version_compare($this->version, "2.8.9") < 0) { $this->MarkTestSkipped(); |