mirror of
https://github.com/t8y2/dbx.git
synced 2026-10-26 00:00:51 +00:00
* fix(redis):format INFO output as plain text in cluster mode * fix(redis): unify INFO category command output in cluster mode In Redis cluster mode, the INFO command (with category parameters) returns aggregated results from multiple primaries. This fix formats the output as human-readable plain text, consistent with standalone mode, to improve readability. Closes #1326
50 lines
1.9 KiB
TypeScript
50 lines
1.9 KiB
TypeScript
import type { QueryResult } from "@/types/database";
|
|
import { formatRedisCommandResult } from "@/lib/redisValuePresentation";
|
|
|
|
const KEY_VALUE_COMMANDS = new Set(["HGETALL"]);
|
|
|
|
function isKeyValueCommand(command: string): boolean {
|
|
return KEY_VALUE_COMMANDS.has(command.toUpperCase().trim());
|
|
}
|
|
|
|
export function redisCommandResultToQueryResult(value: unknown, elapsedMs: number, command?: string): QueryResult {
|
|
if (Array.isArray(value) && command && isKeyValueCommand(command)) {
|
|
const rows: (string | number | boolean | null)[][] = [];
|
|
for (let i = 0; i + 1 < value.length; i += 2) {
|
|
rows.push([formatRedisCommandResult(value[i]), formatRedisCommandResult(value[i + 1])]);
|
|
}
|
|
return {
|
|
columns: ["field", "value"],
|
|
rows,
|
|
affected_rows: value.length / 2,
|
|
execution_time_ms: Math.max(0, Math.round(elapsedMs)),
|
|
};
|
|
}
|
|
// INFO commands in cluster mode → [[node_addr, info_text], ...] pairs.
|
|
// Render as a two-column table with the addr as the index and info text as the value.
|
|
if (Array.isArray(value) && value.length > 0 && value.every((item) => Array.isArray(item) && item.length === 2 && typeof item[0] === "string" && typeof item[1] === "string")) {
|
|
const rows: (string | number | boolean | null)[][] = value.map((item: [string, string]) => [item[0], item[1]]);
|
|
return {
|
|
columns: ["(index)", "value"],
|
|
rows,
|
|
affected_rows: value.length,
|
|
execution_time_ms: Math.max(0, Math.round(elapsedMs)),
|
|
};
|
|
}
|
|
if (Array.isArray(value)) {
|
|
const rows: (string | number | boolean | null)[][] = value.map((item, i) => [i + 1, formatRedisCommandResult(item)]);
|
|
return {
|
|
columns: ["(index)", "value"],
|
|
rows,
|
|
affected_rows: value.length,
|
|
execution_time_ms: Math.max(0, Math.round(elapsedMs)),
|
|
};
|
|
}
|
|
return {
|
|
columns: ["result"],
|
|
rows: [[formatRedisCommandResult(value)]],
|
|
affected_rows: 0,
|
|
execution_time_ms: Math.max(0, Math.round(elapsedMs)),
|
|
};
|
|
}
|