85 lines
3.2 KiB
Rust
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
|
|
);
|
|
}
|
|
}
|
|
}
|