Skip to content

Commit a534a2c

Browse files
committed
[WIP] Issue phpredis#1894
Add Redis::zMscore command.
1 parent a024a9a commit a534a2c

File tree

5 files changed

+74
-0
lines changed

5 files changed

+74
-0
lines changed

library.c

Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2511,6 +2511,50 @@ redis_mbulk_reply_raw(INTERNAL_FUNCTION_PARAMETERS, RedisSock *redis_sock, zval
25112511
return 0;
25122512
}
25132513

2514+
PHP_REDIS_API int
2515+
redis_mbulk_reply_double(INTERNAL_FUNCTION_PARAMETERS, RedisSock *redis_sock, zval *z_tab, void *ctx)
2516+
{
2517+
char inbuf[4096], *line;
2518+
int i, numElems, len;
2519+
size_t buf_len;
2520+
zval z_multi_result;
2521+
2522+
if (redis_sock_gets(redis_sock, inbuf, sizeof(inbuf) - 1, &buf_len) < 0) {
2523+
return FAILURE;
2524+
}
2525+
2526+
if (*inbuf != TYPE_MULTIBULK) {
2527+
if (IS_ATOMIC(redis_sock)) {
2528+
if (*inbuf == TYPE_ERR) {
2529+
redis_sock_set_err(redis_sock, inbuf + 1, buf_len);
2530+
}
2531+
RETVAL_FALSE;
2532+
} else {
2533+
add_next_index_bool(z_tab, 0);
2534+
}
2535+
return FAILURE;
2536+
}
2537+
numElems = atoi(inbuf + 1);
2538+
2539+
array_init(&z_multi_result);
2540+
for (i = 0; i < numElems; ++i) {
2541+
if ((line = redis_sock_read(redis_sock, &len)) == NULL) {
2542+
add_next_index_bool(&z_multi_result, 0);
2543+
continue;
2544+
}
2545+
add_next_index_double(&z_multi_result, atof(line));
2546+
efree(line);
2547+
}
2548+
2549+
if (IS_ATOMIC(redis_sock)) {
2550+
RETVAL_ZVAL(&z_multi_result, 0, 1);
2551+
} else {
2552+
add_next_index_zval(z_tab, &z_multi_result);
2553+
}
2554+
2555+
return SUCCESS;
2556+
}
2557+
25142558
PHP_REDIS_API void
25152559
redis_mbulk_reply_loop(RedisSock *redis_sock, zval *z_tab, int count,
25162560
int unserialize)

library.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -87,6 +87,7 @@ PHP_REDIS_API int redis_mbulk_reply_zipped_vals(INTERNAL_FUNCTION_PARAMETERS, Re
8787
PHP_REDIS_API int redis_mbulk_reply_zipped_keys_int(INTERNAL_FUNCTION_PARAMETERS, RedisSock *redis_sock, zval *z_tab, void *ctx);
8888
PHP_REDIS_API int redis_mbulk_reply_zipped_keys_dbl(INTERNAL_FUNCTION_PARAMETERS, RedisSock *redis_sock, zval *z_tab, void *ctx);
8989
PHP_REDIS_API int redis_mbulk_reply_assoc(INTERNAL_FUNCTION_PARAMETERS, RedisSock *redis_sock, zval *z_tab, void *ctx);
90+
PHP_REDIS_API int redis_mbulk_reply_double(INTERNAL_FUNCTION_PARAMETERS, RedisSock *redis_sock, zval *z_tab, void *ctx);
9091

9192
PHP_REDIS_API int redis_sock_read_scan_reply(INTERNAL_FUNCTION_PARAMETERS, RedisSock *redis_sock, REDIS_SCAN_TYPE type, zend_long *iter);
9293

php_redis.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -126,6 +126,7 @@ PHP_METHOD(Redis, zCard);
126126
PHP_METHOD(Redis, zCount);
127127
PHP_METHOD(Redis, zIncrBy);
128128
PHP_METHOD(Redis, zLexCount);
129+
PHP_METHOD(Redis, zMscore);
129130
PHP_METHOD(Redis, zPopMax);
130131
PHP_METHOD(Redis, zPopMin);
131132
PHP_METHOD(Redis, zRange);

redis.c

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -441,6 +441,7 @@ static zend_function_entry redis_functions[] = {
441441
PHP_ME(Redis, zCount, arginfo_key_min_max, ZEND_ACC_PUBLIC)
442442
PHP_ME(Redis, zIncrBy, arginfo_zincrby, ZEND_ACC_PUBLIC)
443443
PHP_ME(Redis, zLexCount, arginfo_key_min_max, ZEND_ACC_PUBLIC)
444+
PHP_ME(Redis, zMscore, arginfo_key_members, ZEND_ACC_PUBLIC)
444445
PHP_ME(Redis, zPopMax, arginfo_key, ZEND_ACC_PUBLIC)
445446
PHP_ME(Redis, zPopMin, arginfo_key, ZEND_ACC_PUBLIC)
446447
PHP_ME(Redis, zRange, arginfo_zrange, ZEND_ACC_PUBLIC)
@@ -2250,6 +2251,13 @@ PHP_METHOD(Redis, zScore)
22502251
}
22512252
/* }}} */
22522253

2254+
/* {{{ proto array Redis::zMscore(string key, string member0, ...memberN) */
2255+
PHP_METHOD(Redis, zMscore)
2256+
{
2257+
REDIS_PROCESS_KW_CMD("ZMSCORE", redis_key_varval_cmd, redis_mbulk_reply_double);
2258+
}
2259+
/* }}} */
2260+
22532261
/* {{{ proto long Redis::zRank(string key, string member) */
22542262
PHP_METHOD(Redis, zRank) {
22552263
REDIS_PROCESS_KW_CMD("ZRANK", redis_kv_cmd, redis_long_response);

tests/RedisTest.php

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2506,6 +2506,26 @@ public function testZLexCount() {
25062506
}
25072507
}
25082508

2509+
public function testzMscore()
2510+
{
2511+
// Only available since 6.2.0
2512+
if (version_compare($this->version, '6.2.0') < 0) {
2513+
$this->markTestSkipped();
2514+
return;
2515+
}
2516+
2517+
$this->redis->del('key');
2518+
foreach (range('a', 'c') as $c) {
2519+
$this->redis->zAdd('key', 1, $c);
2520+
}
2521+
2522+
$scores = $this->redis->zMscore('key', 'a', 'notamember', 'c');
2523+
$this->assertEquals([1.0, false, 1.0], $scores);
2524+
2525+
$scores = $this->redis->zMscore('wrongkey', 'a', 'b', 'c');
2526+
$this->assertEquals([false, false, false], $scores);
2527+
}
2528+
25092529
public function testZRemRangeByLex() {
25102530
if (version_compare($this->version, "2.8.9") < 0) {
25112531
$this->MarkTestSkipped();

0 commit comments

Comments
 (0)