From 000c2366199f36e624634615b51307c1f713bdb5 Mon Sep 17 00:00:00 2001 From: t8y2 <1156263951@qq.com> Date: Tue, 16 Jun 2026 10:23:49 +0800 Subject: [PATCH] feat(connection): add keepalive interval --- .../connection/ConnectionDialog.vue | 22 +++ apps/desktop/src/i18n/locales/en.ts | 1 + apps/desktop/src/i18n/locales/es.ts | 1 + apps/desktop/src/i18n/locales/it.ts | 1 + apps/desktop/src/i18n/locales/ja.ts | 1 + apps/desktop/src/i18n/locales/pt-BR.ts | 1 + apps/desktop/src/i18n/locales/zh-CN.ts | 1 + apps/desktop/src/i18n/locales/zh-TW.ts | 1 + apps/desktop/src/lib/navicatImport.ts | 10 ++ apps/desktop/src/stores/connectionStore.ts | 1 + apps/desktop/src/types/database.ts | 1 + crates/dbx-core/src/agent_connection.rs | 5 +- crates/dbx-core/src/cloud_sync.rs | 1 + crates/dbx-core/src/connection.rs | 151 ++++++++++++++++-- crates/dbx-core/src/connection_secrets.rs | 1 + crates/dbx-core/src/db/redis_driver.rs | 1 + crates/dbx-core/src/models/connection.rs | 10 ++ crates/dbx-core/src/query.rs | 1 + crates/dbx-core/src/schema.rs | 1 + crates/dbx-core/src/schema/normalization.rs | 1 + crates/dbx-core/src/transfer.rs | 1 + .../dbx-core/tests/live_postgres_transfer.rs | 1 + crates/dbx-web/src/routes/connection.rs | 18 +-- packages/node-core/src/connections.ts | 1 + src-tauri/src/commands/connection.rs | 15 +- 25 files changed, 212 insertions(+), 37 deletions(-) diff --git a/apps/desktop/src/components/connection/ConnectionDialog.vue b/apps/desktop/src/components/connection/ConnectionDialog.vue index a3e543c911..732a716bf8 100644 --- a/apps/desktop/src/components/connection/ConnectionDialog.vue +++ b/apps/desktop/src/components/connection/ConnectionDialog.vue @@ -112,6 +112,7 @@ const defaultForm = (): ConnectionForm => ({ connect_timeout_secs: 5, query_timeout_secs: 30, idle_timeout_secs: 60, + keepalive_interval_secs: 0, ssl: false, ca_cert_path: "", client_cert_path: "", @@ -249,6 +250,17 @@ function sshLayersForConfig(config: LegacyConnectionConfig): SshTunnelConfig[] { } const form = ref(defaultForm()); +const keepaliveEnabled = computed({ + get: () => Number(form.value.keepalive_interval_secs) > 0, + set: (enabled: boolean) => { + if (enabled) { + const current = Number(form.value.keepalive_interval_secs); + form.value.keepalive_interval_secs = Number.isFinite(current) && current > 0 ? current : 30; + } else { + form.value.keepalive_interval_secs = 0; + } + }, +}); const selectedTransportLayerId = ref(null); const draggedTransportLayerId = ref(null); const selectedType = ref("mysql"); @@ -579,6 +591,7 @@ watch( connect_timeout_secs: config.connect_timeout_secs || 5, query_timeout_secs: config.query_timeout_secs ?? 30, idle_timeout_secs: config.idle_timeout_secs ?? 60, + keepalive_interval_secs: config.keepalive_interval_secs ?? 0, ssl: config.ssl || false, ca_cert_path: config.ca_cert_path || "", client_cert_path: config.client_cert_path || "", @@ -1101,6 +1114,8 @@ function connectionConfigForSubmit(id: string): ConnectionConfig { config.query_timeout_secs = Number.isFinite(queryTimeout) && queryTimeout >= 0 ? queryTimeout : 30; const idleTimeout = Number(config.idle_timeout_secs); config.idle_timeout_secs = Number.isFinite(idleTimeout) && idleTimeout >= 0 ? idleTimeout : 60; + const keepaliveInterval = Number(config.keepalive_interval_secs); + config.keepalive_interval_secs = Number.isFinite(keepaliveInterval) && keepaliveInterval >= 0 ? keepaliveInterval : 0; if (config.db_type === "manticoresearch") { config.url_params = ""; } @@ -2977,6 +2992,13 @@ function openExternalUrl(url: string) { +
+ +
+ + +
+