summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorantirez <antirez@gmail.com>2015-12-11 18:09:01 +0100
committerantirez <antirez@gmail.com>2015-12-13 10:09:18 +0100
commit00353f9902da351451bbca67b8f7e19a09b9e831 (patch)
tree5132d400042944dbf0c79279a35bf862658a5ef7
parentf99be541b30014dbef46a92a0006c607dd47628e (diff)
downloadredis-00353f9902da351451bbca67b8f7e19a09b9e831.tar.gz
MIGRATE: Fix key extraction for new form.
-rw-r--r--src/db.c27
-rw-r--r--src/server.c2
-rw-r--r--src/server.h1
3 files changed, 29 insertions, 1 deletions
diff --git a/src/db.c b/src/db.c
index a907c04dd..eaf17cd8e 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 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);