Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/phpredis/phpredis.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPavlo Yatsukhnenko <yatsukhnenko@users.noreply.github.com>2022-04-25 09:48:05 +0300
committerGitHub <noreply@github.com>2022-04-25 09:48:05 +0300
commit31efee772812dac3bd7e8685f00732a0b33de82a (patch)
tree5ad3303e11aa15a45476bbf5798984ad5ff75169
parenta47c38a1c146828f12ac87a4529a8f37de593734 (diff)
parent4b767be7e9c0e225b4c2a6e26ae18b8e217f4ba5 (diff)
Merge pull request #2101 from phpredis/issue-1894-failover
Issue #1894
-rw-r--r--redis.c7
-rw-r--r--redis.stub.php2
-rw-r--r--redis_arginfo.h10
-rw-r--r--redis_commands.c64
-rw-r--r--redis_commands.h3
-rw-r--r--redis_legacy_arginfo.h10
6 files changed, 94 insertions, 2 deletions
diff --git a/redis.c b/redis.c
index ff385b67..2cea0b87 100644
--- a/redis.c
+++ b/redis.c
@@ -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)