@@ -855,7 +855,6 @@ PHP_METHOD(Redis, delete)
855
855
1 , & redis_sock TSRMLS_CC );
856
856
zval * object = getThis ();
857
857
858
-
859
858
IF_ATOMIC () {
860
859
redis_long_response (INTERNAL_FUNCTION_PARAM_PASSTHRU , redis_sock , NULL TSRMLS_CC );
861
860
}
@@ -2670,7 +2669,10 @@ PHP_METHOD(Redis, zRange)
2670
2669
REDIS_PROCESS_RESPONSE (redis_sock_read_multibulk_reply_zipped );
2671
2670
} else {
2672
2671
IF_ATOMIC () {
2673
- redis_sock_read_multibulk_reply (INTERNAL_FUNCTION_PARAM_PASSTHRU , redis_sock , NULL TSRMLS_CC );
2672
+ if (redis_sock_read_multibulk_reply (INTERNAL_FUNCTION_PARAM_PASSTHRU ,
2673
+ redis_sock , NULL TSRMLS_CC ) < 0 ) {
2674
+ RETURN_FALSE ;
2675
+ }
2674
2676
}
2675
2677
REDIS_PROCESS_RESPONSE (redis_sock_read_multibulk_reply );
2676
2678
}
@@ -2790,9 +2792,9 @@ PHP_METHOD(Redis, zReverseRange)
2790
2792
"$%d" _NL\
2791
2793
"%s" _NL\
2792
2794
"$%d" _NL\
2793
- "%f " _NL\
2795
+ "%d " _NL\
2794
2796
"$%d" _NL\
2795
- "%f " _NL
2797
+ "%d " _NL
2796
2798
2797
2799
if (withscores ) {
2798
2800
cmd_len = redis_cmd_format (& cmd ,
@@ -2801,15 +2803,15 @@ PHP_METHOD(Redis, zReverseRange)
2801
2803
"$10" _NL
2802
2804
"WITHSCORES" _NL
2803
2805
, key_len , key , key_len
2804
- , double_length (start ), start
2805
- , double_length (end ), end );
2806
+ , integer_length (start ), start
2807
+ , integer_length (end ), end );
2806
2808
} else {
2807
2809
cmd_len = redis_cmd_format (& cmd ,
2808
2810
"*4" _NL
2809
2811
ZREVRANGE_FORMAT
2810
2812
, key_len , key , key_len
2811
- , double_length (start ), start
2812
- , double_length (end ), end );
2813
+ , integer_length (start ), start
2814
+ , integer_length (end ), end );
2813
2815
2814
2816
2815
2817
}
@@ -2823,7 +2825,10 @@ PHP_METHOD(Redis, zReverseRange)
2823
2825
REDIS_PROCESS_RESPONSE (redis_sock_read_multibulk_reply_zipped );
2824
2826
} else {
2825
2827
IF_ATOMIC () {
2826
- redis_sock_read_multibulk_reply (INTERNAL_FUNCTION_PARAM_PASSTHRU , redis_sock , NULL TSRMLS_CC );
2828
+ if (redis_sock_read_multibulk_reply (INTERNAL_FUNCTION_PARAM_PASSTHRU ,
2829
+ redis_sock , NULL TSRMLS_CC ) < 0 ) {
2830
+ RETURN_FALSE ;
2831
+ }
2827
2832
}
2828
2833
REDIS_PROCESS_RESPONSE (redis_sock_read_multibulk_reply );
2829
2834
}
@@ -2840,6 +2845,8 @@ PHP_METHOD(Redis, zRangeByScore)
2840
2845
int key_len , cmd_len , response_len ;
2841
2846
zend_bool withscores = 0 ;
2842
2847
double start , end ;
2848
+ int has_limit = 0 ;
2849
+ long limit_low , limit_high ;
2843
2850
2844
2851
if (zend_parse_method_parameters (ZEND_NUM_ARGS () TSRMLS_CC , getThis (), "Osdd|a" ,
2845
2852
& object , redis_ce ,
@@ -2863,26 +2870,87 @@ PHP_METHOD(Redis, zRangeByScore)
2863
2870
if (zend_hash_find (Z_ARRVAL_P (z_options ), "limit" , sizeof ("limit" ), (void * * )& z_limit_val_pp )== SUCCESS ) {;
2864
2871
if (zend_hash_num_elements (Z_ARRVAL_PP (z_limit_val_pp )) == 2 ) {
2865
2872
zval * * z_offset_pp , * * z_count_pp ;
2866
- /* get the two values from the table, check that they are indeed of LONG type */
2873
+ // get the two values from the table, check that they are indeed of LONG type
2867
2874
if (SUCCESS == zend_hash_index_find (Z_ARRVAL_PP (z_limit_val_pp ), 0 , (void * * )& z_offset_pp ) &&
2868
2875
SUCCESS == zend_hash_index_find (Z_ARRVAL_PP (z_limit_val_pp ), 1 , (void * * )& z_count_pp ) &&
2869
2876
Z_TYPE_PP (z_offset_pp ) == IS_LONG &&
2870
2877
Z_TYPE_PP (z_count_pp ) == IS_LONG ) {
2871
2878
2872
- spprintf (& limit , 0 , " LIMIT %ld %ld" , Z_LVAL_PP (z_offset_pp ), Z_LVAL_PP (z_count_pp ));
2879
+ has_limit = 1 ;
2880
+ limit_low = Z_LVAL_PP (z_offset_pp );
2881
+ limit_high = Z_LVAL_PP (z_count_pp );
2873
2882
}
2874
2883
}
2875
2884
}
2876
2885
}
2877
2886
2887
+ #define BASIC_FORMAT \
2888
+ "$13" _NL\
2889
+ "ZRANGEBYSCORE" _NL\
2890
+ \
2891
+ "$%d" _NL /* key_len */ \
2892
+ "%s" _NL /* key */ \
2893
+ \
2894
+ "$%d" _NL /* start_len */ \
2895
+ "%f" _NL /* start */ \
2896
+ \
2897
+ "$%d" _NL /* end_len */ \
2898
+ "%f" _NL /* end */
2899
+ #define BASIC_FORMAT_WITH_LIMIT BASIC_FORMAT \
2900
+ "$5" _NL \
2901
+ "LIMIT" _NL \
2902
+ \
2903
+ "$%d" _NL /* limit_low_len */ \
2904
+ "%d" _NL /* limit_low */ \
2905
+ \
2906
+ "$%d" _NL /* limit_high_len */ \
2907
+ "%d" _NL /* limit_high */
2908
+
2878
2909
if (withscores ) {
2879
- cmd_len = spprintf (& cmd , 0 , "ZRANGEBYSCORE %s %f %f%s WITHSCORES\r\n" , key , start , end , limit ?limit :"" );
2910
+ if (has_limit ) {
2911
+ cmd_len = redis_cmd_format (& cmd ,
2912
+ "*8" _NL
2913
+ BASIC_FORMAT_WITH_LIMIT
2914
+ "$10" _NL
2915
+ "WITHSCORES" _NL
2916
+ , key_len , key , key_len
2917
+ , double_length (start ), start
2918
+ , double_length (end ), end
2919
+ , integer_length (limit_low ), limit_low
2920
+ , integer_length (limit_high ), limit_high );
2921
+ } else {
2922
+ cmd_len = redis_cmd_format (& cmd ,
2923
+ "*5" _NL
2924
+ BASIC_FORMAT
2925
+ "$10" _NL
2926
+ "WITHSCORES" _NL
2927
+ , key_len , key , key_len
2928
+ , double_length (start ), start
2929
+ , double_length (end ), end );
2930
+ }
2880
2931
} else {
2881
- cmd_len = spprintf (& cmd , 0 , "ZRANGEBYSCORE %s %f %f%s\r\n" , key , start , end , limit ?limit :"" );
2882
- }
2883
- if (limit ) {
2884
- efree (limit );
2932
+
2933
+ if (has_limit ) {
2934
+
2935
+ cmd_len = redis_cmd_format (& cmd ,
2936
+ "*7" _NL
2937
+ BASIC_FORMAT_WITH_LIMIT
2938
+ , key_len , key , key_len
2939
+ , double_length (start ), start
2940
+ , double_length (end ), end
2941
+ , integer_length (limit_low ), limit_low
2942
+ , integer_length (limit_high ), limit_high );
2943
+ } else {
2944
+ cmd_len = redis_cmd_format (& cmd ,
2945
+ "*4" _NL
2946
+ BASIC_FORMAT
2947
+ , key_len , key , key_len
2948
+ , double_length (start ), start
2949
+ , double_length (end ), end );
2950
+ }
2885
2951
}
2952
+ #undef BASIC_FORMAT
2953
+ #undef BASIC_FORMAT_WITH_LIMIT
2886
2954
2887
2955
REDIS_PROCESS_REQUEST (redis_sock , cmd , cmd_len );
2888
2956
if (withscores ) {
@@ -2891,12 +2959,17 @@ PHP_METHOD(Redis, zRangeByScore)
2891
2959
* we want [elt0 => val0, elt1 => val1], etc.
2892
2960
*/
2893
2961
IF_ATOMIC () {
2894
- redis_sock_read_multibulk_reply_zipped (INTERNAL_FUNCTION_PARAM_PASSTHRU , redis_sock , NULL TSRMLS_CC );
2962
+ if (redis_sock_read_multibulk_reply_zipped (INTERNAL_FUNCTION_PARAM_PASSTHRU , redis_sock , NULL TSRMLS_CC ) < 0 ) {
2963
+ RETURN_FALSE ;
2964
+ }
2895
2965
}
2896
2966
REDIS_PROCESS_RESPONSE (redis_sock_read_multibulk_reply_zipped );
2897
2967
} else {
2898
2968
IF_ATOMIC () {
2899
- redis_sock_read_multibulk_reply (INTERNAL_FUNCTION_PARAM_PASSTHRU , redis_sock , NULL TSRMLS_CC );
2969
+ if (redis_sock_read_multibulk_reply (INTERNAL_FUNCTION_PARAM_PASSTHRU ,
2970
+ redis_sock , NULL TSRMLS_CC ) < 0 ) {
2971
+ RETURN_FALSE ;
2972
+ }
2900
2973
}
2901
2974
REDIS_PROCESS_RESPONSE (redis_sock_read_multibulk_reply );
2902
2975
}
@@ -3560,7 +3633,7 @@ PHP_METHOD(Redis, multi)
3560
3633
current = NULL ;
3561
3634
3562
3635
IF_MULTI () {
3563
- cmd_len = redis_cmd_format (& cmd , "MULTI \r\n" );
3636
+ cmd_len = redis_cmd_format (& cmd , "*1" _NL "$5" _NL "MULTI" _NL );
3564
3637
3565
3638
if (redis_sock_write (redis_sock , cmd , cmd_len ) < 0 ) {
3566
3639
efree (cmd );
0 commit comments