From 66c768061a3643a4eb126df2aaa9787eee9bd36b Mon Sep 17 00:00:00 2001 From: t8y2 <1156263951@qq.com> Date: Mon, 27 Jul 2026 18:27:22 +0800 Subject: [PATCH] fix(saphana): normalize legacy driver class alias --- crates/dbx-core/src/agent_connection.rs | 47 ++++++++++++++++++++++++- 1 file changed, 46 insertions(+), 1 deletion(-) diff --git a/crates/dbx-core/src/agent_connection.rs b/crates/dbx-core/src/agent_connection.rs index eae99f2d8d..3fe0d76923 100644 --- a/crates/dbx-core/src/agent_connection.rs +++ b/crates/dbx-core/src/agent_connection.rs @@ -7,6 +7,15 @@ const OCEANBASE_ORACLE_COMPATIBLE_OJDBC_VERSION_KEY: &str = "compatibleOjdbcVers const OCEANBASE_ORACLE_COMPATIBLE_OJDBC_VERSION_PARAM: &str = "compatibleOjdbcVersion=8"; const ZOOKEEPER_MIN_CONNECTION_TIMEOUT_MS: u64 = 15_000; +fn agent_jdbc_driver_class(config: &ConnectionConfig) -> &str { + let driver_class = config.jdbc_driver_class.as_deref().unwrap_or(""); + if config.db_type == DatabaseType::SapHana && matches!(driver_class, "sap_hana" | "saphana") { + "" + } else { + driver_class + } +} + pub fn agent_connect_params(config: &ConnectionConfig, host: &str, port: u16, database: &str) -> serde_json::Value { let agent_database = if config.db_type == DatabaseType::MongoDb { mongo_agent_database(config, database) @@ -70,7 +79,7 @@ pub fn agent_connect_params(config: &ConnectionConfig, host: &str, port: u16, da "zookeeper_connect_string": zookeeper_connect_string, "gbase_server": config.gbase_server, "informix_server": config.informix_server, - "jdbc_driver_class": config.jdbc_driver_class.as_deref().unwrap_or(""), + "jdbc_driver_class": agent_jdbc_driver_class(config), "jdbc_driver_paths": &config.jdbc_driver_paths, }); if config.db_type == DatabaseType::ZooKeeper { @@ -1018,6 +1027,42 @@ mod tests { assert_eq!(params["connection_string"], "jdbc:sap://hana.example.com:30013/?databaseName=TENANT1&encrypt=true"); } + #[test] + fn sap_hana_agent_connect_params_normalizes_legacy_driver_class_aliases() { + for alias in ["sap_hana", "saphana"] { + let mut cfg = config(DatabaseType::SapHana, Some("TENANT1")); + cfg.jdbc_driver_class = Some(alias.to_string()); + cfg.jdbc_driver_paths = vec!["/tmp/ngdbc.jar".to_string()]; + + let params = agent_connect_params(&cfg, "hana.example.com", 30013, "TENANT1"); + + assert_eq!(params["jdbc_driver_class"], ""); + assert_eq!(params["jdbc_driver_paths"], serde_json::json!(["/tmp/ngdbc.jar"])); + } + } + + #[test] + fn sap_hana_agent_connect_params_preserves_custom_driver_class() { + let mut cfg = config(DatabaseType::SapHana, Some("TENANT1")); + cfg.jdbc_driver_class = Some("com.example.CustomSapHanaDriver".to_string()); + + let params = agent_connect_params(&cfg, "hana.example.com", 30013, "TENANT1"); + + assert_eq!(params["jdbc_driver_class"], "com.example.CustomSapHanaDriver"); + } + + #[test] + fn other_agent_connect_params_preserve_sap_hana_driver_alias() { + let mut cfg = config(DatabaseType::Mysql, Some("test")); + cfg.jdbc_driver_class = Some("sap_hana".to_string()); + cfg.jdbc_driver_paths = vec!["/tmp/custom-driver.jar".to_string()]; + + let params = agent_connect_params(&cfg, "mysql.example.com", 3306, "test"); + + assert_eq!(params["jdbc_driver_class"], "sap_hana"); + assert_eq!(params["jdbc_driver_paths"], serde_json::json!(["/tmp/custom-driver.jar"])); + } + #[test] fn trino_agent_url_uses_jdbc_scheme_without_ssl_by_default() { let mut cfg = config(DatabaseType::Trino, Some("hive"));