Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit 5f15ce2

Browse files
committed
WIP: php7 compatibility
1 parent bba159e commit 5f15ce2

3 files changed

Lines changed: 90 additions & 66 deletions

File tree

redis_array.c

Lines changed: 64 additions & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -97,16 +97,10 @@ static void redis_array_free(RedisArray *ra) {
9797
efree(ra->hosts);
9898

9999
/* delete hash function */
100-
if(ra->z_fun) {
101-
zval_dtor(ra->z_fun);
102-
efree(ra->z_fun);
103-
}
100+
zval_dtor(&ra->z_fun);
104101

105102
/* Distributor */
106-
if(ra->z_dist) {
107-
zval_dtor(ra->z_dist);
108-
efree(ra->z_dist);
109-
}
103+
zval_dtor(&ra->z_dist);
110104

111105
/* Delete pur commands */
112106
zval_dtor(&ra->z_pure_cmds);
@@ -212,7 +206,7 @@ uint32_t rcrc32(const char *s, size_t sz) {
212206
Public constructor */
213207
PHP_METHOD(RedisArray, __construct)
214208
{
215-
zval *z0, *z_fun = NULL, *z_dist = NULL, *zpData, *z_opts = NULL;
209+
zval *z0, z_fun, z_dist, *zpData, *z_opts = NULL;
216210
RedisArray *ra = NULL;
217211
zend_bool b_index = 0, b_autorehash = 0, b_pconnect = 0;
218212
HashTable *hPrev = NULL, *hOpts = NULL;
@@ -240,17 +234,17 @@ PHP_METHOD(RedisArray, __construct)
240234
}
241235

242236
/* extract function name. */
243-
if ((zpData = zend_hash_str_find(hOpts, "function", sizeof("function") - 1)) != NULL) {
244-
MAKE_STD_ZVAL(z_fun);
245-
*z_fun = *zpData;
246-
zval_copy_ctor(z_fun);
237+
if ((zpData = zend_hash_str_find(hOpts, "function", sizeof("function") - 1)) == NULL) {
238+
ZVAL_NULL(&z_fun);
239+
} else {
240+
ZVAL_ZVAL(&z_fun, zpData, 1, 0);
247241
}
248242

249243
/* extract function name. */
250-
if ((zpData = zend_hash_str_find(hOpts, "distributor", sizeof("distributor") - 1)) != NULL) {
251-
MAKE_STD_ZVAL(z_dist);
252-
*z_dist = *zpData;
253-
zval_copy_ctor(z_dist);
244+
if ((zpData = zend_hash_str_find(hOpts, "distributor", sizeof("distributor") - 1)) == NULL) {
245+
ZVAL_NULL(&z_dist);
246+
} else {
247+
ZVAL_ZVAL(&z_dist, zpData, 1, 0);
254248
}
255249

256250
/* extract index option. */
@@ -308,13 +302,15 @@ PHP_METHOD(RedisArray, __construct)
308302
break;
309303

310304
case IS_ARRAY:
311-
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);
305+
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);
312306
break;
313307

314308
default:
315309
WRONG_PARAM_COUNT;
316310
break;
317311
}
312+
zval_dtor(&z_dist);
313+
zval_dtor(&z_fun);
318314

319315
if(ra) {
320316
ra->auto_rehash = b_autorehash;
@@ -522,7 +518,7 @@ PHP_METHOD(RedisArray, _instance)
522518

523519
PHP_METHOD(RedisArray, _function)
524520
{
525-
zval *object;
521+
zval *object, *z_fun;
526522
RedisArray *ra;
527523

528524
if (zend_parse_method_parameters(ZEND_NUM_ARGS() TSRMLS_CC, getThis(), "O",
@@ -534,17 +530,13 @@ PHP_METHOD(RedisArray, _function)
534530
RETURN_FALSE;
535531
}
536532

537-
if(ra->z_fun) {
538-
*return_value = *ra->z_fun;
539-
zval_copy_ctor(return_value);
540-
} else {
541-
RETURN_NULL();
542-
}
533+
z_fun = &ra->z_fun;
534+
RETURN_ZVAL(z_fun, 1, 0);
543535
}
544536

545537
PHP_METHOD(RedisArray, _distributor)
546538
{
547-
zval *object;
539+
zval *object, *z_dist;
548540
RedisArray *ra;
549541

550542
if (zend_parse_method_parameters(ZEND_NUM_ARGS() TSRMLS_CC, getThis(), "O",
@@ -556,12 +548,8 @@ PHP_METHOD(RedisArray, _distributor)
556548
RETURN_FALSE;
557549
}
558550

559-
if(ra->z_fun) {
560-
*return_value = *ra->z_fun;
561-
zval_copy_ctor(return_value);
562-
} else {
563-
RETURN_NULL();
564-
}
551+
z_dist = &ra->z_dist;
552+
RETURN_ZVAL(z_dist, 1, 0);
565553
}
566554

567555
PHP_METHOD(RedisArray, _rehash)
@@ -589,7 +577,7 @@ PHP_METHOD(RedisArray, _rehash)
589577

590578
static void multihost_distribute(INTERNAL_FUNCTION_PARAMETERS, const char *method_name)
591579
{
592-
zval *object, z_fun, *z_tmp;
580+
zval *object, z_fun;
593581
int i;
594582
RedisArray *ra;
595583

@@ -607,8 +595,10 @@ static void multihost_distribute(INTERNAL_FUNCTION_PARAMETERS, const char *metho
607595

608596
array_init(return_value);
609597
for(i = 0; i < ra->count; ++i) {
610-
598+
zval zv, *z_tmp = &zv;
599+
#if (PHP_MAJOR_VERSION < 7)
611600
MAKE_STD_ZVAL(z_tmp);
601+
#endif
612602

613603
/* Call each node in turn */
614604
call_user_function(&redis_ce->function_table, &ra->redis[i], &z_fun, z_tmp, 0, NULL);
@@ -651,7 +641,7 @@ PHP_METHOD(RedisArray, bgsave)
651641

652642
PHP_METHOD(RedisArray, keys)
653643
{
654-
zval *object, z_args[1], *z_tmp, z_fun;
644+
zval *object, z_args[1], z_fun;
655645
RedisArray *ra;
656646
char *pattern;
657647
int pattern_len, i;
@@ -679,8 +669,11 @@ PHP_METHOD(RedisArray, keys)
679669

680670
/* Iterate our RedisArray nodes */
681671
for(i=0; i<ra->count; ++i) {
672+
zval zv, *z_tmp = &zv;
673+
#if (PHP_MAJOR_VERSION < 7)
682674
/* Return for this node */
683675
MAKE_STD_ZVAL(z_tmp);
676+
#endif
684677

685678
/* Call KEYS on each node */
686679
call_user_function(&redis_ce->function_table, &ra->redis[i], &z_fun, z_tmp, 1, z_args);
@@ -694,7 +687,7 @@ PHP_METHOD(RedisArray, keys)
694687

695688
PHP_METHOD(RedisArray, getOption)
696689
{
697-
zval *object, z_fun, *z_tmp, z_args[1];
690+
zval *object, z_fun, z_args[1];
698691
int i;
699692
RedisArray *ra;
700693
long opt;
@@ -716,8 +709,10 @@ PHP_METHOD(RedisArray, getOption)
716709

717710
array_init(return_value);
718711
for(i = 0; i < ra->count; ++i) {
719-
712+
zval zv, *z_tmp = &zv;
713+
#if (PHP_MAJOR_VERSION < 7)
720714
MAKE_STD_ZVAL(z_tmp);
715+
#endif
721716

722717
/* Call each node in turn */
723718
call_user_function(&redis_ce->function_table, &ra->redis[i], &z_fun, z_tmp, 1, z_args);
@@ -729,7 +724,7 @@ PHP_METHOD(RedisArray, getOption)
729724

730725
PHP_METHOD(RedisArray, setOption)
731726
{
732-
zval *object, z_fun, *z_tmp, z_args[2];
727+
zval *object, z_fun, z_args[2];
733728
int i;
734729
RedisArray *ra;
735730
long opt;
@@ -754,8 +749,10 @@ PHP_METHOD(RedisArray, setOption)
754749

755750
array_init(return_value);
756751
for(i = 0; i < ra->count; ++i) {
757-
752+
zval zv, *z_tmp = &zv;
753+
#if (PHP_MAJOR_VERSION < 7)
758754
MAKE_STD_ZVAL(z_tmp);
755+
#endif
759756

760757
/* Call each node in turn */
761758
call_user_function(&redis_ce->function_table, &ra->redis[i], &z_fun, z_tmp, 2, z_args);
@@ -768,7 +765,7 @@ PHP_METHOD(RedisArray, setOption)
768765

769766
PHP_METHOD(RedisArray, select)
770767
{
771-
zval *object, z_fun, *z_tmp, z_args[1];
768+
zval *object, z_fun, z_args[1];
772769
int i;
773770
RedisArray *ra;
774771
long opt;
@@ -790,7 +787,10 @@ PHP_METHOD(RedisArray, select)
790787

791788
array_init(return_value);
792789
for(i = 0; i < ra->count; ++i) {
790+
zval zv, *z_tmp = &zv;
791+
#if (PHP_MAJOR_VERSION < 7)
793792
MAKE_STD_ZVAL(z_tmp);
793+
#endif
794794

795795
/* Call each node in turn */
796796
call_user_function(&redis_ce->function_table, &ra->redis[i], &z_fun, z_tmp, 1, z_args);
@@ -799,7 +799,7 @@ PHP_METHOD(RedisArray, select)
799799
}
800800
zval_dtor(&z_fun);
801801
}
802-
802+
#if (PHP_MAJOR_VERSION < 7)
803803
#define HANDLE_MULTI_EXEC(cmd) do {\
804804
if (redis_array_get(getThis(), &ra TSRMLS_CC) >= 0 && ra->z_multi_exec) {\
805805
int i, num_varargs;\
@@ -828,6 +828,29 @@ PHP_METHOD(RedisArray, select)
828828
return;\
829829
}\
830830
}while(0)
831+
#else
832+
#define HANDLE_MULTI_EXEC(cmd) do { \
833+
if (redis_array_get(getThis(), &ra TSRMLS_CC) >= 0 && ra->z_multi_exec) { \
834+
int i, num_varargs; \
835+
zval *varargs = NULL, z_arg_array; \
836+
if (zend_parse_method_parameters(ZEND_NUM_ARGS() TSRMLS_CC, getThis(), "O*", \
837+
&object, redis_array_ce, &varargs, &num_varargs) == FAILURE) { \
838+
RETURN_FALSE;\
839+
} \
840+
/* copy all args into a zval hash table */\
841+
array_init(&z_arg_array); \
842+
for (i = 0; i < num_varargs; i++) { \
843+
zval z_tmp; \
844+
ZVAL_ZVAL(&z_tmp, &varargs[i], 1, 0); \
845+
add_next_index_zval(&z_arg_array, &z_tmp); \
846+
} \
847+
/* call */\
848+
ra_forward_call(INTERNAL_FUNCTION_PARAM_PASSTHRU, ra, cmd, sizeof(cmd) - 1, &z_arg_array, NULL); \
849+
zval_dtor(&z_arg_array); \
850+
return; \
851+
} \
852+
} while(0)
853+
#endif
831854

832855
/* MGET will distribute the call to several nodes and regroup the values. */
833856
PHP_METHOD(RedisArray, mget)

redis_array.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -48,8 +48,8 @@ typedef struct RedisArray_ {
4848
zend_bool index; /* use per-node index */
4949
zend_bool auto_rehash; /* migrate keys on read operations */
5050
zend_bool pconnect; /* should we use pconnect */
51-
zval *z_fun; /* key extractor, callable */
52-
zval *z_dist; /* key distributor, callable */
51+
zval z_fun; /* key extractor, callable */
52+
zval z_dist; /* key distributor, callable */
5353
zval z_pure_cmds; /* hash table */
5454
double connect_timeout; /* socket connect timeout */
5555

0 commit comments

Comments
 (0)