1
1
#include "common.h"
2
2
3
- PHPAPI void redis_check_eof (RedisSock * redis_sock TSRMLS_DC )
3
+ PHPAPI void redis_check_eof (RedisSock * redis_sock TSRMLS_DC )
4
4
{
5
5
6
6
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)
63
63
return NULL ;
64
64
65
65
case '+' :
66
- case ':' :
67
- // Single Line Reply
66
+ case ':' :
67
+ // Single Line Reply
68
68
/* :123\r\n */
69
69
* buf_len = strlen (inbuf ) - 2 ;
70
70
if (* buf_len >= 2 ) {
@@ -188,7 +188,7 @@ redis_cmd_format(char **ret, char *format, ...) {
188
188
}
189
189
if (stage == 1 ) {
190
190
sprintf ((* ret ) + total , "%d" , i );
191
- }
191
+ }
192
192
total += sz ;
193
193
break ;
194
194
}
@@ -215,7 +215,7 @@ redis_cmd_format(char **ret, char *format, ...) {
215
215
PHPAPI void redis_bulk_double_response (INTERNAL_FUNCTION_PARAMETERS , RedisSock * redis_sock , zval * z_tab TSRMLS_DC ) {
216
216
217
217
char * response ;
218
- int response_len ;
218
+ int response_len ;
219
219
220
220
zval * object = getThis ();
221
221
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
293
293
}
294
294
}
295
295
296
+ PHPAPI int redis_sock_read_multibulk_reply_zipped_with_flag (INTERNAL_FUNCTION_PARAMETERS , RedisSock * redis_sock , zval * z_tab , int flag TSRMLS_DC ) {
296
297
297
- PHPAPI int redis_sock_read_multibulk_reply_zipped (INTERNAL_FUNCTION_PARAMETERS , RedisSock * redis_sock , zval * z_tab TSRMLS_DC ) {
298
-
298
+ /*
299
299
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. */
301
316
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 ;
303
332
}
304
333
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 ) {
306
335
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
+ }
309
338
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 );
311
341
}
312
342
313
343
PHPAPI 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)
487
517
* redis_sock_read_multibulk_reply
488
518
*/
489
519
PHPAPI 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 )
491
521
{
492
522
char inbuf [1024 ], * response ;
493
523
int response_len ;
@@ -499,18 +529,21 @@ PHPAPI int redis_sock_read_multibulk_reply(INTERNAL_FUNCTION_PARAMETERS,
499
529
return -1 ;
500
530
}
501
531
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. */
505
535
506
536
redis_sock_read_multibulk_reply_loop (INTERNAL_FUNCTION_PARAM_PASSTHRU ,
507
- redis_sock , z_tab , numElems );
537
+ redis_sock , z_multi_result , numElems );
508
538
509
539
zval * object = getThis ();
510
540
IF_MULTI_OR_PIPELINE () {
511
- add_next_index_zval (_z_tab , z_tab );
541
+ add_next_index_zval (z_tab , z_multi_result );
512
542
}
513
- * return_value = * z_tab ;
543
+
544
+ * return_value = * z_multi_result ;
545
+ //zval_copy_ctor(return_value);
546
+ // efree(z_multi_result);
514
547
return 0 ;
515
548
}
516
549
0 commit comments