Files
dbx/crates/dbx-core/src/database_capabilities.rs
T

85 lines
3.2 KiB
Rust

use crate::agent_catalog;
use crate::database_manifest;
use crate::models::connection::DatabaseType;
pub fn agent_key(db_type: &DatabaseType, driver_profile: Option<&str>) -> Option<&'static str> {
agent_catalog::agent_key(db_type, driver_profile)
}
pub fn is_agent_type(db_type: &DatabaseType) -> bool {
database_manifest::is_agent_runtime(db_type)
}
pub fn is_single_connection_pool(db_type: &DatabaseType) -> bool {
database_manifest::entry(db_type).is_some_and(|entry| entry.single_connection_pool)
}
pub fn is_metadata_connection_scoped(db_type: &DatabaseType) -> bool {
database_manifest::entry(db_type).is_some_and(|entry| entry.metadata_connection_scoped)
}
pub fn skips_tcp_probe(db_type: &DatabaseType) -> bool {
database_manifest::entry(db_type).is_some_and(|entry| entry.skip_tcp_probe) || is_agent_type(db_type)
}
/// Database types whose connection backs onto a single local file (or may, in the
/// case of H2 file mode). Used to decide whether to expose a "reveal in file
/// manager" affordance. Whether the H2 connection is actually in file mode must
/// be determined separately by parsing the JDBC URL.
pub fn is_local_file_db_type(db_type: &DatabaseType) -> bool {
database_manifest::entry(db_type).is_some_and(|entry| entry.local_file)
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn local_file_db_types_match_expected_set() {
assert!(is_local_file_db_type(&DatabaseType::Sqlite));
assert!(is_local_file_db_type(&DatabaseType::DuckDb));
assert!(is_local_file_db_type(&DatabaseType::Access));
assert!(is_local_file_db_type(&DatabaseType::H2));
}
#[test]
fn non_local_file_db_types_rejected() {
assert!(!is_local_file_db_type(&DatabaseType::Mysql));
assert!(!is_local_file_db_type(&DatabaseType::Postgres));
assert!(!is_local_file_db_type(&DatabaseType::Redis));
assert!(!is_local_file_db_type(&DatabaseType::MongoDb));
assert!(!is_local_file_db_type(&DatabaseType::Turso));
assert!(!is_local_file_db_type(&DatabaseType::CloudflareD1));
assert!(!is_local_file_db_type(&DatabaseType::Rqlite));
}
#[test]
fn cloudflare_d1_uses_a_single_http_pool_without_tcp_probe() {
assert!(is_single_connection_pool(&DatabaseType::CloudflareD1));
assert!(skips_tcp_probe(&DatabaseType::CloudflareD1));
}
#[test]
fn manifest_connection_capabilities_are_used_for_every_registered_driver() {
for entry in database_manifest::entries() {
assert_eq!(
is_single_connection_pool(&entry.db_type),
entry.single_connection_pool,
"single connection pool drift for {:?}",
entry.db_type
);
assert_eq!(
is_metadata_connection_scoped(&entry.db_type),
entry.metadata_connection_scoped,
"metadata scope drift for {:?}",
entry.db_type
);
assert!(
skips_tcp_probe(&entry.db_type) || !is_agent_type(&entry.db_type),
"agent driver {:?} must skip the TCP probe",
entry.db_type
);
}
}
}