diff options
author | antirez <antirez@gmail.com> | 2015-12-11 18:09:01 +0100 |
---|---|---|
committer | antirez <antirez@gmail.com> | 2015-12-13 10:09:18 +0100 |
commit | 00353f9902da351451bbca67b8f7e19a09b9e831 (patch) | |
tree | 5132d400042944dbf0c79279a35bf862658a5ef7 | |
parent | f99be541b30014dbef46a92a0006c607dd47628e (diff) | |
download | redis-00353f9902da351451bbca67b8f7e19a09b9e831.tar.gz |
MIGRATE: Fix key extraction for new form.
-rw-r--r-- | src/db.c | 27 | ||||
-rw-r--r-- | src/server.c | 2 | ||||
-rw-r--r-- | src/server.h | 1 |
3 files changed, 29 insertions, 1 deletions
@@ -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 8164b7c99..05454814c 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 409a9593d..dfe7da463 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); |