mirror of
https://github.com/t8y2/dbx.git
synced 2026-10-23 13:51:31 +00:00
feat(navicat): detect OceanBase and GaussDB from NCX ServiceProvider
This commit is contained in:
@@ -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,
|
||||
|
||||
Reference in New Issue
Block a user