@@ -31,24 +31,25 @@ PHPAPI void redis_stream_close(RedisSock *redis_sock TSRMLS_DC) {
31
31
32
32
PHPAPI int redis_check_eof (RedisSock * redis_sock TSRMLS_DC )
33
33
{
34
-
35
- int eof = redis_sock -> stream == NULL ? 1 : php_stream_eof (redis_sock -> stream );
34
+ int eof = php_stream_eof (redis_sock -> stream );
36
35
int count = 0 ;
37
36
while (eof ) {
38
- if (count ++ == 10 ) { /* too many failures */
37
+ if (( MULTI == redis_sock -> mode ) || redis_sock -> watching || count ++ == 10 ) { /* too many failures */
39
38
if (redis_sock -> stream ) { /* close stream if still here */
40
- redis_stream_close (redis_sock TSRMLS_CC );
39
+ php_stream_close (redis_sock -> stream );
41
40
redis_sock -> stream = NULL ;
42
41
redis_sock -> mode = ATOMIC ;
43
42
redis_sock -> status = REDIS_SOCK_STATUS_FAILED ;
43
+ redis_sock -> watching = 0 ;
44
44
}
45
45
zend_throw_exception (redis_exception_ce , "Connection lost" , 0 TSRMLS_CC );
46
46
return -1 ;
47
47
}
48
48
if (redis_sock -> stream ) { /* close existing stream before reconnecting */
49
- redis_stream_close (redis_sock TSRMLS_CC );
49
+ php_stream_close (redis_sock -> stream );
50
50
redis_sock -> stream = NULL ;
51
51
redis_sock -> mode = ATOMIC ;
52
+ redis_sock -> watching = 0 ;
52
53
}
53
54
redis_sock_connect (redis_sock TSRMLS_CC ); /* reconnect */
54
55
if (redis_sock -> stream ) { /* check for EOF again. */
@@ -72,6 +73,7 @@ PHPAPI zval *redis_sock_read_multibulk_reply_zval(INTERNAL_FUNCTION_PARAMETERS,
72
73
redis_sock -> stream = NULL ;
73
74
redis_sock -> status = REDIS_SOCK_STATUS_FAILED ;
74
75
redis_sock -> mode = ATOMIC ;
76
+ redis_sock -> watching = 0 ;
75
77
zend_throw_exception (redis_exception_ce , "read error on connection" , 0 TSRMLS_CC );
76
78
return NULL ;
77
79
}
@@ -146,6 +148,7 @@ PHPAPI char *redis_sock_read(RedisSock *redis_sock, int *buf_len TSRMLS_DC)
146
148
redis_sock -> stream = NULL ;
147
149
redis_sock -> status = REDIS_SOCK_STATUS_FAILED ;
148
150
redis_sock -> mode = ATOMIC ;
151
+ redis_sock -> watching = 0 ;
149
152
zend_throw_exception (redis_exception_ce , "read error on connection" , 0 TSRMLS_CC );
150
153
return NULL ;
151
154
}
@@ -478,7 +481,7 @@ PHPAPI void redis_info_response(INTERNAL_FUNCTION_PARAMETERS, RedisSock *redis_s
478
481
}
479
482
}
480
483
481
- PHPAPI void redis_boolean_response (INTERNAL_FUNCTION_PARAMETERS , RedisSock * redis_sock , zval * z_tab , void * ctx ) {
484
+ PHPAPI void redis_boolean_response_impl (INTERNAL_FUNCTION_PARAMETERS , RedisSock * redis_sock , zval * z_tab , void * ctx , SuccessCallback success_callback ) {
482
485
483
486
char * response ;
484
487
int response_len ;
@@ -496,19 +499,29 @@ PHPAPI void redis_boolean_response(INTERNAL_FUNCTION_PARAMETERS, RedisSock *redi
496
499
497
500
IF_MULTI_OR_PIPELINE () {
498
501
if (ret == '+' ) {
502
+ if (success_callback != NULL ) {
503
+ success_callback (redis_sock );
504
+ }
499
505
add_next_index_bool (z_tab , 1 );
500
506
} else {
501
507
add_next_index_bool (z_tab , 0 );
502
508
}
503
509
} else {
504
510
if (ret == '+' ) {
511
+ if (success_callback != NULL ) {
512
+ success_callback (redis_sock );
513
+ }
505
514
RETURN_TRUE ;
506
515
} else {
507
516
RETURN_FALSE ;
508
517
}
509
518
}
510
519
}
511
520
521
+ PHPAPI void redis_boolean_response (INTERNAL_FUNCTION_PARAMETERS , RedisSock * redis_sock , zval * z_tab , void * ctx ) {
522
+ redis_boolean_response_impl (INTERNAL_FUNCTION_PARAM_PASSTHRU , redis_sock , z_tab , ctx , NULL );
523
+ }
524
+
512
525
PHPAPI void redis_long_response (INTERNAL_FUNCTION_PARAMETERS , RedisSock * redis_sock , zval * z_tab , void * ctx ) {
513
526
514
527
char * response ;
@@ -570,6 +583,7 @@ PHPAPI int redis_sock_read_multibulk_reply_zipped_with_flag(INTERNAL_FUNCTION_PA
570
583
redis_sock -> stream = NULL ;
571
584
redis_sock -> status = REDIS_SOCK_STATUS_FAILED ;
572
585
redis_sock -> mode = ATOMIC ;
586
+ redis_sock -> watching = 0 ;
573
587
zend_throw_exception (redis_exception_ce , "read error on connection" , 0 TSRMLS_CC );
574
588
return -1 ;
575
589
}
@@ -701,6 +715,7 @@ PHPAPI RedisSock* redis_sock_create(char *host, int host_len, unsigned short por
701
715
redis_sock -> host = estrndup (host , host_len );
702
716
redis_sock -> stream = NULL ;
703
717
redis_sock -> status = REDIS_SOCK_STATUS_DISCONNECTED ;
718
+ redis_sock -> watching = 0 ;
704
719
705
720
redis_sock -> persistent = persistent ;
706
721
@@ -841,6 +856,7 @@ PHPAPI int redis_sock_disconnect(RedisSock *redis_sock TSRMLS_DC)
841
856
}
842
857
843
858
redis_sock -> status = REDIS_SOCK_STATUS_DISCONNECTED ;
859
+ redis_sock -> watching = 0 ;
844
860
if (redis_sock -> stream && !redis_sock -> persistent ) { /* still valid after the write? */
845
861
php_stream_close (redis_sock -> stream );
846
862
}
@@ -893,6 +909,7 @@ PHPAPI int redis_sock_read_multibulk_reply(INTERNAL_FUNCTION_PARAMETERS, RedisSo
893
909
redis_sock -> stream = NULL ;
894
910
redis_sock -> status = REDIS_SOCK_STATUS_FAILED ;
895
911
redis_sock -> mode = ATOMIC ;
912
+ redis_sock -> watching = 0 ;
896
913
zend_throw_exception (redis_exception_ce , "read error on connection" , 0 TSRMLS_CC );
897
914
return -1 ;
898
915
}
@@ -934,6 +951,7 @@ PHPAPI int redis_sock_read_multibulk_reply_raw(INTERNAL_FUNCTION_PARAMETERS, Red
934
951
redis_sock -> stream = NULL ;
935
952
redis_sock -> status = REDIS_SOCK_STATUS_FAILED ;
936
953
redis_sock -> mode = ATOMIC ;
954
+ redis_sock -> watching = 0 ;
937
955
zend_throw_exception (redis_exception_ce , "read error on connection" , 0 TSRMLS_CC );
938
956
return -1 ;
939
957
}
@@ -1007,6 +1025,7 @@ PHPAPI int redis_sock_read_multibulk_reply_assoc(INTERNAL_FUNCTION_PARAMETERS, R
1007
1025
redis_sock -> stream = NULL ;
1008
1026
redis_sock -> status = REDIS_SOCK_STATUS_FAILED ;
1009
1027
redis_sock -> mode = ATOMIC ;
1028
+ redis_sock -> watching = 0 ;
1010
1029
zend_throw_exception (redis_exception_ce , "read error on connection" , 0 TSRMLS_CC );
1011
1030
return -1 ;
1012
1031
}
0 commit comments