Skip to content

Commit 4533920

Browse files
authored
Merge pull request phpredis#1340 from phpredis/issue.1302
Issue.1302
2 parents 80d2a91 + 742cdd0 commit 4533920

File tree

5 files changed

+124
-21
lines changed

5 files changed

+124
-21
lines changed

redis.c

Lines changed: 10 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -108,6 +108,10 @@ ZEND_BEGIN_ARG_INFO_EX(arginfo_config, 0, 0, 2)
108108
ZEND_ARG_INFO(0, value)
109109
ZEND_END_ARG_INFO()
110110

111+
ZEND_BEGIN_ARG_INFO_EX(arginfo_flush, 0, 0, 0)
112+
ZEND_ARG_INFO(0, async)
113+
ZEND_END_ARG_INFO()
114+
111115
ZEND_BEGIN_ARG_INFO_EX(arginfo_pubsub, 0, 0, 1)
112116
ZEND_ARG_INFO(0, cmd)
113117
#if PHP_VERSION_ID >= 50600
@@ -267,8 +271,8 @@ static zend_function_entry redis_functions[] = {
267271
PHP_ME(Redis, exec, arginfo_void, ZEND_ACC_PUBLIC)
268272
PHP_ME(Redis, exists, arginfo_exists, ZEND_ACC_PUBLIC)
269273
PHP_ME(Redis, expireAt, arginfo_key_timestamp, ZEND_ACC_PUBLIC)
270-
PHP_ME(Redis, flushAll, arginfo_void, ZEND_ACC_PUBLIC)
271-
PHP_ME(Redis, flushDB, arginfo_void, ZEND_ACC_PUBLIC)
274+
PHP_ME(Redis, flushAll, arginfo_flush, ZEND_ACC_PUBLIC)
275+
PHP_ME(Redis, flushDB, arginfo_flush, ZEND_ACC_PUBLIC)
272276
PHP_ME(Redis, geoadd, arginfo_geoadd, ZEND_ACC_PUBLIC)
273277
PHP_ME(Redis, geodist, arginfo_geodist, ZEND_ACC_PUBLIC)
274278
PHP_ME(Redis, geohash, arginfo_key_members, ZEND_ACC_PUBLIC)
@@ -1736,17 +1740,17 @@ PHP_METHOD(Redis, lastSave)
17361740
}
17371741
/* }}} */
17381742

1739-
/* {{{ proto bool Redis::flushDB() */
1743+
/* {{{ proto bool Redis::flushDB([bool async]) */
17401744
PHP_METHOD(Redis, flushDB)
17411745
{
1742-
REDIS_PROCESS_KW_CMD("FLUSHDB", redis_empty_cmd, redis_boolean_response);
1746+
REDIS_PROCESS_KW_CMD("FLUSHDB", redis_flush_cmd, redis_boolean_response);
17431747
}
17441748
/* }}} */
17451749

1746-
/* {{{ proto bool Redis::flushAll() */
1750+
/* {{{ proto bool Redis::flushAll([bool async]) */
17471751
PHP_METHOD(Redis, flushAll)
17481752
{
1749-
REDIS_PROCESS_KW_CMD("FLUSHALL", redis_empty_cmd, redis_boolean_response);
1753+
REDIS_PROCESS_KW_CMD("FLUSHALL", redis_flush_cmd, redis_boolean_response);
17501754
}
17511755
/* }}} */
17521756

redis_array.c

Lines changed: 36 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -97,6 +97,10 @@ ZEND_BEGIN_ARG_INFO_EX(arginfo_multi, 0, 0, 1)
9797
ZEND_ARG_INFO(0, mode)
9898
ZEND_END_ARG_INFO()
9999

100+
ZEND_BEGIN_ARG_INFO_EX(arginfo_flush, 0, 0, 0)
101+
ZEND_ARG_INFO(0, async)
102+
ZEND_END_ARG_INFO()
103+
100104
zend_function_entry redis_array_functions[] = {
101105
PHP_ME(RedisArray, __call, arginfo_call, ZEND_ACC_PUBLIC)
102106
PHP_ME(RedisArray, __construct, arginfo_ctor, ZEND_ACC_PUBLIC)
@@ -110,8 +114,8 @@ zend_function_entry redis_array_functions[] = {
110114
PHP_ME(RedisArray, del, arginfo_del, ZEND_ACC_PUBLIC)
111115
PHP_ME(RedisArray, discard, arginfo_void, ZEND_ACC_PUBLIC)
112116
PHP_ME(RedisArray, exec, arginfo_void, ZEND_ACC_PUBLIC)
113-
PHP_ME(RedisArray, flushall, arginfo_void, ZEND_ACC_PUBLIC)
114-
PHP_ME(RedisArray, flushdb, arginfo_void, ZEND_ACC_PUBLIC)
117+
PHP_ME(RedisArray, flushall, arginfo_flush, ZEND_ACC_PUBLIC)
118+
PHP_ME(RedisArray, flushdb, arginfo_flush, ZEND_ACC_PUBLIC)
115119
PHP_ME(RedisArray, getOption, arginfo_getopt, ZEND_ACC_PUBLIC)
116120
PHP_ME(RedisArray, info, arginfo_void, ZEND_ACC_PUBLIC)
117121
PHP_ME(RedisArray, keys, arginfo_keys, ZEND_ACC_PUBLIC)
@@ -646,10 +650,10 @@ multihost_distribute_call(RedisArray *ra, zval *return_value, zval *z_fun, int a
646650
}
647651
}
648652

649-
static void multihost_distribute(INTERNAL_FUNCTION_PARAMETERS, const char *method_name)
653+
static void
654+
multihost_distribute(INTERNAL_FUNCTION_PARAMETERS, const char *method_name)
650655
{
651656
zval *object, z_fun;
652-
int i;
653657
RedisArray *ra;
654658

655659
if (zend_parse_method_parameters(ZEND_NUM_ARGS() TSRMLS_CC, getThis(), "O",
@@ -669,6 +673,31 @@ static void multihost_distribute(INTERNAL_FUNCTION_PARAMETERS, const char *metho
669673
zval_dtor(&z_fun);
670674
}
671675

676+
static void
677+
multihost_distribute_flush(INTERNAL_FUNCTION_PARAMETERS, const char *method_name)
678+
{
679+
zval *object, z_fun, z_args[1];
680+
zend_bool async = 0;
681+
RedisArray *ra;
682+
683+
if (zend_parse_method_parameters(ZEND_NUM_ARGS() TSRMLS_CC, getThis(), "O|b",
684+
&object, redis_array_ce, &async) == FAILURE) {
685+
RETURN_FALSE;
686+
}
687+
688+
if ((ra = redis_array_get(object TSRMLS_CC)) == NULL) {
689+
RETURN_FALSE;
690+
}
691+
692+
/* prepare call */
693+
ZVAL_STRING(&z_fun, method_name);
694+
ZVAL_BOOL(&z_args[0], async);
695+
696+
multihost_distribute_call(ra, return_value, &z_fun, 1, z_args TSRMLS_CC);
697+
698+
zval_dtor(&z_fun);
699+
}
700+
672701
PHP_METHOD(RedisArray, info)
673702
{
674703
multihost_distribute(INTERNAL_FUNCTION_PARAM_PASSTHRU, "INFO");
@@ -681,12 +710,12 @@ PHP_METHOD(RedisArray, ping)
681710

682711
PHP_METHOD(RedisArray, flushdb)
683712
{
684-
multihost_distribute(INTERNAL_FUNCTION_PARAM_PASSTHRU, "FLUSHDB");
713+
multihost_distribute_flush(INTERNAL_FUNCTION_PARAM_PASSTHRU, "FLUSHDB");
685714
}
686715

687716
PHP_METHOD(RedisArray, flushall)
688717
{
689-
multihost_distribute(INTERNAL_FUNCTION_PARAM_PASSTHRU, "FLUSHALL");
718+
multihost_distribute_flush(INTERNAL_FUNCTION_PARAM_PASSTHRU, "FLUSHALL");
690719
}
691720

692721
PHP_METHOD(RedisArray, save)
@@ -702,7 +731,7 @@ PHP_METHOD(RedisArray, bgsave)
702731

703732
PHP_METHOD(RedisArray, keys)
704733
{
705-
zval *object, z_args[1], z_fun;
734+
zval *object, z_fun, z_args[1];
706735
RedisArray *ra;
707736
char *pattern;
708737
strlen_t pattern_len;

redis_cluster.c

Lines changed: 57 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -84,6 +84,11 @@ ZEND_BEGIN_ARG_INFO_EX(arginfo_info, 0, 0, 1)
8484
ZEND_ARG_INFO(0, option)
8585
ZEND_END_ARG_INFO()
8686

87+
ZEND_BEGIN_ARG_INFO_EX(arginfo_flush, 0, 0, 1)
88+
ZEND_ARG_INFO(0, key_or_address)
89+
ZEND_ARG_INFO(0, async)
90+
ZEND_END_ARG_INFO()
91+
8792
/* Argument info for HSCAN, SSCAN, HSCAN */
8893
ZEND_BEGIN_ARG_INFO_EX(arginfo_kscan_cl, 0, 0, 2)
8994
ZEND_ARG_INFO(0, str_key)
@@ -136,8 +141,8 @@ zend_function_entry redis_cluster_functions[] = {
136141
PHP_ME(RedisCluster, exists, arginfo_key, ZEND_ACC_PUBLIC)
137142
PHP_ME(RedisCluster, expire, arginfo_expire, ZEND_ACC_PUBLIC)
138143
PHP_ME(RedisCluster, expireat, arginfo_key_timestamp, ZEND_ACC_PUBLIC)
139-
PHP_ME(RedisCluster, flushall, arginfo_key_or_address, ZEND_ACC_PUBLIC)
140-
PHP_ME(RedisCluster, flushdb, arginfo_key_or_address, ZEND_ACC_PUBLIC)
144+
PHP_ME(RedisCluster, flushall, arginfo_flush, ZEND_ACC_PUBLIC)
145+
PHP_ME(RedisCluster, flushdb, arginfo_flush, ZEND_ACC_PUBLIC)
141146
PHP_ME(RedisCluster, geoadd, arginfo_geoadd, ZEND_ACC_PUBLIC)
142147
PHP_ME(RedisCluster, geodist, arginfo_geodist, ZEND_ACC_PUBLIC)
143148
PHP_ME(RedisCluster, geohash, arginfo_key_members, ZEND_ACC_PUBLIC)
@@ -2334,6 +2339,50 @@ cluster_empty_node_cmd(INTERNAL_FUNCTION_PARAMETERS, char *kw,
23342339
efree(cmd);
23352340
}
23362341

2342+
static void
2343+
cluster_flush_cmd(INTERNAL_FUNCTION_PARAMETERS, char *kw, REDIS_REPLY_TYPE reply_type, cluster_cb cb)
2344+
{
2345+
redisCluster *c = GET_CONTEXT();
2346+
char *cmd;
2347+
int cmd_len;
2348+
zval *z_arg;
2349+
zend_bool async = 0;
2350+
short slot;
2351+
2352+
if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "z|b", &z_arg, &async) == FAILURE) {
2353+
RETURN_FALSE;
2354+
}
2355+
2356+
// One argument means find the node (treated like a key), and two means
2357+
// send the command to a specific host and port
2358+
slot = cluster_cmd_get_slot(c, z_arg TSRMLS_CC);
2359+
if (slot < 0) {
2360+
RETURN_FALSE;
2361+
}
2362+
2363+
// Construct our command
2364+
if (async) {
2365+
cmd_len = redis_spprintf(NULL, NULL TSRMLS_CC, &cmd, kw, "s", "ASYNC", sizeof("ASYNC") - 1);
2366+
} else {
2367+
cmd_len = redis_spprintf(NULL, NULL TSRMLS_CC, &cmd, kw, "");
2368+
}
2369+
2370+
2371+
// Kick off our command
2372+
if (cluster_send_slot(c, slot, cmd, cmd_len, reply_type TSRMLS_CC) < 0) {
2373+
zend_throw_exception(redis_cluster_exception_ce,
2374+
"Unable to send command at a specific node", 0 TSRMLS_CC);
2375+
efree(cmd);
2376+
RETURN_FALSE;
2377+
}
2378+
2379+
// Our response callback
2380+
cb(INTERNAL_FUNCTION_PARAM_PASSTHRU, c, NULL);
2381+
2382+
// Free our command
2383+
efree(cmd);
2384+
}
2385+
23372386
/* Generic routine for handling various commands which need to be directed at
23382387
* a node, but have complex syntax. We simply parse out the arguments and send
23392388
* the command as constructed by the caller */
@@ -2611,18 +2660,18 @@ PHP_METHOD(RedisCluster, bgsave) {
26112660
}
26122661
/* }}} */
26132662

2614-
/* {{{ proto RedisCluster::flushdb(string key)
2615-
* proto RedisCluster::flushdb(string host, long port) */
2663+
/* {{{ proto RedisCluster::flushdb(string key, [bool async])
2664+
* proto RedisCluster::flushdb(array host_port, [bool async]) */
26162665
PHP_METHOD(RedisCluster, flushdb) {
2617-
cluster_empty_node_cmd(INTERNAL_FUNCTION_PARAM_PASSTHRU, "FLUSHDB",
2666+
cluster_flush_cmd(INTERNAL_FUNCTION_PARAM_PASSTHRU, "FLUSHDB",
26182667
TYPE_LINE, cluster_bool_resp);
26192668
}
26202669
/* }}} */
26212670

2622-
/* {{{ proto RedisCluster::flushall(string key)
2623-
* proto RedisCluster::flushall(string host, long port) */
2671+
/* {{{ proto RedisCluster::flushall(string key, [bool async])
2672+
* proto RedisCluster::flushall(array host_port, [bool async]) */
26242673
PHP_METHOD(RedisCluster, flushall) {
2625-
cluster_empty_node_cmd(INTERNAL_FUNCTION_PARAM_PASSTHRU, "FLUSHALL",
2674+
cluster_flush_cmd(INTERNAL_FUNCTION_PARAM_PASSTHRU, "FLUSHALL",
26262675
TYPE_LINE, cluster_bool_resp);
26272676
}
26282677
/* }}} */

redis_commands.c

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -415,6 +415,24 @@ int redis_key_cmd(INTERNAL_FUNCTION_PARAMETERS, RedisSock *redis_sock,
415415
return SUCCESS;
416416
}
417417

418+
int redis_flush_cmd(INTERNAL_FUNCTION_PARAMETERS, RedisSock *redis_sock,
419+
char *kw, char **cmd, int *cmd_len, short *slot, void **ctx)
420+
{
421+
zend_bool async = 0;
422+
423+
if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "|b", &async) == FAILURE) {
424+
return FAILURE;
425+
}
426+
427+
if (async) {
428+
*cmd_len = REDIS_CMD_SPPRINTF(cmd, kw, "s", "ASYNC", sizeof("ASYNC") - 1);
429+
} else {
430+
*cmd_len = REDIS_CMD_SPPRINTF(cmd, kw, "");
431+
}
432+
433+
return SUCCESS;
434+
}
435+
418436
/* Generic command where we take a key and a double */
419437
int redis_key_dbl_cmd(INTERNAL_FUNCTION_PARAMETERS, RedisSock *redis_sock,
420438
char *kw, char **cmd, int *cmd_len, short *slot,

redis_commands.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -109,6 +109,9 @@ int redis_gen_zlex_cmd(INTERNAL_FUNCTION_PARAMETERS, RedisSock *redis_sock,
109109
int redis_eval_cmd(INTERNAL_FUNCTION_PARAMETERS, RedisSock *redis_sock,
110110
char *kw, char **cmd, int *cmd_len, short *slot, void **ctx);
111111

112+
int redis_flush_cmd(INTERNAL_FUNCTION_PARAMETERS, RedisSock *redis_sock,
113+
char *kw, char **cmd, int *cmd_len, short *slot, void **ctx);
114+
112115
/* Commands which need a unique construction mechanism. This is either because
113116
* they don't share a signature with any other command, or because there is
114117
* specific processing we do (e.g. verifying subarguments) that make them

0 commit comments

Comments
 (0)