+void getKeysFreeResult(int *result) {
+ zfree(result);
+}
+
+int *noPreloadGetKeys(struct redisCommand *cmd,robj **argv, int argc, int *numkeys, int flags) {
+ if (flags & REDIS_GETKEYS_PRELOAD) {
+ *numkeys = 0;
+ return NULL;
+ } else {
+ return getKeysUsingCommandTable(cmd,argv,argc,numkeys);
+ }
+}
+
+int *renameGetKeys(struct redisCommand *cmd,robj **argv, int argc, int *numkeys, int flags) {
+ if (flags & REDIS_GETKEYS_PRELOAD) {
+ int *keys = zmalloc(sizeof(int));
+ *numkeys = 1;
+ keys[0] = 1;
+ return keys;
+ } else {
+ return getKeysUsingCommandTable(cmd,argv,argc,numkeys);
+ }
+}
+
+int *zunionInterGetKeys(struct redisCommand *cmd,robj **argv, int argc, int *numkeys, int flags) {
+ int i, num, *keys;
+ REDIS_NOTUSED(cmd);
+ REDIS_NOTUSED(flags);
+
+ num = atoi(argv[2]->ptr);
+ /* Sanity check. Don't return any key if the command is going to
+ * reply with syntax error. */
+ if (num > (argc-3)) {
+ *numkeys = 0;
+ return NULL;
+ }
+ keys = zmalloc(sizeof(int)*num);
+ for (i = 0; i < num; i++) keys[i] = 3+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. */
+void SlotToKeyAdd(robj *key) {
+ unsigned int hashslot = keyHashSlot(key->ptr,sdslen(key->ptr));
+
+ zslInsert(server.cluster.slots_to_keys,hashslot,key);
+ incrRefCount(key);
+}
+
+void SlotToKeyDel(robj *key) {
+ unsigned int hashslot = keyHashSlot(key->ptr,sdslen(key->ptr));
+
+ zslDelete(server.cluster.slots_to_keys,hashslot,key);
+}
+
+unsigned int GetKeysInSlot(unsigned int hashslot, robj **keys, unsigned int count) {
+ zskiplistNode *n;
+ zrangespec range;
+ int j = 0;
+
+ range.min = range.max = hashslot;
+ range.minex = range.maxex = 0;
+
+ n = zslFirstInRange(server.cluster.slots_to_keys, range);
+ while(n && n->score == hashslot && count--) {
+ keys[j++] = n->obj;
+ n = n->level[0].forward;
+ }
+ return j;
+}