Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit f3f361a

Browse files
Fix serializer support for SRANDMEMBER for both one member
and when the count argument is passed. Addresses phpredis#391
1 parent 00233a3 commit f3f361a

File tree

2 files changed

+56
-16
lines changed

2 files changed

+56
-16
lines changed

redis.c

Lines changed: 20 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2346,14 +2346,32 @@ PHP_METHOD(Redis, sRandMember)
23462346
// Process our command
23472347
REDIS_PROCESS_REQUEST(redis_sock, cmd, cmd_len);
23482348

2349-
// Process our reply
2350-
IF_ATOMIC() {
2349+
// Either bulk or multi-bulk depending on argument count
2350+
if(ZEND_NUM_ARGS() == 2) {
2351+
IF_ATOMIC() {
2352+
if(redis_sock_read_multibulk_reply(INTERNAL_FUNCTION_PARAM_PASSTHRU,
2353+
redis_sock, NULL, NULL) < 0)
2354+
{
2355+
RETURN_FALSE;
2356+
}
2357+
}
2358+
REDIS_PROCESS_RESPONSE(redis_sock_read_multibulk_reply);
2359+
} else {
2360+
IF_ATOMIC() {
2361+
redis_string_response(INTERNAL_FUNCTION_PARAM_PASSTHRU, redis_sock,
2362+
NULL, NULL);
2363+
}
2364+
REDIS_PROCESS_RESPONSE(redis_string_response);
2365+
}
2366+
2367+
/*IF_ATOMIC() {
23512368
// This will be bulk or multi-bulk depending if we passed the optional [COUNT] argument
23522369
if(redis_read_variant_reply(INTERNAL_FUNCTION_PARAM_PASSTHRU, redis_sock, NULL) < 0) {
23532370
RETURN_FALSE;
23542371
}
23552372
}
23562373
REDIS_PROCESS_RESPONSE(redis_read_variant_reply);
2374+
*/
23572375
}
23582376
/* }}} */
23592377

tests/TestRedis.php

Lines changed: 36 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1127,23 +1127,45 @@ public function testsPop()
11271127
}
11281128

11291129
public function testsRandMember() {
1130-
$this->redis->delete('set0');
1131-
$this->assertTrue($this->redis->sRandMember('set0') === FALSE);
1130+
$this->redis->delete('set0');
1131+
$this->assertTrue($this->redis->sRandMember('set0') === FALSE);
11321132

1133-
$this->redis->sAdd('set0', 'val');
1134-
$this->redis->sAdd('set0', 'val2');
1133+
$this->redis->sAdd('set0', 'val');
1134+
$this->redis->sAdd('set0', 'val2');
11351135

1136-
$got = array();
1137-
while(true) {
1138-
$v = $this->redis->sRandMember('set0');
1139-
$this->assertTrue(2 === $this->redis->sSize('set0')); // no change.
1140-
$this->assertTrue($v === 'val' || $v === 'val2');
1136+
$got = array();
1137+
while(true) {
1138+
$v = $this->redis->sRandMember('set0');
1139+
$this->assertTrue(2 === $this->redis->sSize('set0')); // no change.
1140+
$this->assertTrue($v === 'val' || $v === 'val2');
11411141

1142-
$got[$v] = $v;
1143-
if(count($got) == 2) {
1144-
break;
1145-
}
1146-
}
1142+
$got[$v] = $v;
1143+
if(count($got) == 2) {
1144+
break;
1145+
}
1146+
}
1147+
1148+
//
1149+
// With and without count, while serializing
1150+
//
1151+
1152+
$this->redis->delete('set0');
1153+
$this->redis->setOption(Redis::OPT_SERIALIZER, Redis::SERIALIZER_PHP);
1154+
for($i=0;$i<5;$i++) {
1155+
$member = "member:$i";
1156+
$this->redis->sAdd('set0', $member);
1157+
$mems[] = $member;
1158+
}
1159+
1160+
$member = $this->redis->srandmember('set0');
1161+
$this->assertTrue(in_array($member, $mems));
1162+
1163+
$rmembers = $this->redis->srandmember('set0', $i);
1164+
foreach($rmembers as $reply_mem) {
1165+
$this->assertTrue(in_array($reply_mem, $mems));
1166+
}
1167+
1168+
$this->redis->setOption(Redis::OPT_SERIALIZER, Redis::SERIALIZER_NONE);
11471169
}
11481170

11491171
public function testSRandMemberWithCount() {

0 commit comments

Comments
 (0)