@@ -3775,8 +3775,8 @@ PHP_METHOD(Redis, subscribe)
3775
3775
int cmd_len , array_count , callback_ft_name_len ;
3776
3776
3777
3777
3778
- if (zend_parse_method_parameters (ZEND_NUM_ARGS () TSRMLS_CC , getThis (), "Oasz " ,
3779
- & object , redis_ce , & array , & callback_ft_name , & callback_ft_name_len , & z_callback ) == FAILURE ) {
3778
+ if (zend_parse_method_parameters (ZEND_NUM_ARGS () TSRMLS_CC , getThis (), "Oaz|z " ,
3779
+ & object , redis_ce , & array , & z_callback ) == FAILURE ) {
3780
3780
RETURN_FALSE ;
3781
3781
}
3782
3782
@@ -3840,33 +3840,20 @@ PHP_METHOD(Redis, subscribe)
3840
3840
char * class_name , * method_name ;
3841
3841
zend_class_entry * * class_entry_pp , * ce ;
3842
3842
3843
- MAKE_STD_ZVAL (z_ret );
3844
-
3845
3843
/* verify the callback */
3846
3844
if (Z_TYPE_P (z_callback ) == IS_ARRAY ) {
3847
3845
3846
+ /* object */
3848
3847
if (zend_hash_index_find (Z_ARRVAL_P (z_callback ), 0 , (void * * )& tmp ) == FAILURE ) {
3849
3848
RETURN_FALSE ;
3850
3849
}
3850
+ z_o = * tmp ;
3851
3851
3852
- class_name = Z_STRVAL_PP (tmp );
3853
-
3852
+ /* method name */
3854
3853
if (zend_hash_index_find (Z_ARRVAL_P (z_callback ), 1 , (void * * )& tmp ) == FAILURE ) {
3855
3854
RETURN_FALSE ;
3856
3855
<
10000
td data-grid-cell-id="diff-a1471159ac00556a439382b010c89a8507ebc6f03311ec7655cebd95dc6c978e-3856-3855-2" data-line-anchor="diff-a1471159ac00556a439382b010c89a8507ebc6f03311ec7655cebd95dc6c978eR3855" data-selected="false" role="gridcell" style="background-color:var(--bgColor-default);padding-right:24px" tabindex="-1" valign="top" class="focusable-grid-cell diff-text-cell right-side-diff-cell left-side"> }
3857
-
3858
3856
method_name = Z_STRVAL_PP (tmp );
3859
- if (zend_lookup_class (class_name , strlen (class_name ), & class_entry_pp TSRMLS_CC ) == FAILURE ) {
3860
- /* The class didn't exist */
3861
- /* generate error */
3862
- RETURN_FALSE ;
3863
- }
3864
-
3865
-
3866
- ce = * class_entry_pp ;
3867
- // create an empty object.
3868
- MAKE_STD_ZVAL (z_o );
3869
- object_init_ex (z_o , ce );
3870
3857
3871
3858
ALLOC_INIT_ZVAL (z_fun );
3872
3859
ZVAL_STRING (z_fun , method_name , 1 );
@@ -3897,59 +3884,36 @@ PHP_METHOD(Redis, subscribe)
3897
3884
}
3898
3885
if (zend_hash_index_find (Z_ARRVAL_P (z_tab ), 2 , (void * * )& data ) == FAILURE ) {
3899
3886
break ;
3900
- }
3887
+ }
3888
+
3889
+ if (Z_TYPE_PP (type ) == IS_STRING && strncmp (Z_STRVAL_PP (type ), "message" , 7 ) != 0 ) {
3890
+ continue ; /* only forwarding published messages */
3891
+ }
3901
3892
3902
3893
z_args [0 ] = getThis ();
3903
3894
z_args [1 ] = * channel ;
3904
3895
z_args [2 ] = * data ;
3905
3896
3906
3897
switch (callback_type ) {
3907
3898
case R_SUB_CALLBACK_CLASS_TYPE :
3899
+ MAKE_STD_ZVAL (z_ret );
3908
3900
call_user_function (& ce -> function_table , & z_o , z_fun , z_ret , 3 , z_args TSRMLS_CC );
3909
- //efree(z_o);
3910
- //efree(z_fun);
3911
- //zval_dtor(z_ret); efree(z_ret);
3912
- //free(z_args[0]); free(z_args[1]); free(z_args[2]);
3913
- //free(z_args);
3914
-
3901
+ efree (z_ret );
3915
3902
break ;
3903
+
3916
3904
case R_SUB_CALLBACK_FT_TYPE :
3917
3905
MAKE_STD_ZVAL (z_ret );
3918
3906
MAKE_STD_ZVAL (z_fun );
3919
3907
ZVAL_STRINGL (z_fun , callback_ft_name , callback_ft_name_len , 0 );
3920
3908
call_user_function (EG (function_table ), NULL , z_fun , z_ret , 3 , z_args TSRMLS_CC );
3921
3909
efree (z_fun );
3922
- //free(z_args[0]); free(z_args[1]); free(z_args[2]);
3923
- //free(z_args);
3910
+ efree (z_ret );
3924
3911
break ;
3925
3912
}
3926
-
3927
- if (Z_TYPE_P (z_ret ) == IS_BOOL ) {
3928
- // the callback function return TRUE if we want to continue listening on the channel
3929
- // or FALSE if we need to stop listeneing
3930
- if (!Z_BVAL_P (z_ret )) {
3931
- efree (z_o );
3932
- efree (z_fun );
3933
- zval_dtor (z_tab );
3934
- efree (z_tab );
3935
- zval_dtor (z_ret );
3936
- efree (z_ret );
3937
- break ;
3938
- }
3939
- } else {
3940
- //error : the callback must return BOOL reponse
3941
- efree (z_o );
3942
- efree (z_fun );
3943
- zval_dtor (z_tab );
3944
- efree (z_tab );
3945
- zval_dtor (z_ret );
3946
- efree (z_ret );
3947
- RETURN_FALSE ;
3948
- }
3913
+ /* TODO: provide a way to break out of the loop. */
3949
3914
zval_dtor (z_tab );
3950
3915
efree (z_tab );
3951
3916
}
3952
- /*@TODO : collect all the returned data and return it */
3953
3917
}
3954
3918
3955
3919
/**
0 commit comments