diff options
author | Pavlo Yatsukhnenko <yatsukhnenko@users.noreply.github.com> | 2022-04-25 09:48:05 +0300 |
---|---|---|
committer | GitHub <noreply@github.com> | 2022-04-25 09:48:05 +0300 |
commit | 31efee772812dac3bd7e8685f00732a0b33de82a (patch) | |
tree | 5ad3303e11aa15a45476bbf5798984ad5ff75169 | |
parent | a47c38a1c146828f12ac87a4529a8f37de593734 (diff) | |
parent | 4b767be7e9c0e225b4c2a6e26ae18b8e217f4ba5 (diff) |
Merge pull request #2101 from phpredis/issue-1894-failover
Issue #1894
-rw-r--r-- | redis.c | 7 | ||||
-rw-r--r-- | redis.stub.php | 2 | ||||
-rw-r--r-- | redis_arginfo.h | 10 | ||||
-rw-r--r-- | redis_commands.c | 64 | ||||
-rw-r--r-- | redis_commands.h | 3 | ||||
-rw-r--r-- | redis_legacy_arginfo.h | 10 |
6 files changed, 94 insertions, 2 deletions
@@ -1695,6 +1695,13 @@ PHP_METHOD(Redis, lastSave) } /* }}} */ +/* {{{ proto bool Redis::failover([array to [,bool abort [,int timeout]]] ) */ +PHP_METHOD(Redis, failover) +{ + REDIS_PROCESS_CMD(failover, redis_boolean_response); +} +/* }}} */ + /* {{{ proto bool Redis::flushDB([bool async]) */ PHP_METHOD(Redis, flushDB) { diff --git a/redis.stub.php b/redis.stub.php index b1c5fc7e..5245f490 100644 --- a/redis.stub.php +++ b/redis.stub.php @@ -117,6 +117,8 @@ class Redis { public function expireAt(string $key, int $timestamp): bool; + public function failover(?array $to = null, bool $abort = false, int $timeout = 0): bool; + public function flushAll(?bool $sync = null): bool; public function flushDB(?bool $sync = null): bool; diff --git a/redis_arginfo.h b/redis_arginfo.h index 4b7c62bf..e615c6de 100644 --- a/redis_arginfo.h +++ b/redis_arginfo.h @@ -1,5 +1,5 @@ /* This is a generated file, edit the .stub.php file instead. - * Stub hash: 8ad4d58327d1b0b07b0dbec026b27ed6a594b8b9 */ + * Stub hash: 858f814d5b91c0829ae6b6a265a740cc037586dd */ ZEND_BEGIN_ARG_INFO_EX(arginfo_class_Redis___construct, 0, 0, 0) 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_ ZEND_ARG_TYPE_INFO(0, timestamp, IS_LONG, 0) ZEND_END_ARG_INFO() +ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_class_Redis_failover, 0, 0, _IS_BOOL, 0) + ZEND_ARG_TYPE_INFO_WITH_DEFAULT_VALUE(0, to, IS_ARRAY, 1, "null") + ZEND_ARG_TYPE_INFO_WITH_DEFAULT_VALUE(0, abort, _IS_BOOL, 0, "false") + ZEND_ARG_TYPE_INFO_WITH_DEFAULT_VALUE(0, timeout, IS_LONG, 0, "0") +ZEND_END_ARG_INFO() + ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_class_Redis_flushAll, 0, 0, _IS_BOOL, 0) ZEND_ARG_TYPE_INFO_WITH_DEFAULT_VALUE(0, sync, _IS_BOOL, 1, "null") ZEND_END_ARG_INFO() @@ -1005,6 +1011,7 @@ ZEND_METHOD(Redis, exec); ZEND_METHOD(Redis, exists); ZEND_METHOD(Redis, expire); ZEND_METHOD(Redis, expireAt); +ZEND_METHOD(Redis, failover); ZEND_METHOD(Redis, flushAll); ZEND_METHOD(Redis, flushDB); ZEND_METHOD(Redis, geoadd); @@ -1235,6 +1242,7 @@ static const zend_function_entry class_Redis_methods[] = { ZEND_ME(Redis, exists, arginfo_class_Redis_exists, ZEND_ACC_PUBLIC) ZEND_ME(Redis, expire, arginfo_class_Redis_expire, ZEND_ACC_PUBLIC) ZEND_ME(Redis, expireAt, arginfo_class_Redis_expireAt, ZEND_ACC_PUBLIC) + ZEND_ME(Redis, failover, arginfo_class_Redis_failover, ZEND_ACC_PUBLIC) ZEND_ME(Redis, flushAll, arginfo_class_Redis_flushAll, ZEND_ACC_PUBLIC) ZEND_ME(Redis, flushDB, arginfo_class_Redis_flushDB, ZEND_ACC_PUBLIC) ZEND_ME(Redis, geoadd, arginfo_class_Redis_geoadd, ZEND_ACC_PUBLIC) diff --git a/redis_commands.c b/redis_commands.c index 14d732fb..86ec2539 100644 --- a/redis_commands.c +++ b/redis_commands.c @@ -447,6 +447,70 @@ int redis_key_cmd(INTERNAL_FUNCTION_PARAMETERS, RedisSock *redis_sock, return SUCCESS; } +int +redis_failover_cmd(INTERNAL_FUNCTION_PARAMETERS, RedisSock *redis_sock, + char **cmd, int *cmd_len, short *slot, void **ctx) +{ + int argc; + smart_string cmdstr = {0}; + zend_bool abort = 0, force = 0; + zend_long timeout = 0, port = 0; + zend_string *zkey, *host = NULL; + zval *z_to = NULL, *z_ele; + + if (zend_parse_parameters(ZEND_NUM_ARGS(), "|a!bl", + &z_to, &abort, &timeout) == FAILURE) + { + return FAILURE; + } + + if (z_to != NULL) { + ZEND_HASH_FOREACH_STR_KEY_VAL(Z_ARRVAL_P(z_to), zkey, z_ele) { + if (zkey != NULL) { + ZVAL_DEREF(z_ele); + if (zend_string_equals_literal_ci(zkey, "host")) { + host = zval_get_string(z_ele); + } else if (zend_string_equals_literal_ci(zkey, "port")) { + port = zval_get_long(z_ele); + } else if (zend_string_equals_literal_ci(zkey, "force")) { + force = zval_is_true(z_ele); + } + } + } ZEND_HASH_FOREACH_END(); + if (!host || !port) { + php_error_docref(NULL, E_WARNING, "host and port must be provided!"); + if (host) zend_string_release(host); + return FAILURE; + } + } + + argc = (host && port ? 3 + force : 0) + abort + (timeout > 0 ? 2 : 0); + REDIS_CMD_INIT_SSTR_STATIC(&cmdstr, argc, "FAILOVER"); + + if (host && port) { + REDIS_CMD_APPEND_SSTR_STATIC(&cmdstr, "TO"); + redis_cmd_append_sstr_zstr(&cmdstr, host); + redis_cmd_append_sstr_int(&cmdstr, port); + if (force) { + REDIS_CMD_APPEND_SSTR_STATIC(&cmdstr, "FORCE"); + } + zend_string_release(host); + } + + if (abort) { + REDIS_CMD_APPEND_SSTR_STATIC(&cmdstr, "ABORT"); + } + if (timeout > 0) { + REDIS_CMD_APPEND_SSTR_STATIC(&cmdstr, "TIMEOUT"); + redis_cmd_append_sstr_long(&cmdstr, timeout); + } + + *cmd = cmdstr.c; + *cmd_len = cmdstr.len; + + return SUCCESS; +} + int redis_flush_cmd(INTERNAL_FUNCTION_PARAMETERS, RedisSock *redis_sock, char *kw, char **cmd, int *cmd_len, short *slot, void **ctx) { diff --git a/redis_commands.h b/redis_commands.h index 94c5dd70..45f9bd9c 100644 --- a/redis_commands.h +++ b/redis_commands.h @@ -133,6 +133,9 @@ int redis_gen_zlex_cmd(INTERNAL_FUNCTION_PARAMETERS, RedisSock *redis_sock, int redis_eval_cmd(INTERNAL_FUNCTION_PARAMETERS, RedisSock *redis_sock, char *kw, char **cmd, int *cmd_len, short *slot, void **ctx); +int redis_failover_cmd(INTERNAL_FUNCTION_PARAMETERS, RedisSock *redis_sock, + char **cmd, int *cmd_len, short *slot, void **ctx); + int redis_flush_cmd(INTERNAL_FUNCTION_PARAMETERS, RedisSock *redis_sock, char *kw, char **cmd, int *cmd_len, short *slot, void **ctx); diff --git a/redis_legacy_arginfo.h b/redis_legacy_arginfo.h index b275ea64..858f299f 100644 --- a/redis_legacy_arginfo.h +++ b/redis_legacy_arginfo.h @@ -1,5 +1,5 @@ /* This is a generated file, edit the .stub.php file instead. - * Stub hash: 8ad4d58327d1b0b07b0dbec026b27ed6a594b8b9 */ + * Stub hash: 858f814d5b91c0829ae6b6a265a740cc037586dd */ ZEND_BEGIN_ARG_INFO_EX(arginfo_class_Redis___construct, 0, 0, 0) ZEND_ARG_INFO(0, options) @@ -167,6 +167,12 @@ ZEND_BEGIN_ARG_INFO_EX(arginfo_class_Redis_expireAt, 0, 0, 2) ZEND_ARG_INFO(0, timestamp) ZEND_END_ARG_INFO() +ZEND_BEGIN_ARG_INFO_EX(arginfo_class_Redis_failover, 0, 0, 0) + ZEND_ARG_INFO(0, to) + ZEND_ARG_INFO(0, abort) + ZEND_ARG_INFO(0, timeout) +ZEND_END_ARG_INFO() + ZEND_BEGIN_ARG_INFO_EX(arginfo_class_Redis_flushAll, 0, 0, 0) ZEND_ARG_INFO(0, sync) ZEND_END_ARG_INFO() @@ -902,6 +908,7 @@ ZEND_METHOD(Redis, exec); ZEND_METHOD(Redis, exists); ZEND_METHOD(Redis, expire); ZEND_METHOD(Redis, expireAt); +ZEND_METHOD(Redis, failover); ZEND_METHOD(Redis, flushAll); ZEND_METHOD(Redis, flushDB); ZEND_METHOD(Redis, geoadd); @@ -1132,6 +1139,7 @@ static const zend_function_entry class_Redis_methods[] = { ZEND_ME(Redis, exists, arginfo_class_Redis_exists, ZEND_ACC_PUBLIC) ZEND_ME(Redis, expire, arginfo_class_Redis_expire, ZEND_ACC_PUBLIC) ZEND_ME(Redis, expireAt, arginfo_class_Redis_expireAt, ZEND_ACC_PUBLIC) + ZEND_ME(Redis, failover, arginfo_class_Redis_failover, ZEND_ACC_PUBLIC) ZEND_ME(Redis, flushAll, arginfo_class_Redis_flushAll, ZEND_ACC_PUBLIC) ZEND_ME(Redis, flushDB, arginfo_class_Redis_flushDB, ZEND_ACC_PUBLIC) ZEND_ME(Redis, geoadd, arginfo_class_Redis_geoadd, ZEND_ACC_PUBLIC) |