From 4e252e4c099b4d8e160bc196e1a2124d6e0cb79d 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 9a4222fe2..d8352ec38 100644 --- a/src/db.c +++ b/src/db.c @@ -1238,6 +1238,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 17bfcbbef..70a9f32da 100644 --- a/src/server.c +++ b/src/server.c @@ -265,7 +265,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 0c5fcdb55..6c8a3ca20 100644 --- a/src/server.h +++ b/src/server.h @@ -1448,6 +1448,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);