summaryrefslogtreecommitdiff
path: root/src/modules
diff options
context:
space:
mode:
authorantirez <antirez@gmail.com>2018-09-27 17:01:32 +0200
committerantirez <antirez@gmail.com>2018-09-27 17:01:35 +0200
commit5aa347b3774891b8babf1347bde451382f514dea (patch)
tree4e58405253729ec8b485a1f22b3b2e14c0261984 /src/modules
parent0aecb135c9fa0839d9f65f855a84957e3e54d747 (diff)
downloadredis-5aa347b3774891b8babf1347bde451382f514dea.tar.gz
Modules: hellodict example WIP #3: KEYRANGE.
Diffstat (limited to 'src/modules')
-rw-r--r--src/modules/hellodict.c40
1 files changed, 40 insertions, 0 deletions
diff --git a/src/modules/hellodict.c b/src/modules/hellodict.c
index b99f9f075..651615b03 100644
--- a/src/modules/hellodict.c
+++ b/src/modules/hellodict.c
@@ -68,6 +68,42 @@ int cmd_GET(RedisModuleCtx *ctx, RedisModuleString **argv, int argc) {
}
}
+/* HELLODICT.KEYRANGE <startkey> <endkey> <count>
+ *
+ * Return a list of matching keys, lexicographically between startkey
+ * and endkey. No more than 'count' items are emitted. */
+int cmd_KEYRANGE(RedisModuleCtx *ctx, RedisModuleString **argv, int argc) {
+ if (argc != 4) return RedisModule_WrongArity(ctx);
+
+ /* Parse the count argument. */
+ long long count;
+ if (RedisModule_StringToLongLong(argv[3],&count) != REDISMODULE_OK) {
+ return RedisModule_ReplyWithError(ctx,"ERR invalid count");
+ }
+
+ /* Seek the iterator. */
+ RedisModuleDictIter *iter = RedisModule_DictIteratorStart(
+ Keyspace, ">=", argv[1]);
+
+ /* Reply with the matching items. */
+ char *key;
+ size_t keylen;
+ long long replylen = 0; /* Keep track of the amitted array len. */
+ RedisModule_ReplyWithArray(ctx,REDISMODULE_POSTPONED_ARRAY_LEN);
+ while((key = RedisModule_DictNextC(iter,&keylen,NULL)) != NULL) {
+ if (replylen >= count) break;
+ if (RedisModule_DictCompare(iter,"<=",argv[2]) == REDISMODULE_ERR)
+ break;
+ RedisModule_ReplyWithStringBuffer(ctx,key,keylen);
+ replylen++;
+ }
+ RedisModule_ReplySetArrayLength(ctx,replylen);
+
+ /* Cleanup. */
+ RedisModule_DictIteratorStop(iter);
+ return REDISMODULE_OK;
+}
+
/* This function must be present on each Redis module. It is used in order to
* register the commands into the Redis server. */
int RedisModule_OnLoad(RedisModuleCtx *ctx, RedisModuleString **argv, int argc) {
@@ -85,6 +121,10 @@ int RedisModule_OnLoad(RedisModuleCtx *ctx, RedisModuleString **argv, int argc)
cmd_GET,"readonly",1,1,0) == REDISMODULE_ERR)
return REDISMODULE_ERR;
+ if (RedisModule_CreateCommand(ctx,"hellodict.keyrange",
+ cmd_KEYRANGE,"readonly",1,1,0) == REDISMODULE_ERR)
+ return REDISMODULE_ERR;
+
/* Create our global dictionray. Here we'll set our keys and values. */
Keyspace = RedisModule_CreateDict(NULL);