From 6d3c9990a5314c3cc7203df3da8d855e8bc152d8 Mon Sep 17 00:00:00 2001 From: Emmanuel Merali Date: Tue, 29 Jan 2013 11:47:36 +0200 Subject: Merged changes from @mobli New select DB command to RedisArray - Added retry delay on reconnect Added the possibility to delay each reconnection attempt, including a random factor to prevent several or many concurrent connections from trying to reconnect at the same time. Added the select command to RedisArray to select a DB on every connections in one instruction. Also, fixed a compiler warning: redis_array_impl.c:1115:15: warning: incompatible pointer types assigning to 'zval **' (aka 'struct _zval_struct **') from 'zval **(*)[2]' [-Wincompatible-pointer-types] Conflicts: common.h --- redis_array.c | 57 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 56 insertions(+), 1 deletion(-) (limited to 'redis_array.c') diff --git a/redis_array.c b/redis_array.c index d0460f10..be95c50d 100644 --- a/redis_array.c +++ b/redis_array.c @@ -51,6 +51,7 @@ zend_function_entry redis_array_functions[] = { PHP_ME(RedisArray, _rehash, NULL, ZEND_ACC_PUBLIC) /* special implementation for a few functions */ + PHP_ME(RedisArray, select, NULL, ZEND_ACC_PUBLIC) PHP_ME(RedisArray, info, NULL, ZEND_ACC_PUBLIC) PHP_ME(RedisArray, ping, NULL, ZEND_ACC_PUBLIC) PHP_ME(RedisArray, mget, NULL, ZEND_ACC_PUBLIC) @@ -192,6 +193,7 @@ PHP_METHOD(RedisArray, __construct) RedisArray *ra = NULL; zend_bool b_index = 0, b_autorehash = 0; HashTable *hPrev = NULL, *hOpts = NULL; + long l_retry_interval = 0; if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "z|a", &z0, &z_opts) == FAILURE) { RETURN_FALSE; @@ -232,6 +234,19 @@ PHP_METHOD(RedisArray, __construct) if(FAILURE != zend_hash_find(hOpts, "autorehash", sizeof("autorehash"), (void**)&zpData) && Z_TYPE_PP(zpData) == IS_BOOL) { b_autorehash = Z_BVAL_PP(zpData); } + + /* extract retry_interval option. */ + zval **z_retry_interval_pp; + if (FAILURE != zend_hash_find(hOpts, "retry_interval", sizeof("retry_interval"), (void**)&z_retry_interval_pp)) { + if (Z_TYPE_PP(z_retry_interval_pp) == IS_LONG || Z_TYPE_PP(z_retry_interval_pp) == IS_STRING) { + if (Z_TYPE_PP(z_retry_interval_pp) == IS_LONG) { + l_retry_interval = Z_LVAL_PP(z_retry_interval_pp); + } + else { + l_retry_interval = atol(Z_STRVAL_PP(z_retry_interval_pp)); + } + } + } } /* extract either name of list of hosts from z0 */ @@ -241,7 +256,7 @@ PHP_METHOD(RedisArray, __construct) break; case IS_ARRAY: - ra = ra_make_array(Z_ARRVAL_P(z0), z_fun, z_dist, hPrev, b_index TSRMLS_CC); + ra = ra_make_array(Z_ARRVAL_P(z0), z_fun, z_dist, hPrev, b_index, l_retry_interval TSRMLS_CC); break; default: @@ -688,6 +703,46 @@ PHP_METHOD(RedisArray, setOption) efree(z_args[0]); efree(z_args[1]); } + +PHP_METHOD(RedisArray, select) +{ + zval *object, z_fun, *z_tmp, *z_args[2]; + int i; + RedisArray *ra; + long opt; + + if (zend_parse_method_parameters(ZEND_NUM_ARGS() TSRMLS_CC, getThis(), "Ol", + &object, redis_array_ce, &opt) == FAILURE) { + RETURN_FALSE; + } + + if (redis_array_get(object, &ra TSRMLS_CC) < 0) { + RETURN_FALSE; + } + + /* prepare call */ + ZVAL_STRING(&z_fun, "select", 0); + + /* copy args */ + MAKE_STD_ZVAL(z_args[0]); + ZVAL_LONG(z_args[0], opt); + + array_init(return_value); + for(i = 0; i < ra->count; ++i) { + + MAKE_STD_ZVAL(z_tmp); + + /* Call each node in turn */ + call_user_function(&redis_ce->function_table, &ra->redis[i], + &z_fun, z_tmp, 1, z_args TSRMLS_CC); + + add_assoc_zval(return_value, ra->hosts[i], z_tmp); + } + + /* cleanup */ + efree(z_args[0]); +} + #define HANDLE_MULTI_EXEC(cmd) do {\ if (redis_array_get(getThis(), &ra TSRMLS_CC) >= 0 && ra->z_multi_exec) {\ int i, num_varargs;\ -- cgit v1.2.3 From 3e6d5b60d66e0a5b31080a7109c412b0ce6358e6 Mon Sep 17 00:00:00 2001 From: michael-grunder Date: Sun, 28 Apr 2013 11:09:58 -0700 Subject: Cutting a release for 2.2.3. Added myself as a maintainer in the header files --- redis_array.c | 1 + 1 file changed, 1 insertion(+) (limited to 'redis_array.c') diff --git a/redis_array.c b/redis_array.c index be95c50d..9c414292 100644 --- a/redis_array.c +++ b/redis_array.c @@ -13,6 +13,7 @@ | license@php.net so we can mail you a copy immediately. | +----------------------------------------------------------------------+ | Author: Nicolas Favre-Felix | + | Maintainer: Michael Grunder | +----------------------------------------------------------------------+ */ -- cgit v1.2.3