Skip to content
GitLab
Menu
Projects
Groups
Snippets
Loading...
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
Menu
Open sidebar
ruanhaishen
redis
Commits
5aa347b3
Commit
5aa347b3
authored
Sep 27, 2018
by
antirez
Browse files
Modules: hellodict example WIP #3: KEYRANGE.
parent
0aecb135
Changes
1
Hide whitespace changes
Inline
Side-by-side
src/modules/hellodict.c
View file @
5aa347b3
...
...
@@ -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
);
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
.
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment