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

Skip to content

Commit e858e8e

Browse files
committed
Issue #1768
Allow multiple field-value pairs for hmset command.
1 parent 765d3cd commit e858e8e

1 file changed

Lines changed: 78 additions & 20 deletions

File tree

redis_commands.c

Lines changed: 78 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -2670,9 +2670,83 @@ int redis_smove_cmd(INTERNAL_FUNCTION_PARAMETERS, RedisSock *redis_sock,
26702670
return SUCCESS;
26712671
}
26722672

2673-
/* Generic command construction for HSET and HSETNX */
2674-
static int gen_hset_cmd(INTERNAL_FUNCTION_PARAMETERS, RedisSock *redis_sock,
2675-
char *kw, char **cmd, int *cmd_len, short *slot)
2673+
/* HSET */
2674+
int redis_hset_cmd(INTERNAL_FUNCTION_PARAMETERS, RedisSock *redis_sock,
2675+
char **cmd, int *cmd_len, short *slot, void **ctx)
2676+
{
2677+
int i, argc;
2678+
smart_string cmdstr = {0};
2679+
zend_string *zkey;
2680+
zval *z_args, *z_ele;
2681+
2682+
if ((argc = ZEND_NUM_ARGS()) < 2) {
2683+
return FAILURE;
2684+
}
2685+
2686+
z_args = ecalloc(argc, sizeof(*z_args));
2687+
if (zend_get_parameters_array(ht, argc, z_args) == FAILURE) {
2688+
efree(z_args);
2689+
return FAILURE;
2690+
}
2691+
2692+
if (argc == 2) {
2693+
if (Z_TYPE(z_args[1]) != IS_ARRAY || zend_hash_num_elements(Z_ARRVAL(z_args[1])) == 0) {
2694+
efree(z_args);
2695+
return FAILURE;
2696+
}
2697+
2698+
/* Initialize our command */
2699+
redis_cmd_init_sstr(&cmdstr, 1 + zend_hash_num_elements(Z_ARRVAL(z_args[1])), ZEND_STRL("HSET"));
2700+
2701+
/* Append key */
2702+
zkey = zval_get_string(&z_args[0]);
2703+
redis_cmd_append_sstr_key(&cmdstr, ZSTR_VAL(zkey), ZSTR_LEN(zkey), redis_sock, slot);
2704+
zend_string_release(zkey);
2705+
2706+
ZEND_HASH_FOREACH_STR_KEY_VAL(Z_ARRVAL(z_args[1]), zkey, z_ele) {
2707+
if (zkey != NULL) {
2708+
ZVAL_DEREF(z_ele);
2709+
redis_cmd_append_sstr(&cmdstr, ZSTR_VAL(zkey), ZSTR_LEN(zkey));
2710+
redis_cmd_append_sstr_zval(&cmdstr, z_ele, redis_sock);
2711+
}
2712+
} ZEND_HASH_FOREACH_END();
2713+
} else {
2714+
if (argc % 2 == 0) {
2715+
efree(z_args);
2716+
return FAILURE;
2717+
}
2718+
/* Initialize our command */
2719+
redis_cmd_init_sstr(&cmdstr, argc, ZEND_STRL("HSET"));
2720+
2721+
/* Append key */
2722+
zkey = zval_get_string(&z_args[0]);
2723+
redis_cmd_append_sstr_key(&cmdstr, ZSTR_VAL(zkey), ZSTR_LEN(zkey), redis_sock, slot);
2724+
zend_string_release(zkey);
2725+
2726+
for (i = 1; i < argc; ++i) {
2727+
if (i % 2) {
2728+
zkey = zval_get_string(&z_args[i]);
2729+
redis_cmd_append_sstr(&cmdstr, ZSTR_VAL(zkey), ZSTR_LEN(zkey));
2730+
zend_string_release(zkey);
2731+
} else {
2732+
redis_cmd_append_sstr_zval(&cmdstr, &z_args[i], redis_sock);
2733+
}
2734+
}
2735+
}
2736+
2737+
// Push out values
2738+
*cmd = cmdstr.c;
2739+
*cmd_len = cmdstr.len;
2740+
2741+
// Cleanup arg array
2742+
efree(z_args);
2743+
2744+
return SUCCESS;
2745+
}
2746+
2747+
/* HSETNX */
2748+
int redis_hsetnx_cmd(INTERNAL_FUNCTION_PARAMETERS, RedisSock *redis_sock,
2749+
char **cmd, int *cmd_len, short *slot, void **ctx)
26762750
{
26772751
char *key, *mem;
26782752
size_t key_len, mem_len;
@@ -2685,28 +2759,12 @@ static int gen_hset_cmd(INTERNAL_FUNCTION_PARAMETERS, RedisSock *redis_sock,
26852759
}
26862760

26872761
/* Construct command */
2688-
*cmd_len = REDIS_CMD_SPPRINTF(cmd, kw, "ksv", key, key_len, mem, mem_len, z_val);
2762+
*cmd_len = REDIS_CMD_SPPRINTF(cmd, "HSETNX", "ksv", key, key_len, mem, mem_len, z_val);
26892763

26902764
// Success
26912765
return SUCCESS;
26922766
}
26932767

2694-
/* HSET */
2695-
int redis_hset_cmd(INTERNAL_FUNCTION_PARAMETERS, RedisSock *redis_sock,
2696-
char **cmd, int *cmd_len, short *slot, void **ctx)
2697-
{
2698-
return gen_hset_cmd(INTERNAL_FUNCTION_PARAM_PASSTHRU, redis_sock, "HSET",
2699-
cmd, cmd_len, slot);
2700-
}
2701-
2702-
/* HSETNX */
2703-
int redis_hsetnx_cmd(INTERNAL_FUNCTION_PARAMETERS, RedisSock *redis_sock,
2704-
char **cmd, int *cmd_len, short *slot, void **ctx)
2705-
{
2706-
return gen_hset_cmd(INTERNAL_FUNCTION_PARAM_PASSTHRU, redis_sock, "HSETNX",
2707-
cmd, cmd_len, slot);
2708-
}
2709-
27102768
int
27112769
redis_hrandfield_cmd(INTERNAL_FUNCTION_PARAMETERS, RedisSock *redis_sock,
27122770
char **cmd, int *cmd_len, short *slot, void **ctx)

0 commit comments

Comments
 (0)