diff options
author | antirez <antirez@gmail.com> | 2018-09-27 17:01:32 +0200 |
---|---|---|
committer | antirez <antirez@gmail.com> | 2018-09-27 17:01:35 +0200 |
commit | 5aa347b3774891b8babf1347bde451382f514dea (patch) | |
tree | 4e58405253729ec8b485a1f22b3b2e14c0261984 /src/modules | |
parent | 0aecb135c9fa0839d9f65f855a84957e3e54d747 (diff) | |
download | redis-5aa347b3774891b8babf1347bde451382f514dea.tar.gz |
Modules: hellodict example WIP #3: KEYRANGE.
Diffstat (limited to 'src/modules')
-rw-r--r-- | src/modules/hellodict.c | 40 |
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); |