Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/phpredis/phpredis.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authormichael-grunder <michael.grunder@gmail.com>2014-11-01 01:00:59 +0300
committermichael-grunder <michael.grunder@gmail.com>2014-11-01 01:00:59 +0300
commita302564c4c9a2800a3ff88def8f900400fbedec2 (patch)
treeb28f7897c15d401b6aec7ebd731bda3ff2c8c2c3
parentc1f862c99db7c8935d31a88f7259d2755a7ba295 (diff)
Fix parsing of 'zipped' replies for various uses
As discovered in issue #523, phpredis was attempting to unserialize both the keys *and* scores for commands like zRangeByScore. This had to do with the logic around deserialization in the response. In addition, this same bug would have caused issues when running commands like $r->config('get'), because that too, would have tried to unserialize the values, which we don't want to do. This commit reworks parsing and zipping up replies by allowing the call to be configured to unseraialize any combination of keys or values (or none or both).
-rw-r--r--library.c250
-rw-r--r--library.h15
-rw-r--r--php_redis.h1
-rw-r--r--redis.c218
-rw-r--r--tests/TestRedis.php48
5 files changed, 307 insertions, 225 deletions
diff --git a/library.c b/library.c
index 3e91e933..1c6fb75d 100644
--- a/library.c
+++ b/library.c
@@ -32,8 +32,14 @@ PHPAPI int usleep(unsigned int useconds);
#define usleep Sleep
#endif
-#define UNSERIALIZE_ONLY_VALUES 0
-#define UNSERIALIZE_ALL 1
+#define UNSERIALIZE_NONE 0
+#define UNSERIALIZE_KEYS 1
+#define UNSERIALIZE_VALS 2
+#define UNSERIALIZE_ALL 3
+
+#define SCORE_DECODE_NONE 0
+#define SCORE_DECODE_INT 1
+#define SCORE_DECODE_DOUBLE 2
extern zend_class_entry *redis_ce;
extern zend_class_entry *redis_exception_ce;
@@ -115,7 +121,7 @@ PHP_REDIS_API int redis_check_eof(RedisSock *redis_sock TSRMLS_DC)
}
-PHP_REDIS_API int
+PHP_REDIS_API int
redis_sock_read_scan_reply(INTERNAL_FUNCTION_PARAMETERS, RedisSock *redis_sock,
REDIS_SCAN_TYPE type, long *iter)
{
@@ -150,13 +156,13 @@ redis_sock_read_scan_reply(INTERNAL_FUNCTION_PARAMETERS, RedisSock *redis_sock,
scan command this is. They all come back in slightly different ways */
switch(type) {
case TYPE_SCAN:
- return redis_sock_read_multibulk_reply_raw(INTERNAL_FUNCTION_PARAM_PASSTHRU, redis_sock, NULL, NULL);
+ return redis_mbulk_reply_raw(INTERNAL_FUNCTION_PARAM_PASSTHRU, redis_sock, NULL, NULL);
case TYPE_SSCAN:
return redis_sock_read_multibulk_reply(INTERNAL_FUNCTION_PARAM_PASSTHRU, redis_sock, NULL, NULL);
case TYPE_ZSCAN:
- return redis_sock_read_multibulk_reply_zipped(INTERNAL_FUNCTION_PARAM_PASSTHRU, redis_sock, NULL, NULL);
+ return redis_mbulk_reply_zipped_keys_dbl(INTERNAL_FUNCTION_PARAM_PASSTHRU, redis_sock, NULL, NULL);
case TYPE_HSCAN:
- return redis_sock_read_multibulk_reply_zipped_strings(INTERNAL_FUNCTION_PARAM_PASSTHRU, redis_sock, NULL, NULL);
+ return redis_mbulk_reply_zipped_vals(INTERNAL_FUNCTION_PARAM_PASSTHRU, redis_sock, NULL, NULL);
default:
return -1;
}
@@ -189,9 +195,10 @@ PHP_REDIS_API zval *redis_sock_read_multibulk_reply_zval(INTERNAL_FUNCTION_PARAM
MAKE_STD_ZVAL(z_tab);
array_init(z_tab);
- redis_sock_read_multibulk_reply_loop(INTERNAL_FUNCTION_PARAM_PASSTHRU,
- redis_sock, z_tab, numElems, 1, UNSERIALIZE_ALL);
- return z_tab;
+ redis_mbulk_reply_loop(INTERNAL_FUNCTION_PARAM_PASSTHRU, redis_sock, z_tab,
+ numElems, UNSERIALIZE_ALL);
+
+ return z_tab;
}
/**
@@ -944,15 +951,90 @@ PHP_REDIS_API void redis_long_response(INTERNAL_FUNCTION_PARAMETERS, RedisSock *
}
}
+/* Helper method to convert [key, value, key, value] into [key => value,
+ * key => value] when returning data to the caller. Depending on our decode
+ * flag we'll convert the value data types */
+static void array_zip_values_and_scores(RedisSock *redis_sock, zval *z_tab,
+ int decode TSRMLS_DC)
+{
+
+ zval *z_ret;
+ HashTable *keytable;
+
+ MAKE_STD_ZVAL(z_ret);
+ array_init(z_ret);
+ keytable = Z_ARRVAL_P(z_tab);
+
+ for(zend_hash_internal_pointer_reset(keytable);
+ zend_hash_has_more_elements(keytable) == SUCCESS;
+ zend_hash_move_forward(keytable)) {
+
+ char *tablekey, *hkey, *hval;
+ unsigned int tablekey_len;
+ int hkey_len;
+ unsigned long idx;
+ zval **z_key_pp, **z_value_pp;
+
+ zend_hash_get_current_key_ex(keytable, &tablekey, &tablekey_len, &idx, 0, NULL);
+ if(zend_hash_get_current_data(keytable, (void**)&z_key_pp) == FAILURE) {
+ continue; /* this should never happen, according to the PHP people. */
+ }
+
+ /* get current value, a key */
+ convert_to_string(*z_key_pp);
+ hkey = Z_STRVAL_PP(z_key_pp);
+ hkey_len = Z_STRLEN_PP(z_key_pp);
+
+ /* move forward */
+ zend_hash_move_forward(keytable);
+
+ /* fetch again */
+ zend_hash_get_current_key_ex(keytable, &tablekey, &tablekey_len, &idx, 0, NULL);
+ if(zend_hash_get_current_data(keytable, (void**)&z_value_pp) == FAILURE) {
+ continue; /* this should never happen, according to the PHP people. */
+ }
+
+ /* get current value, a hash value now. */
+ hval = Z_STRVAL_PP(z_value_pp);
+ /* Decode the score depending on flag */
+ if (decode == SCORE_DECODE_INT && Z_STRLEN_PP(z_value_pp) > 0) {
+ add_assoc_long_ex(z_ret, hkey, 1+hkey_len, atoi(hval+1));
+ } else if (decode == SCORE_DECODE_DOUBLE) {
+ add_assoc_double_ex(z_ret, hkey, 1+hkey_len, atof(hval));
+ } else {
+ zval *z = NULL;
+ MAKE_STD_ZVAL(z);
+ *z = **z_value_pp;
+ zval_copy_ctor(z);
+ add_assoc_zval_ex(z_ret, hkey, 1+hkey_len, z);
+ }
+
+ /*
+ if(use_atof) {
+ add_assoc_double_ex(z_ret, hkey, 1+hkey_len, atof(hval));
+ } else {
+ zval *z = NULL;
+ MAKE_STD_ZVAL(z);
+ *z = **z_value_pp;
+ zval_copy_ctor(z);
+ add_assoc_zval_ex(z_ret, hkey, 1+hkey_len, z);
+ }*/
-PHP_REDIS_API int redis_sock_read_multibulk_reply_zipped_with_flag(INTERNAL_FUNCTION_PARAMETERS, RedisSock *redis_sock, zval *z_tab, int flag) {
+ }
+ /* replace */
+ zval_dtor(z_tab);
+ *z_tab = *z_ret;
+ zval_copy_ctor(z_tab);
+ zval_dtor(z_ret);
- /*
- int ret = redis_sock_read_multibulk_reply(INTERNAL_FUNCTION_PARAM_PASSTHRU, redis_sock, z_tab TSRMLS_CC);
- array_zip_values_and_scores(return_value, 0);
- */
+ efree(z_ret);
+}
+static int
+redis_mbulk_reply_zipped(INTERNAL_FUNCTION_PARAMETERS, RedisSock *redis_sock,
+ zval *z_tab, int unserialize, int decode)
+{
char inbuf[1024];
int numElems;
zval *z_multi_result;
@@ -982,10 +1064,12 @@ PHP_REDIS_API int redis_sock_read_multibulk_reply_zipped_with_flag(INTERNAL_FUNC
MAKE_STD_ZVAL(z_multi_result);
array_init(z_multi_result); /* pre-allocate array for multi's results. */
- redis_sock_read_multibulk_reply_loop(INTERNAL_FUNCTION_PARAM_PASSTHRU,
- redis_sock, z_multi_result, numElems, 1, flag ? UNSERIALIZE_ALL : UNSERIALIZE_ONLY_VALUES);
+ /* Grab our key, value, key, value array */
+ redis_mbulk_reply_loop(INTERNAL_FUNCTION_PARAM_PASSTHRU, redis_sock,
+ z_multi_result, numElems, unserialize);
- array_zip_values_and_scores(redis_sock, z_multi_result, 0 TSRMLS_CC);
+ /* Zip keys and values */
+ array_zip_values_and_scores(redis_sock, z_multi_result, decode TSRMLS_CC);
IF_MULTI_OR_PIPELINE() {
add_next_index_zval(z_tab, z_multi_result);
@@ -999,13 +1083,35 @@ PHP_REDIS_API int redis_sock_read_multibulk_reply_zipped_with_flag(INTERNAL_FUNC
return 0;
}
-PHP_REDIS_API int redis_sock_read_multibulk_reply_zipped(INTERNAL_FUNCTION_PARAMETERS, RedisSock *redis_sock, zval *z_tab, void *ctx) {
+/* Zipped key => value reply but we don't touch anything (e.g. CONFIG GET) */
+PHP_REDIS_API int redis_mbulk_reply_zipped_raw(INTERNAL_FUNCTION_PARAMETERS, RedisSock *redis_sock, zval *z_tab, void *ctx)
+{
+ return redis_mbulk_reply_zipped(INTERNAL_FUNCTION_PARAM_PASSTHRU, redis_sock,
+ z_tab, UNSERIALIZE_NONE, SCORE_DECODE_NONE);
+}
- return redis_sock_read_multibulk_reply_zipped_with_flag(INTERNAL_FUNCTION_PARAM_PASSTHRU, redis_sock, z_tab, 1);
+/* Zipped key => value reply unserializing keys and decoding the score as an integer (PUBSUB) */
+PHP_REDIS_API int redis_mbulk_reply_zipped_keys_int(INTERNAL_FUNCTION_PARAMETERS, RedisSock *redis_sock,
+ zval *z_tab, void *ctx)
+{
+ return redis_mbulk_reply_zipped(INTERNAL_FUNCTION_PARAM_PASSTHRU, redis_sock,
+ z_tab, UNSERIALIZE_KEYS, SCORE_DECODE_INT);
}
-PHP_REDIS_API int redis_sock_read_multibulk_reply_zipped_strings(INTERNAL_FUNCTION_PARAMETERS, RedisSock *redis_sock, zval *z_tab, void *ctx) {
- return redis_sock_read_multibulk_reply_zipped_with_flag(INTERNAL_FUNCTION_PARAM_PASSTHRU, redis_sock, z_tab, 0);
+/* Zipped key => value reply unserializing keys and decoding the score as a double (ZSET commands) */
+PHP_REDIS_API int redis_mbulk_reply_zipped_keys_dbl(INTERNAL_FUNCTION_PARAMETERS, RedisSock *redis_sock,
+ zval *z_tab, void *ctx)
+{
+ return redis_mbulk_reply_zipped(INTERNAL_FUNCTION_PARAM_PASSTHRU, redis_sock,
+ z_tab, UNSERIALIZE_KEYS, SCORE_DECODE_DOUBLE);
+}
+
+/* Zipped key => value reply where only the values are unserialized (e.g. HMGET) */
+PHP_REDIS_API int redis_mbulk_reply_zipped_vals(INTERNAL_FUNCTION_PARAMETERS, RedisSock *redis_sock,
+ zval *z_tab, void *ctx)
+{
+ return redis_mbulk_reply_zipped(INTERNAL_FUNCTION_PARAM_PASSTHRU, redis_sock,
+ z_tab, UNSERIALIZE_VALS, SCORE_DECODE_NONE);
}
PHP_REDIS_API void redis_1_response(INTERNAL_FUNCTION_PARAMETERS, RedisSock *redis_sock, zval *z_tab, void *ctx) {
@@ -1090,7 +1196,7 @@ PHP_REDIS_API void redis_ping_response(INTERNAL_FUNCTION_PARAMETERS, RedisSock *
}
/* Response for DEBUG object which is a formatted single line reply */
-PHP_REDIS_API void redis_debug_response(INTERNAL_FUNCTION_PARAMETERS, RedisSock *redis_sock,
+PHP_REDIS_API void redis_debug_response(INTERNAL_FUNCTION_PARAMETERS, RedisSock *redis_sock,
zval *z_tab, void *ctx)
{
char *resp, *p, *p2, *p3, *p4;
@@ -1116,7 +1222,7 @@ PHP_REDIS_API void redis_debug_response(INTERNAL_FUNCTION_PARAMETERS, RedisSock
while((p2 = strchr(p, ':'))!=NULL) {
/* Null terminate at the ':' */
*p2++ = '\0';
-
+
/* Null terminate at the space if we have one */
if((p3 = strchr(p2, ' '))!=NULL) {
*p3++ = '\0';
@@ -1138,7 +1244,7 @@ PHP_REDIS_API void redis_debug_response(INTERNAL_FUNCTION_PARAMETERS, RedisSock
} else {
add_assoc_string(z_result, p, p2, 1);
}
-
+
p = p3;
}
@@ -1421,8 +1527,8 @@ PHP_REDIS_API int redis_sock_read_multibulk_reply(INTERNAL_FUNCTION_PARAMETERS,
MAKE_STD_ZVAL(z_multi_result);
array_init(z_multi_result); /* pre-allocate array for multi's results. */
- redis_sock_read_multibulk_reply_loop(INTERNAL_FUNCTION_PARAM_PASSTHRU,
- redis_sock, z_multi_result, numElems, 1, UNSERIALIZE_ALL);
+ redis_mbulk_reply_loop(INTERNAL_FUNCTION_PARAM_PASSTHRU, redis_sock,
+ z_multi_result, numElems, UNSERIALIZE_ALL);
IF_MULTI_OR_PIPELINE() {
add_next_index_zval(z_tab, z_multi_result);
@@ -1437,7 +1543,7 @@ PHP_REDIS_API int redis_sock_read_multibulk_reply(INTERNAL_FUNCTION_PARAMETERS,
/**
* Like multibulk reply, but don't touch the values, they won't be compressed. (this is used by HKEYS).
*/
-PHP_REDIS_API int redis_sock_read_multibulk_reply_raw(INTERNAL_FUNCTION_PARAMETERS, RedisSock *redis_sock, zval *z_tab, void *ctx)
+PHP_REDIS_API int redis_mbulk_reply_raw(INTERNAL_FUNCTION_PARAMETERS, RedisSock *redis_sock, zval *z_tab, void *ctx)
{
char inbuf[1024];
int numElems;
@@ -1468,8 +1574,8 @@ PHP_REDIS_API int redis_sock_read_multibulk_reply_raw(INTERNAL_FUNCTION_PARAMETE
MAKE_STD_ZVAL(z_multi_result);
array_init(z_multi_result); /* pre-allocate array for multi's results. */
- redis_sock_read_multibulk_reply_loop(INTERNAL_FUNCTION_PARAM_PASSTHRU,
- redis_sock, z_multi_result, numElems, 0, UNSERIALIZE_ALL);
+ redis_mbulk_reply_loop(INTERNAL_FUNCTION_PARAM_PASSTHRU, redis_sock,
+ z_multi_result, numElems, UNSERIALIZE_NONE);
IF_MULTI_OR_PIPELINE() {
add_next_index_zval(z_tab, z_multi_result);
@@ -1481,6 +1587,42 @@ PHP_REDIS_API int redis_sock_read_multibulk_reply_raw(INTERNAL_FUNCTION_PARAMETE
return 0;
}
+PHP_REDIS_API void
+redis_mbulk_reply_loop(INTERNAL_FUNCTION_PARAMETERS, RedisSock *redis_sock,
+ zval *z_tab, int count, int unserialize)
+{
+ char *line;
+ int len;
+
+ while(count > 0) {
+ line = redis_sock_read(redis_sock, &len TSRMLS_CC);
+ if (line != NULL) {
+ zval *z = NULL;
+ int unwrap;
+
+ /* We will attempt unserialization, if we're unserializing everything,
+ * or if we're unserializing keys and we're on a key, or we're
+ * unserializing values and we're on a value! */
+ unwrap = unserialize == UNSERIALIZE_ALL ||
+ (unserialize == UNSERIALIZE_KEYS && count % 2 == 0) ||
+ (unserialize == UNSERIALIZE_VALS && count % 2 != 0);
+
+ if (unwrap && redis_unserialize(redis_sock, line, len, &z TSRMLS_CC)) {
+ efree(line);
+ add_next_index_zval(z_tab, z);
+ } else {
+ add_next_index_stringl(z_tab, line, len, 0);
+ }
+ } else {
+ add_next_index_bool(z_tab, 0);
+ }
+
+ count--;
+ }
+}
+
+
+/*
PHP_REDIS_API int
redis_sock_read_multibulk_reply_loop(INTERNAL_FUNCTION_PARAMETERS, RedisSock *redis_sock,
zval *z_tab, int numElems, int unwrap_key, int unserialize_even_only)
@@ -1509,16 +1651,16 @@ redis_sock_read_multibulk_reply_loop(INTERNAL_FUNCTION_PARAMETERS, RedisSock *re
}
return 0;
}
+*/
-/**
- * redis_sock_read_multibulk_reply_assoc
- */
-PHP_REDIS_API int redis_sock_read_multibulk_reply_assoc(INTERNAL_FUNCTION_PARAMETERS, RedisSock *redis_sock, zval *z_tab, void *ctx)
+/* Specialized multibulk processing for HMGET where we need to pair requested
+ * keys with their returned values */
+PHP_REDIS_API int redis_mbulk_reply_assoc(INTERNAL_FUNCTION_PARAMETERS, RedisSock *redis_sock, zval *z_tab, void *ctx)
{
char inbuf[1024], *response;
int response_len;
- int i, numElems;
- zval *z_multi_result;
+ int i, numElems;
+ zval *z_multi_result;
zval **z_keys = ctx;
@@ -1526,7 +1668,7 @@ PHP_REDIS_API int redis_sock_read_multibulk_reply_assoc(INTERNAL_FUNCTION_PARAME
return -1;
}
if(php_stream_gets(redis_sock->stream, inbuf, 1024) == NULL) {
- redis_stream_close(redis_sock TSRMLS_CC);
+ redis_stream_close(redis_sock TSRMLS_CC);
redis_sock->stream = NULL;
redis_sock->status = REDIS_SOCK_STATUS_FAILED;
redis_sock->mode = ATOMIC;
@@ -1550,30 +1692,30 @@ PHP_REDIS_API int redis_sock_read_multibulk_reply_assoc(INTERNAL_FUNCTION_PARAME
for(i = 0; i < numElems; ++i) {
response = redis_sock_read(redis_sock, &response_len TSRMLS_CC);
if(response != NULL) {
- zval *z = NULL;
- if(redis_unserialize(redis_sock, response, response_len, &z TSRMLS_CC) == 1) {
- efree(response);
- add_assoc_zval_ex(z_multi_result, Z_STRVAL_P(z_keys[i]), 1+Z_STRLEN_P(z_keys[i]), z);
- } else {
- add_assoc_stringl_ex(z_multi_result, Z_STRVAL_P(z_keys[i]), 1+Z_STRLEN_P(z_keys[i]), response, response_len, 0);
- }
- } else {
- add_assoc_bool_ex(z_multi_result, Z_STRVAL_P(z_keys[i]), 1+Z_STRLEN_P(z_keys[i]), 0);
- }
- zval_dtor(z_keys[i]);
- efree(z_keys[i]);
+ zval *z = NULL;
+ if(redis_unserialize(redis_sock, response, response_len, &z TSRMLS_CC) == 1) {
+ efree(response);
+ add_assoc_zval_ex(z_multi_result, Z_STRVAL_P(z_keys[i]), 1+Z_STRLEN_P(z_keys[i]), z);
+ } else {
+ add_assoc_stringl_ex(z_multi_result, Z_STRVAL_P(z_keys[i]), 1+Z_STRLEN_P(z_keys[i]), response, response_len, 0);
+ }
+ } else {
+ add_assoc_bool_ex(z_multi_result, Z_STRVAL_P(z_keys[i]), 1+Z_STRLEN_P(z_keys[i]), 0);
+ }
+ zval_dtor(z_keys[i]);
+ efree(z_keys[i]);
}
efree(z_keys);
IF_MULTI_OR_PIPELINE() {
add_next_index_zval(z_tab, z_multi_result);
} else {
- *return_value = *z_multi_result;
- zval_copy_ctor(return_value);
- INIT_PZVAL(return_value);
- zval_dtor(z_multi_result);
- efree(z_multi_result);
- }
+ *return_value = *z_multi_result;
+ zval_copy_ctor(return_value);
+ INIT_PZVAL(return_value);
+ zval_dtor(z_multi_result);
+ efree(z_multi_result);
+ }
return 0;
}
diff --git a/library.h b/library.h
index 652db6f4..2e2d770a 100644
--- a/library.h
+++ b/library.h
@@ -31,13 +31,16 @@ PHP_REDIS_API int redis_sock_disconnect(RedisSock *redis_sock TSRMLS_DC);
PHP_REDIS_API zval *redis_sock_read_multibulk_reply_zval(INTERNAL_FUNCTION_PARAMETERS, RedisSock *redis_sock);
PHP_REDIS_API char *redis_sock_read_bulk_reply(RedisSock *redis_sock, int bytes TSRMLS_DC);
PHP_REDIS_API int redis_sock_read_multibulk_reply(INTERNAL_FUNCTION_PARAMETERS, RedisSock *redis_sock, zval *_z_tab, void *ctx);
-PHP_REDIS_API int redis_sock_read_multibulk_reply_raw(INTERNAL_FUNCTION_PARAMETERS, RedisSock *redis_sock, zval *z_tab, void *ctx);
-PHP_REDIS_API int redis_sock_read_multibulk_reply_loop(INTERNAL_FUNCTION_PARAMETERS, RedisSock *redis_sock, zval *z_tab, int numElems, int unwrap_key, int unserialize_even_only);
-PHP_REDIS_API int redis_sock_read_multibulk_reply_zipped(INTERNAL_FUNCTION_PARAMETERS, RedisSock *redis_sock, zval *z_tab, void *ctx);
-PHP_REDIS_API int redis_sock_read_multibulk_reply_zipped_strings(INTERNAL_FUNCTION_PARAMETERS, RedisSock *redis_sock, zval *z_tab, void *ctx);
-PHP_REDIS_API int redis_sock_read_multibulk_reply_assoc(INTERNAL_FUNCTION_PARAMETERS, RedisSock *redis_sock, zval *z_tab, void *ctx);
-PHP_REDIS_API int redis_sock_read_scan_reply(INTERNAL_FUNCTION_PARAMETERS, RedisSock *redis_sock, REDIS_SCAN_TYPE type, long *iter);
+PHP_REDIS_API void redis_mbulk_reply_loop(INTERNAL_FUNCTION_PARAMETERS, RedisSock *redis_sock, zval *z_tab, int count, int unserialize);
+PHP_REDIS_API int redis_mbulk_reply_raw(INTERNAL_FUNCTION_PARAMETERS, RedisSock *redis_sock, zval *z_tab, void *ctx);
+PHP_REDIS_API int redis_mbulk_reply_zipped_raw(INTERNAL_FUNCTION_PARAMETERS, RedisSock *redis_sock, zval *z_tab, void *ctx);
+PHP_REDIS_API int redis_mbulk_reply_zipped_vals(INTERNAL_FUNCTION_PARAMETERS, RedisSock *redis_sock, zval *z_tab, void *ctx);
+PHP_REDIS_API int redis_mbulk_reply_zipped_keys_int(INTERNAL_FUNCTION_PARAMETERS, RedisSock *redis_sock, zval *z_tab, void *ctx);
+PHP_REDIS_API int redis_mbulk_reply_zipped_keys_dbl(INTERNAL_FUNCTION_PARAMETERS, RedisSock *redis_sock, zval *z_tab, void *ctx);
+PHP_REDIS_API int redis_mbulk_reply_assoc(INTERNAL_FUNCTION_PARAMETERS, RedisSock *redis_sock, zval *z_tab, void *ctx);
+
+PHP_REDIS_API int redis_sock_read_scan_reply(INTERNAL_FUNCTION_PARAMETERS, RedisSock *redis_sock, REDIS_SCAN_TYPE type, long *iter);
PHP_REDIS_API int redis_sock_write(RedisSock *redis_sock, char *cmd, size_t sz TSRMLS_DC);
PHP_REDIS_API void redis_stream_close(RedisSock *redis_sock TSRMLS_DC);
PHP_REDIS_API int redis_check_eof(RedisSock *redis_sock TSRMLS_DC);
diff --git a/php_redis.h b/php_redis.h
index e6ec1ef2..5054a321 100644
--- a/php_redis.h
+++ b/php_redis.h
@@ -235,7 +235,6 @@ PHP_REDIS_API void generic_empty_long_cmd(INTERNAL_FUNCTION_PARAMETERS, char *cm
PHP_REDIS_API void generic_subscribe_cmd(INTERNAL_FUNCTION_PARAMETERS, char *sub_cmd);
PHP_REDIS_API void generic_unsubscribe_cmd(INTERNAL_FUNCTION_PARAMETERS, char *unsub_cmd);
-PHP_REDIS_API void array_zip_values_and_scores(RedisSock *redis_sock, zval *z_tab, int use_atof TSRMLS_DC);
PHP_REDIS_API int redis_response_enqueued(RedisSock *redis_sock TSRMLS_DC);
PHP_REDIS_API int get_flag(zval *object TSRMLS_DC);
diff --git a/redis.c b/redis.c
index bde1f7d5..09f87301 100644
--- a/redis.c
+++ b/redis.c
@@ -311,8 +311,8 @@ static zend_function_entry redis_functions[] = {
PHP_MALIAS(Redis, srem, sRemove, NULL, ZEND_ACC_PUBLIC)
PHP_MALIAS(Redis, sismember, sContains, NULL, ZEND_ACC_PUBLIC)
PHP_MALIAS(Redis, zrevrange, zReverseRange, NULL, ZEND_ACC_PUBLIC)
-
- PHP_MALIAS(Redis, sendEcho, echo, NULL, ZEND_ACC_PUBLIC)
+
+ PHP_MALIAS(Redis, sendEcho, echo, NULL, ZEND_ACC_PUBLIC)
PHP_MALIAS(Redis, evaluate, eval, NULL, ZEND_ACC_PUBLIC)
PHP_MALIAS(Redis, evaluateSha, evalsha, NULL, ZEND_ACC_PUBLIC)
@@ -471,7 +471,7 @@ PHP_MINIT_FUNCTION(redis)
zend_class_entry redis_exception_class_entry;
REGISTER_INI_ENTRIES();
-
+
/* Redis class */
INIT_CLASS_ENTRY(redis_class_entry, "Redis", redis_functions);
redis_ce = zend_register_internal_class(&redis_class_entry TSRMLS_CC);
@@ -647,7 +647,7 @@ PHP_REDIS_API int redis_connect(INTERNAL_FUNCTION_PARAMETERS, int persistent) {
char *persistent_id = NULL;
int persistent_id_len = -1;
-
+
double timeout = 0.0;
RedisSock *redis_sock = NULL;
@@ -827,7 +827,7 @@ PHP_METHOD(Redis, bitcount)
/* }}} */
/* {{{ proto integer Redis::bitpos(string key, int bit, [int start], [int end]) */
-PHP_METHOD(Redis, bitpos)
+PHP_METHOD(Redis, bitpos)
{
zval *object;
RedisSock *redis_sock;
@@ -929,7 +929,7 @@ PHP_METHOD(Redis, set) {
/* Our optional argument can either be a long (to support legacy SETEX */
/* redirection), or an array with Redis >= 2.6.12 set options */
if(z_opts && Z_TYPE_P(z_opts) != IS_LONG && Z_TYPE_P(z_opts) != IS_ARRAY
- && Z_TYPE_P(z_opts) != IS_NULL)
+ && Z_TYPE_P(z_opts) != IS_NULL)
{
RETURN_FALSE;
}
@@ -1425,7 +1425,7 @@ PHP_METHOD(Redis, incrByFloat) {
/* Prefix key, format command, free old key if necissary */
key_free = redis_key_prefix(redis_sock, &key, &key_len TSRMLS_CC);
cmd_len = redis_cmd_format_static(&cmd, "INCRBYFLOAT", "sf", key, key_len, val);
- if(key_free) efree(key);
+ if(key_free) efree(key);
REDIS_PROCESS_REQUEST(redis_sock, cmd, cmd_len);
IF_ATOMIC() {
@@ -1688,12 +1688,11 @@ PHP_METHOD(Redis, getKeys)
REDIS_PROCESS_REQUEST(redis_sock, cmd, cmd_len);
IF_ATOMIC() {
- if (redis_sock_read_multibulk_reply_raw(INTERNAL_FUNCTION_PARAM_PASSTHRU,
- redis_sock, NULL, NULL) < 0) {
+ if (redis_mbulk_reply_raw(INTERNAL_FUNCTION_PARAM_PASSTHRU, redis_sock, NULL, NULL) < 0) {
RETURN_FALSE;
}
}
- REDIS_PROCESS_RESPONSE(redis_sock_read_multibulk_reply_raw);
+ REDIS_PROCESS_RESPONSE(redis_mbulk_reply_raw);
}
/* }}} */
@@ -1987,11 +1986,11 @@ PHP_METHOD(Redis, lInsert)
int pivot_len, position_len, key_len, val_len, cmd_len;
int val_free, pivot_free, key_free;
zval *z_value, *z_pivot;
-
+
if (zend_parse_method_parameters(ZEND_NUM_ARGS() TSRMLS_CC, getThis(), "Osszz",
&object, redis_ce,
- &key, &key_len,
+ &key, &key_len,
&position, &position_len,
&z_pivot,
&z_value) == FAILURE) {
@@ -2001,7 +2000,7 @@ PHP_METHOD(Redis, lInsert)
if (redis_sock_get(object, &redis_sock TSRMLS_CC, 0) < 0) {
RETURN_FALSE;
}
-
+
if(strncasecmp(position, "after", 5) == 0 || strncasecmp(position, "before", 6) == 0) {
key_free = redis_key_prefix(redis_sock, &key, &key_len TSRMLS_CC);
@@ -2012,15 +2011,15 @@ PHP_METHOD(Redis, lInsert)
if(key_free) efree(key);
if(pivot_free) STR_FREE(pivot);
- REDIS_PROCESS_REQUEST(redis_sock, cmd, cmd_len);
- IF_ATOMIC() {
- redis_long_response(INTERNAL_FUNCTION_PARAM_PASSTHRU, redis_sock, NULL, NULL);
- }
- REDIS_PROCESS_RESPONSE(redis_long_response);
+ REDIS_PROCESS_REQUEST(redis_sock, cmd, cmd_len);
+ IF_ATOMIC() {
+ redis_long_response(INTERNAL_FUNCTION_PARAM_PASSTHRU, redis_sock, NULL, NULL);
+ }
+ REDIS_PROCESS_RESPONSE(redis_long_response);
} else {
php_error_docref(NULL TSRMLS_CC, E_ERROR, "Error on position");
}
-
+
}
PHP_METHOD(Redis, lPushx)
@@ -2664,7 +2663,7 @@ PHP_REDIS_API int generic_multiple_args_cmd(INTERNAL_FUNCTION_PARAMETERS, char *
if(has_timeout && Z_TYPE_P(z_args[argc - 1]) != IS_LONG) {
php_error_docref(NULL TSRMLS_CC, E_ERROR, "Syntax error on timeout");
}
-
+
for(i = 0, j = 0; i < argc; ++i) { /* store each key */
if(!all_keys && j != 0) { /* not just operating on keys */
@@ -2678,7 +2677,7 @@ PHP_REDIS_API int generic_multiple_args_cmd(INTERNAL_FUNCTION_PARAMETERS, char *
}
} else {
-
+
if(Z_TYPE_P(z_args[i]) != IS_STRING) {
convert_to_string(z_args[i]);
}
@@ -2702,7 +2701,7 @@ PHP_REDIS_API int generic_multiple_args_cmd(INTERNAL_FUNCTION_PARAMETERS, char *
cmd = emalloc(cmd_len+1);
sprintf(cmd, "*%d" _NL "$%d" _NL "%s" _NL, 1+real_argc, keyword_len, keyword);
-
+
pos = 1 +integer_length(real_argc + 1) + 2
+ 1 + integer_length(keyword_len) + 2
+ keyword_len + 2;
@@ -4019,9 +4018,9 @@ PHP_METHOD(Redis, zRange)
REDIS_PROCESS_REQUEST(redis_sock, cmd, cmd_len);
if(withscores) {
IF_ATOMIC() {
- redis_sock_read_multibulk_reply_zipped(INTERNAL_FUNCTION_PARAM_PASSTHRU, redis_sock, NULL, NULL);
+ redis_mbulk_reply_zipped_keys_dbl(INTERNAL_FUNCTION_PARAM_PASSTHRU, redis_sock, NULL, NULL);
}
- REDIS_PROCESS_RESPONSE(redis_sock_read_multibulk_reply_zipped);
+ REDIS_PROCESS_RESPONSE(redis_mbulk_reply_zipped_keys_dbl);
} else {
IF_ATOMIC() {
if (redis_sock_read_multibulk_reply(INTERNAL_FUNCTION_PARAM_PASSTHRU,
@@ -4149,9 +4148,9 @@ PHP_METHOD(Redis, zReverseRange)
REDIS_PROCESS_REQUEST(redis_sock, cmd, cmd_len);
if(withscores) {
IF_ATOMIC() {
- redis_sock_read_multibulk_reply_zipped(INTERNAL_FUNCTION_PARAM_PASSTHRU, redis_sock, NULL, NULL);
+ redis_mbulk_reply_zipped_keys_dbl(INTERNAL_FUNCTION_PARAM_PASSTHRU, redis_sock, NULL, NULL);
}
- REDIS_PROCESS_RESPONSE(redis_sock_read_multibulk_reply_zipped);
+ REDIS_PROCESS_RESPONSE(redis_mbulk_reply_zipped_keys_dbl);
} else {
IF_ATOMIC() {
if (redis_sock_read_multibulk_reply(INTERNAL_FUNCTION_PARAM_PASSTHRU,
@@ -4243,11 +4242,11 @@ redis_generic_zrange_by_score(INTERNAL_FUNCTION_PARAMETERS, char *keyword) {
* we want [elt0 => val0, elt1 => val1], etc.
*/
IF_ATOMIC() {
- if(redis_sock_read_multibulk_reply_zipped(INTERNAL_FUNCTION_PARAM_PASSTHRU, redis_sock, NULL, NULL) < 0) {
+ if(redis_mbulk_reply_zipped_keys_dbl(INTERNAL_FUNCTION_PARAM_PASSTHRU, redis_sock, NULL, NULL) < 0) {
RETURN_FALSE;
}
}
- REDIS_PROCESS_RESPONSE(redis_sock_read_multibulk_reply_zipped);
+ REDIS_PROCESS_RESPONSE(redis_mbulk_reply_zipped_keys_dbl);
} else {
IF_ATOMIC() {
if(redis_sock_read_multibulk_reply(INTERNAL_FUNCTION_PARAM_PASSTHRU,
@@ -4855,12 +4854,11 @@ PHP_METHOD(Redis, hKeys)
RETURN_FALSE;
IF_ATOMIC() {
- if (redis_sock_read_multibulk_reply_raw(INTERNAL_FUNCTION_PARAM_PASSTHRU,
- redis_sock, NULL, NULL) < 0) {
+ if (redis_mbulk_reply_raw(INTERNAL_FUNCTION_PARAM_PASSTHRU, redis_sock, NULL, NULL) < 0) {
RETURN_FALSE;
}
}
- REDIS_PROCESS_RESPONSE(redis_sock_read_multibulk_reply_raw);
+ REDIS_PROCESS_RESPONSE(redis_mbulk_reply_raw);
}
@@ -4889,72 +4887,12 @@ PHP_METHOD(Redis, hGetAll) {
RETURN_FALSE;
IF_ATOMIC() {
- if (redis_sock_read_multibulk_reply_zipped_strings(INTERNAL_FUNCTION_PARAM_PASSTHRU,
+ if (redis_mbulk_reply_zipped_vals(INTERNAL_FUNCTION_PARAM_PASSTHRU,
redis_sock, NULL, NULL) < 0) {
RETURN_FALSE;
}
}
- REDIS_PROCESS_RESPONSE(redis_sock_read_multibulk_reply_zipped_strings);
-}
-
-PHP_REDIS_API void array_zip_values_and_scores(RedisSock *redis_sock, zval *z_tab, int use_atof TSRMLS_DC) {
-
- zval *z_ret;
- HashTable *keytable;
-
- MAKE_STD_ZVAL(z_ret);
- array_init(z_ret);
- keytable = Z_ARRVAL_P(z_tab);
-
- for(zend_hash_internal_pointer_reset(keytable);
- zend_hash_has_more_elements(keytable) == SUCCESS;
- zend_hash_move_forward(keytable)) {
-
- char *tablekey, *hkey, *hval;
- unsigned int tablekey_len;
- int hkey_len;
- unsigned long idx;
- zval **z_key_pp, **z_value_pp;
-
- zend_hash_get_current_key_ex(keytable, &tablekey, &tablekey_len, &idx, 0, NULL);
- if(zend_hash_get_current_data(keytable, (void**)&z_key_pp) == FAILURE) {
- continue; /* this should never happen, according to the PHP people. */
- }
-
- /* get current value, a key */
- convert_to_string(*z_key_pp);
- hkey = Z_STRVAL_PP(z_key_pp);
- hkey_len = Z_STRLEN_PP(z_key_pp);
-
- /* move forward */
- zend_hash_move_forward(keytable);
-
- /* fetch again */
- zend_hash_get_current_key_ex(keytable, &tablekey, &tablekey_len, &idx, 0, NULL);
- if(zend_hash_get_current_data(keytable, (void**)&z_value_pp) == FAILURE) {
- continue; /* this should never happen, according to the PHP people. */
- }
-
- /* get current value, a hash value now. */
- hval = Z_STRVAL_PP(z_value_pp);
-
- if(use_atof) { /* zipping a score */
- add_assoc_double_ex(z_ret, hkey, 1+hkey_len, atof(hval));
- } else { /* add raw copy */
- zval *z = NULL;
- MAKE_STD_ZVAL(z);
- *z = **z_value_pp;
- zval_copy_ctor(z);
- add_assoc_zval_ex(z_ret, hkey, 1+hkey_len, z);
- }
- }
- /* replace */
- zval_dtor(z_tab);
- *z_tab = *z_ret;
- zval_copy_ctor(z_tab);
- zval_dtor(z_ret);
-
- efree(z_ret);
+ REDIS_PROCESS_RESPONSE(redis_mbulk_reply_zipped_vals);
}
PHP_METHOD(Redis, hIncrByFloat)
@@ -5076,7 +5014,7 @@ PHP_METHOD(Redis, hMget) {
/* Make sure the data is a long or string, and if it's a string that */
/* it isn't empty. There is no reason to send empty length members. */
if((Z_TYPE_PP(data) == IS_STRING && Z_STRLEN_PP(data)>0) ||
- Z_TYPE_PP(data) == IS_LONG)
+ Z_TYPE_PP(data) == IS_LONG)
{
/* This is a key we can ask for, copy it and set it in our array */
MAKE_STD_ZVAL(z_keys[valid]);
@@ -5113,9 +5051,9 @@ PHP_METHOD(Redis, hMget) {
/* Kick off our request */
REDIS_PROCESS_REQUEST(redis_sock, cmd.c, cmd.len);
IF_ATOMIC() {
- redis_sock_read_multibulk_reply_assoc(INTERNAL_FUNCTION_PARAM_PASSTHRU, redis_sock, NULL, z_keys);
+ redis_mbulk_reply_assoc(INTERNAL_FUNCTION_PARAM_PASSTHRU, redis_sock, NULL, z_keys);
}
- REDIS_PROCESS_RESPONSE_CLOSURE(redis_sock_read_multibulk_reply_assoc, z_keys);
+ REDIS_PROCESS_RESPONSE_CLOSURE(redis_mbulk_reply_assoc, z_keys);
}
PHP_METHOD(Redis, hMset)
@@ -5161,7 +5099,7 @@ PHP_METHOD(Redis, hMset)
unsigned long idx;
int type;
zval **z_value_p;
-
+
char *hval;
int hval_len, hval_free;
@@ -5356,7 +5294,7 @@ free_reply_callbacks(zval *z_this, RedisSock *redis_sock) {
fold_item *fi;
fold_item *head = redis_sock->head;
request_item *ri;
-
+
for(fi = head; fi; ) {
fold_item *fi_next = fi->next;
free(fi);
@@ -5503,9 +5441,9 @@ PHP_METHOD(Redis, pipeline)
RETURN_ZVAL(getThis(), 1, 0);
}
-/*
- publish channel message
- @return the number of subscribers
+/*
+ publish channel message
+ @return the number of subscribers
*/
PHP_METHOD(Redis, publish)
{
@@ -5551,10 +5489,10 @@ PHP_REDIS_API void generic_subscribe_cmd(INTERNAL_FUNCTION_PARAMETERS, char *sub
zend_fcall_info_cache z_callback_cache;
zval *z_ret, **z_args[4];
-
+
if (zend_parse_method_parameters(ZEND_NUM_ARGS() TSRMLS_CC, getThis(), "Oaf",
&object, redis_ce, &array, &z_callback, &z_callback_cache) == FAILURE) {
- RETURN_FALSE;
+ RETURN_FALSE;
}
if (redis_sock_get(object, &redis_sock TSRMLS_CC, 0) < 0) {
@@ -5606,9 +5544,9 @@ PHP_REDIS_API void generic_subscribe_cmd(INTERNAL_FUNCTION_PARAMETERS, char *sub
RETURN_FALSE;
}
efree(cmd);
-
+
/* read the status of the execution of the command `subscribe` */
-
+
z_tab = redis_sock_read_multibulk_reply_zval(INTERNAL_FUNCTION_PARAM_PASSTHRU, redis_sock);
if(z_tab == NULL) {
RETURN_FALSE;
@@ -5618,14 +5556,14 @@ PHP_REDIS_API void generic_subscribe_cmd(INTERNAL_FUNCTION_PARAMETERS, char *sub
type_response = Z_STRVAL_PP(tmp);
if(strcmp(type_response, sub_cmd) != 0) {
efree(tmp);
- efree(z_tab);
+ efree(z_tab);
RETURN_FALSE;
- }
+ }
} else {
- efree(z_tab);
+ efree(z_tab);
RETURN_FALSE;
}
- efree(z_tab);
+ efree(z_tab);
/* Set a pointer to our return value and to our arguments. */
z_callback.retval_ptr_ptr = &z_ret;
@@ -5633,12 +5571,12 @@ PHP_REDIS_API void generic_subscribe_cmd(INTERNAL_FUNCTION_PARAMETERS, char *sub
z_callback.no_separation = 0;
/* Multibulk Response, format : {message type, originating channel, message payload} */
- while(1) {
+ while(1) {
/* call the callback with this z_tab in argument */
int is_pmsg, tab_idx = 1;
zval **type, **channel, **pattern, **data;
z_tab = redis_sock_read_multibulk_reply_zval(INTERNAL_FUNCTION_PARAM_PASSTHRU, redis_sock);
-
+
if(z_tab == NULL || Z_TYPE_P(z_tab) != IS_ARRAY) {
/*ERROR */
break;
@@ -5715,7 +5653,7 @@ PHP_METHOD(Redis, subscribe) {
generic_subscribe_cmd(INTERNAL_FUNCTION_PARAM_PASSTHRU, "subscribe");
}
-/**
+/**
* [p]unsubscribe channel_0 channel_1 ... channel_n
* [p]unsubscribe(array(channel_0, channel_1, ..., channel_n))
* response format :
@@ -5735,13 +5673,13 @@ PHP_REDIS_API void generic_unsubscribe_cmd(INTERNAL_FUNCTION_PARAMETERS, char *u
RedisSock *redis_sock;
char *cmd = "", *old_cmd = NULL;
int cmd_len, array_count;
-
+
int i;
zval *z_tab, **z_channel;
-
- if (zend_parse_method_parameters(ZEND_NUM_ARGS() TSRMLS_CC, getThis(), "Oa",
+
+ if (zend_parse_method_parameters(ZEND_NUM_ARGS() TSRMLS_CC, getThis(), "Oa",
&object, redis_ce, &array) == FAILURE) {
- RETURN_FALSE;
+ RETURN_FALSE;
}
if (redis_sock_get(object, &redis_sock TSRMLS_CC, 0) < 0) {
RETURN_FALSE;
@@ -5787,10 +5725,10 @@ PHP_REDIS_API void generic_unsubscribe_cmd(INTERNAL_FUNCTION_PARAMETERS, char *u
while( i <= array_count) {
z_tab = redis_sock_read_multibulk_reply_zval(INTERNAL_FUNCTION_PARAM_PASSTHRU, redis_sock);
- if(Z_TYPE_P(z_tab) == IS_ARRAY) {
+ if(Z_TYPE_P(z_tab) == IS_ARRAY) {
if (zend_hash_index_find(Z_ARRVAL_P(z_tab), 1, (void**)&z_channel) == FAILURE) {
RETURN_FALSE;
- }
+ }
add_assoc_bool(return_value, Z_STRVAL_PP(z_channel), 1);
} else {
/*error */
@@ -6030,9 +5968,9 @@ PHP_METHOD(Redis, config)
REDIS_PROCESS_REQUEST(redis_sock, cmd, cmd_len)
IF_ATOMIC() {
- redis_sock_read_multibulk_reply_zipped_strings(INTERNAL_FUNCTION_PARAM_PASSTHRU, redis_sock, NULL, NULL);
+ redis_mbulk_reply_zipped_raw(INTERNAL_FUNCTION_PARAM_PASSTHRU, redis_sock, NULL, NULL);
}
- REDIS_PROCESS_RESPONSE(redis_sock_read_multibulk_reply_zipped_strings);
+ REDIS_PROCESS_RESPONSE(redis_mbulk_reply_zipped_raw);
} else if(mode == CFG_SET && val != NULL) {
cmd_len = redis_cmd_format_static(&cmd, "CONFIG", "sss", op, op_len, key, key_len, val, val_len);
@@ -6110,9 +6048,9 @@ PHP_METHOD(Redis, wait) {
int cmd_len;
/* Make sure arguments are valid */
- if(zend_parse_method_parameters(ZEND_NUM_ARGS() TSRMLS_CC, getThis(), "Oll",
+ if(zend_parse_method_parameters(ZEND_NUM_ARGS() TSRMLS_CC, getThis(), "Oll",
&object, redis_ce, &num_slaves, &timeout)
- ==FAILURE)
+ ==FAILURE)
{
RETURN_FALSE;
}
@@ -6146,7 +6084,7 @@ redis_build_pubsub_cmd(RedisSock *redis_sock, char **ret, PUBSUB_TYPE type,
zval *arg TSRMLS_DC)
{
HashTable *ht_chan;
- HashPosition ptr;
+ HashPosition ptr;
zval **z_ele;
char *key;
int cmd_len, key_len, key_free;
@@ -6176,7 +6114,7 @@ redis_build_pubsub_cmd(RedisSock *redis_sock, char **ret, PUBSUB_TYPE type,
}
} else if(type == PUBSUB_NUMSUB) {
ht_chan = Z_ARRVAL_P(arg);
-
+
/* Add PUBSUB and NUMSUB bits */
redis_cmd_init_sstr(&cmd, zend_hash_num_elements(ht_chan)+1, "PUBSUB", sizeof("PUBSUB")-1);
redis_cmd_append_sstr(&cmd, "NUMSUB", sizeof("NUMSUB")-1);
@@ -6245,9 +6183,9 @@ PHP_METHOD(Redis, pubsub) {
zval *arg=NULL;
/* Parse arguments */
- if(zend_parse_method_parameters(ZEND_NUM_ARGS() TSRMLS_CC, getThis(), "Os|z",
+ if(zend_parse_method_parameters(ZEND_NUM_ARGS() TSRMLS_CC, getThis(), "Os|z",
&object, redis_ce, &keyword, &kw_len, &arg)
- ==FAILURE)
+ ==FAILURE)
{
RETURN_FALSE;
}
@@ -6262,7 +6200,7 @@ PHP_METHOD(Redis, pubsub) {
} else if(!strncasecmp(keyword, "numsub", sizeof("numsub"))) {
/* One array argument */
if(ZEND_NUM_ARGS() < 2 || Z_TYPE_P(arg) != IS_ARRAY ||
- zend_hash_num_elements(Z_ARRVAL_P(arg))==0)
+ zend_hash_num_elements(Z_ARRVAL_P(arg))==0)
{
RETURN_FALSE;
}
@@ -6286,11 +6224,11 @@ PHP_METHOD(Redis, pubsub) {
if(type == PUBSUB_NUMSUB) {
IF_ATOMIC() {
- if(redis_sock_read_multibulk_reply_zipped(INTERNAL_FUNCTION_PARAM_PASSTHRU, redis_sock, NULL, NULL)<0) {
+ if(redis_mbulk_reply_zipped_keys_int(INTERNAL_FUNCTION_PARAM_PASSTHRU, redis_sock, NULL, NULL)<0) {
RETURN_FALSE;
}
}
- REDIS_PROCESS_RESPONSE(redis_sock_read_multibulk_reply_zipped);
+ REDIS_PROCESS_RESPONSE(redis_mbulk_reply_zipped_keys_int);
} else {
IF_ATOMIC() {
if(redis_read_variant_reply(INTERNAL_FUNCTION_PARAM_PASSTHRU, redis_sock, NULL)<0) {
@@ -6572,7 +6510,7 @@ PHP_METHOD(Redis, debug) {
char *cmd, *key;
int cmd_len, key_len, key_free;
- if(zend_parse_method_parameters(ZEND_NUM_ARGS() TSRMLS_CC, getThis(), "Os",
+ if(zend_parse_method_parameters(ZEND_NUM_ARGS() TSRMLS_CC, getThis(), "Os",
&object, redis_ce, &key, &key_len)==FAILURE)
{
RETURN_FALSE;
@@ -6643,7 +6581,7 @@ PHP_METHOD(Redis, migrate) {
/* Parse arguments */
if(zend_parse_method_parameters(ZEND_NUM_ARGS() TSRMLS_CC, getThis(), "Oslsll|bb", &object, redis_ce,
- &host, &host_len, &port, &key, &key_len, &dest_db, &timeout,
+ &host, &host_len, &port, &key, &key_len, &dest_db, &timeout,
&copy, &replace) == FAILURE) {
RETURN_FALSE;
}
@@ -6658,19 +6596,19 @@ PHP_METHOD(Redis, migrate) {
/* Construct our command */
if(copy && replace) {
- cmd_len = redis_cmd_format_static(&cmd, "MIGRATE", "sdsddss", host, host_len, port,
- key, key_len, dest_db, timeout, "COPY",
+ cmd_len = redis_cmd_format_static(&cmd, "MIGRATE", "sdsddss", host, host_len, port,
+ key, key_len, dest_db, timeout, "COPY",
sizeof("COPY")-1, "REPLACE", sizeof("REPLACE")-1);
} else if(copy) {
cmd_len = redis_cmd_format_static(&cmd, "MIGRATE", "sdsdds", host, host_len, port,
- key, key_len, dest_db, timeout, "COPY",
+ key, key_len, dest_db, timeout, "COPY",
sizeof("COPY")-1);
} else if(replace) {
cmd_len = redis_cmd_format_static(&cmd, "MIGRATE", "sdsdds", host, host_len, port,
key, key_len, dest_db, timeout, "REPLACE",
sizeof("REPLACE")-1);
} else {
- cmd_len = redis_cmd_format_static(&cmd, "MIGRATE", "sdsdd", host, host_len, port,
+ cmd_len = redis_cmd_format_static(&cmd, "MIGRATE", "sdsdd", host, host_len, port,
key, key_len, dest_db, timeout);
}
@@ -6851,11 +6789,11 @@ PHP_METHOD(Redis, time) {
/* Execute or queue command */
REDIS_PROCESS_REQUEST(redis_sock, cmd, cmd_len);
IF_ATOMIC() {
- if(redis_sock_read_multibulk_reply_raw(INTERNAL_FUNCTION_PARAM_PASSTHRU, redis_sock, NULL, NULL) < 0) {
+ if(redis_mbulk_reply_raw(INTERNAL_FUNCTION_PARAM_PASSTHRU, redis_sock, NULL, NULL) < 0) {
RETURN_FALSE;
}
}
- REDIS_PROCESS_RESPONSE(redis_sock_read_multibulk_reply_raw);
+ REDIS_PROCESS_RESPONSE(redis_mbulk_reply_raw);
}
/*
@@ -6989,8 +6927,8 @@ PHP_METHOD(Redis, client) {
int cmd_len, opt_len, arg_len;
/* Parse our method parameters */
- if(zend_parse_method_parameters(ZEND_NUM_ARGS() TSRMLS_CC, getThis(), "Os|s",
- &object, redis_ce, &opt, &opt_len, &arg, &arg_len) == FAILURE)
+ if(zend_parse_method_parameters(ZEND_NUM_ARGS() TSRMLS_CC, getThis(), "Os|s",
+ &object, redis_ce, &opt, &opt_len, &arg, &arg_len) == FAILURE)
{
RETURN_FALSE;
}
@@ -7003,7 +6941,7 @@ PHP_METHOD(Redis, client) {
/* Build our CLIENT command */
if(ZEND_NUM_ARGS() == 2) {
cmd_len = redis_cmd_format_static(&cmd, "CLIENT", "ss", opt, opt_len,
- arg, arg_len);
+ arg, arg_len);
} else {
cmd_len = redis_cmd_format_static(&cmd, "CLIENT", "s", opt, opt_len);
}
diff --git a/tests/TestRedis.php b/tests/TestRedis.php
index 9bbef4da..c6955b69 100644
--- a/tests/TestRedis.php
+++ b/tests/TestRedis.php
@@ -88,7 +88,7 @@ class Redis_Test extends TestSuite
$this->assertTrue(is_array($result));
// PUBSUB NUMSUB
-
+
$c1 = uniqid() . '-' . rand(1,100);
$c2 = uniqid() . '-' . rand(1,100);
@@ -101,7 +101,7 @@ class Redis_Test extends TestSuite
// Make sure the elements are correct, and have zero counts
foreach(Array($c1,$c2) as $channel) {
$this->assertTrue(isset($result[$channel]));
- $this->assertEquals($result[$channel], "0");
+ $this->assertEquals($result[$channel], 0);
}
// PUBSUB NUMPAT
@@ -218,7 +218,7 @@ class Redis_Test extends TestSuite
$this->assertEquals('val', $this->redis->get('key2'));
$value = 'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA';
-
+
$this->redis->set('key2', $value);
$this->assertEquals($value, $this->redis->get('key2'));
$this->assertEquals($value, $this->redis->get('key2'));
@@ -528,7 +528,7 @@ class Redis_Test extends TestSuite
}
$this->redis->delete('key');
-
+
$this->redis->set('key', 0);
$this->redis->incrbyfloat('key', 1.5);
@@ -1227,9 +1227,9 @@ class Redis_Test extends TestSuite
}
}
- //
+ //
// With and without count, while serializing
- //
+ //
$this->redis->delete('set0');
$this->redis->setOption(Redis::OPT_SERIALIZER, Redis::SERIALIZER_PHP);
@@ -1253,11 +1253,11 @@ class Redis_Test extends TestSuite
public function testSRandMemberWithCount() {
// Make sure the set is nuked
$this->redis->delete('set0');
-
+
// Run with a count (positive and negative) on an empty set
$ret_pos = $this->redis->sRandMember('set0', 10);
$ret_neg = $this->redis->sRandMember('set0', -10);
-
+
// Should both be empty arrays
$this->assertTrue(is_array($ret_pos) && empty($ret_pos));
$this->assertTrue(is_array($ret_neg) && empty($ret_neg));
@@ -1845,10 +1845,10 @@ class Redis_Test extends TestSuite
// We should have found our connection
$this->assertFalse(empty($str_addr));
-
+
/* CLIENT GETNAME */
$this->assertTrue($this->redis->client('getname'), 'phpredis_unit_tests');
-
+
/* CLIENT KILL -- phpredis will reconnect, so we can do this */
$this->assertTrue($this->redis->client('kill', $str_addr));
}
@@ -2037,14 +2037,13 @@ class Redis_Test extends TestSuite
}
public function testZAddFirstArg() {
+ $zsetName = 100; // Make sure int keys work
+ $this->redis->delete($zsetName);
- $this->redis->delete('key');
-
- $zsetName = 100; // not a string!
- $this->assertTrue(1 === $this->redis->zAdd($zsetName, 0, 'val0'));
- $this->assertTrue(1 === $this->redis->zAdd($zsetName, 1, 'val1'));
+ $this->assertEquals(1, $this->redis->zAdd($zsetName, 0, 'val0'));
+ $this->assertEquals(1, $this->redis->zAdd($zsetName, 1, 'val1'));
- $this->assertTrue(array('val0', 'val1') === $this->redis->zRange($zsetName, 0, -1));
+ $this->assertTrue(array('val0', 'val1') === $this->redis->zRange($zsetName, 0, -1));
}
public function testZX() {
@@ -4496,7 +4495,7 @@ class Redis_Test extends TestSuite
public function testSerialize() {
$vals = Array(1, 1.5, 'one', Array('here','is','an','array'));
-
+
// Test with no serialization at all
$this->assertTrue($this->redis->_serialize('test') === 'test');
$this->assertTrue($this->redis->_serialize(1) === '1');
@@ -4509,7 +4508,7 @@ class Redis_Test extends TestSuite
}
foreach($arr_serializers as $mode) {
- $arr_enc = Array();
+ $arr_enc = Array();
$arr_dec = Array();
foreach($vals as $k => $v) {
@@ -4679,7 +4678,7 @@ class Redis_Test extends TestSuite
$this->markTestSkipped();
return;
}
-
+
// Never get empty sets
$this->redis->setOption(Redis::OPT_SCAN, Redis::SCAN_RETRY);
@@ -4688,7 +4687,7 @@ class Redis_Test extends TestSuite
for($i=0;$i<100;$i++) {
if($i>3) {
- $this->redis->hset('hash', "member:$i", "value:$i");
+ $this->redis->hset('hash', "member:$i", "value:$i");
} else {
$this->redis->hset('hash', "foomember:$i", "value:$i");
$i_foo_mems++;
@@ -4766,7 +4765,7 @@ class Redis_Test extends TestSuite
} else {
$this->redis->zadd('zset', $i, "mem:$i");
}
-
+
$i_tot_score += $i;
}
@@ -4778,8 +4777,9 @@ class Redis_Test extends TestSuite
$i--;
}
}
+
$this->assertEquals(0, $i);
- $this->assertEquals(0, $i_tot_score);
+ $this->assertEquals(0.0, $i_tot_score);
// Just scan "pmem" members
$it = NULL;
@@ -4791,7 +4791,7 @@ class Redis_Test extends TestSuite
$i_p_count -= 1;
}
}
- $this->assertEquals(0, $i_p_score);
+ $this->assertEquals(0.0, $i_p_score);
$this->assertEquals(0, $i_p_count);
// Turn off retrying and we should get some empty results
@@ -4809,7 +4809,7 @@ class Redis_Test extends TestSuite
}
// We should still get all the keys, just with several empty results
$this->assertTrue($i_skips > 0);
- $this->assertEquals(0, $i_p_score);
+ $this->assertEquals(0.0, $i_p_score);
$this->assertEquals(0, $i_p_count);
}
}