X-Git-Url: https://git.saurik.com/redis.git/blobdiff_plain/0681c5ad844cefefbe62f30df6587c0cbec3272e..80e87a461a7d2ee54430127bdb6ac014778c54c5:/src/networking.c diff --git a/src/networking.c b/src/networking.c index a4eee464..629267d1 100644 --- a/src/networking.c +++ b/src/networking.c @@ -941,6 +941,9 @@ void clientCommand(redisClient *c) { } } +/* Rewrite the command vector of the client. All the new objects ref count + * is incremented. The old command vector is freed, and the old objects + * ref count is decremented. */ void rewriteClientCommandVector(redisClient *c, int argc, ...) { va_list ap; int j; @@ -967,3 +970,21 @@ void rewriteClientCommandVector(redisClient *c, int argc, ...) { redisAssert(c->cmd != NULL); va_end(ap); } + +/* Rewrite a single item in the command vector. + * The new val ref count is incremented, and the old decremented. */ +void rewriteClientCommandArgument(redisClient *c, int i, robj *newval) { + robj *oldval; + + redisAssert(i < c->argc); + oldval = c->argv[i]; + c->argv[i] = newval; + incrRefCount(newval); + decrRefCount(oldval); + + /* If this is the command name make sure to fix c->cmd. */ + if (i == 0) { + c->cmd = lookupCommand(c->argv[0]->ptr); + redisAssert(c->cmd != NULL); + } +}