use drizzle_types::Dialect;
pub const ORIGIN_UUID: &str = "00000000-0000-0000-0000-000000000000";
pub const JOURNAL_VERSION: &str = "7";
pub const SQLITE_SNAPSHOT_VERSION: &str = "7";
pub const POSTGRES_SNAPSHOT_VERSION: &str = "8";
pub const MYSQL_SNAPSHOT_VERSION: &str = "6";
pub const SINGLESTORE_SNAPSHOT_VERSION: &str = "1";
pub const SQLITE_MIN_SUPPORTED_VERSION: u32 = 5;
pub const POSTGRES_MIN_SUPPORTED_VERSION: u32 = 5;
pub const MYSQL_MIN_SUPPORTED_VERSION: u32 = 5;
#[must_use]
pub const fn snapshot_version(dialect: Dialect) -> &'static str {
match dialect {
Dialect::SQLite => SQLITE_SNAPSHOT_VERSION,
Dialect::PostgreSQL => POSTGRES_SNAPSHOT_VERSION,
Dialect::MySQL => MYSQL_SNAPSHOT_VERSION,
}
}
#[must_use]
pub const fn is_latest_version(dialect: Dialect, version: &str) -> bool {
let a = version.as_bytes();
let b = snapshot_version(dialect).as_bytes();
if a.len() != b.len() {
return false;
}
let mut i = 0;
while i < a.len() {
if a[i] != b[i] {
return false;
}
i += 1;
}
true
}
#[must_use]
pub fn is_supported_version(dialect: Dialect, version: &str) -> bool {
let Ok(v) = version.parse::<u32>() else {
return false;
};
let (min, max) = match dialect {
Dialect::SQLite => (SQLITE_MIN_SUPPORTED_VERSION, 7),
Dialect::PostgreSQL => (POSTGRES_MIN_SUPPORTED_VERSION, 8),
Dialect::MySQL => (MYSQL_MIN_SUPPORTED_VERSION, 6),
};
v >= min && v <= max
}
#[must_use]
pub fn needs_upgrade(dialect: Dialect, version: &str) -> bool {
let Ok(v) = version.parse::<u32>() else {
return true; };
let min = match dialect {
Dialect::SQLite => SQLITE_MIN_SUPPORTED_VERSION,
Dialect::PostgreSQL => POSTGRES_MIN_SUPPORTED_VERSION,
Dialect::MySQL => MYSQL_MIN_SUPPORTED_VERSION,
};
v < min
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_snapshot_versions() {
assert_eq!(snapshot_version(Dialect::SQLite), "7");
assert_eq!(snapshot_version(Dialect::PostgreSQL), "8");
assert_eq!(snapshot_version(Dialect::MySQL), "6");
}
#[test]
fn test_is_latest_version() {
assert!(is_latest_version(Dialect::SQLite, "7"));
assert!(!is_latest_version(Dialect::SQLite, "6"));
assert!(is_latest_version(Dialect::PostgreSQL, "8"));
assert!(!is_latest_version(Dialect::PostgreSQL, "7"));
}
#[test]
fn test_is_supported_version() {
assert!(is_supported_version(Dialect::SQLite, "7"));
assert!(is_supported_version(Dialect::SQLite, "6"));
assert!(is_supported_version(Dialect::SQLite, "5"));
assert!(!is_supported_version(Dialect::SQLite, "4")); assert!(!is_supported_version(Dialect::SQLite, "8"));
assert!(is_supported_version(Dialect::PostgreSQL, "8"));
assert!(is_supported_version(Dialect::PostgreSQL, "7"));
assert!(is_supported_version(Dialect::PostgreSQL, "6"));
assert!(is_supported_version(Dialect::PostgreSQL, "5"));
assert!(!is_supported_version(Dialect::PostgreSQL, "4")); assert!(!is_supported_version(Dialect::PostgreSQL, "9")); }
#[test]
fn test_needs_upgrade() {
assert!(needs_upgrade(Dialect::SQLite, "4"));
assert!(needs_upgrade(Dialect::SQLite, "3"));
assert!(!needs_upgrade(Dialect::SQLite, "5"));
assert!(!needs_upgrade(Dialect::SQLite, "6"));
assert!(!needs_upgrade(Dialect::SQLite, "7"));
assert!(needs_upgrade(Dialect::PostgreSQL, "4"));
assert!(!needs_upgrade(Dialect::PostgreSQL, "5"));
}
}