Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/phpredis/phpredis.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorEmmanuel Merali <emmanuel@mobli.com>2011-12-11 21:19:24 +0400
committerEmmanuel Merali <emmanuel@mobli.com>2011-12-11 21:19:24 +0400
commit2f58629e0c261bc45b79c598582d22e08a35a1c0 (patch)
tree14dc54d1cd15ca2ade2f4dd54097a01ec0931694 /redis_array.c
parent497300afdade3060f5fa2804aa964ae51a5b4fd1 (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.c41
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;