diff options
author | Emmanuel Merali <emmanuel@mobli.com> | 2011-12-11 21:19:24 +0400 |
---|---|---|
committer | Emmanuel Merali <emmanuel@mobli.com> | 2011-12-11 21:19:24 +0400 |
commit | 2f58629e0c261bc45b79c598582d22e08a35a1c0 (patch) | |
tree | 14dc54d1cd15ca2ade2f4dd54097a01ec0931694 /redis_array.c | |
parent | 497300afdade3060f5fa2804aa964ae51a5b4fd1 (diff) |
External key distributor
Added possibility to specify a user land key distributor function.
Diffstat (limited to 'redis_array.c')
-rw-r--r-- | redis_array.c | 41 |
1 files changed, 39 insertions, 2 deletions
diff --git a/redis_array.c b/redis_array.c index 7b974d9a..fdb038d8 100644 --- a/redis_array.c +++ b/redis_array.c @@ -46,6 +46,7 @@ zend_function_entry redis_array_functions[] = { PHP_ME(RedisArray, _hosts, NULL, ZEND_ACC_PUBLIC) PHP_ME(RedisArray, _target, NULL, ZEND_ACC_PUBLIC) PHP_ME(RedisArray, _function, NULL, ZEND_ACC_PUBLIC) + PHP_ME(RedisArray, _distributor, NULL, ZEND_ACC_PUBLIC) PHP_ME(RedisArray, _rehash, NULL, ZEND_ACC_PUBLIC) /* special implementation for a few functions */ @@ -92,6 +93,12 @@ void redis_destructor_redis_array(zend_rsrc_list_entry * rsrc TSRMLS_DC) efree(ra->z_fun); } + /* delete distributor */ + if(ra->z_dist) { + zval_dtor(ra->z_dist); + efree(ra->z_dist); + } + /* delete list of pure commands */ zval_dtor(ra->z_pure_cmds); efree(ra->z_pure_cmds); @@ -178,7 +185,7 @@ uint32_t rcrc32(const char *s, size_t sz) { Public constructor */ PHP_METHOD(RedisArray, __construct) { - zval *z0, *z_fun = NULL, **zpData, *z_opts = NULL; + zval *z0, *z_fun = NULL, *z_dist = NULL, **zpData, *z_opts = NULL; char *name = NULL; int id; RedisArray *ra = NULL; @@ -208,6 +215,13 @@ PHP_METHOD(RedisArray, __construct) zval_copy_ctor(z_fun); } + /* extract function name. */ + if(FAILURE != zend_hash_find(hOpts, "distributor", sizeof("distributor"), (void**)&zpData)) { + MAKE_STD_ZVAL(z_dist); + *z_dist = **zpData; + zval_copy_ctor(z_dist); + } + /* extract index option. */ if(FAILURE != zend_hash_find(hOpts, "index", sizeof("index"), (void**)&zpData) && Z_TYPE_PP(zpData) == IS_BOOL) { b_index = Z_BVAL_PP(zpData); @@ -226,7 +240,7 @@ PHP_METHOD(RedisArray, __construct) break; case IS_ARRAY: - ra = ra_make_array(Z_ARRVAL_P(z0), z_fun, hPrev, b_index TSRMLS_CC); + ra = ra_make_array(Z_ARRVAL_P(z0), z_fun, z_dist, hPrev, b_index TSRMLS_CC); break; default: @@ -428,6 +442,29 @@ PHP_METHOD(RedisArray, _function) } } +PHP_METHOD(RedisArray, _distributor) +{ + zval *object; + int i; + RedisArray *ra; + + if (zend_parse_method_parameters(ZEND_NUM_ARGS() TSRMLS_CC, getThis(), "O", + &object, redis_array_ce) == FAILURE) { + RETURN_FALSE; + } + + if (redis_array_get(object, &ra TSRMLS_CC) < 0) { + RETURN_FALSE; + } + + if(ra->z_fun) { + *return_value = *ra->z_fun; + zval_copy_ctor(return_value); + } else { + RETURN_NULL(); + } +} + PHP_METHOD(RedisArray, _rehash) { zval *object, *z_cb = NULL; |