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

Skip to content

Commit 83f3440

Browse files
PHP 5.4 number encode fix
2 parents 2b101e2 + c12a873 commit 83f3440

File tree

4 files changed

+32
-9
lines changed

4 files changed

+32
-9
lines changed

library.c

+2-4
Original file line numberDiff line numberDiff line change
@@ -308,8 +308,7 @@ redis_cmd_format_static(char **ret, char *keyword, char *format, ...) {
308308
case 'f':
309309
case 'F': {
310310
double d = va_arg(ap, double);
311-
dbl_str = _php_math_number_format(d, 8, '.', '\x00');
312-
dbl_len = strlen(dbl_str);
311+
REDIS_DOUBLE_TO_STRING(dbl_str, dbl_len, d)
313312
smart_str_append_long(&buf, dbl_len);
314313
smart_str_appendl(&buf, _NL, sizeof(_NL) - 1);
315314
smart_str_appendl(&buf, dbl_str, dbl_len);
@@ -377,8 +376,7 @@ redis_cmd_format(char **ret, char *format, ...) {
377376
case 'F':
378377
case 'f': {
379378
double d = va_arg(ap, double);
380-
dbl_str = _php_math_number_format(d, 8, '.', '\x00');
381-
dbl_len = strlen(dbl_str);
379+
REDIS_DOUBLE_TO_STRING(dbl_str, dbl_len, d)
382380
smart_str_append_long(&buf, dbl_len);
383381
smart_str_appendl(&buf, _NL, sizeof(_NL) - 1);
384382
smart_str_appendl(&buf, dbl_str, dbl_len);

library.h

+13-3
Original file line numberDiff line numberDiff line change
@@ -47,12 +47,22 @@ redis_key_prefix(RedisSock *redis_sock, char **key, int *key_len TSRMLS_DC);
4747
PHPAPI int
4848
redis_unserialize(RedisSock *redis_sock, const char *val, int val_len, zval **return_value TSRMLS_DC);
4949

50-
/*
51-
* Variant Read methods, mostly to implement eval
52-
*/
5350

5451
PHPAPI int redis_read_reply_type(RedisSock *redis_sock, REDIS_REPLY_TYPE *reply_type, int *reply_info TSRMLS_DC);
5552
PHPAPI int redis_read_variant_line(RedisSock *redis_sock, REDIS_REPLY_TYPE reply_type, zval **z_ret TSRMLS_DC);
5653
PHPAPI int redis_read_variant_bulk(RedisSock *redis_sock, int size, zval **z_ret TSRMLS_DC);
5754
PHPAPI int redis_read_multibulk_recursive(RedisSock *redis_sock, int elements, zval **z_ret TSRMLS_DC);
5855
PHPAPI int redis_read_variant_reply(INTERNAL_FUNCTION_PARAMETERS, RedisSock *redis_sock, zval *z_tab);
56+
57+
58+
#if ZEND_MODULE_API_NO >= 20100000
59+
#define REDIS_DOUBLE_TO_STRING(dbl_str, dbl_len, dbl) \
60+
char dbl_decsep; \
61+
dbl_decsep = '.'; \
62+
dbl_str = _php_math_number_format_ex(dbl, 8, &dbl_decsep, 1, NULL, 0); \
63+
dbl_len = strlen(dbl_str);
64+
#else
65+
#define REDIS_DOUBLE_TO_STRING(dbl_str, dbl_len, dbl) \
66+
dbl_str = _php_math_number_format(dbl, 8, '.', '\x00'); \
67+
dbl_len = strlen(dbl_str);
68+
#endif

redis.c

+1-2
Original file line numberDiff line numberDiff line change
@@ -3684,8 +3684,7 @@ PHP_METHOD(Redis, zAdd) {
36843684

36853685
/* add score */
36863686
score = Z_DVAL_P(z_args[i]);
3687-
dbl_str = _php_math_number_format(score, 8, '.', '\x00');
3688-
dbl_len = strlen(dbl_str);
3687+
REDIS_DOUBLE_TO_STRING(dbl_str, dbl_len, score)
36893688
smart_str_appendc(&buf, '$');
36903689
smart_str_append_long(&buf, dbl_len);
36913690
smart_str_appendl(&buf, _NL, sizeof(_NL) - 1);

tests/TestRedis.php

+16
Original file line numberDiff line numberDiff line change
@@ -1814,6 +1814,22 @@ public function testZX() {
18141814
$this->redis->delete('key2');
18151815
$this->redis->delete('key3');
18161816

1817+
$this->redis->zadd('key1', 2000.1, 'one');
1818+
$this->redis->zadd('key1', 3000.1, 'two');
1819+
$this->redis->zadd('key1', 4000.1, 'three');
1820+
1821+
$ret = $this->redis->zRange('key1', 0, -1, TRUE);
1822+
$this->assertTrue(count($ret) === 3);
1823+
$retValues = array_keys($ret);
1824+
1825+
$this->assertTrue(array('one', 'two', 'three') === $retValues);
1826+
1827+
// + 0 converts from string to float OR integer
1828+
$this->assertTrue(is_float($ret['one'] + 0));
1829+
$this->assertTrue(is_float($ret['two'] + 0));
1830+
$this->assertTrue(is_float($ret['three'] + 0));
1831+
1832+
$this->redis->delete('key1');
18171833

18181834
// ZREMRANGEBYRANK
18191835
$this->redis->zAdd('key1', 1, 'one');

0 commit comments

Comments
 (0)