atomr_persistence_sql/
dialect.rs1use 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}