@@ -624,6 +624,28 @@ PHP_METHOD(RedisArray, _rehash)
624
624
}
625
625
}
626
626
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
+
627
649
static void multihost_distribute (INTERNAL_FUNCTION_PARAMETERS , const char * method_name )
628
650
{
629
651
zval * object , z_fun ;
@@ -642,18 +664,8 @@ static void multihost_distribute(INTERNAL_FUNCTION_PARAMETERS, const char *metho
642
664
/* prepare call */
643
665
ZVAL_STRING (& z_fun , method_name );
644
666
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 );
654
668
655
- add_assoc_zval (return_value , ra -> hosts [i ], z_tmp );
656
- }
657
669
zval_dtor (& z_fun );
658
670
}
659
671
@@ -714,23 +726,8 @@ PHP_METHOD(RedisArray, keys)
714
726
/* We will be passing with one string argument (the pattern) */
715
727
ZVAL_STRINGL (z_args , pattern , pattern_len );
716
728
717
- /* Init our array return */
718
- array_init (return_value );
729
+ multihost_distribute_call (ra , return_value , & z_fun , 1 , z_args TSRMLS_CC );
719
730
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
- }
734
731
zval_dtor (& z_args [0 ]);
735
732
zval_dtor (& z_fun );
736
733
}
@@ -757,18 +754,8 @@ PHP_METHOD(RedisArray, getOption)
757
754
/* copy arg */
758
755
ZVAL_LONG (& z_args [0 ], opt );
759
756
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 );
769
758
770
- add_assoc_zval (return_value , ra -> hosts [i ], z_tmp );
771
- }
772
759
zval_dtor (& z_fun );
773
760
}
774
761
@@ -797,18 +784,8 @@ PHP_METHOD(RedisArray, setOption)
797
784
ZVAL_LONG (& z_args [0 ], opt );
798
785
ZVAL_STRINGL (& z_args [1 ], val_str , val_len );
799
786
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 );
809
788
810
- add_assoc_zval (return_value , ra -> hosts [i ], z_tmp );
811
- }
812
789
zval_dtor (& z_args [1 ]);
813
790
zval_dtor (& z_fun );
814
791
}
@@ -835,20 +812,11 @@ PHP_METHOD(RedisArray, select)
835
812
/* copy args */
836
813
ZVAL_LONG (& z_args [0 ], opt );
837
814
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 );
847
816
848
- add_assoc_zval (return_value , ra -> hosts [i ], z_tmp );
849
- }
850
817
zval_dtor (& z_fun );
851
818
}
819
+
852
820
#if (PHP_MAJOR_VERSION < 7 )
853
821
#define HANDLE_MULTI_EXEC (ra , cmd , cmdlen ) do { \
854
822
if (ra && ra->z_multi_exec) { \
0 commit comments