diff options
author | Xavier Vello <xavier.vello@gmail.com> | 2024-03-12 19:02:44 +0100 |
---|---|---|
committer | GitHub <noreply@github.com> | 2024-03-12 18:02:44 +0000 |
commit | c3306367665bbebf9ab79e42f0ea6884d6d3d76d (patch) | |
tree | 74ff4aaae17074c5e61c717e0a6a9b0bc425a5fb | |
parent | 3e2e7292c0dd0994b601fefe034d193ffe0fcf42 (diff) |
feat(server): check PG version before running migrations (#1868)
-rw-r--r-- | Cargo.lock | 1 | ||||
-rw-r--r-- | atuin-server-postgres/Cargo.toml | 1 | ||||
-rw-r--r-- | atuin-server-postgres/src/lib.rs | 21 |
3 files changed, 23 insertions, 0 deletions
@@ -354,6 +354,7 @@ dependencies = [ "async-trait", "atuin-common", "atuin-server-database", + "eyre", "futures-util", "serde", "sqlx", diff --git a/atuin-server-postgres/Cargo.toml b/atuin-server-postgres/Cargo.toml index d6579ee3..a5dfbaf7 100644 --- a/atuin-server-postgres/Cargo.toml +++ b/atuin-server-postgres/Cargo.toml @@ -13,6 +13,7 @@ repository = { workspace = true } atuin-common = { path = "../atuin-common", version = "18.1.0" } atuin-server-database = { path = "../atuin-server-database", version = "18.1.0" } +eyre = { workspace = true } tracing = "0.1" time = { workspace = true } serde = { workspace = true } diff --git a/atuin-server-postgres/src/lib.rs b/atuin-server-postgres/src/lib.rs index 0ad33076..6dc56fe4 100644 --- a/atuin-server-postgres/src/lib.rs +++ b/atuin-server-postgres/src/lib.rs @@ -16,6 +16,8 @@ use wrappers::{DbHistory, DbRecord, DbSession, DbUser}; mod wrappers; +const MIN_PG_VERSION: u32 = 14; + #[derive(Clone)] pub struct Postgres { pool: sqlx::Pool<sqlx::postgres::Postgres>, @@ -43,6 +45,25 @@ impl Database for Postgres { .await .map_err(fix_error)?; + // Call server_version_num to get the DB server's major version number + // The call returns None for servers older than 8.x. + let pg_major_version: u32 = pool + .acquire() + .await + .map_err(fix_error)? + .server_version_num() + .ok_or(DbError::Other(eyre::Report::msg( + "could not get PostgreSQL version", + )))? + / 10000; + + if pg_major_version < MIN_PG_VERSION { + return Err(DbError::Other(eyre::Report::msg(format!( + "unsupported PostgreSQL version {}, minimum required is {}", + pg_major_version, MIN_PG_VERSION + )))); + } + sqlx::migrate!("./migrations") .run(&pool) .await |