Skip to content

Commit c799d25

Browse files
committed
zval_get_string + zAdd tests fix
1 parent 7ae7d35 commit c799d25

File tree

4 files changed

+22
-31
lines changed

4 files changed

+22
-31
lines changed

library.c

-1
Original file line numberDiff line numberDiff line change
@@ -1967,7 +1967,6 @@ redis_serialize(RedisSock *redis_sock, zval *z, char **val, int *val_len
19671967
HashTable ht;
19681968
#endif
19691969
smart_str sstr = {0};
1970-
zval z_copy;
19711970
#ifdef HAVE_REDIS_IGBINARY
19721971
size_t sz;
19731972
uint8_t *val8;

redis_cluster.c

+3-3
Original file line numberDiff line numberDiff line change
@@ -2435,9 +2435,9 @@ static void cluster_raw_cmd(INTERNAL_FUNCTION_PARAMETERS, char *kw, int kw_len)
24352435

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

24432443
/* Send it off */

redis_commands.c

+11-24
Original file line numberDiff line numberDiff line change
@@ -1771,6 +1771,7 @@ static int redis_gen_pf_cmd(INTERNAL_FUNCTION_PARAMETERS, RedisSock *redis_sock,
17711771
char *mem, *key;
17721772
int key_free, mem_len, mem_free, argc=1;
17731773
strlen_t key_len;
1774+
zend_string *zstr;
17741775

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

18021803
// Now iterate over the rest of our keys or values
18031804
ZEND_HASH_FOREACH_VAL(ht_arr, z_ele) {
1804-
zval z_tmp;
1805-
1806-
ZVAL_NULL(&z_tmp);
18071805
// Prefix keys, serialize values
18081806
if(is_keys) {
1809-
if (Z_TYPE_P(z_ele) == IS_STRING) {
1810-
mem = Z_STRVAL_P(z_ele);
1811-
mem_len = Z_STRLEN_P(z_ele);
1812-
} else {
1813-
ZVAL_ZVAL(&z_tmp, z_ele, 1, 0);
1814-
convert_to_string(&z_tmp);
1815-
mem = Z_STRVAL(z_tmp);
1816-
mem_len = Z_STRLEN(z_tmp);
1817-
}
1807+
zstr = zval_get_string(z_ele);
1808+
mem = zstr->val;
1809+
mem_len = zstr->len;
18181810

18191811
// Key prefix
18201812
mem_free = redis_key_prefix(redis_sock, &mem, &mem_len);
@@ -1823,32 +1815,27 @@ static int redis_gen_pf_cmd(INTERNAL_FUNCTION_PARAMETERS, RedisSock *redis_sock,
18231815
if(slot && *slot != cluster_hash_key(mem, mem_len)) {
18241816
php_error_docref(0 TSRMLS_CC, E_WARNING,
18251817
"All keys must hash to the same slot!");
1818+
zend_string_release(zstr);
18261819
if(key_free) efree(key);
1827-
zval_dtor(&z_tmp);
18281820
return FAILURE;
18291821
}
18301822
} else {
18311823
mem_free = redis_serialize(redis_sock, z_ele, &mem, &mem_len
18321824
TSRMLS_CC);
18331825

1826+
zstr = NULL;
18341827
if(!mem_free) {
1835-
if (Z_TYPE_P(z_ele) == IS_STRING) {
1836-
mem = Z_STRVAL_P(z_ele);
1837-
mem_len = Z_STRLEN_P(z_ele);
1838-
} else {
1839-
ZVAL_ZVAL(&z_tmp, z_ele, 1, 0);
1840-
convert_to_string(&z_tmp);
1841-
mem = Z_STRVAL(z_tmp);
1842-
mem_len = Z_STRLEN(z_tmp);
1843-
}
1828+
zstr = zval_get_string(z_ele);
1829+
mem = zstr->val;
1830+
mem_len = zstr->len;
18441831
}
18451832
}
18461833

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

18501837
// Clean up our temp val if it was used
1851-
zval_dtor(&z_tmp);
1838+
if (zstr) zend_string_release(zstr);
18521839

18531840
// Clean up prefixed or serialized data
18541841

@@ -1884,7 +1871,7 @@ int redis_pfmerge_cmd(INTERNAL_FUNCTION_PARAMETERS, RedisSock *redis_sock,
18841871
int redis_pfcount_cmd(INTERNAL_FUNCTION_PARAMETERS, RedisSock *redis_sock,
18851872
char **cmd, int *cmd_len, short *slot, void **ctx)
18861873
{
1887-
zval *z_keys, *z_key, z_tmp;
1874+
zval *z_keys, *z_key;
18881875
HashTable *ht_keys;
18891876
smart_string cmdstr = {0};
18901877
int num_keys, key_len, key_free;

tests/RedisTest.php

+8-3
Original file line numberDiff line numberDiff line change
@@ -1960,10 +1960,15 @@ public function testZX() {
19601960

19611961
$this->assertTrue(1 === $this->redis->zAdd('key', 0, 'val0'));
19621962
$this->assertTrue(1 === $this->redis->zAdd('key', 2, 'val2'));
1963-
$this->assertTrue(1 === $this->redis->zAdd('key', array(), 1, 'val1')); // empty options
1964-
$this->assertTrue(1 === $this->redis->zAdd('key', array('nx'), 3, 'val3')); // nx option
1965-
$this->assertTrue(0 === $this->redis->zAdd('key', array('xx'), 3, 'val3')); // xx option
19661963
$this->assertTrue(2 === $this->redis->zAdd('key', 4, 'val4', 5, 'val5')); // multiple parameters
1964+
if (version_compare($this->version, "3.0.2", "lt")) {
1965+
$this->assertTrue(1 === $this->redis->zAdd('key', 1, 'val1'));
1966+
$this->assertTrue(1 === $this->redis->zAdd('key', 3, 'val3'));
1967+
} else {
1968+
$this->assertTrue(1 === $this->redis->zAdd('key', array(), 1, 'val1')); // empty options
1969+
$this->assertTrue(1 === $this->redis->zAdd('key', array('nx'), 3, 'val3')); // nx option
1970+
$this->assertTrue(0 === $this->redis->zAdd('key', array('xx'), 3, 'val3')); // xx option
1971+
}
19671972

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

0 commit comments

Comments
 (0)