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

Skip to content

Commit 4b767be

Browse files
committed
Issue #1894
Add FAILOVER command.
1 parent a47c38a commit 4b767be

6 files changed

Lines changed: 94 additions & 2 deletions

File tree

redis.c

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1695,6 +1695,13 @@ PHP_METHOD(Redis, lastSave)
16951695
}
16961696
/* }}} */
16971697

1698+
/* {{{ proto bool Redis::failover([array to [,bool abort [,int timeout]]] ) */
1699+
PHP_METHOD(Redis, failover)
1700+
{
1701+
REDIS_PROCESS_CMD(failover, redis_boolean_response);
1702+
}
1703+
/* }}} */
1704+
16981705
/* {{{ proto bool Redis::flushDB([bool async]) */
16991706
PHP_METHOD(Redis, flushDB)
17001707
{

redis.stub.php

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -117,6 +117,8 @@ public function expire(string $key, int $timeout): bool;
117117

118118
public function expireAt(string $key, int $timestamp): bool;
119119

120+
public function failover(?array $to = null, bool $abort = false, int $timeout = 0): bool;
121+
120122
public function flushAll(?bool $sync = null): bool;
121123

122124
public function flushDB(?bool $sync = null): bool;

redis_arginfo.h

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/* This is a generated file, edit the .stub.php file instead.
2-
* Stub hash: 8ad4d58327d1b0b07b0dbec026b27ed6a594b8b9 */
2+
* Stub hash: 858f814d5b91c0829ae6b6a265a740cc037586dd */
33

44
ZEND_BEGIN_ARG_INFO_EX(arginfo_class_Redis___construct, 0, 0, 0)
55
ZEND_ARG_TYPE_INFO_WITH_DEFAULT_VALUE(0, options, IS_ARRAY, 0, "null")
@@ -179,6 +179,12 @@ ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_class_Redis_expireAt, 0, 2, _IS_
179179
ZEND_ARG_TYPE_INFO(0, timestamp, IS_LONG, 0)
180180
ZEND_END_ARG_INFO()
181181

182+
ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_class_Redis_failover, 0, 0, _IS_BOOL, 0)
183+
ZEND_ARG_TYPE_INFO_WITH_DEFAULT_VALUE(0, to, IS_ARRAY, 1, "null")
184+
ZEND_ARG_TYPE_INFO_WITH_DEFAULT_VALUE(0, abort, _IS_BOOL, 0, "false")
185+
ZEND_ARG_TYPE_INFO_WITH_DEFAULT_VALUE(0, timeout, IS_LONG, 0, "0")
186+
ZEND_END_ARG_INFO()
187+
182188
ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_class_Redis_flushAll, 0, 0, _IS_BOOL, 0)
183189
ZEND_ARG_TYPE_INFO_WITH_DEFAULT_VALUE(0, sync, _IS_BOOL, 1, "null")
184190
ZEND_END_ARG_INFO()
@@ -1005,6 +1011,7 @@ ZEND_METHOD(Redis, exec);
10051011
ZEND_METHOD(Redis, exists);
10061012
ZEND_METHOD(Redis, expire);
10071013
ZEND_METHOD(Redis, expireAt);
1014+
ZEND_METHOD(Redis, failover);
10081015
ZEND_METHOD(Redis, flushAll);
10091016
ZEND_METHOD(Redis, flushDB);
10101017
ZEND_METHOD(Redis, geoadd);
@@ -1235,6 +1242,7 @@ static const zend_function_entry class_Redis_methods[] = {
12351242
ZEND_ME(Redis, exists, arginfo_class_Redis_exists, ZEND_ACC_PUBLIC)
12361243
ZEND_ME(Redis, expire, arginfo_class_Redis_expire, ZEND_ACC_PUBLIC)
12371244
ZEND_ME(Redis, expireAt, arginfo_class_Redis_expireAt, ZEND_ACC_PUBLIC)
1245+
ZEND_ME(Redis, failover, arginfo_class_Redis_failover, ZEND_ACC_PUBLIC)
12381246
ZEND_ME(Redis, flushAll, arginfo_class_Redis_flushAll, ZEND_ACC_PUBLIC)
12391247
ZEND_ME(Redis, flushDB, arginfo_class_Redis_flushDB, ZEND_ACC_PUBLIC)
12401248
ZEND_ME(Redis, geoadd, arginfo_class_Redis_geoadd, ZEND_ACC_PUBLIC)

redis_commands.c

Lines changed: 64 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -447,6 +447,70 @@ int redis_key_cmd(INTERNAL_FUNCTION_PARAMETERS, RedisSock *redis_sock,
447447
return SUCCESS;
448448
}
449449

450+
int
451+
redis_failover_cmd(INTERNAL_FUNCTION_PARAMETERS, RedisSock *redis_sock,
452+
char **cmd, int *cmd_len, short *slot, void **ctx)
453+
{
454+
int argc;
455+
smart_string cmdstr = {0};
456+
zend_bool abort = 0, force = 0;
457+
zend_long timeout = 0, port = 0;
458+
zend_string *zkey, *host = NULL;
459+
zval *z_to = NULL, *z_ele;
460+
461+
if (zend_parse_parameters(ZEND_NUM_ARGS(), "|a!bl",
462+
&z_to, &abort, &timeout) == FAILURE)
463+
{
464+
return FAILURE;
465+
}
466+
467+
if (z_to != NULL) {
468+
ZEND_HASH_FOREACH_STR_KEY_VAL(Z_ARRVAL_P(z_to), zkey, z_ele) {
469+
if (zkey != NULL) {
470+
ZVAL_DEREF(z_ele);
471+
if (zend_string_equals_literal_ci(zkey, "host")) {
472+
host = zval_get_string(z_ele);
473+
} else if (zend_string_equals_literal_ci(zkey, "port")) {
474+
port = zval_get_long(z_ele);
475+
} else if (zend_string_equals_literal_ci(zkey, "force")) {
476+
force = zval_is_true(z_ele);
477+
}
478+
}
479+
} ZEND_HASH_FOREACH_END();
480+
if (!host || !port) {
481+
php_error_docref(NULL, E_WARNING, "host and port must be provided!");
482+
if (host) zend_string_release(host);
483+
return FAILURE;
484+
}
485+
}
486+
487+
argc = (host && port ? 3 + force : 0) + abort + (timeout > 0 ? 2 : 0);
488+
REDIS_CMD_INIT_SSTR_STATIC(&cmdstr, argc, "FAILOVER");
489+
490+
if (host && port) {
491+
REDIS_CMD_APPEND_SSTR_STATIC(&cmdstr, "TO");
492+
redis_cmd_append_sstr_zstr(&cmdstr, host);
493+
redis_cmd_append_sstr_int(&cmdstr, port);
494+
if (force) {
495+
REDIS_CMD_APPEND_SSTR_STATIC(&cmdstr, "FORCE");
496+
}
497+
zend_string_release(host);
498+
}
499+
500+
if (abort) {
501+
REDIS_CMD_APPEND_SSTR_STATIC(&cmdstr, "ABORT");
502+
}
503+
if (timeout > 0) {
504+
REDIS_CMD_APPEND_SSTR_STATIC(&cmdstr, "TIMEOUT");
505+
redis_cmd_append_sstr_long(&cmdstr, timeout);
506+
}
507+
508+
*cmd = cmdstr.c;
509+
*cmd_len = cmdstr.len;
510+
511+
return SUCCESS;
512+
}
513+
450514
int redis_flush_cmd(INTERNAL_FUNCTION_PARAMETERS, RedisSock *redis_sock,
451515
char *kw, char **cmd, int *cmd_len, short *slot, void **ctx)
452516
{

redis_commands.h

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

136+
int redis_failover_cmd(INTERNAL_FUNCTION_PARAMETERS, RedisSock *redis_sock,
137+
char **cmd, int *cmd_len, short *slot, void **ctx);
138+
136139
int redis_flush_cmd(INTERNAL_FUNCTION_PARAMETERS, RedisSock *redis_sock,
137140
char *kw, char **cmd, int *cmd_len, short *slot, void **ctx);
138141

redis_legacy_arginfo.h

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/* This is a generated file, edit the .stub.php file instead.
2-
* Stub hash: 8ad4d58327d1b0b07b0dbec026b27ed6a594b8b9 */
2+
* Stub hash: 858f814d5b91c0829ae6b6a265a740cc037586dd */
33

44
ZEND_BEGIN_ARG_INFO_EX(arginfo_class_Redis___construct, 0, 0, 0)
55
ZEND_ARG_INFO(0, options)
@@ -167,6 +167,12 @@ ZEND_BEGIN_ARG_INFO_EX(arginfo_class_Redis_expireAt, 0, 0, 2)
167167
ZEND_ARG_INFO(0, timestamp)
168168
ZEND_END_ARG_INFO()
169169

170+
ZEND_BEGIN_ARG_INFO_EX(arginfo_class_Redis_failover, 0, 0, 0)
171+
ZEND_ARG_INFO(0, to)
172+
ZEND_ARG_INFO(0, abort)
173+
ZEND_ARG_INFO(0, timeout)
174+
ZEND_END_ARG_INFO()
175+
170176
ZEND_BEGIN_ARG_INFO_EX(arginfo_class_Redis_flushAll, 0, 0, 0)
171177
ZEND_ARG_INFO(0, sync)
172178
ZEND_END_ARG_INFO()
@@ -902,6 +908,7 @@ ZEND_METHOD(Redis, exec);
902908
ZEND_METHOD(Redis, exists);
903909
ZEND_METHOD(Redis, expire);
904910
ZEND_METHOD(Redis, expireAt);
911+
ZEND_METHOD(Redis, failover);
905912
ZEND_METHOD(Redis, flushAll);
906913
ZEND_METHOD(Redis, flushDB);
907914
ZEND_METHOD(Redis, geoadd);
@@ -1132,6 +1139,7 @@ static const zend_function_entry class_Redis_methods[] = {
11321139
ZEND_ME(Redis, exists, arginfo_class_Redis_exists, ZEND_ACC_PUBLIC)
11331140
ZEND_ME(Redis, expire, arginfo_class_Redis_expire, ZEND_ACC_PUBLIC)
11341141
ZEND_ME(Redis, expireAt, arginfo_class_Redis_expireAt, ZEND_ACC_PUBLIC)
1142+
ZEND_ME(Redis, failover, arginfo_class_Redis_failover, ZEND_ACC_PUBLIC)
11351143
ZEND_ME(Redis, flushAll, arginfo_class_Redis_flushAll, ZEND_ACC_PUBLIC)
11361144
ZEND_ME(Redis, flushDB, arginfo_class_Redis_flushDB, ZEND_ACC_PUBLIC)
11371145
ZEND_ME(Redis, geoadd, arginfo_class_Redis_geoadd, ZEND_ACC_PUBLIC)

0 commit comments

Comments
 (0)