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:
Diffstat (limited to 'redis_array_impl.c')
-rw-r--r--redis_array_impl.c223
1 files changed, 83 insertions, 140 deletions
diff --git a/redis_array_impl.c b/redis_array_impl.c
index 82715d07..a427f673 100644
--- a/redis_array_impl.c
+++ b/redis_array_impl.c
@@ -31,7 +31,8 @@
extern zend_class_entry *redis_ce;
static RedisArray *
-ra_load_hosts(RedisArray *ra, HashTable *hosts, zend_string *auth, long retry_interval, zend_bool b_lazy_connect)
+ra_load_hosts(RedisArray *ra, HashTable *hosts, zend_string *user,
+ zend_string *pass, long retry_interval, zend_bool b_lazy_connect)
{
int i = 0, host_len;
char *host, *p;
@@ -63,14 +64,13 @@ ra_load_hosts(RedisArray *ra, HashTable *hosts, zend_string *auth, long retry_in
redis = PHPREDIS_ZVAL_GET_OBJECT(redis_object, &ra->redis[i]);
/* create socket */
- redis->sock = redis_sock_create(host, host_len, port, ra->connect_timeout, ra->read_timeout, ra->pconnect, NULL, retry_interval);
+ redis->sock = redis_sock_create(host, host_len, port, ra->connect_timeout,
+ ra->read_timeout, ra->pconnect, NULL,
+ retry_interval);
- /* copy password is specified */
- if (auth) redis->sock->auth = zend_string_copy(auth);
+ redis_sock_set_auth(redis->sock, user, pass);
- if (!b_lazy_connect)
- {
- /* connect */
+ if (!b_lazy_connect) {
if (redis_sock_server_open(redis->sock) < 0) {
ra->count = ++i;
return NULL;
@@ -151,25 +151,12 @@ ra_find_name(const char *name) {
/* load array from INI settings */
RedisArray *ra_load_array(const char *name) {
-
- zval *z_data, z_fun, z_dist;
+ zval *z_data, z_tmp, z_fun, z_dist;
zval z_params_hosts;
zval z_params_prev;
- zval z_params_funs;
- zval z_params_dist;
- zval z_params_algo;
- zval z_params_index;
- zval z_params_autorehash;
- zval z_params_retry_interval;
- zval z_params_pconnect;
- zval z_params_connect_timeout;
- zval z_params_read_timeout;
- zval z_params_lazy_connect;
- zval z_params_consistent;
- zval z_params_auth;
RedisArray *ra = NULL;
- zend_string *algorithm = NULL, *auth = NULL;
+ zend_string *algorithm = NULL, *user = NULL, *pass = NULL;
zend_bool b_index = 0, b_autorehash = 0, b_pconnect = 0, consistent = 0;
long l_retry_interval = 0;
zend_bool b_lazy_connect = 0;
@@ -182,185 +169,142 @@ RedisArray *ra_load_array(const char *name) {
if(!ra_find_name(name))
return ra;
+ ZVAL_NULL(&z_fun);
+ ZVAL_NULL(&z_dist);
+
/* find hosts */
array_init(&z_params_hosts);
if ((iptr = INI_STR("redis.arrays.hosts")) != NULL) {
sapi_module.treat_data(PARSE_STRING, estrdup(iptr), &z_params_hosts);
- }
- if ((z_data = zend_hash_str_find(Z_ARRVAL(z_params_hosts), name, name_len)) != NULL) {
- hHosts = Z_ARRVAL_P(z_data);
+ if ((z_data = zend_hash_str_find(Z_ARRVAL(z_params_hosts), name, name_len)) != NULL) {
+ hHosts = Z_ARRVAL_P(z_data);
+ }
}
/* find previous hosts */
array_init(&z_params_prev);
if ((iptr = INI_STR("redis.arrays.previous")) != NULL) {
sapi_module.treat_data(PARSE_STRING, estrdup(iptr), &z_params_prev);
- }
- if ((z_data = zend_hash_str_find(Z_ARRVAL(z_params_prev), name, name_len)) != NULL) {
- hPrev = Z_ARRVAL_P(z_data);
+ if ((z_data = zend_hash_str_find(Z_ARRVAL(z_params_prev), name, name_len)) != NULL) {
+ if (Z_TYPE_P(z_data) == IS_ARRAY) {
+ hPrev = Z_ARRVAL_P(z_data);
+ }
+ }
}
/* find function */
- array_init(&z_params_funs);
if ((iptr = INI_STR("redis.arrays.functions")) != NULL) {
- sapi_module.treat_data(PARSE_STRING, estrdup(iptr), &z_params_funs);
- }
- ZVAL_NULL(&z_fun);
- if ((z_data = zend_hash_str_find(Z_ARRVAL(z_params_funs), name, name_len)) != NULL) {
- ZVAL_ZVAL(&z_fun, z_data, 1, 0);
+ array_init(&z_tmp);
+ sapi_module.treat_data(PARSE_STRING, estrdup(iptr), &z_tmp);
+ redis_conf_zval(Z_ARRVAL(z_tmp), name, name_len, &z_fun, 1, 0);
+ zval_dtor(&z_tmp);
}
/* find distributor */
- array_init(&z_params_dist);
if ((iptr = INI_STR("redis.arrays.distributor")) != NULL) {
- sapi_module.treat_data(PARSE_STRING, estrdup(iptr), &z_params_dist);
- }
- ZVAL_NULL(&z_dist);
- if ((z_data = zend_hash_str_find(Z_ARRVAL(z_params_dist), name, name_len)) != NULL) {
- ZVAL_ZVAL(&z_dist, z_data, 1, 0);
+ array_init(&z_tmp);
+ sapi_module.treat_data(PARSE_STRING, estrdup(iptr), &z_tmp);
+ redis_conf_zval(Z_ARRVAL(z_tmp), name, name_len, &z_dist, 1, 0);
+ zval_dtor(&z_tmp);
}
/* find hash algorithm */
- array_init(&z_params_algo);
if ((iptr = INI_STR("redis.arrays.algorithm")) != NULL) {
- sapi_module.treat_data(PARSE_STRING, estrdup(iptr), &z_params_algo);
- }
- if ((z_data = zend_hash_str_find(Z_ARRVAL(z_params_algo), name, name_len)) != NULL) {
- algorithm = zval_get_string(z_data);
+ array_init(&z_tmp);
+ sapi_module.treat_data(PARSE_STRING, estrdup(iptr), &z_tmp);
+ redis_conf_string(Z_ARRVAL(z_tmp), name, name_len, &algorithm);
+ zval_dtor(&z_tmp);
}
/* find index option */
- array_init(&z_params_index);
if ((iptr = INI_STR("redis.arrays.index")) != NULL) {
- sapi_module.treat_data(PARSE_STRING, estrdup(iptr), &z_params_index);
- }
- if ((z_data = zend_hash_str_find(Z_ARRVAL(z_params_index), name, name_len)) != NULL) {
- if (Z_TYPE_P(z_data) == IS_STRING && strncmp(Z_STRVAL_P(z_data), "1", 1) == 0) {
- b_index = 1;
- }
+ array_init(&z_tmp);
+ sapi_module.treat_data(PARSE_STRING, estrdup(iptr), &z_tmp);
+ redis_conf_zend_bool(Z_ARRVAL(z_tmp), name, name_len, &b_index);
+ zval_dtor(&z_tmp);
}
/* find autorehash option */
- array_init(&z_params_autorehash);
if ((iptr = INI_STR("redis.arrays.autorehash")) != NULL) {
- sapi_module.treat_data(PARSE_STRING, estrdup(iptr), &z_params_autorehash);
- }
- if ((z_data = zend_hash_str_find(Z_ARRVAL(z_params_autorehash), name, name_len)) != NULL) {
- if(Z_TYPE_P(z_data) == IS_STRING && strncmp(Z_STRVAL_P(z_data), "1", 1) == 0) {
- b_autorehash = 1;
- }
+ array_init(&z_tmp);
+ sapi_module.treat_data(PARSE_STRING, estrdup(iptr), &z_tmp);
+ redis_conf_zend_bool(Z_ARRVAL(z_tmp), name, name_len, &b_autorehash);
+ zval_dtor(&z_tmp);
}
/* find retry interval option */
- array_init(&z_params_retry_interval);
if ((iptr = INI_STR("redis.arrays.retryinterval")) != NULL) {
- sapi_module.treat_data(PARSE_STRING, estrdup(iptr), &z_params_retry_interval);
- }
- if ((z_data = zend_hash_str_find(Z_ARRVAL(z_params_retry_interval), name, name_len)) != NULL) {
- if (Z_TYPE_P(z_data) == IS_LONG) {
- l_retry_interval = Z_LVAL_P(z_data);
- } else if (Z_TYPE_P(z_data) == IS_STRING) {
- l_retry_interval = atol(Z_STRVAL_P(z_data));
- }
+ array_init(&z_tmp);
+ sapi_module.treat_data(PARSE_STRING, estrdup(iptr), &z_tmp);
+ redis_conf_long(Z_ARRVAL(z_tmp), name, name_len, &l_retry_interval);
+ zval_dtor(&z_tmp);
}
/* find pconnect option */
- array_init(&z_params_pconnect);
if ((iptr = INI_STR("redis.arrays.pconnect")) != NULL) {
- sapi_module.treat_data(PARSE_STRING, estrdup(iptr), &z_params_pconnect);
- }
- if ((z_data = zend_hash_str_find(Z_ARRVAL(z_params_pconnect), name, name_len)) != NULL) {
- if(Z_TYPE_P(z_data) == IS_STRING && strncmp(Z_STRVAL_P(z_data), "1", 1) == 0) {
- b_pconnect = 1;
- }
+ array_init(&z_tmp);
+ sapi_module.treat_data(PARSE_STRING, estrdup(iptr), &z_tmp);
+ redis_conf_zend_bool(Z_ARRVAL(z_tmp), name, name_len, &b_pconnect);
+ zval_dtor(&z_tmp);
}
/* find lazy connect option */
- array_init(&z_params_lazy_connect);
if ((iptr = INI_STR("redis.arrays.lazyconnect")) != NULL) {
- sapi_module.treat_data(PARSE_STRING, estrdup(iptr), &z_params_lazy_connect);
- }
- if ((z_data = zend_hash_str_find(Z_ARRVAL(z_params_lazy_connect), name, name_len)) != NULL) {
- if (Z_TYPE_P(z_data) == IS_STRING && strncmp(Z_STRVAL_P(z_data), "1", 1) == 0) {
- b_lazy_connect = 1;
- }
+ array_init(&z_tmp);
+ sapi_module.treat_data(PARSE_STRING, estrdup(iptr), &z_tmp);
+ redis_conf_zend_bool(Z_ARRVAL(z_tmp), name, name_len, &b_lazy_connect);
+ zval_dtor(&z_tmp);
}
/* find connect timeout option */
- array_init(&z_params_connect_timeout);
if ((iptr = INI_STR("redis.arrays.connecttimeout")) != NULL) {
- sapi_module.treat_data(PARSE_STRING, estrdup(iptr), &z_params_connect_timeout);
- }
- if ((z_data = zend_hash_str_find(Z_ARRVAL(z_params_connect_timeout), name, name_len)) != NULL) {
- if (Z_TYPE_P(z_data) == IS_DOUBLE) {
- d_connect_timeout = Z_DVAL_P(z_data);
- } else if (Z_TYPE_P(z_data) == IS_STRING) {
- d_connect_timeout = atof(Z_STRVAL_P(z_data));
- } else if (Z_TYPE_P(z_data) == IS_LONG) {
- d_connect_timeout = Z_LVAL_P(z_data);
- }
+ array_init(&z_tmp);
+ sapi_module.treat_data(PARSE_STRING, estrdup(iptr), &z_tmp);
+ redis_conf_double(Z_ARRVAL(z_tmp), name, name_len, &d_connect_timeout);
+ zval_dtor(&z_tmp);
}
/* find read timeout option */
- array_init(&z_params_read_timeout);
if ((iptr = INI_STR("redis.arrays.readtimeout")) != NULL) {
- sapi_module.treat_data(PARSE_STRING, estrdup(iptr), &z_params_read_timeout);
- }
- if ((z_data = zend_hash_str_find(Z_ARRVAL(z_params_read_timeout), name, name_len)) != NULL) {
- if (Z_TYPE_P(z_data) == IS_DOUBLE) {
- read_timeout = Z_DVAL_P(z_data);
- } else if (Z_TYPE_P(z_data) == IS_STRING) {
- read_timeout = atof(Z_STRVAL_P(z_data));
- } else if (Z_TYPE_P(z_data) == IS_LONG) {
- read_timeout = Z_LVAL_P(z_data);
- }
+ array_init(&z_tmp);
+ sapi_module.treat_data(PARSE_STRING, estrdup(iptr), &z_tmp);
+ redis_conf_double(Z_ARRVAL(z_tmp), name, name_len, &read_timeout);
+ zval_dtor(&z_tmp);
}
/* find consistent option */
- array_init(&z_params_consistent);
if ((iptr = INI_STR("redis.arrays.consistent")) != NULL) {
- sapi_module.treat_data(PARSE_STRING, estrdup(iptr), &z_params_consistent);
- }
- if ((z_data = zend_hash_str_find(Z_ARRVAL(z_params_consistent), name, name_len)) != NULL) {
- if (Z_TYPE_P(z_data) == IS_STRING && strncmp(Z_STRVAL_P(z_data), "1", 1) == 0) {
- consistent = 1;
+ array_init(&z_tmp);
+ sapi_module.treat_data(PARSE_STRING, estrdup(iptr), &z_tmp);
+ if ((z_data = zend_hash_str_find(Z_ARRVAL(z_tmp), name, name_len)) != NULL) {
+ consistent = Z_TYPE_P(z_data) == IS_STRING && strncmp(Z_STRVAL_P(z_data), "1", 1) == 0;
}
+ zval_dtor(&z_tmp);
}
/* find auth option */
- array_init(&z_params_auth);
if ((iptr = INI_STR("redis.arrays.auth")) != NULL) {
- sapi_module.treat_data(PARSE_STRING, estrdup(iptr), &z_params_auth);
- }
- if ((z_data = zend_hash_str_find(Z_ARRVAL(z_params_auth), name, name_len)) != NULL) {
- auth = zval_get_string(z_data);
+ array_init(&z_tmp);
+ sapi_module.treat_data(PARSE_STRING, estrdup(iptr), &z_tmp);
+ redis_conf_auth(Z_ARRVAL(z_tmp), name, name_len, &user, &pass);
+ zval_dtor(&z_tmp);
}
/* create RedisArray object */
- ra = ra_make_array(hHosts, &z_fun, &z_dist, hPrev, b_index, b_pconnect, l_retry_interval, b_lazy_connect, d_connect_timeout, read_timeout, consistent, algorithm, auth);
+ ra = ra_make_array(hHosts, &z_fun, &z_dist, hPrev, b_index, b_pconnect, l_retry_interval,
+ b_lazy_connect, d_connect_timeout, read_timeout, consistent, algorithm,
+ user, pass);
if (ra) {
ra->auto_rehash = b_autorehash;
if(ra->prev) ra->prev->auto_rehash = b_autorehash;
}
- /* cleanup */
if (algorithm) zend_string_release(algorithm);
- if (auth) zend_string_release(auth);
+ if (user) zend_string_release(user);
+ if (pass) zend_string_release(pass);
zval_dtor(&z_params_hosts);
zval_dtor(&z_params_prev);
- zval_dtor(&z_params_funs);
- zval_dtor(&z_params_dist);
- zval_dtor(&z_params_algo);
- zval_dtor(&z_params_index);
- zval_dtor(&z_params_autorehash);
- zval_dtor(&z_params_retry_interval);
- zval_dtor(&z_params_pconnect);
- zval_dtor(&z_params_connect_timeout);
- zval_dtor(&z_params_read_timeout);
- zval_dtor(&z_params_lazy_connect);
- zval_dtor(&z_params_consistent);
- zval_dtor(&z_params_auth);
zval_dtor(&z_dist);
zval_dtor(&z_fun);
@@ -408,7 +352,11 @@ ra_make_continuum(zend_string **hosts, int nb_hosts)
}
RedisArray *
-ra_make_array(HashTable *hosts, zval *z_fun, zval *z_dist, HashTable *hosts_prev, zend_bool b_index, zend_bool b_pconnect, long retry_interval, zend_bool b_lazy_connect, double connect_timeout, double read_timeout, zend_bool consistent, zend_string *algorithm, zend_string *auth)
+ra_make_array(HashTable *hosts, zval *z_fun, zval *z_dist, HashTable *hosts_prev,
+ zend_bool b_index, zend_bool b_pconnect, long retry_interval,
+ zend_bool b_lazy_connect, double connect_timeout, double read_timeout,
+ zend_bool consistent, zend_string *algorithm, zend_string *user,
+ zend_string *pass)
{
int i, count;
RedisArray *ra;
@@ -429,7 +377,7 @@ ra_make_array(HashTable *hosts, zval *z_fun, zval *z_dist, HashTable *hosts_prev
ra->continuum = NULL;
ra->algorithm = NULL;
- if (ra_load_hosts(ra, hosts, auth, retry_interval, b_lazy_connect) == NULL || !ra->count) {
+ if (ra_load_hosts(ra, hosts, user, pass, retry_interval, b_lazy_connect) == NULL || !ra->count) {
for (i = 0; i < ra->count; ++i) {
zval_dtor(&ra->redis[i]);
zend_string_release(ra->hosts[i]);
@@ -439,7 +387,8 @@ ra_make_array(HashTable *hosts, zval *z_fun, zval *z_dist, HashTable *hosts_prev
efree(ra);
return NULL;
}
- ra->prev = hosts_prev ? ra_make_array(hosts_prev, z_fun, z_dist, NULL, b_index, b_pconnect, retry_interval, b_lazy_connect, connect_timeout, read_timeout, consistent, algorithm, auth) : NULL;
+
+ ra->prev = hosts_prev ? ra_make_array(hosts_prev, z_fun, z_dist, NULL, b_index, b_pconnect, retry_interval, b_lazy_connect, connect_timeout, read_timeout, consistent, algorithm, user, pass) : NULL;
/* init array data structures */
ra_init_function_table(ra);
@@ -541,13 +490,7 @@ ra_find_node(RedisArray *ra, const char *key, int key_len, int *out_pos)
const php_hash_ops *ops;
/* hash */
- if (ra->algorithm && (
-#if (PHP_VERSION_ID < 80000)
- ops = php_hash_fetch_ops(ZSTR_VAL(ra->algorithm), ZSTR_LEN(ra->algorithm))
-#else
- ops = php_hash_fetch_ops(ra->algorithm)
-#endif
- ) != NULL) {
+ if (ra->algorithm && (ops = redis_hash_fetch_ops(ra->algorithm))) {
void *ctx = emalloc(ops->context_size);
unsigned char *digest = emalloc(ops->digest_size);