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:
authorNicolas Favre-Felix <n.favrefelix@gmail.com>2012-01-02 20:03:53 +0400
committerNicolas Favre-Felix <n.favrefelix@gmail.com>2012-01-02 20:03:53 +0400
commit99387710de8a40dbbde270b3c675d932dd63d278 (patch)
tree83cbabf58a8e23a0f8a17e851fe50afa52882d8a /library.c
parent1a1a81bf62603fe0813b2697e06da84dc267be93 (diff)
parent39df0b7a2c3eed423c22412ad803af121a883900 (diff)
Merge branch 'master' of https://github.com/imvu/phpredis into imvu-master
Diffstat (limited to 'library.c')
-rw-r--r--library.c31
1 files changed, 25 insertions, 6 deletions
diff --git a/library.c b/library.c
index a1f7cebf..c924cf28 100644
--- a/library.c
+++ b/library.c
@@ -31,24 +31,25 @@ PHPAPI void redis_stream_close(RedisSock *redis_sock TSRMLS_DC) {
PHPAPI int redis_check_eof(RedisSock *redis_sock TSRMLS_DC)
{
-
- int eof = redis_sock->stream == NULL ? 1 : php_stream_eof(redis_sock->stream);
+ int eof = php_stream_eof(redis_sock->stream);
int count = 0;
while(eof) {
- if(count++ == 10) { /* too many failures */
+ if((MULTI == redis_sock->mode) || redis_sock->watching || count++ == 10) { /* too many failures */
if(redis_sock->stream) { /* close stream if still here */
- redis_stream_close(redis_sock TSRMLS_CC);
+ php_stream_close(redis_sock->stream);
redis_sock->stream = NULL;
redis_sock->mode = ATOMIC;
redis_sock->status = REDIS_SOCK_STATUS_FAILED;
+ redis_sock->watching = 0;
}
zend_throw_exception(redis_exception_ce, "Connection lost", 0 TSRMLS_CC);
return -1;
}
if(redis_sock->stream) { /* close existing stream before reconnecting */
- redis_stream_close(redis_sock TSRMLS_CC);
+ php_stream_close(redis_sock->stream);
redis_sock->stream = NULL;
redis_sock->mode = ATOMIC;
+ redis_sock->watching = 0;
}
redis_sock_connect(redis_sock TSRMLS_CC); /* reconnect */
if(redis_sock->stream) { /* check for EOF again. */
@@ -72,6 +73,7 @@ PHPAPI zval *redis_sock_read_multibulk_reply_zval(INTERNAL_FUNCTION_PARAMETERS,
redis_sock->stream = NULL;
redis_sock->status = REDIS_SOCK_STATUS_FAILED;
redis_sock->mode = ATOMIC;
+ redis_sock->watching = 0;
zend_throw_exception(redis_exception_ce, "read error on connection", 0 TSRMLS_CC);
return NULL;
}
@@ -146,6 +148,7 @@ PHPAPI char *redis_sock_read(RedisSock *redis_sock, int *buf_len TSRMLS_DC)
redis_sock->stream = NULL;
redis_sock->status = REDIS_SOCK_STATUS_FAILED;
redis_sock->mode = ATOMIC;
+ redis_sock->watching = 0;
zend_throw_exception(redis_exception_ce, "read error on connection", 0 TSRMLS_CC);
return NULL;
}
@@ -478,7 +481,7 @@ PHPAPI void redis_info_response(INTERNAL_FUNCTION_PARAMETERS, RedisSock *redis_s
}
}
-PHPAPI void redis_boolean_response(INTERNAL_FUNCTION_PARAMETERS, RedisSock *redis_sock, zval *z_tab, void *ctx) {
+PHPAPI void redis_boolean_response_impl(INTERNAL_FUNCTION_PARAMETERS, RedisSock *redis_sock, zval *z_tab, void *ctx, SuccessCallback success_callback) {
char *response;
int response_len;
@@ -496,12 +499,18 @@ PHPAPI void redis_boolean_response(INTERNAL_FUNCTION_PARAMETERS, RedisSock *redi
IF_MULTI_OR_PIPELINE() {
if (ret == '+') {
+ if (success_callback != NULL) {
+ success_callback(redis_sock);
+ }
add_next_index_bool(z_tab, 1);
} else {
add_next_index_bool(z_tab, 0);
}
} else {
if (ret == '+') {
+ if (success_callback != NULL) {
+ success_callback(redis_sock);
+ }
RETURN_TRUE;
} else {
RETURN_FALSE;
@@ -509,6 +518,10 @@ PHPAPI void redis_boolean_response(INTERNAL_FUNCTION_PARAMETERS, RedisSock *redi
}
}
+PHPAPI void redis_boolean_response(INTERNAL_FUNCTION_PARAMETERS, RedisSock *redis_sock, zval *z_tab, void *ctx) {
+ redis_boolean_response_impl(INTERNAL_FUNCTION_PARAM_PASSTHRU, redis_sock, z_tab, ctx, NULL);
+}
+
PHPAPI void redis_long_response(INTERNAL_FUNCTION_PARAMETERS, RedisSock *redis_sock, zval * z_tab, void *ctx) {
char *response;
@@ -570,6 +583,7 @@ PHPAPI int redis_sock_read_multibulk_reply_zipped_with_flag(INTERNAL_FUNCTION_PA
redis_sock->stream = NULL;
redis_sock->status = REDIS_SOCK_STATUS_FAILED;
redis_sock->mode = ATOMIC;
+ redis_sock->watching = 0;
zend_throw_exception(redis_exception_ce, "read error on connection", 0 TSRMLS_CC);
return -1;
}
@@ -701,6 +715,7 @@ PHPAPI RedisSock* redis_sock_create(char *host, int host_len, unsigned short por
redis_sock->host = estrndup(host, host_len);
redis_sock->stream = NULL;
redis_sock->status = REDIS_SOCK_STATUS_DISCONNECTED;
+ redis_sock->watching = 0;
redis_sock->persistent = persistent;
@@ -841,6 +856,7 @@ PHPAPI int redis_sock_disconnect(RedisSock *redis_sock TSRMLS_DC)
}
redis_sock->status = REDIS_SOCK_STATUS_DISCONNECTED;
+ redis_sock->watching = 0;
if(redis_sock->stream && !redis_sock->persistent) { /* still valid after the write? */
php_stream_close(redis_sock->stream);
}
@@ -893,6 +909,7 @@ PHPAPI int redis_sock_read_multibulk_reply(INTERNAL_FUNCTION_PARAMETERS, RedisSo
redis_sock->stream = NULL;
redis_sock->status = REDIS_SOCK_STATUS_FAILED;
redis_sock->mode = ATOMIC;
+ redis_sock->watching = 0;
zend_throw_exception(redis_exception_ce, "read error on connection", 0 TSRMLS_CC);
return -1;
}
@@ -934,6 +951,7 @@ PHPAPI int redis_sock_read_multibulk_reply_raw(INTERNAL_FUNCTION_PARAMETERS, Red
redis_sock->stream = NULL;
redis_sock->status = REDIS_SOCK_STATUS_FAILED;
redis_sock->mode = ATOMIC;
+ redis_sock->watching = 0;
zend_throw_exception(redis_exception_ce, "read error on connection", 0 TSRMLS_CC);
return -1;
}
@@ -1007,6 +1025,7 @@ PHPAPI int redis_sock_read_multibulk_reply_assoc(INTERNAL_FUNCTION_PARAMETERS, R
redis_sock->stream = NULL;
redis_sock->status = REDIS_SOCK_STATUS_FAILED;
redis_sock->mode = ATOMIC;
+ redis_sock->watching = 0;
zend_throw_exception(redis_exception_ce, "read error on connection", 0 TSRMLS_CC);
return -1;
}