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

Skip to content

Commit 204a02c

Browse files
Refactor SMOVE command.
1 parent 19fd7e0 commit 204a02c

1 file changed

Lines changed: 19 additions & 31 deletions

File tree

redis_commands.c

Lines changed: 19 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -3426,43 +3426,31 @@ redis_lpos_cmd(INTERNAL_FUNCTION_PARAMETERS, RedisSock *redis_sock,
34263426
int redis_smove_cmd(INTERNAL_FUNCTION_PARAMETERS, RedisSock *redis_sock,
34273427
char **cmd, int *cmd_len, short *slot, void **ctx)
34283428
{
3429-
char *src, *dst;
3430-
size_t src_len, dst_len;
3431-
int src_free, dst_free;
3432-
zval *z_val;
3429+
zend_string *src = NULL, *dst = NULL;
3430+
smart_string cmdstr = {0};
3431+
zval *zv = NULL;
3432+
short slot2;
34333433

3434-
if (zend_parse_parameters(ZEND_NUM_ARGS(), "ssz", &src, &src_len,
3435-
&dst, &dst_len, &z_val) == FAILURE)
3436-
{
3437-
return FAILURE;
3438-
}
3434+
ZEND_PARSE_PARAMETERS_START(3, 3) {
3435+
Z_PARAM_STR(src)
3436+
Z_PARAM_STR(dst)
3437+
Z_PARAM_ZVAL(zv)
3438+
} ZEND_PARSE_PARAMETERS_END_EX(return FAILURE);
34393439

3440-
src_free = redis_key_prefix(redis_sock, &src, &src_len);
3441-
dst_free = redis_key_prefix(redis_sock, &dst, &dst_len);
3440+
REDIS_CMD_INIT_SSTR_STATIC(&cmdstr, 3, "SMOVE");
3441+
redis_cmd_append_sstr_key_zstr(&cmdstr, src, redis_sock, slot);
3442+
redis_cmd_append_sstr_key_zstr(&cmdstr, dst, redis_sock, slot ? &slot2 : NULL);
3443+
redis_cmd_append_sstr_zval(&cmdstr, zv, redis_sock);
34423444

3443-
// Protect against a CROSSSLOT error
3444-
if (slot) {
3445-
short slot1 = cluster_hash_key(src, src_len);
3446-
short slot2 = cluster_hash_key(dst, dst_len);
3447-
if (slot1 != slot2) {
3448-
php_error_docref(0, E_WARNING,
3449-
"Source and destination keys don't hash to the same slot!");
3450-
if (src_free) efree(src);
3451-
if (dst_free) efree(dst);
3452-
return FAILURE;
3453-
}
3454-
*slot = slot1;
3445+
if (slot && *slot != slot2) {
3446+
php_error_docref(0, E_WARNING, "Source and destination keys don't hash to the same slot!");
3447+
efree(cmdstr.c);
3448+
return FAILURE;
34553449
}
34563450

3457-
// Construct command
3458-
*cmd_len = REDIS_CMD_SPPRINTF(cmd, "SMOVE", "ssv", src, src_len, dst,
3459-
dst_len, z_val);
3460-
3461-
// Cleanup
3462-
if (src_free) efree(src);
3463-
if (dst_free) efree(dst);
3451+
*cmd = cmdstr.c;
3452+
*cmd_len = cmdstr.len;
34643453

3465-
// Success!
34663454
return SUCCESS;
34673455
}
34683456

0 commit comments

Comments
 (0)