Fix:修复升级后固定数据标签页连接失败后无法恢复

Co-authored-by: staff <staff@qimaos-MacBook-Pro.local>
This commit is contained in:
zipgandstaff authored and GitHub committed 2026-07-01 19:41:34 +08:00
1 parent 63d991db86
commit 7a6fc00b26
5 files changed
+83 -8

No files matched your search

@@ -80,6 +80,7 @@ import { copyNameForTreeNode, objectSourceKindForTreeNode, sidebarSelectionCopyA
import { formatSqlInsert } from "@/lib/exportFormats";
import { joinExportedDdls } from "@/lib/ddlExport";
import { fetchTableDataForExport } from "@/lib/tableDataExport";
import { canActivateExistingDataTableTab } from "@/lib/dataTabActivation";
import { buildCreateDatabaseSql, buildDuckDbAttachDatabaseSql, duckDbAttachedDatabaseNameFromPath, supportsCreateDatabaseCharset, uniqueDuckDbAttachedDatabaseName } from "@/lib/createDatabaseSql";
import {
buildCreateSchemaSql,
@@ -951,12 +952,7 @@ async function openData() {
const tableSchema = connectionObjectTreeNodeSchema(config, node.database, node.schema);
const tableType = node.type === "view" ? "VIEW" : node.type === "materialized_view" ? "MATERIALIZED_VIEW" : (node.tableType ?? "TABLE");
const isSameDataTableTab = (tab: (typeof queryStore.tabs)[number]) => tab.mode === "data" && tab.connectionId === node.connectionId && tab.database === node.database && (tab.schema || "") === (tableSchema || "") && (tab.tableMeta?.tableName || tab.title) === node.label;
const activateExistingSameTableTab = () => {
const existing = queryStore.tabs.find(isSameDataTableTab);
if (!existing) return false;
queryStore.activeTabId = existing.id;
return true;
};
const existingSameTableTab = queryStore.tabs.find(isSameDataTableTab);
const resetReusedDataTabState = (tab: (typeof queryStore.tabs)[number]) => {
tab.title = node.label;
tab.schema = tableSchema;
@@ -979,12 +975,18 @@ async function openData() {
tab.queryEditabilityReason = undefined;
};
if (activateExistingSameTableTab()) {
if (existingSameTableTab && canActivateExistingDataTableTab(existingSameTableTab)) {
queryStore.activeTabId = existingSameTableTab.id;
logPhase("existing-tab-activated", { table: node.label });
return;
}
const tabId = (() => {
if (existingSameTableTab) {
queryStore.activeTabId = existingSameTableTab.id;
resetReusedDataTabState(existingSameTableTab);
return existingSameTableTab.id;
}
if (settingsStore.editorSettings.reuseDataTab) {
const existing = queryStore.tabs.find((tab) => tab.mode === "data" && tab.connectionId === node.connectionId && tab.database === node.database);
if (existing) {
+3 -1
View File
@@ -21,9 +21,11 @@ const CONNECTION_ERROR_PATTERNS = [
"agent stdout not available",
"failed to write to agent stdin",
"failed to flush agent stdin",
"input/output error",
"关闭的连接",
"连接已关闭",
"i/o error",
"no route to host",
];
export function staleConnectionMessage(error: unknown): string {
@@ -37,7 +39,7 @@ export function shouldMarkDisconnected(error: unknown): boolean {
}
function hasConnectionOsError(message: string): boolean {
const osErrorCodes = new Set(["10053", "10054", "10057", "10058", "10060", "10061"]);
const osErrorCodes = new Set(["65", "10053", "10054", "10057", "10058", "10060", "10061"]);
const match = message.match(/os error\s+(\d+)/);
return !!match && osErrorCodes.has(match[1]);
}
+11
View File
@@ -0,0 +1,11 @@
import type { QueryResult, QueryTab } from "@/types/database";
function isErrorResult(result: QueryResult | undefined): boolean {
return result?.columns.length === 1 && result.columns[0] === "Error";
}
export function canActivateExistingDataTableTab(tab: QueryTab): boolean {
if (tab.isExecuting) return true;
if (isErrorResult(tab.result)) return false;
return !!tab.result || !!tab.results?.length;
}