diff --git a/redis.c b/redis.c index 02ba94c..5d4016b 100644 --- a/redis.c +++ b/redis.c @@ -988,6 +988,10 @@ PHP_METHOD(Redis, del) { } /* }}} */ +PHP_METHOD(Redis, delifeq) { + REDIS_PROCESS_KW_CMD("DELIFEQ", redis_kv_cmd, redis_long_response); +} + /* {{{ proto long Redis::unlink(string $key1, string $key2 [, string $key3...]) }}} * {{{ proto long Redis::unlink(array $keys) */ PHP_METHOD(Redis, unlink) diff --git a/redis.stub.php b/redis.stub.php index 78587d8..fb87ce4 100644 --- a/redis.stub.php +++ b/redis.stub.php @@ -987,6 +987,16 @@ class Redis { */ public function del(array|string $key, string ...$other_keys): Redis|int|false; + /** + * Delete a key if it's equal to the specified value. This command is + * specific to Valkey >= 9.0 + * + * @param string $key The key to delete + * @param mixed $value The value to compare against the key's value. + * @return Redis|int|false Returns 1 if the key was deleted, 0 if it was not. + */ + public function delifeq(string $key, mixed $value): Redis|int|false; + /** * @deprecated * @alias Redis::del diff --git a/redis_arginfo.h b/redis_arginfo.h index 838159d..cdc1d46 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: 89e401bc3bc52dbd6d20f0459f5740b3ec855eb2 */ + * Stub hash: d5f56120b09dc6a8240d87efa53dc5749c031f38 */ ZEND_BEGIN_ARG_INFO_EX(arginfo_class_Redis___construct, 0, 0, 0) ZEND_ARG_TYPE_INFO_WITH_DEFAULT_VALUE(0, options, IS_ARRAY, 1, "null") @@ -175,6 +175,8 @@ ZEND_BEGIN_ARG_WITH_RETURN_OBJ_TYPE_MASK_EX(arginfo_class_Redis_del, 0, 1, Redis ZEND_ARG_VARIADIC_TYPE_INFO(0, other_keys, IS_STRING, 0) ZEND_END_ARG_INFO() +#define arginfo_class_Redis_delifeq arginfo_class_Redis_append + #define arginfo_class_Redis_delete arginfo_class_Redis_del #define arginfo_class_Redis_discard arginfo_class_Redis_bgSave @@ -1286,6 +1288,7 @@ ZEND_METHOD(Redis, debug); ZEND_METHOD(Redis, decr); ZEND_METHOD(Redis, decrBy); ZEND_METHOD(Redis, del); +ZEND_METHOD(Redis, delifeq); ZEND_METHOD(Redis, discard); ZEND_METHOD(Redis, dump); ZEND_METHOD(Redis, echo); @@ -1560,6 +1563,7 @@ static const zend_function_entry class_Redis_methods[] = { ZEND_ME(Redis, decr, arginfo_class_Redis_decr, ZEND_ACC_PUBLIC) ZEND_ME(Redis, decrBy, arginfo_class_Redis_decrBy, ZEND_ACC_PUBLIC) ZEND_ME(Redis, del, arginfo_class_Redis_del, ZEND_ACC_PUBLIC) + ZEND_ME(Redis, delifeq, arginfo_class_Redis_delifeq, ZEND_ACC_PUBLIC) ZEND_MALIAS(Redis, delete, del, arginfo_class_Redis_delete, ZEND_ACC_PUBLIC|ZEND_ACC_DEPRECATED) ZEND_ME(Redis, discard, arginfo_class_Redis_discard, ZEND_ACC_PUBLIC) ZEND_ME(Redis, dump, arginfo_class_Redis_dump, ZEND_ACC_PUBLIC) diff --git a/redis_cluster.c b/redis_cluster.c index 4769120..6bb9a73 100644 --- a/redis_cluster.c +++ b/redis_cluster.c @@ -800,6 +800,10 @@ PHP_METHOD(RedisCluster, del) { cluster_generic_delete(INTERNAL_FUNCTION_PARAM_PASSTHRU, "DEL", sizeof("DEL") - 1); } +PHP_METHOD(RedisCluster, delifeq) { + CLUSTER_PROCESS_KW_CMD("DELIFEQ", redis_kv_cmd, cluster_long_resp, 0); +} + /* {{{ proto array RedisCluster::unlink(string key1, string key2, ... keyN) */ PHP_METHOD(RedisCluster, unlink) { cluster_generic_delete(INTERNAL_FUNCTION_PARAM_PASSTHRU, "UNLINK", sizeof("UNLINK") - 1); diff --git a/redis_cluster.stub.php b/redis_cluster.stub.php index 6d9ed01..7021d8c 100644 --- a/redis_cluster.stub.php +++ b/redis_cluster.stub.php @@ -255,6 +255,16 @@ class RedisCluster { */ public function del(array|string $key, string ...$other_keys): RedisCluster|int|false; + /** + * Delete a key if it's equal to the specified value. This command is + * specific to Valkey >= 9.0 + * + * @param string $key The key to delete + * @param mixed $value The value to compare against the key's value. + * @return RedisCluster|int|false Returns 1 if the key was deleted, 0 if it was not. + */ + public function delifeq(string $key, mixed $value): RedisCluster|int|false; + /** * @see Redis::discard */ diff --git a/redis_cluster_arginfo.h b/redis_cluster_arginfo.h index edd927b..67eb630 100644 --- a/redis_cluster_arginfo.h +++ b/redis_cluster_arginfo.h @@ -1,5 +1,5 @@ /* This is a generated file, edit the .stub.php file instead. - * Stub hash: a4928c230ba6d599b66087fa831dd26bf1d4c5d7 */ + * Stub hash: 0f01437681bc6df1d6e2b39e6a0c7c5c77f6237e */ ZEND_BEGIN_ARG_INFO_EX(arginfo_class_RedisCluster___construct, 0, 0, 1) ZEND_ARG_TYPE_INFO(0, name, IS_STRING, 1) @@ -198,6 +198,11 @@ ZEND_BEGIN_ARG_WITH_RETURN_OBJ_TYPE_MASK_EX(arginfo_class_RedisCluster_del, 0, 1 ZEND_ARG_VARIADIC_TYPE_INFO(0, other_keys, IS_STRING, 0) ZEND_END_ARG_INFO() +ZEND_BEGIN_ARG_WITH_RETURN_OBJ_TYPE_MASK_EX(arginfo_class_RedisCluster_delifeq, 0, 2, RedisCluster, MAY_BE_LONG|MAY_BE_FALSE) + ZEND_ARG_TYPE_INFO(0, key, IS_STRING, 0) + ZEND_ARG_TYPE_INFO(0, value, IS_MIXED, 0) +ZEND_END_ARG_INFO() + #define arginfo_class_RedisCluster_discard arginfo_class_RedisCluster_clearlasterror ZEND_BEGIN_ARG_WITH_RETURN_OBJ_TYPE_MASK_EX(arginfo_class_RedisCluster_dump, 0, 1, RedisCluster, MAY_BE_STRING|MAY_BE_FALSE) @@ -1167,6 +1172,7 @@ ZEND_METHOD(RedisCluster, decr); ZEND_METHOD(RedisCluster, decrby); ZEND_METHOD(RedisCluster, decrbyfloat); ZEND_METHOD(RedisCluster, del); +ZEND_METHOD(RedisCluster, delifeq); ZEND_METHOD(RedisCluster, discard); ZEND_METHOD(RedisCluster, dump); ZEND_METHOD(RedisCluster, echo); @@ -1412,6 +1418,7 @@ static const zend_function_entry class_RedisCluster_methods[] = { ZEND_ME(RedisCluster, decrby, arginfo_class_RedisCluster_decrby, ZEND_ACC_PUBLIC) ZEND_ME(RedisCluster, decrbyfloat, arginfo_class_RedisCluster_decrbyfloat, ZEND_ACC_PUBLIC) ZEND_ME(RedisCluster, del, arginfo_class_RedisCluster_del, ZEND_ACC_PUBLIC) + ZEND_ME(RedisCluster, delifeq, arginfo_class_RedisCluster_delifeq, ZEND_ACC_PUBLIC) ZEND_ME(RedisCluster, discard, arginfo_class_RedisCluster_discard, ZEND_ACC_PUBLIC) ZEND_ME(RedisCluster, dump, arginfo_class_RedisCluster_dump, ZEND_ACC_PUBLIC) ZEND_ME(RedisCluster, echo, arginfo_class_RedisCluster_echo, ZEND_ACC_PUBLIC) diff --git a/redis_cluster_legacy_arginfo.h b/redis_cluster_legacy_arginfo.h index 14ca234..abfb463 100644 --- a/redis_cluster_legacy_arginfo.h +++ b/redis_cluster_legacy_arginfo.h @@ -1,5 +1,5 @@ /* This is a generated file, edit the .stub.php file instead. - * Stub hash: a4928c230ba6d599b66087fa831dd26bf1d4c5d7 */ + * Stub hash: 0f01437681bc6df1d6e2b39e6a0c7c5c77f6237e */ ZEND_BEGIN_ARG_INFO_EX(arginfo_class_RedisCluster___construct, 0, 0, 1) ZEND_ARG_INFO(0, name) @@ -178,6 +178,8 @@ ZEND_BEGIN_ARG_INFO_EX(arginfo_class_RedisCluster_del, 0, 0, 1) ZEND_ARG_VARIADIC_INFO(0, other_keys) ZEND_END_ARG_INFO() +#define arginfo_class_RedisCluster_delifeq arginfo_class_RedisCluster_append + #define arginfo_class_RedisCluster_discard arginfo_class_RedisCluster__masters #define arginfo_class_RedisCluster_dump arginfo_class_RedisCluster__prefix @@ -1005,6 +1007,7 @@ ZEND_METHOD(RedisCluster, decr); ZEND_METHOD(RedisCluster, decrby); ZEND_METHOD(RedisCluster, decrbyfloat); ZEND_METHOD(RedisCluster, del); +ZEND_METHOD(RedisCluster, delifeq); ZEND_METHOD(RedisCluster, discard); ZEND_METHOD(RedisCluster, dump); ZEND_METHOD(RedisCluster, echo); @@ -1250,6 +1253,7 @@ static const zend_function_entry class_RedisCluster_methods[] = { ZEND_ME(RedisCluster, decrby, arginfo_class_RedisCluster_decrby, ZEND_ACC_PUBLIC) ZEND_ME(RedisCluster, decrbyfloat, arginfo_class_RedisCluster_decrbyfloat, ZEND_ACC_PUBLIC) ZEND_ME(RedisCluster, del, arginfo_class_RedisCluster_del, ZEND_ACC_PUBLIC) + ZEND_ME(RedisCluster, delifeq, arginfo_class_RedisCluster_delifeq, ZEND_ACC_PUBLIC) ZEND_ME(RedisCluster, discard, arginfo_class_RedisCluster_discard, ZEND_ACC_PUBLIC) ZEND_ME(RedisCluster, dump, arginfo_class_RedisCluster_dump, ZEND_ACC_PUBLIC) ZEND_ME(RedisCluster, echo, arginfo_class_RedisCluster_echo, ZEND_ACC_PUBLIC) diff --git a/redis_legacy_arginfo.h b/redis_legacy_arginfo.h index ea1ec08..4fd012a 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: 89e401bc3bc52dbd6d20f0459f5740b3ec855eb2 */ + * Stub hash: d5f56120b09dc6a8240d87efa53dc5749c031f38 */ ZEND_BEGIN_ARG_INFO_EX(arginfo_class_Redis___construct, 0, 0, 0) ZEND_ARG_INFO(0, options) @@ -163,6 +163,8 @@ ZEND_BEGIN_ARG_INFO_EX(arginfo_class_Redis_del, 0, 0, 1) ZEND_ARG_VARIADIC_INFO(0, other_keys) ZEND_END_ARG_INFO() +#define arginfo_class_Redis_delifeq arginfo_class_Redis_append + #define arginfo_class_Redis_delete arginfo_class_Redis_del #define arginfo_class_Redis_discard arginfo_class_Redis___destruct @@ -1124,6 +1126,7 @@ ZEND_METHOD(Redis, debug); ZEND_METHOD(Redis, decr); ZEND_METHOD(Redis, decrBy); ZEND_METHOD(Redis, del); +ZEND_METHOD(Redis, delifeq); ZEND_METHOD(Redis, discard); ZEND_METHOD(Redis, dump); ZEND_METHOD(Redis, echo); @@ -1398,6 +1401,7 @@ static const zend_function_entry class_Redis_methods[] = { ZEND_ME(Redis, decr, arginfo_class_Redis_decr, ZEND_ACC_PUBLIC) ZEND_ME(Redis, decrBy, arginfo_class_Redis_decrBy, ZEND_ACC_PUBLIC) ZEND_ME(Redis, del, arginfo_class_Redis_del, ZEND_ACC_PUBLIC) + ZEND_ME(Redis, delifeq, arginfo_class_Redis_delifeq, ZEND_ACC_PUBLIC) ZEND_MALIAS(Redis, delete, del, arginfo_class_Redis_delete, ZEND_ACC_PUBLIC|ZEND_ACC_DEPRECATED) ZEND_ME(Redis, discard, arginfo_class_Redis_discard, ZEND_ACC_PUBLIC) ZEND_ME(Redis, dump, arginfo_class_Redis_dump, ZEND_ACC_PUBLIC) diff --git a/tests/RedisTest.php b/tests/RedisTest.php index 10ef3a9..5a48fd6 100644 --- a/tests/RedisTest.php +++ b/tests/RedisTest.php @@ -1093,6 +1093,16 @@ class Redis_Test extends TestSuite { $this->genericDelUnlink('DEL'); } + public function testDelIfEq() { + if ( ! $this->haveCommand('DELIFEQ')) + $this->markTestSkipped(); + + $this->assertTrue($this->redis->set('key', 'value')); + $this->assertEquals(0, $this->redis->delifeq('key', 'notvalue')); + $this->assertEquals(1, $this->redis->delifeq('key', 'value')); + $this->assertEquals(0, $this->redis->exists('key')); + } + public function testUnlink() { if (version_compare($this->version, '4.0.0') < 0) $this->markTestSkipped();