feat: make query timeout configurable via global settings (default 30s)

Add queryTimeoutSecs to editor settings with UI control in the settings
dialog. 0 means no timeout. Applied to all query execution paths including
sidebar table data loading and EXPLAIN queries.

Closes #441.
This commit is contained in:
t8y2 committed 2026-05-25 18:30:55 +08:00
1 parent db00051632
commit 792c816a17
10 files changed
+127 -18

No files matched your search

@@ -66,6 +66,7 @@ const editWordWrap = ref(settingsStore.editorSettings.wordWrap);
const editAppLayout = ref(settingsStore.editorSettings.appLayout);
const editShowTrayIcon = ref(settingsStore.desktopSettings.show_tray_icon);
const editRedisScanPageSize = ref(settingsStore.editorSettings.redisScanPageSize);
const editQueryTimeoutSecs = ref(settingsStore.editorSettings.queryTimeoutSecs);
const editShortcuts = ref(normalizeShortcutSettings(settingsStore.editorSettings.shortcuts));
const editSidebarActivation = ref(settingsStore.editorSettings.sidebarActivation);
const editAutoSelectActiveSidebarNode = ref(settingsStore.editorSettings.autoSelectActiveSidebarNode);
@@ -198,6 +199,7 @@ watch(
editAppLayout.value = settingsStore.editorSettings.appLayout;
editShowTrayIcon.value = settingsStore.desktopSettings.show_tray_icon;
editRedisScanPageSize.value = settingsStore.editorSettings.redisScanPageSize;
editQueryTimeoutSecs.value = settingsStore.editorSettings.queryTimeoutSecs;
editShortcuts.value = normalizeShortcutSettings(settingsStore.editorSettings.shortcuts);
editSidebarActivation.value = settingsStore.editorSettings.sidebarActivation;
editAutoSelectActiveSidebarNode.value = settingsStore.editorSettings.autoSelectActiveSidebarNode;
@@ -238,6 +240,7 @@ function hasChanges(): boolean {
editAppLayout.value !== settingsStore.editorSettings.appLayout ||
editShowTrayIcon.value !== settingsStore.desktopSettings.show_tray_icon ||
editRedisScanPageSize.value !== settingsStore.editorSettings.redisScanPageSize ||
editQueryTimeoutSecs.value !== settingsStore.editorSettings.queryTimeoutSecs ||
JSON.stringify(editShortcuts.value) !== JSON.stringify(settingsStore.editorSettings.shortcuts) ||
editSidebarActivation.value !== settingsStore.editorSettings.sidebarActivation ||
editAutoSelectActiveSidebarNode.value !== settingsStore.editorSettings.autoSelectActiveSidebarNode ||
@@ -257,6 +260,7 @@ async function applySettings() {
wordWrap: editWordWrap.value,
appLayout: editAppLayout.value,
redisScanPageSize: editRedisScanPageSize.value,
queryTimeoutSecs: editQueryTimeoutSecs.value,
shortcuts: editShortcuts.value,
sidebarActivation: editSidebarActivation.value,
autoSelectActiveSidebarNode: editAutoSelectActiveSidebarNode.value,
@@ -278,6 +282,7 @@ function resetDefaults() {
editAppLayout.value = DEFAULT_EDITOR_SETTINGS.appLayout;
editShowTrayIcon.value = DEFAULT_DESKTOP_SETTINGS.show_tray_icon;
editRedisScanPageSize.value = DEFAULT_EDITOR_SETTINGS.redisScanPageSize;
editQueryTimeoutSecs.value = DEFAULT_EDITOR_SETTINGS.queryTimeoutSecs;
editShortcuts.value = normalizeShortcutSettings(DEFAULT_EDITOR_SETTINGS.shortcuts);
editSidebarActivation.value = DEFAULT_EDITOR_SETTINGS.sidebarActivation;
editAutoSelectActiveSidebarNode.value = DEFAULT_EDITOR_SETTINGS.autoSelectActiveSidebarNode;
@@ -884,6 +889,26 @@ watch(
<Separator />
<div class="space-y-2">
<Label for="query-timeout-secs">{{ t("settings.queryTimeoutSecs") }}</Label>
<Input
id="query-timeout-secs"
type="number"
min="0"
:model-value="String(editQueryTimeoutSecs)"
@update:model-value="
(v: any) => {
const n = Number(v);
if (Number.isFinite(n) && n >= 0) editQueryTimeoutSecs = n;
}
"
class="h-9 w-28"
/>
<p class="text-xs text-muted-foreground">{{ t("settings.queryTimeoutSecsDescription") }}</p>
</div>
<Separator />
<!-- Live Preview -->
<div class="space-y-2">
<Label>{{ t("settings.preview") }}</Label>