diff options
author | Pavlo Yatsukhnenko <yatsukhnenko@gmail.com> | 2022-04-17 17:57:11 +0300 |
---|---|---|
committer | Pavlo Yatsukhnenko <yatsukhnenko@gmail.com> | 2022-04-17 17:57:11 +0300 |
commit | 11861d95113a385f6eb6360a14ab35582effbf7e (patch) | |
tree | 251730a5086e631bbd50503d7a66c35d3d41f924 | |
parent | 55bf0202dd674c70e147fc50e72298719e23391e (diff) |
Issue #1894
Add GETEX, GETDEL commands.
-rw-r--r-- | redis.c | 15 | ||||
-rw-r--r-- | redis.stub.php | 4 | ||||
-rw-r--r-- | redis_arginfo.h | 15 | ||||
-rw-r--r-- | redis_commands.c | 59 | ||||
-rw-r--r-- | redis_commands.h | 3 | ||||
-rw-r--r-- | redis_legacy_arginfo.h | 22 |
6 files changed, 110 insertions, 8 deletions
@@ -961,6 +961,21 @@ PHP_METHOD(Redis, get) } /* }}} */ +/* {{{ proto string Redis::getDel(string key) + */ +PHP_METHOD(Redis, getDel) +{ + REDIS_PROCESS_KW_CMD("GETDEL", redis_key_cmd, redis_string_response); +} +/* }}} */ + +/* {{{ proto string Redis::getEx(string key [, array $options = []]) + */ +PHP_METHOD(Redis, getEx) +{ + REDIS_PROCESS_CMD(getex, redis_string_response); +} +/* }}} */ /* {{{ proto string Redis::ping() */ diff --git a/redis.stub.php b/redis.stub.php index e5b72dd1..b1c5fc7e 100644 --- a/redis.stub.php +++ b/redis.stub.php @@ -149,8 +149,12 @@ class Redis { /** @return int|Redis */ public function getBit(string $key, int $idx); + public function getEx(string $key, array $options = []): bool|string; + public function getDBNum(): int; + public function getDel(string $key): bool|string; + public function getHost(): string; public function getLastError(): ?string; diff --git a/redis_arginfo.h b/redis_arginfo.h index 3525e26c..4b7c62bf 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: 452d7bafe0b4a9d6d67353613d9cde2d407aa2a2 */ + * Stub hash: 8ad4d58327d1b0b07b0dbec026b27ed6a594b8b9 */ 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") @@ -256,8 +256,17 @@ ZEND_BEGIN_ARG_INFO_EX(arginfo_class_Redis_getBit, 0, 0, 2) ZEND_ARG_TYPE_INFO(0, idx, IS_LONG, 0) ZEND_END_ARG_INFO() +ZEND_BEGIN_ARG_WITH_RETURN_TYPE_MASK_EX(arginfo_class_Redis_getEx, 0, 1, MAY_BE_BOOL|MAY_BE_STRING) + ZEND_ARG_TYPE_INFO(0, key, IS_STRING, 0) + ZEND_ARG_TYPE_INFO_WITH_DEFAULT_VALUE(0, options, IS_ARRAY, 0, "[]") +ZEND_END_ARG_INFO() + #define arginfo_class_Redis_getDBNum arginfo_class_Redis_dbSize +ZEND_BEGIN_ARG_WITH_RETURN_TYPE_MASK_EX(arginfo_class_Redis_getDel, 0, 1, MAY_BE_BOOL|MAY_BE_STRING) + ZEND_ARG_TYPE_INFO(0, key, IS_STRING, 0) +ZEND_END_ARG_INFO() + ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_class_Redis_getHost, 0, 0, IS_STRING, 0) ZEND_END_ARG_INFO() @@ -1011,7 +1020,9 @@ ZEND_METHOD(Redis, geosearchstore); ZEND_METHOD(Redis, get); ZEND_METHOD(Redis, getAuth); ZEND_METHOD(Redis, getBit); +ZEND_METHOD(Redis, getEx); ZEND_METHOD(Redis, getDBNum); +ZEND_METHOD(Redis, getDel); ZEND_METHOD(Redis, getHost); ZEND_METHOD(Redis, getLastError); ZEND_METHOD(Redis, getMode); @@ -1239,7 +1250,9 @@ static const zend_function_entry class_Redis_methods[] = { ZEND_ME(Redis, get, arginfo_class_Redis_get, ZEND_ACC_PUBLIC) ZEND_ME(Redis, getAuth, arginfo_class_Redis_getAuth, ZEND_ACC_PUBLIC) ZEND_ME(Redis, getBit, arginfo_class_Redis_getBit, ZEND_ACC_PUBLIC) + ZEND_ME(Redis, getEx, arginfo_class_Redis_getEx, ZEND_ACC_PUBLIC) ZEND_ME(Redis, getDBNum, arginfo_class_Redis_getDBNum, ZEND_ACC_PUBLIC) + ZEND_ME(Redis, getDel, arginfo_class_Redis_getDel, ZEND_ACC_PUBLIC) ZEND_ME(Redis, getHost, arginfo_class_Redis_getHost, ZEND_ACC_PUBLIC) ZEND_ME(Redis, getLastError, arginfo_class_Redis_getLastError, ZEND_ACC_PUBLIC) ZEND_ME(Redis, getMode, arginfo_class_Redis_getMode, ZEND_ACC_PUBLIC) diff --git a/redis_commands.c b/redis_commands.c index 47f74904..af6754a1 100644 --- a/redis_commands.c +++ b/redis_commands.c @@ -1670,6 +1670,65 @@ int redis_set_cmd(INTERNAL_FUNCTION_PARAMETERS, RedisSock *redis_sock, return SUCCESS; } +int +redis_getex_cmd(INTERNAL_FUNCTION_PARAMETERS, RedisSock *redis_sock, + char **cmd, int *cmd_len, short *slot, void **ctx) +{ + smart_string cmdstr = {0}; + char *key, *exp_type = NULL; + zval *z_opts = NULL, *z_ele; + zend_long expire = -1; + zend_bool persist = 0; + zend_string *zkey; + size_t key_len; + + if (zend_parse_parameters(ZEND_NUM_ARGS(), "s|a", + &key, &key_len, &z_opts) == FAILURE) + { + return FAILURE; + } + + if (z_opts != NULL) { + ZEND_HASH_FOREACH_STR_KEY_VAL(Z_ARRVAL_P(z_opts), zkey, z_ele) { + if (zkey != NULL) { + ZVAL_DEREF(z_ele); + if (ZSTR_STRICMP_STATIC(zkey, "EX") || + ZSTR_STRICMP_STATIC(zkey, "PX") || + ZSTR_STRICMP_STATIC(zkey, "EXAT") || + ZSTR_STRICMP_STATIC(zkey, "PXAT") + ) { + exp_type = ZSTR_VAL(zkey); + expire = zval_get_long(z_ele); + persist = 0; + } else if (ZSTR_STRICMP_STATIC(zkey, "PERSIST")) { + persist = zval_is_true(z_ele); + exp_type = NULL; + } + } + } ZEND_HASH_FOREACH_END(); + } + + if (exp_type != NULL && expire < 1) { + php_error_docref(NULL, E_WARNING, "EXPIRE can't be < 1"); + return FAILURE; + } + + REDIS_CMD_INIT_SSTR_STATIC(&cmdstr, 1 + (exp_type ? 2 : persist), "GETEX"); + redis_cmd_append_sstr_key(&cmdstr, key, key_len, redis_sock, slot); + + if (exp_type != NULL) { + redis_cmd_append_sstr(&cmdstr, exp_type, strlen(exp_type)); + redis_cmd_append_sstr_long(&cmdstr, expire); + } else if (persist) { + REDIS_CMD_APPEND_SSTR_STATIC(&cmdstr, "PERSIST"); + } + + *cmd = cmdstr.c; + *cmd_len = cmdstr.len; + + return SUCCESS; +} + /* BRPOPLPUSH */ int redis_brpoplpush_cmd(INTERNAL_FUNCTION_PARAMETERS, RedisSock *redis_sock, char **cmd, int *cmd_len, short *slot, void **ctx) diff --git a/redis_commands.h b/redis_commands.h index ab9646e7..94c5dd70 100644 --- a/redis_commands.h +++ b/redis_commands.h @@ -159,6 +159,9 @@ int redis_geosearchstore_cmd(INTERNAL_FUNCTION_PARAMETERS, RedisSock *redis_sock int redis_set_cmd(INTERNAL_FUNCTION_PARAMETERS, RedisSock *redis_sock, char **cmd, int *cmd_len, short *slot, void **ctx); +int redis_getex_cmd(INTERNAL_FUNCTION_PARAMETERS, RedisSock *redis_sock, + char **cmd, int *cmd_len, short *slot, void **ctx); + int redis_brpoplpush_cmd(INTERNAL_FUNCTION_PARAMETERS, RedisSock *redis_sock, char **cmd, int *cmd_len, short *slot, void **ctx); diff --git a/redis_legacy_arginfo.h b/redis_legacy_arginfo.h index 1788713c..b275ea64 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: 452d7bafe0b4a9d6d67353613d9cde2d407aa2a2 */ + * Stub hash: 8ad4d58327d1b0b07b0dbec026b27ed6a594b8b9 */ ZEND_BEGIN_ARG_INFO_EX(arginfo_class_Redis___construct, 0, 0, 0) ZEND_ARG_INFO(0, options) @@ -243,8 +243,15 @@ ZEND_BEGIN_ARG_INFO_EX(arginfo_class_Redis_getBit, 0, 0, 2) ZEND_ARG_INFO(0, idx) ZEND_END_ARG_INFO() +ZEND_BEGIN_ARG_INFO_EX(arginfo_class_Redis_getEx, 0, 0, 1) + ZEND_ARG_INFO(0, key) + ZEND_ARG_INFO(0, options) +ZEND_END_ARG_INFO() + #define arginfo_class_Redis_getDBNum arginfo_class_Redis___destruct +#define arginfo_class_Redis_getDel arginfo_class_Redis__prefix + #define arginfo_class_Redis_getHost arginfo_class_Redis___destruct #define arginfo_class_Redis_getLastError arginfo_class_Redis___destruct @@ -304,10 +311,7 @@ ZEND_BEGIN_ARG_INFO_EX(arginfo_class_Redis_hMset, 0, 0, 2) ZEND_ARG_INFO(0, keyvals) ZEND_END_ARG_INFO() -ZEND_BEGIN_ARG_INFO_EX(arginfo_class_Redis_hRandField, 0, 0, 1) - ZEND_ARG_INFO(0, key) - ZEND_ARG_INFO(0, options) -ZEND_END_ARG_INFO() +#define arginfo_class_Redis_hRandField arginfo_class_Redis_getEx #define arginfo_class_Redis_hSet arginfo_class_Redis_hIncrBy @@ -607,7 +611,7 @@ ZEND_BEGIN_ARG_INFO_EX(arginfo_class_Redis_slowlog, 0, 0, 1) ZEND_ARG_INFO(0, option) ZEND_END_ARG_INFO() -#define arginfo_class_Redis_sort arginfo_class_Redis_hRandField +#define arginfo_class_Redis_sort arginfo_class_Redis_getEx ZEND_BEGIN_ARG_INFO_EX(arginfo_class_Redis_sortAsc, 0, 0, 1) ZEND_ARG_INFO(0, key) @@ -802,7 +806,7 @@ ZEND_BEGIN_ARG_INFO_EX(arginfo_class_Redis_zRangeByScore, 0, 0, 3) ZEND_ARG_INFO(0, options) ZEND_END_ARG_INFO() -#define arginfo_class_Redis_zRandMember arginfo_class_Redis_hRandField +#define arginfo_class_Redis_zRandMember arginfo_class_Redis_getEx #define arginfo_class_Redis_zRank arginfo_class_Redis_hExists @@ -913,7 +917,9 @@ ZEND_METHOD(Redis, geosearchstore); ZEND_METHOD(Redis, get); ZEND_METHOD(Redis, getAuth); ZEND_METHOD(Redis, getBit); +ZEND_METHOD(Redis, getEx); ZEND_METHOD(Redis, getDBNum); +ZEND_METHOD(Redis, getDel); ZEND_METHOD(Redis, getHost); ZEND_METHOD(Redis, getLastError); ZEND_METHOD(Redis, getMode); @@ -1141,7 +1147,9 @@ static const zend_function_entry class_Redis_methods[] = { ZEND_ME(Redis, get, arginfo_class_Redis_get, ZEND_ACC_PUBLIC) ZEND_ME(Redis, getAuth, arginfo_class_Redis_getAuth, ZEND_ACC_PUBLIC) ZEND_ME(Redis, getBit, arginfo_class_Redis_getBit, ZEND_ACC_PUBLIC) + ZEND_ME(Redis, getEx, arginfo_class_Redis_getEx, ZEND_ACC_PUBLIC) ZEND_ME(Redis, getDBNum, arginfo_class_Redis_getDBNum, ZEND_ACC_PUBLIC) + ZEND_ME(Redis, getDel, arginfo_class_Redis_getDel, ZEND_ACC_PUBLIC) ZEND_ME(Redis, getHost, arginfo_class_Redis_getHost, ZEND_ACC_PUBLIC) ZEND_ME(Redis, getLastError, arginfo_class_Redis_getLastError, ZEND_ACC_PUBLIC) ZEND_ME(Redis, getMode, arginfo_class_Redis_getMode, ZEND_ACC_PUBLIC) |