feat(navicat): detect OceanBase and GaussDB from NCX ServiceProvider

This commit is contained in:
t8y2
2026-06-16 17:25:52 +08:00
parent c77948b3c0
commit 24f92536e0
+22 -7
View File
@@ -160,10 +160,25 @@ async function parseConnection(node: ParsedNode): Promise<ConnectionConfig | nul
return null;
}
const name = getAny(node.values, ["name", "connectionName", "connName", "caption", "title"]) || getAny(node.values, ["host", "server", "hostname"]) || profile.label;
const host = getAny(node.values, ["host", "server", "hostname", "serverHost", "address"]) || getAny(node.values, ["databaseFile", "filename", "path", "databasePath"]) || (profile.dbType === "sqlite" ? "" : "127.0.0.1");
// Navicat NCX uses ServiceProvider to distinguish vendor-specific database types.
// e.g. OceanBase Oracle reports ConnType="ORACLE" ServiceProvider="AliyunOceanBase"
// GaussDB reports ConnType="POSTGRESQL" ServiceProvider="HuaweiCloudGaussDB"
const serviceProvider = getAny(node.values, ["serviceprovider"]);
let effectiveProfile = profile;
if (serviceProvider) {
const sp = serviceProvider.toLowerCase();
if (sp.includes("oceanbase")) {
effectiveProfile = { ...profile, dbType: "oceanbase-oracle", profile: "oceanbase", label: "OceanBase", port: 2881 };
} else if (sp.includes("gaussdb") || sp.includes("huaweicloudgauss")) {
effectiveProfile = { ...profile, dbType: "gaussdb", profile: "gaussdb", label: "GaussDB", port: 8000 };
}
}
const name = getAny(node.values, ["name", "connectionName", "connName", "caption", "title"]) || getAny(node.values, ["host", "server", "hostname"]) || effectiveProfile.label;
const host = getAny(node.values, ["host", "server", "hostname", "serverHost", "address"]) || getAny(node.values, ["databaseFile", "filename", "path", "databasePath"]) || (effectiveProfile.dbType === "sqlite" ? "" : "127.0.0.1");
const database = getAny(node.values, ["database", "databaseName", "initialDatabase", "serviceName", "sid", "schema"]);
const oracleConnectionType = profile.dbType === "oracle" && getAny(node.values, ["sid"]) ? "sid" : profile.dbType === "oracle" ? "service_name" : undefined;
const isOracleLike = effectiveProfile.dbType === "oracle" || effectiveProfile.dbType === "oceanbase-oracle";
const oracleConnectionType = isOracleLike && getAny(node.values, ["sid"]) ? "sid" : isOracleLike ? "service_name" : undefined;
const username = getAny(node.values, ["user", "username", "userName", "uid"]) || profile.user;
const password = await decryptNavicatPassword(getAny(node.values, ["password"]));
const keepaliveValue = Number(getAny(node.values, ["keepAliveInterval", "keepaliveInterval", "keepAliveTime", "keepaliveTime"]));
@@ -173,12 +188,12 @@ async function parseConnection(node: ParsedNode): Promise<ConnectionConfig | nul
const config: PartialConnection = {
name,
db_type: profile.dbType,
driver_profile: profile.profile,
driver_label: profile.label,
db_type: effectiveProfile.dbType,
driver_profile: effectiveProfile.profile,
driver_label: effectiveProfile.label,
url_params: "",
host,
port: port || profile.port,
port: port || effectiveProfile.port,
username,
password,
database: database || undefined,