From fa55fa0d8a47bcfb015e5082aa5d386801b3f127 Mon Sep 17 00:00:00 2001 From: zipg Date: Sun, 28 Jun 2026 10:08:53 +0800 Subject: [PATCH] =?UTF-8?q?fix(driver):=20=E4=BF=AE=E5=A4=8D=E5=86=85?= =?UTF-8?q?=E7=BD=AE=E9=A9=B1=E5=8A=A8=E6=90=9C=E7=B4=A2=E7=BB=93=E6=9E=9C?= =?UTF-8?q?=E9=87=8D=E5=A4=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- crates/dbx-core/src/agent_catalog.rs | 21 +++++++++++++------ .../dbx-core/tests/database_capabilities.rs | 12 +++++++++++ 2 files changed, 27 insertions(+), 6 deletions(-) diff --git a/crates/dbx-core/src/agent_catalog.rs b/crates/dbx-core/src/agent_catalog.rs index 394411c38..1abdd1536 100644 --- a/crates/dbx-core/src/agent_catalog.rs +++ b/crates/dbx-core/src/agent_catalog.rs @@ -1,3 +1,5 @@ +use std::collections::HashSet; + use crate::models::connection::DatabaseType; #[derive(Debug, Clone, Copy, PartialEq)] @@ -290,12 +292,19 @@ pub fn is_agent_type(db_type: &DatabaseType) -> bool { } pub fn driver_store_entries() -> impl Iterator { - entries().iter().flat_map(|entry| { - let base = entry.store_visible.then_some((entry.key, entry.label)); - let profiles = - entry.profiles.iter().filter(|profile| profile.store_visible).map(|profile| (profile.key, profile.label)); - base.into_iter().chain(profiles) - }) + let mut seen = HashSet::new(); + entries() + .iter() + .flat_map(move |entry| { + let base = entry.store_visible.then_some((entry.key, entry.label)); + let profiles = entry + .profiles + .iter() + .filter(|profile| profile.store_visible) + .map(|profile| (profile.key, profile.label)); + base.into_iter().chain(profiles) + }) + .filter(move |(key, _)| seen.insert(*key)) } pub fn label_for_key(agent_key: &str) -> Option<&'static str> { diff --git a/crates/dbx-core/tests/database_capabilities.rs b/crates/dbx-core/tests/database_capabilities.rs index 6c58cab54..52b72dd8b 100644 --- a/crates/dbx-core/tests/database_capabilities.rs +++ b/crates/dbx-core/tests/database_capabilities.rs @@ -4,6 +4,7 @@ use dbx_core::database_capabilities::{ }; use dbx_core::models::connection::DatabaseType; use serde::Deserialize; +use std::collections::HashSet; #[derive(Debug, Deserialize)] #[serde(rename_all = "camelCase")] @@ -118,6 +119,17 @@ fn maps_agent_database_types_to_driver_keys() { assert_eq!(agent_key(&DatabaseType::Postgres, None), None); } +#[test] +fn driver_store_entries_do_not_repeat_agent_keys() { + let entries: Vec<_> = agent_catalog::driver_store_entries().collect(); + let mut seen = HashSet::new(); + let duplicate_keys: Vec<_> = entries.iter().map(|(key, _)| *key).filter(|key| !seen.insert(*key)).collect(); + + assert!(duplicate_keys.is_empty(), "driver store agent keys should be unique: {duplicate_keys:?}"); + assert_eq!(entries.iter().filter(|(key, _)| *key == "gbase8a").count(), 1); + assert_eq!(entries.iter().filter(|(key, _)| *key == "gbase8s").count(), 1); +} + #[test] fn classifies_agent_database_types() { assert!(is_agent_type(&DatabaseType::Oracle));