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:
authorPavlo Yatsukhnenko <yatsukhnenko@gmail.com>2017-08-04 09:57:47 +0300
committerPavlo Yatsukhnenko <yatsukhnenko@gmail.com>2017-08-04 09:57:47 +0300
commit577a91909989924c841ed45f9e57a0518aa3ab30 (patch)
tree9b3f51c223e680b4c07bc96e20df7b3d37873127 /redis_array_impl.c
parente53465437d707f12ba8f461b391902dc9f7b9dd7 (diff)
Remove ra_rehash_scan
Diffstat (limited to 'redis_array_impl.c')
-rw-r--r--redis_array_impl.c106
1 files changed, 35 insertions, 71 deletions
diff --git a/redis_array_impl.c b/redis_array_impl.c
index ceab1884..ce2ceb19 100644
--- a/redis_array_impl.c
+++ b/redis_array_impl.c
@@ -693,52 +693,6 @@ ra_is_write_cmd(RedisArray *ra, const char *cmd, int cmd_len) {
return !ret;
}
-/* list keys from array index */
-static long
-ra_rehash_scan(zval *z_redis, char ***keys, int **key_lens, const char *cmd, const char *arg TSRMLS_DC) {
-
- long count, i;
- zval z_fun_smembers, z_ret, z_arg[1], *z_data_p;
- HashTable *h_keys;
- char *key;
- int key_len;
-
- /* arg */
- ZVAL_STRING(&z_arg[0], arg);
-
- /* run SMEMBERS */
- ZVAL_STRING(&z_fun_smembers, cmd);
- call_user_function(&redis_ce->function_table, z_redis, &z_fun_smembers, &z_ret, 1, z_arg);
- zval_dtor(&z_fun_smembers);
- zval_dtor(&z_arg[0]);
- if(Z_TYPE(z_ret) != IS_ARRAY) { /* failure */
- zval_dtor(&z_ret);
- return -1; /* TODO: log error. */
- }
- h_keys = Z_ARRVAL(z_ret);
-
- /* allocate key array */
- count = zend_hash_num_elements(h_keys);
- *keys = emalloc(count * sizeof(char*));
- *key_lens = emalloc(count * sizeof(int));
-
- i = 0;
- ZEND_HASH_FOREACH_VAL(h_keys, z_data_p) {
- key = Z_STRVAL_P(z_data_p);
- key_len = Z_STRLEN_P(z_data_p);
-
- /* copy key and length */
- (*keys)[i] = estrndup(key, key_len);
- (*key_lens)[i] = key_len;
- i++;
- } ZEND_HASH_FOREACH_END();
-
- /* cleanup */
- zval_dtor(&z_ret);
-
- return count;
-}
-
/* run TYPE to find the type */
static zend_bool
ra_get_key_type(zval *z_redis, const char *key, int key_len, zval *z_from, long *res TSRMLS_DC) {
@@ -1184,42 +1138,52 @@ static void
ra_rehash_server(RedisArray *ra, zval *z_redis, const char *hostname, zend_bool b_index,
zend_fcall_info *z_cb, zend_fcall_info_cache *z_cb_cache TSRMLS_DC) {
- char **keys;
- long count, i;
- int *key_lens, target_pos;
- zval *z_target;
+ HashTable *h_keys;
+ long count = 0;
+ zval z_fun, z_ret, z_argv, *z_ele;
- /* list all keys */
- if(b_index) {
- count = ra_rehash_scan(z_redis, &keys, &key_lens, "SMEMBERS", PHPREDIS_INDEX_NAME TSRMLS_CC);
- } else {
- count = ra_rehash_scan(z_redis, &keys, &key_lens, "KEYS", "*" TSRMLS_CC);
- }
+ /* list all keys */
+ if (b_index) {
+ ZVAL_STRING(&z_fun, "SMEMBERS");
+ ZVAL_STRING(&z_argv, PHPREDIS_INDEX_NAME);
+ } else {
+ ZVAL_STRING(&z_fun, "KEYS");
+ ZVAL_STRING(&z_argv, "*");
+ }
+ ZVAL_NULL(&z_ret);
+ call_user_function(&redis_ce->function_table, z_redis, &z_fun, &z_ret, 1, &z_argv);
+ zval_dtor(&z_argv);
+ zval_dtor(&z_fun);
- if (count < 0) return;
+ if (Z_TYPE(z_ret) == IS_ARRAY) {
+ h_keys = Z_ARRVAL(z_ret);
+ count = zend_hash_num_elements(h_keys);
+ }
+
+ if (!count) {
+ zval_dtor(&z_ret);
+ return;
+ }
/* callback */
if(z_cb && z_cb_cache) {
zval_rehash_callback(z_cb, z_cb_cache, hostname, count TSRMLS_CC);
}
- /* for each key, redistribute */
- for(i = 0; i < count; ++i) {
+ /* for each key, redistribute */
+ ZEND_HASH_FOREACH_VAL(h_keys, z_ele) {
+ int pos = 0;
+ /* check that we're not moving to the same node. */
+ zval *z_target = ra_find_node(ra, Z_STRVAL_P(z_ele), Z_STRLEN_P(z_ele), &pos TSRMLS_CC);
- /* check that we're not moving to the same node. */
- z_target = ra_find_node(ra, keys[i], key_lens[i], &target_pos TSRMLS_CC);
-
- if (z_target && strcmp(hostname, ra->hosts[target_pos])) { /* different host */
- /* php_printf("move [%s] from [%s] to [%s]\n", keys[i], hostname, ra->hosts[target_pos]); */
- ra_move_key(keys[i], key_lens[i], z_redis, z_target TSRMLS_CC);
- }
+ if (z_target && strcmp(hostname, ra->hosts[pos])) { /* different host */
+ ra_move_key(Z_STRVAL_P(z_ele), Z_STRLEN_P(z_ele), z_redis, z_target TSRMLS_CC);
+ }
- /* cleanup */
- efree(keys[i]);
- }
+ } ZEND_HASH_FOREACH_END();
- efree(keys);
- efree(key_lens);
+ /* cleanup */
+ zval_dtor(&z_ret);
}
void