Skip to content

Commit 19f5f70

Browse files
committed
WIP: php7 compatibility
1 parent 4c74162 commit 19f5f70

8 files changed

Lines changed: 207 additions & 222 deletions

File tree

cluster_library.c

Lines changed: 58 additions & 81 deletions
Original file line numberDiff line numberDiff line change
@@ -1500,7 +1500,7 @@ PHP_REDIS_API void cluster_bulk_raw_resp(INTERNAL_FUNCTION_PARAMETERS,
15001500
if(c->flags->mode != MULTI) {
15011501
RETURN_FALSE;
15021502
} else {
1503-
add_next_index_bool(c->multi_resp, 0);
1503+
add_next_index_bool(&c->multi_resp, 0);
15041504
return;
15051505
}
15061506
}
@@ -1530,11 +1530,14 @@ PHP_REDIS_API void cluster_bulk_resp(INTERNAL_FUNCTION_PARAMETERS, redisCluster
15301530
CLUSTER_RETURN_STRING(c, resp, c->reply_len);
15311531
}
15321532
} else {
1533-
zval *z = NULL;
1533+
zval zv, *z = &zv;
1534+
#if (PHP_MAJOR_VERSION < 7)
1535+
z = NULL;
1536+
#endif
15341537
if (redis_unserialize(c->flags, resp, c->reply_len, &z TSRMLS_CC)) {
1535-
add_next_index_zval(c->multi_resp, z);
1538+
add_next_index_zval(&c->multi_resp, z);
15361539
} else {
1537-
add_next_index_stringl(c->multi_resp, resp, c->reply_len);
1540+
add_next_index_stringl(&c->multi_resp, resp, c->reply_len);
15381541
}
15391542
}
15401543
efree(resp);
@@ -1641,31 +1644,28 @@ PHP_REDIS_API void cluster_sub_resp(INTERNAL_FUNCTION_PARAMETERS, redisCluster *
16411644
void *ctx)
16421645
{
16431646
subscribeContext *sctx = (subscribeContext*)ctx;
1644-
zval *z_tab, *z_tmp, *z_ret;
1647+
zval z_tab, *z_tmp, *z_ret;
16451648
int pull=0;
16461649

16471650

16481651
// Consume each MULTI BULK response (one per channel/pattern)
16491652
while(sctx->argc--) {
1650-
z_tab = cluster_zval_mbulk_resp(INTERNAL_FUNCTION_PARAM_PASSTHRU, c,
1651-
pull, mbulk_resp_loop_raw);
1652-
1653-
if(!z_tab) {
1653+
if (!cluster_zval_mbulk_resp(INTERNAL_FUNCTION_PARAM_PASSTHRU, c,
1654+
pull, mbulk_resp_loop_raw, &z_tab)
1655+
) {
16541656
efree(sctx);
16551657
RETURN_FALSE;
16561658
}
16571659

1658-
if ((z_tmp = zend_hash_index_find(Z_ARRVAL_P(z_tab), 0)) == NULL ||
1660+
if ((z_tmp = zend_hash_index_find(Z_ARRVAL(z_tab), 0)) == NULL ||
16591661
strcasecmp(Z_STRVAL_P(z_tmp), sctx->kw) != 0
16601662
) {
1661-
zval_dtor(z_tab);
1662-
FREE_ZVAL(z_tab);
1663+
zval_dtor(&z_tab);
16631664
efree(sctx);
16641665
RETURN_FALSE;
16651666
}
16661667

1667-
zval_dtor(z_tab);
1668-
efree(z_tab);
1668+
zval_dtor(&z_tab);
16691669
pull = 1;
16701670
}
16711671

@@ -1690,10 +1690,9 @@ PHP_REDIS_API void cluster_sub_resp(INTERNAL_FUNCTION_PARAMETERS, redisCluster *
16901690
int tab_idx=1, is_pmsg;
16911691

16921692
// Get the next subscribe response
1693-
z_tab = cluster_zval_mbulk_resp(INTERNAL_FUNCTION_PARAM_PASSTHRU, c,
1694-
1, mbulk_resp_loop);
1695-
1696-
if (!z_tab || (z_type = zend_hash_index_find(Z_ARRVAL_P(z_tab), 0)) == NULL) {
1693+
if (!cluster_zval_mbulk_resp(INTERNAL_FUNCTION_PARAM_PASSTHRU, c, 1, mbulk_resp_loop, &z_tab) ||
1694+
(z_type = zend_hash_index_find(Z_ARRVAL(z_tab), 0)) == NULL
1695+
) {
16971696
break;
16981697
}
16991698

@@ -1703,18 +1702,17 @@ PHP_REDIS_API void cluster_sub_resp(INTERNAL_FUNCTION_PARAMETERS, redisCluster *
17031702
) {
17041703
is_pmsg = *Z_STRVAL_P(z_type) == 'p';
17051704
} else {
1706-
zval_dtor(z_tab);
1707-
efree(z_tab);
1705+
zval_dtor(&z_tab);
17081706
continue;
17091707
}
17101708

1711-
if (is_pmsg && (z_pat = zend_hash_index_find(Z_ARRVAL_P(z_tab), tab_idx++)) == NULL) {
1709+
if (is_pmsg && (z_pat = zend_hash_index_find(Z_ARRVAL(z_tab), tab_idx++)) == NULL) {
17121710
break;
17131711
}
17141712

17151713
// Extract channel and data
1716-
if ((z_chan = zend_hash_index_find(Z_ARRVAL_P(z_tab), tab_idx++)) == NULL ||
1717-
(z_data = zend_hash_index_find(Z_ARRVAL_P(z_tab), tab_idx++)) == NULL
1714+
if ((z_chan = zend_hash_index_find(Z_ARRVAL(z_tab), tab_idx++)) == NULL ||
1715+
(z_data = zend_hash_index_find(Z_ARRVAL(z_tab), tab_idx++)) == NULL
17181716
) {
17191717
break;
17201718
}
@@ -1759,19 +1757,15 @@ PHP_REDIS_API void cluster_sub_resp(INTERNAL_FUNCTION_PARAMETERS, redisCluster *
17591757
// If we have a return value, free it
17601758
if(z_ret) zval_ptr_dtor(&z_ret);
17611759

1762-
zval_dtor(z_tab);
1763-
efree(z_tab);
1760+
zval_dtor(&z_tab);
17641761
}
17651762

17661763
// We're no longer subscribing, due to an error
17671764
c->subscribed_slot = -1;
17681765

17691766
// Cleanup
1767+
zval_dtor(&z_tab);
17701768
efree(sctx);
1771-
if(z_tab) {
1772-
zval_dtor(z_tab);
1773-
efree(z_tab);
1774-
}
17751769

17761770
// Failure
17771771
RETURN_FALSE;
@@ -1782,33 +1776,28 @@ PHP_REDIS_API void cluster_unsub_resp(INTERNAL_FUNCTION_PARAMETERS,
17821776
redisCluster *c, void *ctx)
17831777
{
17841778
subscribeContext *sctx = (subscribeContext*)ctx;
1785-
zval *z_tab, *z_chan, *z_flag;
1779+
zval z_tab, *z_chan, *z_flag;
17861780
int pull = 0, argc = sctx->argc;
17871781

17881782
efree(sctx);
17891783
array_init(return_value);
17901784

17911785
// Consume each response
17921786
while(argc--) {
1793-
z_tab = cluster_zval_mbulk_resp(INTERNAL_FUNCTION_PARAM_PASSTHRU,
1794-
c, pull, mbulk_resp_loop_raw);
1795-
17961787
// Fail if we didn't get an array or can't find index 1
1797-
if(!z_tab || (z_chan = zend_hash_index_find(Z_ARRVAL_P(z_tab), 1)) == NULL) {
1798-
if(z_tab) {
1799-
zval_dtor(z_tab);
1800-
efree(z_tab);
1801-
}
1788+
if (!cluster_zval_mbulk_resp(INTERNAL_FUNCTION_PARAM_PASSTHRU, c, pull, mbulk_resp_loop_raw, &z_tab) ||
1789+
(z_chan = zend_hash_index_find(Z_ARRVAL(z_tab), 1)) == NULL
1790+
) {
1791+
zval_dtor(&z_tab);
18021792
zval_dtor(return_value);
18031793
RETURN_FALSE;
18041794
}
18051795

18061796
// Find the flag for this channel/pattern
1807-
if ((z_flag = zend_hash_index_find(Z_ARRVAL_P(z_tab), 2)) == NULL ||
1797+
if ((z_flag = zend_hash_index_find(Z_ARRVAL(z_tab), 2)) == NULL ||
18081798
Z_STRLEN_P(z_flag) != 2
18091799
) {
1810-
zval_dtor(z_tab);
1811-
efree(z_tab);
1800+
zval_dtor(&z_tab);
18121801
zval_dtor(return_value);
18131802
RETURN_FALSE;
18141803
}
@@ -1819,8 +1808,7 @@ PHP_REDIS_API void cluster_unsub_resp(INTERNAL_FUNCTION_PARAMETERS,
18191808
// Add result
18201809
add_assoc_bool(return_value, Z_STRVAL_P(z_chan), flag[1]=='1');
18211810

1822-
zval_dtor(z_tab);
1823-
efree(z_tab);
1811+
zval_dtor(&z_tab);
18241812
pull = 1;
18251813
}
18261814
}
@@ -1866,7 +1854,7 @@ PHP_REDIS_API void cluster_variant_resp(INTERNAL_FUNCTION_PARAMETERS, redisClust
18661854
void *ctx)
18671855
{
18681856
clusterReply *r;
1869-
zval *z_arr;
1857+
zval zv, *z_arr = &zv;
18701858
int i;
18711859

18721860
// Make sure we can read it
@@ -1890,15 +1878,12 @@ PHP_REDIS_API void cluster_variant_resp(INTERNAL_FUNCTION_PARAMETERS, redisClust
18901878
RETVAL_STRINGL(r->str, r->len);
18911879
break;
18921880
case TYPE_MULTIBULK:
1893-
MAKE_STD_ZVAL(z_arr);
18941881
array_init(z_arr);
18951882

18961883
for(i=0;i<r->elements;i++) {
18971884
cluster_mbulk_variant_resp(r->element[i], z_arr);
18981885
}
1899-
1900-
*return_value = *z_arr;
1901-
efree(z_arr);
1886+
RETVAL_ZVAL(z_arr, 1, 0);
19021887
break;
19031888
default:
19041889
RETVAL_FALSE;
@@ -1907,23 +1892,23 @@ PHP_REDIS_API void cluster_variant_resp(INTERNAL_FUNCTION_PARAMETERS, redisClust
19071892
} else {
19081893
switch(r->type) {
19091894
case TYPE_INT:
1910-
add_next_index_long(c->multi_resp, r->integer);
1895+
add_next_index_long(&c->multi_resp, r->integer);
19111896
break;
19121897
case TYPE_ERR:
1913-
add_next_index_bool(c->multi_resp, 0);
1898+
add_next_index_bool(&c->multi_resp, 0);
19141899
break;
19151900
case TYPE_LINE:
1916-
add_next_index_bool(c->multi_resp, 1);
1901+
add_next_index_bool(&c->multi_resp, 1);
19171902
break;
19181903
case TYPE_BULK:
1919-
add_next_index_stringl(c->multi_resp, r->str, r->len);
1904+
add_next_index_stringl(&c->multi_resp, r->str, r->len);
19201905
efree(r->str);
19211906
break;
19221907
case TYPE_MULTIBULK:
1923-
cluster_mbulk_variant_resp(r, c->multi_resp);
1908+
cluster_mbulk_variant_resp(r, &c->multi_resp);
19241909
break;
19251910
default:
1926-
add_next_index_bool(c->multi_resp, 0);
1911+
add_next_index_bool(&c->multi_resp, 0);
19271912
break;
19281913
}
19291914
}
@@ -1965,7 +1950,7 @@ PHP_REDIS_API void cluster_gen_mbulk_resp(INTERNAL_FUNCTION_PARAMETERS,
19651950
if(CLUSTER_IS_ATOMIC(c)) {
19661951
RETVAL_ZVAL(z_result, 0, 1);
19671952
} else {
1968-
add_next_index_zval(c->multi_resp, z_result);
1953+
add_next_index_zval(&c->multi_resp, z_result);
19691954
}
19701955
}
19711956

@@ -2047,7 +2032,7 @@ PHP_REDIS_API void cluster_info_resp(INTERNAL_FUNCTION_PARAMETERS, redisCluster
20472032
if(CLUSTER_IS_ATOMIC(c)) {
20482033
RETVAL_ZVAL(z_result, 0, 1);
20492034
} else {
2050-
add_next_index_zval(c->multi_resp, z_result);
2035+
add_next_index_zval(&c->multi_resp, z_result);
20512036
}
20522037
}
20532038

@@ -2056,6 +2041,7 @@ PHP_REDIS_API void cluster_client_list_resp(INTERNAL_FUNCTION_PARAMETERS, redisC
20562041
void *ctx)
20572042
{
20582043
char *info;
2044+
zval zv, *z_result = &zv;
20592045

20602046
/* Read the bulk response */
20612047
info = redis_sock_read_bulk_reply(c->cmd_sock, c->reply_len TSRMLS_CC);
@@ -2064,10 +2050,7 @@ PHP_REDIS_API void cluster_client_list_resp(INTERNAL_FUNCTION_PARAMETERS, redisC
20642050
}
20652051

20662052
#if (PHP_MAJOR_VERSION < 7)
2067-
zval *z_result;
20682053
MAKE_STD_ZVAL(z_result);
2069-
#else
2070-
zval zv, *z_result = &zv;
20712054
#endif
20722055

20732056
/* Parse it and free the bulk string */
@@ -2077,16 +2060,14 @@ PHP_REDIS_API void cluster_client_list_resp(INTERNAL_FUNCTION_PARAMETERS, redisC
20772060
if (CLUSTER_IS_ATOMIC(c)) {
20782061
RETVAL_ZVAL(z_result, 0, 1);
20792062
} else {
2080-
add_next_index_zval(c->multi_resp, z_result);
2063+
add_next_index_zval(&c->multi_resp, z_result);
20812064
}
20822065
}
20832066

20842067
/* MULTI BULK response loop where we might pull the next one */
20852068
PHP_REDIS_API zval *cluster_zval_mbulk_resp(INTERNAL_FUNCTION_PARAMETERS,
2086-
redisCluster *c, int pull, mbulk_cb cb)
2069+
redisCluster *c, int pull, mbulk_cb cb, zval *z_ret)
20872070
{
2088-
zval *z_result;
2089-
20902071
// Pull our next response if directed
20912072
if(pull) {
20922073
if(cluster_check_response(c, &c->reply_type TSRMLS_CC)<0)
@@ -2100,25 +2081,23 @@ PHP_REDIS_API zval *cluster_zval_mbulk_resp(INTERNAL_FUNCTION_PARAMETERS,
21002081
return NULL;
21012082
}
21022083

2103-
MAKE_STD_ZVAL(z_result);
2104-
array_init(z_result);
2084+
array_init(z_ret);
21052085

21062086
// Call our callback
2107-
if(cb(c->cmd_sock, z_result, c->reply_len, NULL TSRMLS_CC)==FAILURE) {
2108-
zval_dtor(z_result);
2109-
FREE_ZVAL(z_result);
2087+
if(cb(c->cmd_sock, z_ret, c->reply_len, NULL TSRMLS_CC)==FAILURE) {
2088+
zval_dtor(z_ret);
21102089
return NULL;
21112090
}
21122091

2113-
return z_result;
2092+
return z_ret;
21142093
}
21152094

21162095
/* MULTI MULTI BULK reply (for EXEC) */
21172096
PHP_REDIS_API void cluster_multi_mbulk_resp(INTERNAL_FUNCTION_PARAMETERS,
21182097
redisCluster *c, void *ctx)
21192098
{
2120-
MAKE_STD_ZVAL(c->multi_resp);
2121-
array_init(c->multi_resp);
2099+
zval *multi_resp = &c->multi_resp;
2100+
array_init(multi_resp);
21222101

21232102
clusterFoldItem *fi = c->multi_head;
21242103
while(fi) {
@@ -2131,23 +2110,21 @@ PHP_REDIS_API void cluster_multi_mbulk_resp(INTERNAL_FUNCTION_PARAMETERS,
21312110
c->cmd_sock = SLOT_SOCK(c, fi->slot);
21322111

21332112
if(cluster_check_response(c, &c->reply_type TSRMLS_CC)<0) {
2134-
zval_dtor(c->multi_resp);
2135-
efree(c->multi_resp);
2113+
zval_dtor(multi_resp);
21362114
RETURN_FALSE;
21372115
}
21382116

21392117
fi->callback(INTERNAL_FUNCTION_PARAM_PASSTHRU, c, fi->ctx);
21402118
} else {
21412119
/* Just add false */
2142-
add_next_index_bool(c->multi_resp, 0);
2120+
add_next_index_bool(multi_resp, 0);
21432121
}
21442122
fi = fi->next;
21452123
}
21462124

21472125
// Set our return array
21482126
zval_dtor(return_value);
2149-
*return_value = *c->multi_resp;
2150-
efree(c->multi_resp);
2127+
RETVAL_ZVAL(multi_resp, 0, 1);
21512128
}
21522129

21532130
/* Generic handler for MGET */
@@ -2176,7 +2153,7 @@ PHP_REDIS_API void cluster_mbulk_mget_resp(INTERNAL_FUNCTION_PARAMETERS,
21762153
*return_value = *(mctx->z_multi);
21772154
efree(mctx->z_multi);
21782155
} else {
2179-
add_next_index_zval(c->multi_resp, mctx->z_multi);
2156+
add_next_index_zval(&c->multi_resp, mctx->z_multi);
21802157
}
21812158
}
21822159

@@ -2212,7 +2189,7 @@ PHP_REDIS_API void cluster_msetnx_resp(INTERNAL_FUNCTION_PARAMETERS, redisCluste
22122189
*return_value = *(mctx->z_multi);
22132190
efree(mctx->z_multi);
22142191
} else {
2215-
add_next_index_zval(c->multi_resp, mctx->z_multi);
2192+
add_next_index_zval(&c->multi_resp, mctx->z_multi);
22162193
}
22172194
}
22182195

@@ -2241,7 +2218,7 @@ PHP_REDIS_API void cluster_del_resp(INTERNAL_FUNCTION_PARAMETERS, redisCluster *
22412218
if(CLUSTER_IS_ATOMIC(c)) {
22422219
ZVAL_LONG(return_value, Z_LVAL_P(mctx->z_multi));
22432220
} else {
2244-
add_next_index_long(c->multi_resp, Z_LVAL_P(mctx->z_multi));
2221+
add_next_index_long(&c->multi_resp, Z_LVAL_P(mctx->z_multi));
22452222
}
22462223
efree(mctx->z_multi);
22472224
}
@@ -2269,9 +2246,9 @@ PHP_REDIS_API void cluster_mset_resp(INTERNAL_FUNCTION_PARAMETERS, redisCluster
22692246
// Set our return if it's the last call
22702247
if(mctx->last) {
22712248
if(CLUSTER_IS_ATOMIC(c)) {
2272-
ZVAL_BOOL(return_value, Z_BVAL_P(mctx->z_multi));
2249+
ZVAL_BOOL(return_value, Z_LVAL_P(mctx->z_multi));
22732250
} else {
2274-
add_next_index_bool(c->multi_resp, Z_BVAL_P(mctx->z_multi));
2251+
add_next_index_bool(&c->multi_resp, Z_LVAL_P(mctx->z_multi));
22752252
}
22762253
efree(mctx->z_multi);
22772254
}

0 commit comments

Comments
 (0)