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

Skip to content

Commit f62363c

Browse files
Refactor SRANDMEMBER command.
1 parent 86f15cc commit f62363c

8 files changed

Lines changed: 47 additions & 80 deletions

File tree

cluster_library.c

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1832,6 +1832,17 @@ cluster_zrandmember_resp(INTERNAL_FUNCTION_PARAMETERS, redisCluster *c, void *ct
18321832
}
18331833
}
18341834

1835+
PHP_REDIS_API void
1836+
cluster_srandmember_resp(INTERNAL_FUNCTION_PARAMETERS, redisCluster *c, void *ctx) {
1837+
if (ctx == NULL) {
1838+
cluster_bulk_resp(INTERNAL_FUNCTION_PARAM_PASSTHRU, c, NULL);
1839+
} else if (ctx == PHPREDIS_CTX_PTR) {
1840+
cluster_mbulk_resp(INTERNAL_FUNCTION_PARAM_PASSTHRU, c, NULL);
1841+
} else {
1842+
ZEND_ASSERT(!"memory corruption?");
1843+
}
1844+
}
1845+
18351846
PHP_REDIS_API void
18361847
cluster_set_resp(INTERNAL_FUNCTION_PARAMETERS, redisCluster *c, void *ctx)
18371848
{

cluster_library.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -418,6 +418,8 @@ PHP_REDIS_API void cluster_zdiff_resp(INTERNAL_FUNCTION_PARAMETERS, redisCluster
418418
void *ctx);
419419
PHP_REDIS_API void cluster_zrandmember_resp(INTERNAL_FUNCTION_PARAMETERS, redisCluster *c,
420420
void *ctx);
421+
PHP_REDIS_API void cluster_srandmember_resp(INTERNAL_FUNCTION_PARAMETERS, redisCluster *c,
422+
void *ctx);
421423
PHP_REDIS_API void cluster_set_resp(INTERNAL_FUNCTION_PARAMETERS, redisCluster *c,
422424
void *ctx);
423425
PHP_REDIS_API void cluster_geosearch_resp(INTERNAL_FUNCTION_PARAMETERS, redisCluster *c,

library.c

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1225,6 +1225,18 @@ redis_zrange_response(INTERNAL_FUNCTION_PARAMETERS, RedisSock *redis_sock, zval
12251225
return cb(INTERNAL_FUNCTION_PARAM_PASSTHRU, redis_sock, z_tab, ctx);
12261226
}
12271227

1228+
PHP_REDIS_API int
1229+
redis_srandmember_response(INTERNAL_FUNCTION_PARAMETERS, RedisSock *redis_sock, zval *z_tab, void *ctx) {
1230+
FailableResultCallback cb;
1231+
1232+
/* Whether or not we have a COUNT argument */
1233+
ZEND_ASSERT(ctx == NULL || ctx == PHPREDIS_CTX_PTR);
1234+
1235+
cb = ctx ? redis_sock_read_multibulk_reply : redis_string_response;
1236+
1237+
return cb(INTERNAL_FUNCTION_PARAM_PASSTHRU, redis_sock, z_tab, ctx);
1238+
}
1239+
12281240
PHP_REDIS_API int redis_info_response(INTERNAL_FUNCTION_PARAMETERS, RedisSock *redis_sock, zval *z_tab, void *ctx) {
12291241
char *response;
12301242
int response_len;

library.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -190,9 +190,11 @@ PHP_REDIS_API int redis_geosearch_response(INTERNAL_FUNCTION_PARAMETERS, RedisSo
190190
PHP_REDIS_API int redis_hrandfield_response(INTERNAL_FUNCTION_PARAMETERS, RedisSock *redis_sock, zval *z_tab, void *ctx);
191191
PHP_REDIS_API int redis_pop_response(INTERNAL_FUNCTION_PARAMETERS, RedisSock *redis_sock, zval *z_tab, void *ctx);
192192

193+
PHP_REDIS_API int redis_srandmember_response(INTERNAL_FUNCTION_PARAMETERS, RedisSock *redis_sock, zval *z_tab, void *ctx);
193194
PHP_REDIS_API int redis_lpos_response(INTERNAL_FUNCTION_PARAMETERS, RedisSock *redis_sock, zval *z_tab, void *ctx);
194195
PHP_REDIS_API int redis_read_lpos_response(zval *zdst, RedisSock *redis_sock, char reply_type, long long elements, void *ctx);
195196

197+
196198
PHP_REDIS_API int redis_client_response(INTERNAL_FUNCTION_PARAMETERS, RedisSock *redis_sock, zval *z_tab, void *ctx);
197199
PHP_REDIS_API int redis_command_response(INTERNAL_FUNCTION_PARAMETERS, RedisSock *redis_sock, zval *z_tab, void *ctx);
198200
PHP_REDIS_API int redis_select_response(INTERNAL_FUNCTION_PARAMETERS, RedisSock *redis_sock, zval *z_tab, void *ctx);

redis.c

Lines changed: 1 addition & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -1249,36 +1249,7 @@ PHP_METHOD(Redis, sPop)
12491249
/* {{{ proto string Redis::sRandMember(string key [int count]) */
12501250
PHP_METHOD(Redis, sRandMember)
12511251
{
1252-
char *cmd;
1253-
int cmd_len;
1254-
short have_count;
1255-
RedisSock *redis_sock;
1256-
1257-
// Grab our socket, validate call
1258-
if ((redis_sock = redis_sock_get(getThis(), 0)) == NULL ||
1259-
redis_srandmember_cmd(INTERNAL_FUNCTION_PARAM_PASSTHRU, redis_sock,
1260-
&cmd, &cmd_len, NULL, NULL, &have_count) == FAILURE)
1261-
{
1262-
RETURN_FALSE;
1263-
}
1264-
1265-
REDIS_PROCESS_REQUEST(redis_sock, cmd, cmd_len);
1266-
if(have_count) {
1267-
if (IS_ATOMIC(redis_sock)) {
1268-
if(redis_sock_read_multibulk_reply(INTERNAL_FUNCTION_PARAM_PASSTHRU,
1269-
redis_sock, NULL, NULL) < 0)
1270-
{
1271-
RETURN_FALSE;
1272-
}
1273-
}
1274-
REDIS_PROCESS_RESPONSE(redis_sock_read_multibulk_reply);
1275-
} else {
1276-
if (IS_ATOMIC(redis_sock)) {
1277-
redis_string_response(INTERNAL_FUNCTION_PARAM_PASSTHRU, redis_sock,
1278-
NULL, NULL);
1279-
}
1280-
REDIS_PROCESS_RESPONSE(redis_string_response);
1281-
}
1252+
REDIS_PROCESS_CMD(srandmember, redis_srandmember_response);
12821253
}
12831254
/* }}} */
12841255

redis_cluster.c

Lines changed: 1 addition & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -869,37 +869,7 @@ PHP_METHOD(RedisCluster, spop) {
869869

870870
/* {{{ proto string|array RedisCluster::srandmember(string key, [long count]) */
871871
PHP_METHOD(RedisCluster, srandmember) {
872-
redisCluster *c = GET_CONTEXT();
873-
cluster_cb cb;
874-
char *cmd; int cmd_len; short slot;
875-
short have_count;
876-
877-
/* Treat as readonly */
878-
c->readonly = CLUSTER_IS_ATOMIC(c);
879-
880-
if (redis_srandmember_cmd(INTERNAL_FUNCTION_PARAM_PASSTHRU, c->flags,
881-
&cmd, &cmd_len, &slot, NULL, &have_count)
882-
== FAILURE)
883-
{
884-
RETURN_FALSE;
885-
}
886-
887-
if (cluster_send_command(c,slot,cmd,cmd_len) < 0 || c->err != NULL) {
888-
efree(cmd);
889-
RETURN_FALSE;
890-
}
891-
892-
// Clean up command
893-
efree(cmd);
894-
895-
cb = have_count ? cluster_mbulk_resp : cluster_bulk_resp;
896-
if (CLUSTER_IS_ATOMIC(c)) {
897-
cb(INTERNAL_FUNCTION_PARAM_PASSTHRU, c, NULL);
898-
} else {
899-
void *ctx = NULL;
900-
CLUSTER_ENQUEUE_RESPONSE(c, slot, cb, ctx);
901-
RETURN_ZVAL(getThis(), 1, 0);
902-
}
872+
CLUSTER_PROCESS_CMD(srandmember, cluster_srandmember_resp, 1);
903873
}
904874

905875
/* {{{ proto string RedisCluster::strlen(string key) */

redis_commands.c

Lines changed: 17 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -3684,28 +3684,27 @@ int redis_select_cmd(INTERNAL_FUNCTION_PARAMETERS, RedisSock *redis_sock,
36843684

36853685
/* SRANDMEMBER */
36863686
int redis_srandmember_cmd(INTERNAL_FUNCTION_PARAMETERS, RedisSock *redis_sock,
3687-
char **cmd, int *cmd_len, short *slot, void **ctx,
3688-
short *have_count)
3687+
char **cmd, int *cmd_len, short *slot, void **ctx)
36893688
{
3690-
char *key;
3691-
size_t key_len;
3692-
zend_long count;
3689+
uint32_t argc = ZEND_NUM_ARGS();
3690+
smart_string cmdstr = {0};
3691+
zend_long count = 0;
3692+
zend_string *key;
36933693

3694-
if (zend_parse_parameters(ZEND_NUM_ARGS(), "s|l", &key, &key_len,
3695-
&count) == FAILURE)
3696-
{
3697-
return FAILURE;
3698-
}
3694+
ZEND_PARSE_PARAMETERS_START(1, 2)
3695+
Z_PARAM_STR(key)
3696+
Z_PARAM_OPTIONAL
3697+
Z_PARAM_LONG(count)
3698+
ZEND_PARSE_PARAMETERS_END_EX(return FAILURE);
36993699

3700-
// Set our have count flag
3701-
*have_count = ZEND_NUM_ARGS() == 2;
3700+
REDIS_CMD_INIT_SSTR_STATIC(&cmdstr, ZEND_NUM_ARGS(), "SRANDMEMBER");
3701+
redis_cmd_append_sstr_key_zstr(&cmdstr, key, redis_sock, slot);
3702+
if (argc == 2)
3703+
redis_cmd_append_sstr_long(&cmdstr, count);
37023704

3703-
// Two args means we have the optional COUNT
3704-
if (*have_count) {
3705-
*cmd_len = REDIS_CMD_SPPRINTF(cmd, "SRANDMEMBER", "kl", key, key_len, count);
3706-
} else {
3707-
*cmd_len = REDIS_CMD_SPPRINTF(cmd, "SRANDMEMBER", "k", key, key_len);
3708-
}
3705+
*cmd = cmdstr.c;
3706+
*cmd_len = cmdstr.len;
3707+
*ctx = argc == 2 ? PHPREDIS_CTX_PTR : NULL;
37093708

37103709
return SUCCESS;
37113710
}

redis_commands.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -264,7 +264,7 @@ int redis_hsetnx_cmd(INTERNAL_FUNCTION_PARAMETERS, RedisSock *redis_sock,
264264
char **cmd, int *cmd_len, short *slot, void **ctx);
265265

266266
int redis_srandmember_cmd(INTERNAL_FUNCTION_PARAMETERS, RedisSock *redis_sock,
267-
char **cmd, int *cmd_len, short *slot, void **ctx, short *have_count);
267+
char **cmd, int *cmd_len, short *slot, void **ctx);
268268

269269
int redis_select_cmd(INTERNAL_FUNCTION_PARAMETERS, RedisSock *redis_sock,
270270
char **cmd, int *cmd_len, short *slot, void **ctx);

0 commit comments

Comments
 (0)