summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorXavier Vello <xavier.vello@gmail.com>2024-03-12 19:02:44 +0100
committerGitHub <noreply@github.com>2024-03-12 18:02:44 +0000
commitc3306367665bbebf9ab79e42f0ea6884d6d3d76d (patch)
tree74ff4aaae17074c5e61c717e0a6a9b0bc425a5fb
parent3e2e7292c0dd0994b601fefe034d193ffe0fcf42 (diff)
feat(server): check PG version before running migrations (#1868)
-rw-r--r--Cargo.lock1
-rw-r--r--atuin-server-postgres/Cargo.toml1
-rw-r--r--atuin-server-postgres/src/lib.rs21
3 files changed, 23 insertions, 0 deletions
diff --git a/Cargo.lock b/Cargo.lock
index 86c972f9..b6dfd90f 100644
--- a/Cargo.lock
+++ b/Cargo.lock
@@ -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