use fraiseql_error::FraiseQLError;
use super::pg_detail;
use crate::Result;
pub const MINIMUM_SERVER_VERSION_NUM: i32 = 180_000;
pub fn check_server_version(server_version_num: i32, server_version: &str) -> Result<()> {
if server_version_num >= MINIMUM_SERVER_VERSION_NUM {
return Ok(());
}
Err(FraiseQLError::Unsupported {
message: format!(
"PostgreSQL {server_version} is not supported: FraiseQL requires PostgreSQL 18 or \
newer. Upgrade the cluster with pg_upgrade, or dump it and restore into a \
PostgreSQL 18 cluster."
),
})
}
pub async fn require_supported_server(client: &tokio_postgres::Client) -> Result<()> {
let row = client
.query_one(
"SELECT current_setting('server_version_num')::int, current_setting('server_version')",
&[],
)
.await
.map_err(|e| FraiseQLError::Database {
message: format!("Failed to read the PostgreSQL server version: {}", pg_detail(&e)),
sql_state: e.code().map(|c| c.code().to_string()),
})?;
check_server_version(row.get(0), row.get(1))
}
#[cfg(test)]
mod tests;