Skip to content

Commit 1689318

Browse files
committed
Refactor RedisArray
Add `multihost_distribute_call` function for iterating over RA hosts and store results of functions into `return_value` array.
1 parent a53d5db commit 1689318

File tree

1 file changed

+28
-60
lines changed

1 file changed

+28
-60
lines changed

redis_array.c

Lines changed: 28 additions & 60 deletions
Original file line numberDiff line numberDiff line change
@@ -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+
627649
static 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

Comments
 (0)