summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rwxr-xr-xruntest-moduleapi1
-rw-r--r--src/module.c2
-rw-r--r--tests/modules/Makefile1
-rw-r--r--tests/modules/zset.c30
-rw-r--r--tests/unit/moduleapi/zset.tcl16
5 files changed, 50 insertions, 0 deletions
diff --git a/runtest-moduleapi b/runtest-moduleapi
index e554226c1..53656fad7 100755
--- a/runtest-moduleapi
+++ b/runtest-moduleapi
@@ -32,5 +32,6 @@ $TCLSH tests/test_helper.tcl \
--single unit/moduleapi/getkeys \
--single unit/moduleapi/test_lazyfree \
--single unit/moduleapi/defrag \
+--single unit/moduleapi/zset \
--single unit/moduleapi/stream \
"${@}"
diff --git a/src/module.c b/src/module.c
index b04595801..039465e1a 100644
--- a/src/module.c
+++ b/src/module.c
@@ -2612,6 +2612,7 @@ int RM_ZsetRem(RedisModuleKey *key, RedisModuleString *ele, int *deleted) {
if (key->value && key->value->type != OBJ_ZSET) return REDISMODULE_ERR;
if (key->value != NULL && zsetDel(key->value,ele->ptr)) {
if (deleted) *deleted = 1;
+ moduleDelKeyIfEmpty(key);
} else {
if (deleted) *deleted = 0;
}
@@ -2657,6 +2658,7 @@ void RM_ZsetRangeStop(RedisModuleKey *key) {
/* Return the "End of range" flag value to signal the end of the iteration. */
int RM_ZsetRangeEndReached(RedisModuleKey *key) {
+ if (!key->value || key->value->type != OBJ_ZSET) return 1;
return key->u.zset.er;
}
diff --git a/tests/modules/Makefile b/tests/modules/Makefile
index 73a9be3bc..8ea1d91a2 100644
--- a/tests/modules/Makefile
+++ b/tests/modules/Makefile
@@ -35,6 +35,7 @@ TEST_MODULES = \
test_lazyfree.so \
timer.so \
defragtest.so \
+ zset.so \
stream.so
diff --git a/tests/modules/zset.c b/tests/modules/zset.c
new file mode 100644
index 000000000..4806f6549
--- /dev/null
+++ b/tests/modules/zset.c
@@ -0,0 +1,30 @@
+#include "redismodule.h"
+
+/* ZSET.REM key element
+ *
+ * Removes an occurrence of an element from a sorted set. Replies with the
+ * number of removed elements (0 or 1).
+ */
+int zset_rem(RedisModuleCtx *ctx, RedisModuleString **argv, int argc) {
+ if (argc != 3) return RedisModule_WrongArity(ctx);
+ RedisModule_AutoMemory(ctx);
+ int keymode = REDISMODULE_READ | REDISMODULE_WRITE;
+ RedisModuleKey *key = RedisModule_OpenKey(ctx, argv[1], keymode);
+ int deleted;
+ if (RedisModule_ZsetRem(key, argv[2], &deleted) == REDISMODULE_OK)
+ return RedisModule_ReplyWithLongLong(ctx, deleted);
+ else
+ return RedisModule_ReplyWithError(ctx, "ERR ZsetRem failed");
+}
+
+int RedisModule_OnLoad(RedisModuleCtx *ctx, RedisModuleString **argv, int argc) {
+ REDISMODULE_NOT_USED(argv);
+ REDISMODULE_NOT_USED(argc);
+ if (RedisModule_Init(ctx, "zset", 1, REDISMODULE_APIVER_1) ==
+ REDISMODULE_OK &&
+ RedisModule_CreateCommand(ctx, "zset.rem", zset_rem, "",
+ 1, 1, 1) == REDISMODULE_OK)
+ return REDISMODULE_OK;
+ else
+ return REDISMODULE_ERR;
+}
diff --git a/tests/unit/moduleapi/zset.tcl b/tests/unit/moduleapi/zset.tcl
new file mode 100644
index 000000000..998d20765
--- /dev/null
+++ b/tests/unit/moduleapi/zset.tcl
@@ -0,0 +1,16 @@
+set testmodule [file normalize tests/modules/zset.so]
+
+start_server {tags {"modules"}} {
+ r module load $testmodule
+
+ test {Module zset rem} {
+ r del k
+ r zadd k 100 hello 200 world
+ assert_equal 1 [r zset.rem k hello]
+ assert_equal 0 [r zset.rem k hello]
+ assert_equal 1 [r exists k]
+ # Check that removing the last element deletes the key
+ assert_equal 1 [r zset.rem k world]
+ assert_equal 0 [r exists k]
+ }
+}