@@ -7367,15 +7367,19 @@ PHP_METHOD(Redis, pfadd) {
73677367    REDIS_PROCESS_RESPONSE (redis_1_response );
73687368}
73697369
7370- /* {{{ proto Redis::pfCount(string key) }}}*/ 
7370+ /* {{{ proto Redis::pfCount(string key) }}} 
7371+  *     proto Redis::pfCount(array keys) }}} */ 
73717372PHP_METHOD (Redis , pfcount ) {
7372-     zval  * object ;
7373+     zval  * object , * z_keys , * * z_key , * z_tmp  =  NULL ;
7374+     HashTable  * ht_keys ;
7375+     HashPosition  ptr ;
73737376    RedisSock  * redis_sock ;
7374-     char  * key , * cmd ;
7375-     int  key_len , cmd_len , key_free ;
7377+     smart_str  cmd  =  {0 };
7378+     int  num_keys , key_len , key_free ;
7379+     char  * key ;
73767380
7377-     if (zend_parse_method_parameters (ZEND_NUM_ARGS () TSRMLS_CC , getThis (), "Os " ,
7378-                                     & object , redis_ce , & key ,  & key_len )== FAILURE )
7381+     if (zend_parse_method_parameters (ZEND_NUM_ARGS () TSRMLS_CC , getThis (), "Oz " ,
7382+                                     & object , redis_ce , & z_keys )== FAILURE )
73797383    {
73807384        RETURN_FALSE ;
73817385    }
@@ -7384,17 +7388,88 @@ PHP_METHOD(Redis, pfcount) {
73847388        RETURN_FALSE ;
73857389    }
73867390
7387-     // Prefix key if neccisary and construct our command 
7388-     key_free  =  redis_key_prefix (redis_sock , & key , & key_len  TSRMLS_CC );
7389-     cmd_len  =  redis_cmd_format_static (& cmd , "PFCOUNT" , "s" , key , key_len );
7390-     if (key_free ) efree (key );
7391+     /* If we were passed an array of keys, iterate through them prefixing if 
7392+      * required and capturing lengths and if we need to free them.  Otherwise 
7393+      * attempt to treat the argument as a string and just pass one */ 
7394+     if  (Z_TYPE_P (z_keys ) ==  IS_ARRAY ) {
7395+         /* Grab key hash table and the number of keys */ 
7396+         ht_keys  =  Z_ARRVAL_P (z_keys );
7397+         num_keys  =  zend_hash_num_elements (ht_keys );
73917398
7392-     REDIS_PROCESS_REQUEST (redis_sock , cmd , cmd_len );
7399+         /* There is no reason to send zero keys */ 
7400+         if  (num_keys  ==  0 ) {
7401+             RETURN_FALSE ;
7402+         }
7403+ 
7404+         /* Initialize the command with our number of arguments */ 
7405+         redis_cmd_init_sstr (& cmd , num_keys , "PFCOUNT" , sizeof ("PFCOUNT" )- 1 );
7406+         
7407+         /* Append our key(s) */ 
7408+         for  (zend_hash_internal_pointer_reset_ex (ht_keys , & ptr );
7409+              zend_hash_get_current_data_ex (ht_keys , (void * * )& z_key , & ptr )== SUCCESS ;
7410+              zend_hash_move_forward_ex (ht_keys , & ptr ))
7411+         {
7412+             /* Turn our value into a string if it isn't one */ 
7413+             if  (Z_TYPE_PP (z_key ) !=  IS_STRING ) {
7414+                 MAKE_STD_ZVAL (z_tmp );
7415+                 * z_tmp  =  * * z_key ;
7416+                 zval_copy_ctor (z_tmp );
7417+                 convert_to_string (z_tmp );
7418+ 
7419+                 key  =  Z_STRVAL_P (z_tmp );
7420+                 key_len  =  Z_STRLEN_P (z_tmp );
7421+             } else  {
7422+                 key  =  Z_STRVAL_PP (z_key );
7423+                 key_len  =  Z_STRLEN_PP (z_key );
7424+             }
7425+ 
7426+             /* Append this key to our command */ 
7427+             key_free  =  redis_key_prefix (redis_sock , & key , & key_len  TSRMLS_CC );
7428+             redis_cmd_append_sstr (& cmd , key , key_len );
7429+             
7430+             /* Cleanup */ 
7431+             if  (key_free ) efree (key );
7432+             if  (z_tmp ) {
7433+                 zval_dtor (z_tmp );
7434+                 efree (z_tmp );
7435+                 z_tmp  =  NULL ;
7436+             }
7437+         }
7438+     } else  {
7439+         /* Turn our key into a string if it's a different type */ 
7440+         if  (Z_TYPE_P (z_keys ) !=  IS_STRING ) {
7441+             MAKE_STD_ZVAL (z_tmp );
7442+             * z_tmp  =  * z_keys ;
7443+             zval_copy_ctor (z_tmp );
7444+             convert_to_string (z_tmp );
7445+ 
7446+             key  =  Z_STRVAL_P (z_tmp );
7447+             key_len  =  Z_STRLEN_P (z_tmp );
7448+         } else  {
7449+             key  =  Z_STRVAL_P (z_keys );
7450+             key_len  =  Z_STRLEN_P (z_keys );
7451+         }
7452+ 
7453+         /* Construct our whole command */ 
7454+         redis_cmd_init_sstr (& cmd , 1 , "PFCOUNT" , sizeof ("PFCOUNT" )- 1 );
7455+         key_free  =  redis_key_prefix (redis_sock , & key , & key_len  TSRMLS_CC );
7456+         redis_cmd_append_sstr (& cmd , key , key_len );
7457+         
7458+         /* Cleanup */ 
7459+         if  (key_free ) efree (key );
7460+         if  (z_tmp ) {
7461+             zval_dtor (z_tmp );
7462+             efree (z_tmp );
7463+         }
7464+     }
7465+ 
7466+     REDIS_PROCESS_REQUEST (redis_sock , cmd .c , cmd .len );
73937467    IF_ATOMIC () {
73947468        redis_long_response (INTERNAL_FUNCTION_PARAM_PASSTHRU , redis_sock , NULL , NULL );
73957469    }
73967470    REDIS_PROCESS_RESPONSE (redis_long_response );
73977471}
7472+ /* }}} */ 
73987473
73997474/* {{{ proto Redis::pfMerge(array keys) }}}*/ 
74007475PHP_METHOD (Redis , pfmerge ) {
0 commit comments