summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorYossi Gottlieb <yossigo@gmail.com>2019-03-18 23:06:38 +0200
committerYossi Gottlieb <yossigo@gmail.com>2019-03-18 23:06:38 +0200
commit325fc1cb2e2e15a99e5d012184d177dc19257036 (patch)
tree9a05dc195ca1d47d3b9056ba2ecfc4cba63f88fd /src
parent2a5aeef79f894b80024d49ec1036ac03ae7ac5c5 (diff)
downloadredis-325fc1cb2e2e15a99e5d012184d177dc19257036.tar.gz
CommandFilter API: Support Lua and RM_call() flows.
Diffstat (limited to 'src')
-rw-r--r--src/module.c20
-rw-r--r--src/scripting.c5
2 files changed, 18 insertions, 7 deletions
diff --git a/src/module.c b/src/module.c
index c6cb8a0ca..17accfb70 100644
--- a/src/module.c
+++ b/src/module.c
@@ -2741,12 +2741,6 @@ RedisModuleCallReply *RM_Call(RedisModuleCtx *ctx, const char *cmdname, const ch
RedisModuleCallReply *reply = NULL;
int replicate = 0; /* Replicate this command? */
- cmd = lookupCommandByCString((char*)cmdname);
- if (!cmd) {
- errno = EINVAL;
- return NULL;
- }
-
/* Create the client and dispatch the command. */
va_start(ap, fmt);
c = createClient(-1);
@@ -2760,11 +2754,23 @@ RedisModuleCallReply *RM_Call(RedisModuleCtx *ctx, const char *cmdname, const ch
c->db = ctx->client->db;
c->argv = argv;
c->argc = argc;
- c->cmd = c->lastcmd = cmd;
/* We handle the above format error only when the client is setup so that
* we can free it normally. */
if (argv == NULL) goto cleanup;
+ /* Call command filters */
+ moduleCallCommandFilters(c);
+
+ /* Lookup command now, after filters had a chance to make modifications
+ * if necessary.
+ */
+ cmd = lookupCommand(c->argv[0]->ptr);
+ if (!cmd) {
+ errno = EINVAL;
+ goto cleanup;
+ }
+ c->cmd = c->lastcmd = cmd;
+
/* Basic arity checks. */
if ((cmd->arity > 0 && cmd->arity != argc) || (argc < -cmd->arity)) {
errno = EINVAL;
diff --git a/src/scripting.c b/src/scripting.c
index cbbf43fb1..032bfdf10 100644
--- a/src/scripting.c
+++ b/src/scripting.c
@@ -462,6 +462,11 @@ int luaRedisGenericCommand(lua_State *lua, int raise_error) {
c->argc = argc;
c->user = server.lua_caller->user;
+ /* Process module hooks */
+ moduleCallCommandFilters(c);
+ argv = c->argv;
+ argc = c->argc;
+
/* Log the command if debugging is active. */
if (ldb.active && ldb.step) {
sds cmdlog = sdsnew("<redis>");