Skip to main content

atomr_persistence_sql/
dialect.rs

1//! URL scheme detection for the supported SQL dialects.
2
3use crate::config::SqlDialect;
4
5pub fn detect_dialect(url: &str) -> Option<SqlDialect> {
6    let lower = url.to_ascii_lowercase();
7    if lower.starts_with("sqlite:") {
8        Some(SqlDialect::Sqlite)
9    } else if lower.starts_with("postgres:") || lower.starts_with("postgresql:") {
10        Some(SqlDialect::Postgres)
11    } else if lower.starts_with("mysql:") || lower.starts_with("mariadb:") {
12        Some(SqlDialect::MySql)
13    } else if lower.starts_with("mssql:") || lower.starts_with("sqlserver:") {
14        Some(SqlDialect::MsSql)
15    } else {
16        None
17    }
18}
19
20pub(crate) fn sqlite_migration() -> &'static str {
21    include_str!("../migrations/sqlite/001_init.sql")
22}
23
24pub(crate) fn postgres_migration() -> &'static str {
25    include_str!("../migrations/postgres/001_init.sql")
26}
27
28pub(crate) fn mysql_migration() -> &'static str {
29    include_str!("../migrations/mysql/001_init.sql")
30}
31
32pub(crate) fn mssql_migration() -> &'static str {
33    include_str!("../migrations/mssql/001_init.sql")
34}
35
36pub(crate) fn migration_for(dialect: SqlDialect) -> &'static str {
37    match dialect {
38        SqlDialect::Sqlite => sqlite_migration(),
39        SqlDialect::Postgres => postgres_migration(),
40        SqlDialect::MySql => mysql_migration(),
41        SqlDialect::MsSql => mssql_migration(),
42    }
43}
44
45#[cfg(test)]
46mod tests {
47    use super::*;
48
49    #[test]
50    fn detects_all_schemes() {
51        assert_eq!(detect_dialect("sqlite::memory:"), Some(SqlDialect::Sqlite));
52        assert_eq!(detect_dialect("postgres://a"), Some(SqlDialect::Postgres));
53        assert_eq!(detect_dialect("postgresql://a"), Some(SqlDialect::Postgres));
54        assert_eq!(detect_dialect("mysql://a"), Some(SqlDialect::MySql));
55        assert_eq!(detect_dialect("mssql://a"), Some(SqlDialect::MsSql));
56        assert_eq!(detect_dialect("https://x"), None);
57    }
58
59    #[test]
60    fn migrations_embedded() {
61        assert!(migration_for(SqlDialect::Sqlite).contains("event_journal"));
62        assert!(migration_for(SqlDialect::Postgres).contains("event_journal"));
63        assert!(migration_for(SqlDialect::MySql).contains("event_journal"));
64    }
65}