mirror of
https://github.com/fluencelabs/redis
synced 2025-03-30 22:31:03 +00:00
Modules: hellodict example WIP #3: KEYRANGE.
This commit is contained in:
parent
0aecb135c9
commit
5aa347b377
@ -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
|
/* This function must be present on each Redis module. It is used in order to
|
||||||
* register the commands into the Redis server. */
|
* register the commands into the Redis server. */
|
||||||
int RedisModule_OnLoad(RedisModuleCtx *ctx, RedisModuleString **argv, int argc) {
|
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)
|
cmd_GET,"readonly",1,1,0) == REDISMODULE_ERR)
|
||||||
return 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. */
|
/* Create our global dictionray. Here we'll set our keys and values. */
|
||||||
Keyspace = RedisModule_CreateDict(NULL);
|
Keyspace = RedisModule_CreateDict(NULL);
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user