You've already forked node-redis
mirror of
https://github.com/redis/node-redis.git
synced 2025-08-07 13:22:56 +03:00
* fix #2046 - add support for multi in select * fix "Argument of type 'symbol | undefined' is not assignable to parameter of type 'number | undefined'"
This commit is contained in:
@@ -468,6 +468,20 @@ describe('Client', () => {
|
|||||||
['PONG']
|
['PONG']
|
||||||
);
|
);
|
||||||
}, GLOBAL.SERVERS.OPEN);
|
}, GLOBAL.SERVERS.OPEN);
|
||||||
|
|
||||||
|
testUtils.testWithClient('should remember selected db', async client => {
|
||||||
|
await client.multi()
|
||||||
|
.select(1)
|
||||||
|
.exec();
|
||||||
|
await killClient(client);
|
||||||
|
assert.equal(
|
||||||
|
(await client.clientInfo()).db,
|
||||||
|
1
|
||||||
|
);
|
||||||
|
}, {
|
||||||
|
...GLOBAL.SERVERS.OPEN,
|
||||||
|
minimumDockerVersion: [6, 2] // CLIENT INFO
|
||||||
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
testUtils.testWithClient('scripts', async client => {
|
testUtils.testWithClient('scripts', async client => {
|
||||||
|
@@ -606,18 +606,26 @@ export default class RedisClient<
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
multiExecutor(commands: Array<RedisMultiQueuedCommand>, chainId?: symbol): Promise<Array<RedisCommandRawReply>> {
|
async multiExecutor(
|
||||||
|
commands: Array<RedisMultiQueuedCommand>,
|
||||||
|
selectedDB?: number,
|
||||||
|
chainId?: symbol
|
||||||
|
): Promise<Array<RedisCommandRawReply>> {
|
||||||
const promise = Promise.all(
|
const promise = Promise.all(
|
||||||
commands.map(({ args }) => {
|
commands.map(({ args }) => {
|
||||||
return this.#queue.addCommand(args, RedisClient.commandOptions({
|
return this.#queue.addCommand(args, { chainId });
|
||||||
chainId
|
|
||||||
}));
|
|
||||||
})
|
})
|
||||||
);
|
);
|
||||||
|
|
||||||
this.#tick();
|
this.#tick();
|
||||||
|
|
||||||
return promise;
|
const results = await promise;
|
||||||
|
|
||||||
|
if (selectedDB !== undefined) {
|
||||||
|
this.#selectedDB = selectedDB;
|
||||||
|
}
|
||||||
|
|
||||||
|
return results;
|
||||||
}
|
}
|
||||||
|
|
||||||
async* scanIterator(options?: ScanCommandOptions): AsyncIterable<string> {
|
async* scanIterator(options?: ScanCommandOptions): AsyncIterable<string> {
|
||||||
|
@@ -58,13 +58,13 @@ type InstantiableRedisMultiCommand<
|
|||||||
S extends RedisScripts
|
S extends RedisScripts
|
||||||
> = new (...args: ConstructorParameters<typeof RedisClientMultiCommand>) => RedisClientMultiCommandType<M, F, S>;
|
> = new (...args: ConstructorParameters<typeof RedisClientMultiCommand>) => RedisClientMultiCommandType<M, F, S>;
|
||||||
|
|
||||||
|
export type RedisClientMultiExecutor = (
|
||||||
export type RedisClientMultiExecutor = (queue: Array<RedisMultiQueuedCommand>, chainId?: symbol) => Promise<Array<RedisCommandRawReply>>;
|
queue: Array<RedisMultiQueuedCommand>,
|
||||||
|
selectedDB?: number,
|
||||||
|
chainId?: symbol
|
||||||
|
) => Promise<Array<RedisCommandRawReply>>;
|
||||||
|
|
||||||
export default class RedisClientMultiCommand {
|
export default class RedisClientMultiCommand {
|
||||||
readonly #multi = new RedisMultiCommand();
|
|
||||||
readonly #executor: RedisClientMultiExecutor;
|
|
||||||
|
|
||||||
static extend<
|
static extend<
|
||||||
M extends RedisModules,
|
M extends RedisModules,
|
||||||
F extends RedisFunctions,
|
F extends RedisFunctions,
|
||||||
@@ -81,7 +81,10 @@ export default class RedisClientMultiCommand {
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
readonly #multi = new RedisMultiCommand();
|
||||||
|
readonly #executor: RedisClientMultiExecutor;
|
||||||
readonly v4: Record<string, any> = {};
|
readonly v4: Record<string, any> = {};
|
||||||
|
#selectedDB?: number;
|
||||||
|
|
||||||
constructor(executor: RedisClientMultiExecutor, legacyMode = false) {
|
constructor(executor: RedisClientMultiExecutor, legacyMode = false) {
|
||||||
this.#executor = executor;
|
this.#executor = executor;
|
||||||
@@ -136,6 +139,13 @@ export default class RedisClientMultiCommand {
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
SELECT(db: number, transformReply?: RedisCommand['transformReply']): this {
|
||||||
|
this.#selectedDB = db;
|
||||||
|
return this.addCommand(['SELECT', db.toString()], transformReply);
|
||||||
|
}
|
||||||
|
|
||||||
|
select = this.SELECT;
|
||||||
|
|
||||||
addCommand(args: RedisCommandArguments, transformReply?: RedisCommand['transformReply']): this {
|
addCommand(args: RedisCommandArguments, transformReply?: RedisCommand['transformReply']): this {
|
||||||
this.#multi.addCommand(args, transformReply);
|
this.#multi.addCommand(args, transformReply);
|
||||||
return this;
|
return this;
|
||||||
@@ -160,7 +170,11 @@ export default class RedisClientMultiCommand {
|
|||||||
if (!commands) return [];
|
if (!commands) return [];
|
||||||
|
|
||||||
return this.#multi.handleExecReplies(
|
return this.#multi.handleExecReplies(
|
||||||
await this.#executor(commands, RedisMultiCommand.generateChainId())
|
await this.#executor(
|
||||||
|
commands,
|
||||||
|
this.#selectedDB,
|
||||||
|
RedisMultiCommand.generateChainId()
|
||||||
|
)
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -168,7 +182,10 @@ export default class RedisClientMultiCommand {
|
|||||||
|
|
||||||
async execAsPipeline(): Promise<Array<RedisCommandRawReply>> {
|
async execAsPipeline(): Promise<Array<RedisCommandRawReply>> {
|
||||||
return this.#multi.transformReplies(
|
return this.#multi.transformReplies(
|
||||||
await this.#executor(this.#multi.queue)
|
await this.#executor(
|
||||||
|
this.#multi.queue,
|
||||||
|
this.#selectedDB
|
||||||
|
)
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -230,7 +230,7 @@ export default class RedisCluster<
|
|||||||
return this.#execute(
|
return this.#execute(
|
||||||
firstKey,
|
firstKey,
|
||||||
false,
|
false,
|
||||||
client => client.multiExecutor(commands, chainId)
|
client => client.multiExecutor(commands, undefined, chainId)
|
||||||
);
|
);
|
||||||
},
|
},
|
||||||
routing
|
routing
|
||||||
|
Reference in New Issue
Block a user