Sitelet https://github.com/phpredis/phpredis/commit/c8224b93
Skip to content

Commit c8224b9

Browse files
Refactor a more command handlers.
Use PHP's new argument parsing API and also our simplified mechanism for dynamically appending strings or packed values.
1 parent ae3bc50 commit c8224b9

1 file changed

Lines changed: 32 additions & 59 deletions

File tree

‎redis_commands.c‎

Lines changed: 32 additions & 59 deletions
Original file line numberDiff line numberDiff line change
@@ -1507,36 +1507,31 @@ int redis_unsubscribe_cmd(INTERNAL_FUNCTION_PARAMETERS, RedisSock *redis_sock,
15071507
char *kw, char **cmd, int *cmd_len, short *slot,
15081508
void **ctx)
15091509
{
1510-
zval *z_arr, *z_chan;
1511-
HashTable *ht_arr;
15121510
smart_string cmdstr = {0};
1513-
subscribeContext *sctx = ecalloc(1, sizeof(*sctx));
1511+
subscribeContext *sctx;
1512+
HashTable *channels;
1513+
zval *channel;
15141514

1515-
if (zend_parse_parameters(ZEND_NUM_ARGS(), "a", &z_arr) == FAILURE) {
1516-
efree(sctx);
1517-
return FAILURE;
1518-
}
1515+
ZEND_PARSE_PARAMETERS_START(1, 1)
1516+
Z_PARAM_ARRAY_HT(channels)
1517+
ZEND_PARSE_PARAMETERS_END_EX(return FAILURE);
15191518

1520-
ht_arr = Z_ARRVAL_P(z_arr);
1519+
if (zend_hash_num_elements(channels) == 0)
1520+
return FAILURE;
15211521

1522+
sctx = ecalloc(1, sizeof(*sctx));
15221523
sctx->kw = kw;
1523-
sctx->argc = zend_hash_num_elements(ht_arr);
1524-
redis_cmd_init_sstr(&cmdstr, sctx->argc, kw, strlen(kw));
1524+
sctx->argc = zend_hash_num_elements(channels);
15251525

1526-
ZEND_HASH_FOREACH_VAL(ht_arr, z_chan) {
1527-
char *key = Z_STRVAL_P(z_chan);
1528-
size_t key_len = Z_STRLEN_P(z_chan);
1529-
int key_free;
1526+
redis_cmd_init_sstr(&cmdstr, sctx->argc, kw, strlen(kw));
15301527

1531-
key_free = redis_key_prefix(redis_sock, &key, &key_len);
1532-
redis_cmd_append_sstr(&cmdstr, key, key_len);
1533-
if (key_free) efree(key);
1528+
ZEND_HASH_FOREACH_VAL(channels, channel) {
1529+
redis_cmd_append_sstr_key_zval(&cmdstr, channel, redis_sock, slot);
15341530
} ZEND_HASH_FOREACH_END();
15351531

1536-
// Push out vals
15371532
*cmd_len = cmdstr.len;
1538-
*cmd = cmdstr.c;
1539-
*ctx = (void*)sctx;
1533+
*cmd = cmdstr.c;
1534+
*ctx = sctx;
15401535

15411536
return SUCCESS;
15421537
}
@@ -1726,54 +1721,32 @@ int redis_key_varval_cmd(INTERNAL_FUNCTION_PARAMETERS, RedisSock *redis_sock,
17261721
}
17271722

17281723
/* Commands that take a key and then an array of values */
1729-
#define VAL_TYPE_VALUES 1
1730-
#define VAL_TYPE_STRINGS 2
17311724
static int gen_key_arr_cmd(INTERNAL_FUNCTION_PARAMETERS, RedisSock *redis_sock,
1732-
char *kw, int valtype, char **cmd, int *cmd_len,
1725+
char *kw, zend_bool pack_values, char **cmd, int *cmd_len,
17331726
short *slot, void **ctx)
17341727
{
1735-
zval *z_arr, *z_val;
1736-
HashTable *ht_arr;
17371728
smart_string cmdstr = {0};
1738-
zend_string *zstr;
1739-
int key_free, val_free, argc = 1;
1740-
size_t val_len, key_len;
1741-
char *key, *val;
1729+
HashTable *values = NULL;
1730+
zend_string *key = NULL;
1731+
zval *zv;
17421732

1743-
if (zend_parse_parameters(ZEND_NUM_ARGS(), "sa", &key, &key_len,
1744-
&z_arr) == FAILURE ||
1745-
zend_hash_num_elements(Z_ARRVAL_P(z_arr)) == 0)
1746-
{
1747-
return FAILURE;
1748-
}
1733+
ZEND_PARSE_PARAMETERS_START(2, 2)
1734+
Z_PARAM_STR(key)
1735+
Z_PARAM_ARRAY_HT(values)
1736+
ZEND_PARSE_PARAMETERS_END_EX(return FAILURE);
17491737

1750-
/* Start constructing our command */
1751-
ht_arr = Z_ARRVAL_P(z_arr);
1752-
argc += zend_hash_num_elements(ht_arr);
1753-
redis_cmd_init_sstr(&cmdstr, argc, kw, strlen(kw));
1738+
if (zend_hash_num_elements(values) == 0)
1739+
return FAILURE;
17541740

1755-
/* Prefix if required and append the key name */
1756-
key_free = redis_key_prefix(redis_sock, &key, &key_len);
1757-
redis_cmd_append_sstr(&cmdstr, key, key_len);
1758-
CMD_SET_SLOT(slot, key, key_len);
1759-
if (key_free) efree(key);
1741+
redis_cmd_init_sstr(&cmdstr, 1 + zend_hash_num_elements(values), kw, strlen(kw));
1742+
redis_cmd_append_sstr_key_zstr(&cmdstr, key, redis_sock, slot);
17601743

1761-
/* Iterate our hash table, serializing and appending values */
1762-
assert(valtype == VAL_TYPE_VALUES || valtype == VAL_TYPE_STRINGS);
1763-
ZEND_HASH_FOREACH_VAL(ht_arr, z_val) {
1764-
if (valtype == VAL_TYPE_VALUES) {
1765-
val_free = redis_pack(redis_sock, z_val, &val, &val_len);
1766-
redis_cmd_append_sstr(&cmdstr, val, val_len);
1767-
if (val_free) efree(val);
1768-
} else {
1769-
zstr = zval_get_string(z_val);
1770-
redis_cmd_append_sstr(&cmdstr, ZSTR_VAL(zstr), ZSTR_LEN(zstr));
1771-
zend_string_release(zstr);
1772-
}
1744+
ZEND_HASH_FOREACH_VAL(values, zv) {
1745+
redis_cmd_append_sstr_zval(&cmdstr, zv, pack_values ? redis_sock : NULL);
17731746
} ZEND_HASH_FOREACH_END();
17741747

1775-
*cmd_len = cmdstr.len;
17761748
*cmd = cmdstr.c;
1749+
*cmd_len = cmdstr.len;
17771750

17781751
return SUCCESS;
17791752
}
@@ -1783,15 +1756,15 @@ int redis_key_val_arr_cmd(INTERNAL_FUNCTION_PARAMETERS, RedisSock *redis_sock,
17831756
void **ctx)
17841757
{
17851758
return gen_key_arr_cmd(INTERNAL_FUNCTION_PARAM_PASSTHRU, redis_sock, kw,
1786-
VAL_TYPE_VALUES, cmd, cmd_len, slot, ctx);
1759+
1, cmd, cmd_len, slot, ctx);
17871760
}
17881761

17891762
int redis_key_str_arr_cmd(INTERNAL_FUNCTION_PARAMETERS, RedisSock *redis_sock,
17901763
char *kw, char **cmd, int *cmd_len, short *slot,
17911764
void **ctx)
17921765
{
17931766
return gen_key_arr_cmd(INTERNAL_FUNCTION_PARAM_PASSTHRU, redis_sock, kw,
1794-
VAL_TYPE_STRINGS, cmd, cmd_len, slot, ctx);
1767+
0, cmd, cmd_len, slot, ctx);
17951768
}
17961769

17971770
/* Generic function that takes one or more non-serialized arguments */

0 commit comments

Comments
 (0)