@@ -3775,8 +3775,8 @@ PHP_METHOD(Redis, subscribe)
37753775 int cmd_len , array_count , callback_ft_name_len ;
37763776
37773777
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 ) {
37803780 RETURN_FALSE ;
37813781 }
37823782
@@ -3840,33 +3840,20 @@ PHP_METHOD(Redis, subscribe)
38403840 char * class_name , * method_name ;
38413841 zend_class_entry * * class_entry_pp , * ce ;
38423842
3843- MAKE_STD_ZVAL (z_ret );
3844-
38453843 /* verify the callback */
38463844 if (Z_TYPE_P (z_callback ) == IS_ARRAY ) {
38473845
3846+ /* object */
38483847 if (zend_hash_index_find (Z_ARRVAL_P (z_callback ), 0 , (void * * )& tmp ) == FAILURE ) {
38493848 RETURN_FALSE ;
38503849 }
3850+ z_o = * tmp ;
38513851
3852- class_name = Z_STRVAL_PP (tmp );
3853-
3852+ /* method name */
38543853 if (zend_hash_index_find (Z_ARRVAL_P (z_callback ), 1 , (void * * )& tmp ) == FAILURE ) {
38553854 RETURN_FALSE ;
38563855 }
3857-
38583856 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 );
38703857
38713858 ALLOC_INIT_ZVAL (z_fun );
38723859 ZVAL_STRING (z_fun , method_name , 1 );
@@ -3897,59 +3884,36 @@ PHP_METHOD(Redis, subscribe)
38973884 }
38983885 if (zend_hash_index_find (Z_ARRVAL_P (z_tab ), 2 , (void * * )& data ) == FAILURE ) {
38993886 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+ }
39013892
39023893 z_args [0 ] = getThis ();
39033894 z_args [1 ] = * channel ;
39043895 z_args [2 ] = * data ;
39053896
39063897 switch (callback_type ) {
39073898 case R_SUB_CALLBACK_CLASS_TYPE :
3899+ MAKE_STD_ZVAL (z_ret );
39083900 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 );
39153902 break ;
3903+
39163904 case R_SUB_CALLBACK_FT_TYPE :
39173905 MAKE_STD_ZVAL (z_ret );
39183906 MAKE_STD_ZVAL (z_fun );
39193907 ZVAL_STRINGL (z_fun , callback_ft_name , callback_ft_name_len , 0 );
39203908 call_user_function (EG (function_table ), NULL , z_fun , z_ret , 3 , z_args TSRMLS_CC );
39213909 efree (z_fun );
3922- //free(z_args[0]); free(z_args[1]); free(z_args[2]);
3923- //free(z_args);
3910+ efree (z_ret );
39243911 break ;
39253912 }
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. */
39493914 zval_dtor (z_tab );
39503915 efree (z_tab );
39513916 }
3952- /*@TODO : collect all the returned data and return it */
39533917}
39543918
39553919/**
0 commit comments