diff options
author | Yossi Gottlieb <yossigo@gmail.com> | 2019-03-18 23:06:38 +0200 |
---|---|---|
committer | Yossi Gottlieb <yossigo@gmail.com> | 2019-03-18 23:06:38 +0200 |
commit | 325fc1cb2e2e15a99e5d012184d177dc19257036 (patch) | |
tree | 9a05dc195ca1d47d3b9056ba2ecfc4cba63f88fd /src | |
parent | 2a5aeef79f894b80024d49ec1036ac03ae7ac5c5 (diff) | |
download | redis-325fc1cb2e2e15a99e5d012184d177dc19257036.tar.gz |
CommandFilter API: Support Lua and RM_call() flows.
Diffstat (limited to 'src')
-rw-r--r-- | src/module.c | 20 | ||||
-rw-r--r-- | src/scripting.c | 5 |
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>"); |