Skip to content

Commit f3191cd

Browse files
Merge branch 'hotfix/srandmember_serialize'
2 parents 00233a3 + f3f361a commit f3191cd

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)