#![forbid(unsafe_code)]
mod error;
mod generated;
mod ids;
mod sort;
mod sqlstate;
pub use error::{Error, Level, Object, Result};
pub use ids::{Hlc, Lsn, Oid, RowId, ShardId, Xid};
pub use sort::qsort;
pub use sqlstate::{Category, SqlState};
use std::fmt;
use std::str::FromStr;
pub const POSTGRES_PIN: &str = "19beta4";
pub const POSTGRES_COMMIT: &str = "7d3d2db7";
#[derive(Clone, Copy, Debug, PartialEq, Eq, PartialOrd, Ord, Hash)]
pub enum CompatVersion {
V14,
V15,
V16,
V17,
V18,
V19,
}
impl CompatVersion {
pub const ALL: [CompatVersion; 6] = [
CompatVersion::V14,
CompatVersion::V15,
CompatVersion::V16,
CompatVersion::V17,
CompatVersion::V18,
CompatVersion::V19,
];
pub const NATIVE: CompatVersion = CompatVersion::V19;
pub const fn major(self) -> u32 {
match self {
CompatVersion::V14 => 14,
CompatVersion::V15 => 15,
CompatVersion::V16 => 16,
CompatVersion::V17 => 17,
CompatVersion::V18 => 18,
CompatVersion::V19 => 19,
}
}
pub const fn server_version_num(self) -> u32 {
match self {
CompatVersion::V14 => 140024,
CompatVersion::V15 => 150019,
CompatVersion::V16 => 160015,
CompatVersion::V17 => 170011,
CompatVersion::V18 => 180006,
CompatVersion::V19 => 190000,
}
}
}
impl fmt::Display for CompatVersion {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
write!(f, "{}", self.major())
}
}
#[derive(Clone, Debug, PartialEq, Eq)]
pub struct UnknownVersion(pub String);
impl fmt::Display for UnknownVersion {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
write!(f, "unknown PostgreSQL version {:?}, expected 14 to 19", self.0)
}
}
impl std::error::Error for UnknownVersion {}
impl FromStr for CompatVersion {
type Err = UnknownVersion;
fn from_str(s: &str) -> Result<Self, Self::Err> {
CompatVersion::ALL
.into_iter()
.find(|v| v.major().to_string() == s.trim())
.ok_or_else(|| UnknownVersion(s.to_string()))
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn parse_every_version() {
for v in CompatVersion::ALL {
assert_eq!(v.to_string().parse::<CompatVersion>(), Ok(v));
}
}
#[test]
fn reject_unknown_versions() {
assert!("13".parse::<CompatVersion>().is_err());
assert!("20".parse::<CompatVersion>().is_err());
assert!("".parse::<CompatVersion>().is_err());
}
#[test]
fn version_numbers_match_the_major() {
for v in CompatVersion::ALL {
assert_eq!(v.server_version_num() / 10000, v.major());
}
}
}