From 00353f9902da351451bbca67b8f7e19a09b9e831 Mon Sep 17 00:00:00 2001 From: antirez Date: Fri, 11 Dec 2015 18:09:01 +0100 Subject: [PATCH] MIGRATE: Fix key extraction for new form. --- src/db.c | 27 +++++++++++++++++++++++++++ src/server.c | 2 +- src/server.h | 1 + 3 files changed, 29 insertions(+), 1 deletion(-) diff --git a/src/db.c b/src/db.c index a907c04d..eaf17cd8 100644 --- a/src/db.c +++ b/src/db.c @@ -1160,6 +1160,33 @@ int *sortGetKeys(struct redisCommand *cmd, robj **argv, int argc, int *numkeys) return keys; } +int *migrateGetKeys(struct redisCommand *cmd, robj **argv, int argc, int *numkeys) { + int i, num, first, *keys; + UNUSED(cmd); + + /* Assume the obvious form. */ + first = 3; + num = 1; + + /* But check for the extended one with the KEYS option. */ + if (argc > 6) { + for (i = 6; i < argc; i++) { + if (!strcasecmp(argv[i]->ptr,"keys") && + sdslen(argv[3]->ptr) == 0) + { + first = i+1; + num = argc-first; + break; + } + } + } + + keys = zmalloc(sizeof(int)*num); + for (i = 0; i < num; i++) keys[i] = first+i; + *numkeys = num; + return keys; +} + /* Slot to Key API. This is used by Redis Cluster in order to obtain in * a fast way a key that belongs to a specified hash slot. This is useful * while rehashing the cluster. */ diff --git a/src/server.c b/src/server.c index 8164b7c9..05454814 100644 --- a/src/server.c +++ b/src/server.c @@ -264,7 +264,7 @@ struct redisCommand redisCommandTable[] = { {"cluster",clusterCommand,-2,"ar",0,NULL,0,0,0,0,0}, {"restore",restoreCommand,-4,"wm",0,NULL,1,1,1,0,0}, {"restore-asking",restoreCommand,-4,"wmk",0,NULL,1,1,1,0,0}, - {"migrate",migrateCommand,-6,"w",0,NULL,3,3,1,0,0}, + {"migrate",migrateCommand,-6,"w",0,migrateGetKeys,0,0,0,0,0}, {"asking",askingCommand,1,"r",0,NULL,0,0,0,0,0}, {"readonly",readonlyCommand,1,"rF",0,NULL,0,0,0,0,0}, {"readwrite",readwriteCommand,1,"rF",0,NULL,0,0,0,0,0}, diff --git a/src/server.h b/src/server.h index 409a9593..dfe7da46 100644 --- a/src/server.h +++ b/src/server.h @@ -1421,6 +1421,7 @@ void getKeysFreeResult(int *result); int *zunionInterGetKeys(struct redisCommand *cmd,robj **argv, int argc, int *numkeys); int *evalGetKeys(struct redisCommand *cmd, robj **argv, int argc, int *numkeys); int *sortGetKeys(struct redisCommand *cmd, robj **argv, int argc, int *numkeys); +int *migrateGetKeys(struct redisCommand *cmd, robj **argv, int argc, int *numkeys); /* Cluster */ void clusterInit(void);