Files
dbx/src/composables/useSchemaOptions.ts
T
t8y2 d4c2b4af7b fix(oracle): 简化编辑器选择器并支持 schema 切换 (closes #205)
Oracle/Dameng 连接隐藏多余的 Database 选择器,只显示 Schema 选择器。
查询执行时通过 ALTER SESSION SET CURRENT_SCHEMA 切换 schema 上下文。
2026-05-11 11:00:16 +08:00

53 lines
1.7 KiB
TypeScript

import { ref } from "vue";
import { useConnectionStore } from "@/stores/connectionStore";
import { isSchemaAware as isSchemaAwareType, isSingleDatabase } from "@/lib/databaseCapabilities";
import * as api from "@/lib/api";
export function useSchemaOptions() {
const connectionStore = useConnectionStore();
const schemaOptions = ref<Record<string, string[]>>({});
const loadingSchemaOptions = ref<Record<string, boolean>>({});
function cacheKey(connectionId: string, database: string) {
return `${connectionId}:${database}`;
}
function isSchemaAware(connectionId: string): boolean {
return isSchemaAwareType(connectionStore.getConfig(connectionId)?.db_type);
}
async function loadSchemaOptions(connectionId: string, database: string) {
if (!isSchemaAware(connectionId)) return;
const dbType = connectionStore.getConfig(connectionId)?.db_type;
if (!database && !isSingleDatabase(dbType)) return;
const key = cacheKey(connectionId, database);
if (loadingSchemaOptions.value[key]) return;
loadingSchemaOptions.value[key] = true;
try {
await connectionStore.ensureConnected(connectionId);
schemaOptions.value[key] = await api.listSchemas(connectionId, database);
} finally {
loadingSchemaOptions.value[key] = false;
}
}
function getSchemaOptionsForDb(connectionId: string, database: string): string[] {
return schemaOptions.value[cacheKey(connectionId, database)] ?? [];
}
function isLoadingSchemas(connectionId: string, database: string): boolean {
return !!loadingSchemaOptions.value[cacheKey(connectionId, database)];
}
return {
schemaOptions,
loadingSchemaOptions,
loadSchemaOptions,
getSchemaOptionsForDb,
isLoadingSchemas,
isSchemaAware,
};
}