11#include "common.h"
22
3- PHPAPI void redis_check_eof (RedisSock * redis_sock TSRMLS_DC )
3+ PHPAPI void redis_check_eof (RedisSock * redis_sock TSRMLS_DC )
44{
55
66 int eof = php_stream_eof (redis_sock -> stream );
@@ -63,8 +63,8 @@ PHPAPI char *redis_sock_read(RedisSock *redis_sock, int *buf_len TSRMLS_DC)
6363 return NULL ;
6464
6565 case '+' :
66- case ':' :
67- // Single Line Reply
66+ case ':' :
67+ // Single Line Reply
6868 /* :123\r\n */
6969 * buf_len = strlen (inbuf ) - 2 ;
7070 if (* buf_len >= 2 ) {
@@ -188,7 +188,7 @@ redis_cmd_format(char **ret, char *format, ...) {
188188 }
189189 if (stage == 1 ) {
190190 sprintf ((* ret ) + total , "%d" , i );
191- }
191+ }
192192 total += sz ;
193193 break ;
194194 }
@@ -215,7 +215,7 @@ redis_cmd_format(char **ret, char *format, ...) {
215215PHPAPI void redis_bulk_double_response (INTERNAL_FUNCTION_PARAMETERS , RedisSock * redis_sock , zval * z_tab TSRMLS_DC ) {
216216
217217 char * response ;
218- int response_len ;
218+ int response_len ;
219219
220220 zval * object = getThis ();
221221 if ((response = redis_sock_read (redis_sock , & response_len TSRMLS_CC )) == NULL ) {
@@ -293,21 +293,51 @@ PHPAPI void redis_long_response(INTERNAL_FUNCTION_PARAMETERS, RedisSock *redis_s
293293 }
294294}
295295
296+ PHPAPI int redis_sock_read_multibulk_reply_zipped_with_flag (INTERNAL_FUNCTION_PARAMETERS , RedisSock * redis_sock , zval * z_tab , int flag TSRMLS_DC ) {
296297
297- PHPAPI int redis_sock_read_multibulk_reply_zipped (INTERNAL_FUNCTION_PARAMETERS , RedisSock * redis_sock , zval * z_tab TSRMLS_DC ) {
298-
298+ /*
299299 int ret = redis_sock_read_multibulk_reply(INTERNAL_FUNCTION_PARAM_PASSTHRU, redis_sock, z_tab TSRMLS_CC);
300- array_zip_values_and_scores (return_value , 1 );
300+ array_zip_values_and_scores(return_value, 0);
301+ */
302+
303+ char inbuf [1024 ], * response ;
304+ int response_len ;
305+
306+ redis_check_eof (redis_sock TSRMLS_CC );
307+ php_stream_gets (redis_sock -> stream , inbuf , 1024 );
308+
309+ if (inbuf [0 ] != '*' ) {
310+ return -1 ;
311+ }
312+ int numElems = atoi (inbuf + 1 );
313+ zval * z_multi_result ;
314+ MAKE_STD_ZVAL (z_multi_result );
315+ array_init (z_multi_result ); /* pre-allocate array for multi's results. */
301316
302- return ret ;
317+ redis_sock_read_multibulk_reply_loop (INTERNAL_FUNCTION_PARAM_PASSTHRU ,
318+ redis_sock , z_multi_result , numElems );
319+
320+ array_zip_values_and_scores (z_multi_result , 0 );
321+
322+ zval * object = getThis ();
323+ IF_MULTI_OR_PIPELINE () {
324+ add_next_index_zval (z_tab , z_multi_result );
325+ } else {
326+ * return_value = * z_multi_result ;
327+ zval_copy_ctor (return_value );
328+ efree (z_multi_result );
329+ }
330+
331+ return 0 ;
303332}
304333
305- PHPAPI int redis_sock_read_multibulk_reply_zipped_strings (INTERNAL_FUNCTION_PARAMETERS , RedisSock * redis_sock , zval * z_tab TSRMLS_DC ) {
334+ PHPAPI int redis_sock_read_multibulk_reply_zipped (INTERNAL_FUNCTION_PARAMETERS , RedisSock * redis_sock , zval * z_tab TSRMLS_DC ) {
306335
307- int ret = redis_sock_read_multibulk_reply (INTERNAL_FUNCTION_PARAM_PASSTHRU , redis_sock , z_tab TSRMLS_CC );
308- array_zip_values_and_scores ( return_value , 0 );
336+ return redis_sock_read_multibulk_reply_zipped_with_flag (INTERNAL_FUNCTION_PARAM_PASSTHRU , redis_sock , z_tab , 1 );
337+ }
309338
310- return ret ;
339+ PHPAPI int redis_sock_read_multibulk_reply_zipped_strings (INTERNAL_FUNCTION_PARAMETERS , RedisSock * redis_sock , zval * z_tab TSRMLS_DC ) {
340+ return redis_sock_read_multibulk_reply_zipped_with_flag (INTERNAL_FUNCTION_PARAM_PASSTHRU , redis_sock , z_tab , 0 );
311341}
312342
313343PHPAPI void redis_1_response (INTERNAL_FUNCTION_PARAMETERS , RedisSock * redis_sock , zval * z_tab TSRMLS_DC ) {
@@ -487,7 +517,7 @@ PHPAPI int redis_sock_disconnect(RedisSock *redis_sock TSRMLS_DC)
487517 * redis_sock_read_multibulk_reply
488518 */
489519PHPAPI int redis_sock_read_multibulk_reply (INTERNAL_FUNCTION_PARAMETERS ,
490- RedisSock * redis_sock , zval * _z_tab TSRMLS_DC )
520+ RedisSock * redis_sock , zval * z_tab TSRMLS_DC )
491521{
492522 char inbuf [1024 ], * response ;
493523 int response_len ;
@@ -499,18 +529,21 @@ PHPAPI int redis_sock_read_multibulk_reply(INTERNAL_FUNCTION_PARAMETERS,
499529 return -1 ;
500530 }
501531 int numElems = atoi (inbuf + 1 );
502- zval * z_tab ;
503- MAKE_STD_ZVAL (z_tab );
504- array_init (z_tab );
532+ zval * z_multi_result ;
533+ MAKE_STD_ZVAL (z_multi_result );
534+ array_init (z_multi_result ); /* pre-allocate array for multi's results. */
505535
506536 redis_sock_read_multibulk_reply_loop (INTERNAL_FUNCTION_PARAM_PASSTHRU ,
507- redis_sock , z_tab , numElems );
537+ redis_sock , z_multi_result , numElems );
508538
509539 zval * object = getThis ();
510540 IF_MULTI_OR_PIPELINE () {
511- add_next_index_zval (_z_tab , z_tab );
541+ add_next_index_zval (z_tab , z_multi_result );
512542 }
513- * return_value = * z_tab ;
543+
544+ * return_value = * z_multi_result ;
545+ //zval_copy_ctor(return_value);
546+ // efree(z_multi_result);
514547 return 0 ;
515548}
516549
0 commit comments