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:
-rw-r--r--library.c44
-rw-r--r--library.h1
-rw-r--r--php_redis.h1
-rw-r--r--redis.c8
-rw-r--r--tests/RedisTest.php20
5 files changed, 74 insertions, 0 deletions
diff --git a/library.c b/library.c
index a0a0880d..9c4c37bf 100644
--- a/library.c
+++ b/library.c
@@ -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)
diff --git a/library.h b/library.h
index db47545d..428f6230 100644
--- a/library.h
+++ b/library.h
@@ -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);
diff --git a/redis.c b/redis.c
index 68fee9bc..dd340967 100644
--- a/redis.c
+++ b/redis.c
@@ -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();