@@ -559,6 +559,29 @@ PHP_METHOD(RedisArray, setOption)
559559 efree (z_args [0 ]);
560560 efree (z_args [1 ]);
561561}
562+ #define HANDLE_MULTI_EXEC (cmd ) do {\
563+ if (redis_array_get(getThis(), &ra TSRMLS_CC) >= 0 && ra->z_multi_exec) {\
564+ int i, num_varargs;\
565+ zval ***varargs = NULL;\
566+ zval z_arg_array;\
567+ if (zend_parse_method_parameters(ZEND_NUM_ARGS() TSRMLS_CC, getThis(), "O*",\
568+ &object, redis_array_ce, &varargs, &num_varargs) == FAILURE) {\
569+ RETURN_FALSE;\
570+ }\
571+ /* copy all args into a zval hash table */ \
572+ array_init (& z_arg_array );\
573+ for (i = 0 ; i < num_varargs ; ++ i ) {\
574+ add_next_index_zval (& z_arg_array , * varargs [i ]);\
575+ }\
576+ /* call */ \
577+ ra_forward_call (INTERNAL_FUNCTION_PARAM_PASSTHRU , ra , cmd , sizeof (cmd )- 1 , & z_arg_array , NULL );\
578+ zval_dtor (& z_arg_array );\
579+ if (varargs ) {\
580+ efree (varargs );\
581+ }\
582+ return ;\
583+ }\
584+ }while (0 )
562585
563586/* MGET will distribute the call to several nodes and regroup the values. */
564587PHP_METHOD (RedisArray , mget )
@@ -571,6 +594,9 @@ PHP_METHOD(RedisArray, mget)
571594 HashPosition pointer ;
572595 zval * * redis_instances , * redis_inst , * * argv ;
573596
597+ /* Multi/exec support */
598+ HANDLE_MULTI_EXEC ("MGET" );
599+
574600 if (zend_parse_method_parameters (ZEND_NUM_ARGS () TSRMLS_CC , getThis (), "Oa" ,
575601 & object , redis_array_ce , & z_keys ) == FAILURE ) {
576602 RETURN_FALSE ;
@@ -691,6 +717,9 @@ PHP_METHOD(RedisArray, mset)
691717 int key_len , type , * key_lens ;
692718 long idx ;
693719
720+ /* Multi/exec support */
721+ HANDLE_MULTI_EXEC ("MSET" );
722+
694723 if (zend_parse_method_parameters (ZEND_NUM_ARGS () TSRMLS_CC , getThis (), "Oa" ,
695724 & object , redis_array_ce , & z_keys ) == FAILURE ) {
696725 RETURN_FALSE ;
@@ -792,6 +821,9 @@ PHP_METHOD(RedisArray, del)
792821 long total = 0 ;
793822 int free_zkeys = 0 ;
794823
824+ /* Multi/exec support */
825+ HANDLE_MULTI_EXEC ("DEL" );
826+
795827 /* get all args in z_args */
796828 z_args = emalloc (ZEND_NUM_ARGS () * sizeof (zval * ));
797829 if (zend_get_parameters_array (ht , ZEND_NUM_ARGS (), z_args ) == FAILURE ) {
0 commit comments