From d849cd49af8b13c98c168fbc74996b2a9dcdbf74 Mon Sep 17 00:00:00 2001 From: jonclex Date: Mon, 13 Apr 2026 12:39:14 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20Oracle/DM=E6=95=B0=E6=8D=AE=E5=BA=93?= =?UTF-8?q?=E4=BE=A7=E8=BE=B9=E6=A0=8F=E4=B8=8D=E6=98=BE=E7=A4=BA'?= =?UTF-8?q?=E9=BB=98=E8=AE=A4=E6=A8=A1=E5=BC=8F'=E8=8A=82=E7=82=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- frontend/src/components/Sidebar.tsx | 18 +++++++++++--- frontend/src/utils/sidebarMetadata.ts | 36 +++++++++++++++++++++++++++ 2 files changed, 50 insertions(+), 4 deletions(-) diff --git a/frontend/src/components/Sidebar.tsx b/frontend/src/components/Sidebar.tsx index fa7ed30..1ea3817 100644 --- a/frontend/src/components/Sidebar.tsx +++ b/frontend/src/components/Sidebar.tsx @@ -45,7 +45,7 @@ import { getTableDataDangerActionMeta, supportsTableTruncateAction, type TableDa import { useAutoFetchVisibility } from '../utils/autoFetchVisibility'; import FindInDatabaseModal from './FindInDatabaseModal'; import { buildRpcConnectionConfig } from '../utils/connectionRpcConfig'; -import { normalizeSidebarViewName } from '../utils/sidebarMetadata'; +import { normalizeSidebarViewName, resolveSidebarRuntimeDatabase } from '../utils/sidebarMetadata'; const { Search } = Input; @@ -1202,7 +1202,11 @@ const Sidebar: React.FC<{ onEditConnection?: (conn: SavedConnection) => void }> routineEntries.forEach((entry) => getSchemaBucket(entry.schemaName).routines.push(buildRoutineNode(entry))); triggerEntries.forEach((entry) => getSchemaBucket(entry.schemaName).triggers.push(buildTriggerNode(entry))); + const dialect = getMetadataDialect(conn as SavedConnection); + const isOracleLike = (dialect === 'oracle' || dialect === 'dm'); + const schemaNodes: TreeNode[] = Array.from(schemaMap.values()) + .filter((bucket) => !(isOracleLike && !bucket.schemaName)) .sort((a, b) => { if (!a.schemaName && !b.schemaName) return 0; if (!a.schemaName) return -1; @@ -1210,8 +1214,8 @@ const Sidebar: React.FC<{ onEditConnection?: (conn: SavedConnection) => void }> return a.schemaName.toLowerCase().localeCompare(b.schemaName.toLowerCase()); }) .map((bucket) => { - const schemaNodeKey = `${key}-schema-${bucket.schemaName || 'default'}`; - const schemaTitle = bucket.schemaName || '默认模式'; + const schemaNodeKey = `${key}-schema-${bucket.schemaName || 'default'}`; + const schemaTitle = bucket.schemaName || '默认模式'; const groupedNodes: TreeNode[] = [ buildObjectGroup(schemaNodeKey, 'tables', '表', , bucket.tables, { schemaName: bucket.schemaName }), buildObjectGroup(schemaNodeKey, 'views', '视图', , bucket.views, { schemaName: bucket.schemaName }), @@ -2141,7 +2145,13 @@ const Sidebar: React.FC<{ onEditConnection?: (conn: SavedConnection) => void }> const buildRuntimeConfig = (conn: any, overrideDatabase?: string, clearDatabase: boolean = false) => { return buildRpcConnectionConfig(conn.config, { - database: clearDatabase ? '' : ((overrideDatabase ?? conn.config.database) || ''), + database: resolveSidebarRuntimeDatabase( + conn?.config?.type, + conn?.config?.driver, + conn?.config?.database, + overrideDatabase, + clearDatabase, + ), }); }; diff --git a/frontend/src/utils/sidebarMetadata.ts b/frontend/src/utils/sidebarMetadata.ts index 81837a6..2b09cd6 100644 --- a/frontend/src/utils/sidebarMetadata.ts +++ b/frontend/src/utils/sidebarMetadata.ts @@ -11,6 +11,19 @@ const splitQualifiedName = (qualifiedName: string): { schemaName: string; object }; }; +const normalizeSidebarConnectionDialect = (type: string, driver: string): string => { + const normalizedType = String(type || '').trim().toLowerCase(); + if (normalizedType === 'custom') { + const normalizedDriver = String(driver || '').trim().toLowerCase(); + if (normalizedDriver === 'postgresql' || normalizedDriver === 'postgres' || normalizedDriver === 'pg') return 'postgres'; + if (normalizedDriver === 'dameng' || normalizedDriver === 'dm' || normalizedDriver === 'dm8') return 'dm'; + if (normalizedDriver.includes('oracle')) return 'oracle'; + return normalizedDriver; + } + if (normalizedType === 'dameng') return 'dm'; + return normalizedType; +}; + export const normalizeSidebarViewName = (dialect: string, dbName: string, schemaName: string, viewName: string): string => { const normalizedDialect = String(dialect || '').trim().toLowerCase(); const normalizedDbName = String(dbName || '').trim(); @@ -35,3 +48,26 @@ export const normalizeSidebarViewName = (dialect: string, dbName: string, schema return `${normalizedSchemaName}.${normalizedViewName}`; }; + +export const resolveSidebarRuntimeDatabase = ( + type: string, + driver: string, + savedDatabase: string, + overrideDatabase?: string, + clearDatabase: boolean = false, +): string => { + if (clearDatabase) return ''; + + const normalizedSavedDatabase = String(savedDatabase || '').trim(); + const normalizedOverrideDatabase = String(overrideDatabase || '').trim(); + if (!normalizedOverrideDatabase) { + return normalizedSavedDatabase; + } + + const dialect = normalizeSidebarConnectionDialect(type, driver); + if (dialect === 'oracle' || dialect === 'dm') { + return normalizedSavedDatabase || normalizedOverrideDatabase; + } + + return normalizedOverrideDatabase; +};