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@gmail.com>2022-04-17 17:57:11 +0300
committerPavlo Yatsukhnenko <yatsukhnenko@gmail.com>2022-04-17 17:57:11 +0300
commit11861d95113a385f6eb6360a14ab35582effbf7e (patch)
tree251730a5086e631bbd50503d7a66c35d3d41f924
parent55bf0202dd674c70e147fc50e72298719e23391e (diff)
Issue #1894
Add GETEX, GETDEL commands.
-rw-r--r--redis.c15
-rw-r--r--redis.stub.php4
-rw-r--r--redis_arginfo.h15
-rw-r--r--redis_commands.c59
-rw-r--r--redis_commands.h3
-rw-r--r--redis_legacy_arginfo.h22
6 files changed, 110 insertions, 8 deletions
diff --git a/redis.c b/redis.c
index ac7afd80..ff385b67 100644
--- a/redis.c
+++ b/redis.c
@@ -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)