feat(h2): add split JDBC URL support

This commit is contained in:
Orwen Xiang authored and GitHub committed 2026-06-27 20:03:16 +08:00
1 parent 03c06fb6ef
commit 44884efa9b
5 files changed
+305 -39

No files matched your search

@@ -26,7 +26,7 @@ import { isTauriRuntime } from "@/lib/tauriRuntime";
import { applyParsedConnectionUrl, normalizeMongoConnectionString, parseConnectionUrl } from "@/lib/connectionUrl";
import { parseConnectionDeepLink, type ConnectionDeepLinkDraft } from "@/lib/connectionDeepLink";
import { connectionUrlPlaceholder as getUrlPlaceholder } from "@/lib/connectionPresentation";
import { h2ConnectionModeForConfig, h2FileJdbcUrl, h2FilePathFromJdbcUrl, type H2ConnectionMode } from "@/lib/h2Connection";
import { h2ConnectionModeForConfig, h2FileJdbcUrlWithPath, h2FilePathFromJdbcUrl, isH2SplitJdbcUrl, type H2ConnectionMode } from "@/lib/h2Connection";
import { firstZooKeeperEndpoint, normalizeZooKeeperConnectString } from "@/lib/zookeeperConnection";
import { isLocalFileTypeDb } from "@/lib/connectionFile";
import { MQ_PINNED_VERSION_OPTIONS, pinnedVersionToSelection, selectionToPinnedVersion } from "@/lib/mqPinnedVersionOptions";
@@ -302,6 +302,7 @@ const agentDrivers = ref<AgentDriverInstallState[]>([]);
const selectedJdbcDriverPath = ref("");
const jdbcManualClasspathOpen = ref(false);
const connectionUrlInput = ref("");
const appliedConnectionUrlInput = ref("");
const oceanbaseSubMode = ref<"mysql" | "oracle">("mysql");
const h2ConnectionMode = ref<H2ConnectionMode>("file");
const dialogStep = ref<DialogStep>("select");
@@ -898,7 +899,7 @@ watch(
driver_profile: oceanbasePatch?.driver_profile || profile,
driver_label: config.driver_label || oceanbasePatch?.driver_label || driverProfiles[profile]?.label || config.db_type,
url_params: config.url_params || "",
host: config.db_type === "h2" ? config.host || h2FilePathFromJdbcUrl(config.connection_string) : config.host,
host: config.db_type === "h2" && h2FilePathFromJdbcUrl(config.connection_string) ? h2FilePathFromJdbcUrl(config.connection_string) : config.host,
port: profile === "tdengine" && (config.port === 0 || config.port === 6030) ? 6041 : config.port,
username: config.username,
password: config.password,
@@ -932,6 +933,8 @@ watch(
read_only: config.read_only || false,
visible_databases: config.visible_databases,
};
connectionUrlInput.value = config.db_type === "h2" && config.connection_string ? config.connection_string : "";
appliedConnectionUrlInput.value = connectionUrlInput.value.trim();
if (config.db_type === "mq") {
hydrateMqFields(config.external_config);
} else {
@@ -1476,6 +1479,8 @@ function applyConnectionUrlToForm(input: string): boolean {
const draft = parseConnectionDeepLink(input);
if (draft) {
applyConnectionDraftToForm({ ...draft, oneTime: undefined });
resetTestState();
appliedConnectionUrlInput.value = input.trim();
return true;
}
@@ -1484,10 +1489,14 @@ function applyConnectionUrlToForm(input: string): boolean {
selectedType.value = parsed.driverProfile;
customDriverName.value = isCustomCompatibleProfile() ? parsed.driverLabel : "";
mongoUseUrl.value = !!parsed.useMongoUrl;
if (form.value.db_type === "h2") {
h2ConnectionMode.value = h2ConnectionModeForConfig(form.value);
}
if (!form.value.name.trim()) {
form.value.name = parsed.database || parsed.host || parsed.driverLabel;
}
resetTestState();
appliedConnectionUrlInput.value = input.trim();
return true;
} catch (e: any) {
toast(t("connection.parseConnectionUrlFailed", { message: e?.message || String(e) }), 5000);
@@ -1495,11 +1504,26 @@ function applyConnectionUrlToForm(input: string): boolean {
}
}
function ensureConnectionHostResolvedFromUrl(): boolean {
if (form.value.host.trim()) return true;
function hasPendingConnectionUrlInput(): boolean {
const url = connectionUrlInput.value.trim();
if (!url) return true;
return applyConnectionUrlToForm(url);
return !!url && url !== appliedConnectionUrlInput.value;
}
function ensureConnectionHostResolvedFromUrl(): boolean {
if (!hasPendingConnectionUrlInput()) return true;
return applyConnectionUrlToForm(connectionUrlInput.value.trim());
}
function formValueForSubmit(): Omit<ConnectionConfig, "id"> {
const url = connectionUrlInput.value.trim();
if (!url || url === appliedConnectionUrlInput.value) return form.value;
const draft = parseConnectionDeepLink(url);
if (draft) {
return applyConnectionDraftToConfig(form.value, { ...draft, oneTime: undefined });
}
return applyParsedConnectionUrl(form.value, parseConnectionUrl(url, selectedType.value));
}
function generateConnectionName(): string {
@@ -1509,8 +1533,8 @@ function generateConnectionName(): string {
}
function connectionConfigForSubmit(id: string): ConnectionConfig {
const config = { ...form.value, id } as LegacyConnectionConfig;
if (selectedType.value === "oceanbase") {
const config = { ...formValueForSubmit(), id } as LegacyConnectionConfig;
if (selectedType.value === "oceanbase" && (config.driver_profile === "oceanbase" || config.driver_profile === "oceanbase-oracle")) {
Object.assign(config, oceanbaseModeConnectionPatch(oceanbaseSubMode.value));
}
if (!config.name?.trim()) {
@@ -1679,14 +1703,16 @@ function connectionConfigForSubmit(id: string): ConnectionConfig {
.filter(Boolean);
}
if (config.db_type === "h2") {
if (h2ConnectionMode.value === "file") {
const filePath = config.host?.trim() || h2FilePathFromJdbcUrl(config.connection_string);
const h2Mode = connectionUrlInput.value.trim() ? h2ConnectionModeForConfig(config) : h2ConnectionMode.value;
if (h2Mode === "file") {
const jdbcFilePath = h2FilePathFromJdbcUrl(config.connection_string);
const filePath = config.host?.trim() || jdbcFilePath || "";
if (!filePath) {
throw new Error(t("connection.h2FilePathRequired"));
}
config.host = filePath;
config.port = 0;
config.connection_string = h2FileJdbcUrl(filePath);
config.connection_string = isH2SplitJdbcUrl(config.connection_string) ? h2FileJdbcUrlWithPath(config.connection_string, filePath) : h2FileJdbcUrlWithPath(undefined, filePath);
config.transport_layers = [];
} else {
config.host = config.host?.trim() || "127.0.0.1";
@@ -2138,6 +2164,7 @@ function resetForm() {
jdbcDriverPathsInput.value = "";
selectedJdbcDriverPath.value = "";
connectionUrlInput.value = "";
appliedConnectionUrlInput.value = "";
dialogStep.value = "select";
dbPickerView.value = "icon";
dbSearchQuery.value = "";
@@ -2161,25 +2188,32 @@ function submitOneTimePrefill(draft: ConnectionDeepLinkDraft) {
void nextTick(() => save());
}
function applyConnectionDraftToForm(draft: ConnectionDeepLinkDraft) {
applyProfile(draft.driverProfile);
form.value = {
...form.value,
function applyConnectionDraftToConfig(config: Omit<ConnectionConfig, "id">, draft: ConnectionDeepLinkDraft): Omit<ConnectionConfig, "id"> {
return {
...config,
db_type: draft.dbType,
driver_profile: draft.driverProfile,
driver_label: draft.driverLabel,
host: draft.host ?? form.value.host,
port: draft.port ?? form.value.port,
username: draft.username ?? form.value.username,
password: draft.password ?? form.value.password,
database: draft.database ?? form.value.database,
url_params: draft.urlParams ?? form.value.url_params,
ssl: draft.ssl ?? form.value.ssl,
connection_string: draft.connectionString ?? form.value.connection_string,
oracle_connection_type: draft.oracleConnectionType ?? form.value.oracle_connection_type,
host: draft.host ?? config.host,
port: draft.port ?? config.port,
username: draft.username ?? config.username,
password: draft.password ?? config.password,
database: draft.database ?? config.database,
url_params: draft.urlParams ?? config.url_params,
ssl: draft.ssl ?? config.ssl,
connection_string: draft.connectionString ?? config.connection_string,
oracle_connection_type: draft.oracleConnectionType ?? config.oracle_connection_type,
one_time: draft.oneTime || undefined,
};
}
function applyConnectionDraftToForm(draft: ConnectionDeepLinkDraft) {
applyProfile(draft.driverProfile);
form.value = applyConnectionDraftToConfig(form.value, draft);
selectedType.value = draft.driverProfile;
if (form.value.db_type === "h2") {
h2ConnectionMode.value = h2ConnectionModeForConfig(form.value);
}
if (draft.driverProfile === "oceanbase-oracle") {
oceanbaseSubMode.value = "oracle";
selectedType.value = "oceanbase";