@@ -624,6 +624,28 @@ PHP_METHOD(RedisArray, _rehash)
624624    }
625625}
626626
627+ static  void 
628+ multihost_distribute_call (RedisArray  * ra , zval  * return_value , zval  * z_fun , int  argc , zval  * argv  TSRMLS_DC )
629+ {
630+     int  i ;
631+ 
632+     /* Init our array return */ 
633+     array_init (return_value );
634+ 
635+     /* Iterate our RedisArray nodes */ 
636+     for  (i  =  0 ; i  <  ra -> count ; ++ i ) {
637+         zval  zv , * z_tmp  =  & zv ;
638+ #if  (PHP_MAJOR_VERSION  <  7 )
639+         MAKE_STD_ZVAL (z_tmp );
640+ #endif 
641+         /* Call each node in turn */ 
642+         call_user_function (& redis_array_ce -> function_table , & ra -> redis [i ], z_fun , z_tmp , argc , argv );
643+ 
644+         /* Add the result for this host */ 
645+         add_assoc_zval (return_value , ra -> hosts [i ], z_tmp );
646+     }
647+ }
648+ 
627649static  void  multihost_distribute (INTERNAL_FUNCTION_PARAMETERS , const  char  * method_name )
628650{
629651    zval  * object , z_fun ;
@@ -642,18 +664,8 @@ static void multihost_distribute(INTERNAL_FUNCTION_PARAMETERS, const char *metho
642664    /* prepare call */ 
643665    ZVAL_STRING (& z_fun , method_name );
644666
645-     array_init (return_value );
646-     for (i  =  0 ; i  <  ra -> count ; ++ i ) {
647-         zval  zv , * z_tmp  =  & zv ;
648- #if  (PHP_MAJOR_VERSION  <  7 )
649-         MAKE_STD_ZVAL (z_tmp );
650- #endif 
651- 
652-         /* Call each node in turn */ 
653-         call_user_function (& redis_ce -> function_table , & ra -> redis [i ], & z_fun , z_tmp , 0 , NULL );
667+     multihost_distribute_call (ra , return_value , & z_fun , 0 , NULL  TSRMLS_CC );
654668
655-         add_assoc_zval (return_value , ra -> hosts [i ], z_tmp );
656-     }
657669    zval_dtor (& z_fun );
658670}
659671
@@ -714,23 +726,8 @@ PHP_METHOD(RedisArray, keys)
714726    /* We will be passing with one string argument (the pattern) */ 
715727    ZVAL_STRINGL (z_args , pattern , pattern_len );
716728
717-     /* Init our array return */ 
718-     array_init (return_value );
729+     multihost_distribute_call (ra , return_value , & z_fun , 1 , z_args  TSRMLS_CC );
719730
720-     /* Iterate our RedisArray nodes */ 
721-     for (i  =  0 ; i  <  ra -> count ; ++ i ) {
722-         zval  zv , * z_tmp  =  & zv ;
723- #if  (PHP_MAJOR_VERSION  <  7 )
724-         /* Return for this node */ 
725-         MAKE_STD_ZVAL (z_tmp );
726- #endif 
727- 
728-         /* Call KEYS on each node */ 
729-         call_user_function (& redis_ce -> function_table , & ra -> redis [i ], & z_fun , z_tmp , 1 , z_args );
730- 
731-         /* Add the result for this host */ 
732-         add_assoc_zval (return_value , ra -> hosts [i ], z_tmp );
733-     }
734731    zval_dtor (& z_args [0 ]);
735732    zval_dtor (& z_fun );
736733}
@@ -757,18 +754,8 @@ PHP_METHOD(RedisArray, getOption)
757754    /* copy arg */ 
758755    ZVAL_LONG (& z_args [0 ], opt );
759756
760-     array_init (return_value );
761-     for (i  =  0 ; i  <  ra -> count ; ++ i ) {
762-         zval  zv , * z_tmp  =  & zv ;
763- #if  (PHP_MAJOR_VERSION  <  7 )
764-         MAKE_STD_ZVAL (z_tmp );
765- #endif 
766- 
767-         /* Call each node in turn */ 
768-         call_user_function (& redis_ce -> function_table , & ra -> redis [i ], & z_fun , z_tmp , 1 , z_args );
757+     multihost_distribute_call (ra , return_value , & z_fun , 1 , z_args  TSRMLS_CC );
769758
770-         add_assoc_zval (return_value , ra -> hosts [i ], z_tmp );
771-     }
772759    zval_dtor (& z_fun );
773760}
774761
@@ -797,18 +784,8 @@ PHP_METHOD(RedisArray, setOption)
797784    ZVAL_LONG (& z_args [0 ], opt );
798785    ZVAL_STRINGL (& z_args [1 ], val_str , val_len );
799786
800-     array_init (return_value );
801-     for (i  =  0 ; i  <  ra -> count ; ++ i ) {
802-         zval  zv , * z_tmp  =  & zv ;
803- #if  (PHP_MAJOR_VERSION  <  7 )
804-         MAKE_STD_ZVAL (z_tmp );
805- #endif 
806- 
807-         /* Call each node in turn */ 
808-         call_user_function (& redis_ce -> function_table , & ra -> redis [i ], & z_fun , z_tmp , 2 , z_args );
787+     multihost_distribute_call (ra , return_value , & z_fun , 2 , z_args  TSRMLS_CC );
809788
810-         add_assoc_zval (return_value , ra -> hosts [i ], z_tmp );
811-     }
812789    zval_dtor (& z_args [1 ]);
813790    zval_dtor (& z_fun );
814791}
@@ -835,20 +812,11 @@ PHP_METHOD(RedisArray, select)
835812    /* copy args */ 
836813    ZVAL_LONG (& z_args [0 ], opt );
837814
838-     array_init (return_value );
839-     for (i  =  0 ; i  <  ra -> count ; ++ i ) {
840-         zval  zv , * z_tmp  =  & zv ;
841- #if  (PHP_MAJOR_VERSION  <  7 )
842-         MAKE_STD_ZVAL (z_tmp );
843- #endif 
844- 
845-         /* Call each node in turn */ 
846-         call_user_function (& redis_ce -> function_table , & ra -> redis [i ], & z_fun , z_tmp , 1 , z_args );
815+     multihost_distribute_call (ra , return_value , & z_fun , 1 , z_args  TSRMLS_CC );
847816
848-         add_assoc_zval (return_value , ra -> hosts [i ], z_tmp );
849-     }
850817    zval_dtor (& z_fun );
851818}
819+ 
852820#if  (PHP_MAJOR_VERSION  <  7 )
853821#define  HANDLE_MULTI_EXEC (ra , cmd , cmdlen ) do { \
854822    if (ra && ra->z_multi_exec) { \
0 commit comments