From b7e8b3b64edbfc6583f551a22c9d2186625e19c9 Mon Sep 17 00:00:00 2001 From: vostok4 Date: Thu, 10 Oct 2013 13:07:01 +0200 Subject: Fix compilation errors on Win32 with VC11 This brings the W32 compilation fixes done by @char101 up to date and allows building of php_redis.dll with VC11 on Win32 (allows for a php5.5 version). --- redis_array.c | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) (limited to 'redis_array.c') diff --git a/redis_array.c b/redis_array.c index ecc158ea..12fe9830 100644 --- a/redis_array.c +++ b/redis_array.c @@ -116,7 +116,7 @@ void redis_destructor_redis_array(zend_rsrc_list_entry * rsrc TSRMLS_DC) /** * redis_array_get */ -PHPAPI int redis_array_get(zval *id, RedisArray **ra TSRMLS_DC) +PHP_REDIS_API int redis_array_get(zval *id, RedisArray **ra TSRMLS_DC) { zval **socket; @@ -198,6 +198,7 @@ PHP_METHOD(RedisArray, __construct) HashTable *hPrev = NULL, *hOpts = NULL; long l_retry_interval = 0; zend_bool b_lazy_connect = 0; + zval **z_retry_interval_pp; if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "z|a", &z0, &z_opts) == FAILURE) { RETURN_FALSE; @@ -245,7 +246,6 @@ PHP_METHOD(RedisArray, __construct) } /* 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) { @@ -961,6 +961,8 @@ PHP_METHOD(RedisArray, mset) unsigned int key_len, free_idx = 0; int type, *key_lens; unsigned long idx; + int found; + zval *z_tmp; /* Multi/exec support */ HANDLE_MULTI_EXEC("MSET"); @@ -1028,13 +1030,12 @@ PHP_METHOD(RedisArray, mset) redis_inst = ra->redis[n]; /* copy args */ - int found = 0; + found = 0; MAKE_STD_ZVAL(z_argarray); array_init(z_argarray); for(i = 0; i < argc; ++i) { if(pos[i] != n) continue; - zval *z_tmp; ALLOC_ZVAL(z_tmp); *z_tmp = *argv[i]; zval_copy_ctor(z_tmp); -- cgit v1.2.3 From 978fbcf6fc355fcd344feb76ab4b7d6b77e9f7c1 Mon Sep 17 00:00:00 2001 From: vostok4 Date: Fri, 18 Oct 2013 14:37:06 +0200 Subject: Further fixes for building on VC9 Win32, C89 compliance Include win32/php_stdint.h on Win32 (fixes compilation on VC9) Change C++ comments to C89 style (to adhere to PHP project) --- redis_array.c | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) (limited to 'redis_array.c') diff --git a/redis_array.c b/redis_array.c index 12fe9830..60d1022b 100644 --- a/redis_array.c +++ b/redis_array.c @@ -293,7 +293,7 @@ static void ra_forward_call(INTERNAL_FUNCTION_PARAMETERS, RedisArray *ra, const char *cmd, int cmd_len, zval *z_args, zval *z_new_target) { zval **zp_tmp, z_tmp; - char *key = NULL; // set to avoid "unused-but-set-variable" + char *key = NULL; /* set to avoid "unused-but-set-variable" */ int key_len; int i; zval *redis_inst; @@ -607,41 +607,41 @@ PHP_METHOD(RedisArray, keys) char *pattern; int pattern_len, i; - // Make sure the prototype is correct + /* Make sure the prototype is correct */ if(zend_parse_method_parameters(ZEND_NUM_ARGS() TSRMLS_CC, getThis(), "Os", &object, redis_array_ce, &pattern, &pattern_len) == FAILURE) { RETURN_FALSE; } - // Make sure we can grab our RedisArray object + /* Make sure we can grab our RedisArray object */ if(redis_array_get(object, &ra TSRMLS_CC) < 0) { RETURN_FALSE; } - // Set up our function call (KEYS) + /* Set up our function call (KEYS) */ ZVAL_STRING(&z_fun, "KEYS", 0); - // We will be passing with one string argument (the pattern) + /* We will be passing with one string argument (the pattern) */ MAKE_STD_ZVAL(z_args[0]); ZVAL_STRINGL(z_args[0], pattern, pattern_len, 0); - // Init our array return + /* Init our array return */ array_init(return_value); - // Iterate our RedisArray nodes + /* Iterate our RedisArray nodes */ for(i=0; icount; ++i) { - // Return for this node + /* Return for this node */ MAKE_STD_ZVAL(z_tmp); - // Call KEYS on each node + /* Call KEYS on each node */ call_user_function(&redis_ce->function_table, &ra->redis[i], &z_fun, z_tmp, 1, z_args TSRMLS_CC); - // Add the result for this host + /* Add the result for this host */ add_assoc_zval(return_value, ra->hosts[i], z_tmp); } - // Free arg array + /* Free arg array */ efree(z_args[0]); } @@ -1186,7 +1186,7 @@ PHP_METHOD(RedisArray, del) found++; } - if(!found) { // don't run empty DELs + if(!found) { /* don't run empty DELs */ zval_dtor(z_argarray); efree(z_argarray); continue; -- cgit v1.2.3 From 9c12c40a66cbd76f5efa053b1718fa936320400b Mon Sep 17 00:00:00 2001 From: vostok4 Date: Wed, 9 Apr 2014 11:14:45 +0200 Subject: Merge nicolasff:b9a16b5ad5 in, fixing for Win32 Now we should be up to master with upstream for an easier merge. --- redis_array.c | 72 +++++++++++++++++++++++++++++++++++++++-------------------- 1 file changed, 48 insertions(+), 24 deletions(-) (limited to 'redis_array.c') diff --git a/redis_array.c b/redis_array.c index 60d1022b..e9a56e7a 100644 --- a/redis_array.c +++ b/redis_array.c @@ -32,6 +32,12 @@ #include "redis_array.h" #include "redis_array_impl.h" +/* Simple macro to detect failure in a RedisArray call */ +#define RA_CALL_FAILED(rv, cmd) \ + ((Z_TYPE_P(rv) == IS_BOOL && Z_BVAL_P(rv) == 0) || \ + (Z_TYPE_P(rv) == IS_ARRAY && zend_hash_num_elements(Z_ARRVAL_P(rv)) == 0) || \ + (Z_TYPE_P(rv) == IS_LONG && Z_LVAL_P(rv) == 0 && !strcasecmp(cmd, "TYPE"))) \ + extern zend_class_entry *redis_ce; zend_class_entry *redis_array_ce; @@ -76,43 +82,50 @@ zend_function_entry redis_array_functions[] = { {NULL, NULL, NULL} }; -int le_redis_array; -void redis_destructor_redis_array(zend_rsrc_list_entry * rsrc TSRMLS_DC) -{ +static void redis_array_free(RedisArray *ra) { int i; - RedisArray *ra = (RedisArray*)rsrc->ptr; - /* delete Redis objects */ - for(i = 0; i < ra->count; ++i) { + // Redis objects + for(i=0;icount;i++) { zval_dtor(ra->redis[i]); efree(ra->redis[i]); - - /* remove host too */ efree(ra->hosts[i]); } efree(ra->redis); efree(ra->hosts); - /* delete function */ + /* delete hash function */ if(ra->z_fun) { zval_dtor(ra->z_fun); efree(ra->z_fun); } - /* delete distributor */ + /* Distributor */ if(ra->z_dist) { zval_dtor(ra->z_dist); efree(ra->z_dist); } - /* delete list of pure commands */ + /* Delete pur commands */ zval_dtor(ra->z_pure_cmds); efree(ra->z_pure_cmds); - /* free container */ + // Free structure itself efree(ra); } +int le_redis_array; +void redis_destructor_redis_array(zend_rsrc_list_entry * rsrc TSRMLS_DC) +{ + RedisArray *ra = (RedisArray*)rsrc->ptr; + + /* Free previous ring if it's set */ + if(ra->prev) redis_array_free(ra->prev); + + /* Free parent array */ + redis_array_free(ra); +} + /** * redis_array_get */ @@ -199,6 +212,8 @@ PHP_METHOD(RedisArray, __construct) long l_retry_interval = 0; zend_bool b_lazy_connect = 0; zval **z_retry_interval_pp; + double d_connect_timeout = 0; + zval **z_connect_timeout_pp; if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "z|a", &z0, &z_opts) == FAILURE) { RETURN_FALSE; @@ -261,6 +276,18 @@ PHP_METHOD(RedisArray, __construct) if(FAILURE != zend_hash_find(hOpts, "lazy_connect", sizeof("lazy_connect"), (void**)&zpData) && Z_TYPE_PP(zpData) == IS_BOOL) { b_lazy_connect = Z_BVAL_PP(zpData); } + + /* extract connect_timeout option */ + if (FAILURE != zend_hash_find(hOpts, "connect_timeout", sizeof("connect_timeout"), (void**)&z_connect_timeout_pp)) { + if (Z_TYPE_PP(z_connect_timeout_pp) == IS_DOUBLE || Z_TYPE_PP(z_connect_timeout_pp) == IS_STRING) { + if (Z_TYPE_PP(z_connect_timeout_pp) == IS_DOUBLE) { + d_connect_timeout = Z_DVAL_PP(z_connect_timeout_pp); + } + else { + d_connect_timeout = atof(Z_STRVAL_PP(z_connect_timeout_pp)); + } + } + } } /* extract either name of list of hosts from z0 */ @@ -270,7 +297,7 @@ PHP_METHOD(RedisArray, __construct) break; case IS_ARRAY: - ra = ra_make_array(Z_ARRVAL_P(z0), z_fun, z_dist, hPrev, b_index, b_pconnect, l_retry_interval, b_lazy_connect TSRMLS_CC); + ra = ra_make_array(Z_ARRVAL_P(z0), z_fun, z_dist, hPrev, b_index, b_pconnect, l_retry_interval, b_lazy_connect, d_connect_timeout TSRMLS_CC); break; default: @@ -280,6 +307,8 @@ PHP_METHOD(RedisArray, __construct) if(ra) { ra->auto_rehash = b_autorehash; + ra->connect_timeout = d_connect_timeout; + if(ra->prev) ra->prev->auto_rehash = b_autorehash; #if PHP_VERSION_ID >= 50400 id = zend_list_insert(ra, le_redis_array TSRMLS_CC); #else @@ -366,22 +395,14 @@ ra_forward_call(INTERNAL_FUNCTION_PARAMETERS, RedisArray *ra, const char *cmd, i } else { /* call directly through. */ call_user_function(&redis_ce->function_table, &redis_inst, &z_fun, return_value, argc, z_callargs TSRMLS_CC); - failed = 0; - if((Z_TYPE_P(return_value) == IS_BOOL && Z_BVAL_P(return_value) == 0) || - (Z_TYPE_P(return_value) == IS_ARRAY && zend_hash_num_elements(Z_ARRVAL_P(return_value)) == 0) || - (Z_TYPE_P(return_value) == IS_LONG && Z_LVAL_P(return_value) == 0 && !strcasecmp(cmd, "TYPE"))) - - { - failed = 1; - } - /* check if we have an error. */ - if(failed && ra->prev && !b_write_cmd) { /* there was an error reading, try with prev ring. */ + if(RA_CALL_FAILED(return_value,cmd) && ra->prev && !b_write_cmd) { /* there was an error reading, try with prev ring. */ /* ERROR, FALLBACK TO PREVIOUS RING and forward a reference to the first redis instance we were looking at. */ ra_forward_call(INTERNAL_FUNCTION_PARAM_PASSTHRU, ra->prev, cmd, cmd_len, z_args, z_new_target?z_new_target:redis_inst); } - if(!failed && !b_write_cmd && z_new_target && ra->auto_rehash) { /* move key from old ring to new ring */ + /* Autorehash if the key was found on the previous node if this is a read command and auto rehashing is on */ + if(!RA_CALL_FAILED(return_value,cmd) && !b_write_cmd && z_new_target && ra->auto_rehash) { /* move key from old ring to new ring */ ra_move_key(key, key_len, redis_inst, z_new_target TSRMLS_CC); } } @@ -876,6 +897,9 @@ PHP_METHOD(RedisArray, mget) /* calls */ for(n = 0; n < ra->count; ++n) { /* for each node */ + /* We don't even need to make a call to this node if no keys go there */ + if(!argc_each[n]) continue; + /* copy args for MGET call on node. */ MAKE_STD_ZVAL(z_argarray); array_init(z_argarray); -- cgit v1.2.3 From 566d673f83170e9f5a49d8f072c8e5e0a1c8d6b1 Mon Sep 17 00:00:00 2001 From: vostok4 Date: Wed, 9 Apr 2014 11:21:32 +0200 Subject: Fix comments for C89 compatibility --- redis_array.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'redis_array.c') diff --git a/redis_array.c b/redis_array.c index e9a56e7a..05f0c2e4 100644 --- a/redis_array.c +++ b/redis_array.c @@ -85,7 +85,7 @@ zend_function_entry redis_array_functions[] = { static void redis_array_free(RedisArray *ra) { int i; - // Redis objects + /* Redis objects */ for(i=0;icount;i++) { zval_dtor(ra->redis[i]); efree(ra->redis[i]); @@ -110,7 +110,7 @@ static void redis_array_free(RedisArray *ra) { zval_dtor(ra->z_pure_cmds); efree(ra->z_pure_cmds); - // Free structure itself + /* Free structure itself */ efree(ra); } -- cgit v1.2.3 From 6c377eee18a5a36df71da2498eddbc0cd4f1ba76 Mon Sep 17 00:00:00 2001 From: Anatol Belski Date: Tue, 1 Jul 2014 12:19:01 +0200 Subject: added redis array stuff to win part done some fixes to it --- redis_array.c | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) (limited to 'redis_array.c') diff --git a/redis_array.c b/redis_array.c index 36254df0..fc9ded5d 100644 --- a/redis_array.c +++ b/redis_array.c @@ -219,6 +219,8 @@ PHP_METHOD(RedisArray, __construct) /* extract options */ if(z_opts) { + zval **z_retry_interval_pp; + zval **z_connect_timeout_pp; hOpts = Z_ARRVAL_P(z_opts); @@ -259,7 +261,6 @@ PHP_METHOD(RedisArray, __construct) } /* 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) { @@ -277,7 +278,6 @@ PHP_METHOD(RedisArray, __construct) } /* extract connect_timeout option */ - zval **z_connect_timeout_pp; if (FAILURE != zend_hash_find(hOpts, "connect_timeout", sizeof("connect_timeout"), (void**)&z_connect_timeout_pp)) { if (Z_TYPE_PP(z_connect_timeout_pp) == IS_DOUBLE || Z_TYPE_PP(z_connect_timeout_pp) == IS_STRING) { if (Z_TYPE_PP(z_connect_timeout_pp) == IS_DOUBLE) { @@ -1045,19 +1045,20 @@ PHP_METHOD(RedisArray, mset) /* calls */ for(n = 0; n < ra->count; ++n) { /* for each node */ + int found = 0; /* prepare call */ ZVAL_STRING(&z_fun, "MSET", 0); redis_inst = ra->redis[n]; /* copy args */ - int found = 0; MAKE_STD_ZVAL(z_argarray); array_init(z_argarray); for(i = 0; i < argc; ++i) { + zval *z_tmp; + if(pos[i] != n) continue; - zval *z_tmp; ALLOC_ZVAL(z_tmp); *z_tmp = *argv[i]; zval_copy_ctor(z_tmp); -- cgit v1.2.3 From 79efa8d791ac2db33a7eb29e51813faacdb7bb21 Mon Sep 17 00:00:00 2001 From: Anatol Belski Date: Tue, 1 Jul 2014 16:50:23 +0200 Subject: fixes after the merge --- redis_array.c | 11 ----------- 1 file changed, 11 deletions(-) (limited to 'redis_array.c') diff --git a/redis_array.c b/redis_array.c index 02412ba6..1d4b6c92 100644 --- a/redis_array.c +++ b/redis_array.c @@ -126,17 +126,6 @@ void redis_destructor_redis_array(zend_rsrc_list_entry * rsrc TSRMLS_DC) redis_array_free(ra); } -int le_redis_array; -void redis_destructor_redis_array(zend_rsrc_list_entry * rsrc TSRMLS_DC) -{ - RedisArray *ra = (RedisArray*)rsrc->ptr; - - /* Free previous ring if it's set */ - if(ra->prev) redis_array_free(ra->prev); - - /* Free parent array */ - redis_array_free(ra); -} /** * redis_array_get -- cgit v1.2.3 From cdd4557f014a82c7b7ce3a841654ab4cfa0f12f2 Mon Sep 17 00:00:00 2001 From: Anatol Belski Date: Tue, 1 Jul 2014 16:59:41 +0200 Subject: fix unreferenced variable warnings --- redis_array.c | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) (limited to 'redis_array.c') diff --git a/redis_array.c b/redis_array.c index 1d4b6c92..899ba718 100644 --- a/redis_array.c +++ b/redis_array.c @@ -985,8 +985,6 @@ PHP_METHOD(RedisArray, mset) unsigned int key_len, free_idx = 0; int type, *key_lens; unsigned long idx; - int found; - zval *z_tmp; /* Multi/exec support */ HANDLE_MULTI_EXEC("MSET"); @@ -1006,7 +1004,7 @@ PHP_METHOD(RedisArray, mset) argv = emalloc(argc * sizeof(zval*)); pos = emalloc(argc * sizeof(int)); keys = emalloc(argc * sizeof(char*)); - key_lens = emalloc(argc * sizeof(int)); + key_lens = emalloc(argc * sizeof(int)); redis_instances = emalloc(argc * sizeof(zval*)); memset(redis_instances, 0, argc * sizeof(zval*)); -- cgit v1.2.3