Skip to content

zval_get_string + zAdd tests fix #1041

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 1 commit into from
Dec 4, 2016
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 0 additions & 1 deletion library.c
Original file line number Diff line number Diff line change
Expand Up @@ -1967,7 +1967,6 @@ redis_serialize(RedisSock *redis_sock, zval *z, char **val, int *val_len
HashTable ht;
#endif
smart_str sstr = {0};
zval z_copy;
#ifdef HAVE_REDIS_IGBINARY
size_t sz;
uint8_t *val8;
Expand Down
6 changes: 3 additions & 3 deletions redis_cluster.c
Original file line number Diff line number Diff line change
Expand Up @@ -2435,9 +2435,9 @@ static void cluster_raw_cmd(INTERNAL_FUNCTION_PARAMETERS, char *kw, int kw_len)

/* Iterate, appending args */
for(i=1;i<argc;i++) {
convert_to_string(&z_args[i]);
redis_cmd_append_sstr(&cmd, Z_STRVAL(z_args[i]),
Z_STRLEN(z_args[i]));
zend_string *zstr = zval_get_string(&z_args[i]);
redis_cmd_append_sstr(&cmd, zstr->val, zstr->len);
zend_string_release(zstr);
}

/* Send it off */
Expand Down
35 changes: 11 additions & 24 deletions redis_commands.c
Original file line number Diff line number Diff line change
Expand Up @@ -1771,6 +1771,7 @@ static int redis_gen_pf_cmd(INTERNAL_FUNCTION_PARAMETERS, RedisSock *redis_sock,
char *mem, *key;
int key_free, mem_len, mem_free, argc=1;
strlen_t key_len;
zend_string *zstr;

// Parse arguments
if(zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "sa", &key, &key_len,
Expand Down Expand Up @@ -1801,20 +1802,11 @@ static int redis_gen_pf_cmd(INTERNAL_FUNCTION_PARAMETERS, RedisSock *redis_sock,

// Now iterate over the rest of our keys or values
ZEND_HASH_FOREACH_VAL(ht_arr, z_ele) {
zval z_tmp;

ZVAL_NULL(&z_tmp);
// Prefix keys, serialize values
if(is_keys) {
if (Z_TYPE_P(z_ele) == IS_STRING) {
mem = Z_STRVAL_P(z_ele);
mem_len = Z_STRLEN_P(z_ele);
} else {
ZVAL_ZVAL(&z_tmp, z_ele, 1, 0);
convert_to_string(&z_tmp);
mem = Z_STRVAL(z_tmp);
mem_len = Z_STRLEN(z_tmp);
}
zstr = zval_get_string(z_ele);
mem = zstr->val;
mem_len = zstr->len;

// Key prefix
mem_free = redis_key_prefix(redis_sock, &mem, &mem_len);
Expand All @@ -1823,32 +1815,27 @@ static int redis_gen_pf_cmd(INTERNAL_FUNCTION_PARAMETERS, RedisSock *redis_sock,
if(slot && *slot != cluster_hash_key(mem, mem_len)) {
php_error_docref(0 TSRMLS_CC, E_WARNING,
"All keys must hash to the same slot!");
zend_string_release(zstr);
if(key_free) efree(key);
zval_dtor(&z_tmp);
return FAILURE;
}
} else {
mem_free = redis_serialize(redis_sock, z_ele, &mem, &mem_len
TSRMLS_CC);

zstr = NULL;
if(!mem_free) {
if (Z_TYPE_P(z_ele) == IS_STRING) {
mem = Z_STRVAL_P(z_ele);
mem_len = Z_STRLEN_P(z_ele);
} else {
ZVAL_ZVAL(&z_tmp, z_ele, 1, 0);
convert_to_string(&z_tmp);
mem = Z_STRVAL(z_tmp);
mem_len = Z_STRLEN(z_tmp);
}
zstr = zval_get_string(z_ele);
mem = zstr->val;
mem_len = zstr->len;
}
}

// Append our key or member
redis_cmd_append_sstr(&cmdstr, mem, mem_len);

// Clean up our temp val if it was used
zval_dtor(&z_tmp);
if (zstr) zend_string_release(zstr);

// Clean up prefixed or serialized data

Expand Down Expand Up @@ -1884,7 +1871,7 @@ int redis_pfmerge_cmd(INTERNAL_FUNCTION_PARAMETERS, RedisSock *redis_sock,
int redis_pfcount_cmd(INTERNAL_FUNCTION_PARAMETERS, RedisSock *redis_sock,
char **cmd, int *cmd_len, short *slot, void **ctx)
{
zval *z_keys, *z_key, z_tmp;
zval *z_keys, *z_key;
HashTable *ht_keys;
smart_string cmdstr = {0};
int num_keys, key_len, key_free;
Expand Down
11 changes: 8 additions & 3 deletions tests/RedisTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -1960,10 +1960,15 @@ public function testZX() {

$this->assertTrue(1 === $this->redis->zAdd('key', 0, 'val0'));
$this->assertTrue(1 === $this->redis->zAdd('key', 2, 'val2'));
$this->assertTrue(1 === $this->redis->zAdd('key', array(), 1, 'val1')); // empty options
$this->assertTrue(1 === $this->redis->zAdd('key', array('nx'), 3, 'val3')); // nx option
$this->assertTrue(0 === $this->redis->zAdd('key', array('xx'), 3, 'val3')); // xx option
$this->assertTrue(2 === $this->redis->zAdd('key', 4, 'val4', 5, 'val5')); // multiple parameters
if (version_compare($this->version, "3.0.2", "lt")) {
$this->assertTrue(1 === $this->redis->zAdd('key', 1, 'val1'));
$this->assertTrue(1 === $this->redis->zAdd('key', 3, 'val3'));
} else {
$this->assertTrue(1 === $this->redis->zAdd('key', array(), 1, 'val1')); // empty options
$this->assertTrue(1 === $this->redis->zAdd('key', array('nx'), 3, 'val3')); // nx option
$this->assertTrue(0 === $this->redis->zAdd('key', array('xx'), 3, 'val3')); // xx option
}

$this->assertTrue(array('val0', 'val1', 'val2', 'val3', 'val4', 'val5') === $this->redis->zRange('key', 0, -1));

Expand Down