44 lines
1.5 KiB
TypeScript
44 lines
1.5 KiB
TypeScript
export interface OracleTnsConnectionConfig {
|
|
alias: string;
|
|
tnsAdmin: string;
|
|
}
|
|
|
|
const ORACLE_TNS_JDBC_PREFIX = "jdbc:oracle:thin:@";
|
|
|
|
export function parseOracleTnsConnectionString(value?: string): OracleTnsConnectionConfig | null {
|
|
const source = value?.trim() || "";
|
|
if (!source.toLowerCase().startsWith(ORACLE_TNS_JDBC_PREFIX)) return null;
|
|
|
|
const target = source.slice(ORACLE_TNS_JDBC_PREFIX.length);
|
|
if (!target || target.startsWith("(") || target.startsWith("//") || target.includes(":")) return null;
|
|
|
|
const [rawAlias, rawQuery = ""] = target.split("?", 2);
|
|
let alias = "";
|
|
try {
|
|
alias = decodeURIComponent(rawAlias).trim();
|
|
} catch {
|
|
return null;
|
|
}
|
|
const tnsAdmin = new URLSearchParams(rawQuery).get("TNS_ADMIN")?.trim() || "";
|
|
if (!alias) return null;
|
|
return { alias, tnsAdmin };
|
|
}
|
|
|
|
export function buildOracleTnsConnectionString(alias: string, tnsAdmin: string): string {
|
|
const normalizedAlias = alias.trim();
|
|
const normalizedTnsAdmin = normalizeOracleTnsAdminPath(tnsAdmin);
|
|
const query = new URLSearchParams({ TNS_ADMIN: normalizedTnsAdmin });
|
|
return `${ORACLE_TNS_JDBC_PREFIX}${encodeURIComponent(normalizedAlias)}?${query.toString()}`;
|
|
}
|
|
|
|
export function normalizeOracleTnsAdminPath(value: string): string {
|
|
const path = value.trim();
|
|
if (!path) return "";
|
|
if (!/(^|[\\/])tnsnames\.ora$/i.test(path)) return path;
|
|
|
|
const parent = path.replace(/[\\/]tnsnames\.ora$/i, "");
|
|
if (/^[A-Za-z]:$/.test(parent)) return `${parent}\\`;
|
|
if (parent) return parent;
|
|
return path.startsWith("\\") ? "\\" : "/";
|
|
}
|