Skip to main content

pg/types/
mod.rs

1pub type Oid = u32;
2
3pub const INT2OID: Oid = 21;
4pub const INT4OID: Oid = 23;
5pub const INT8OID: Oid = 20;
6pub const FLOAT4OID: Oid = 700;
7pub const FLOAT8OID: Oid = 701;
8pub const NUMERICOID: Oid = 1700;
9pub const BOOLOID: Oid = 16;
10pub const TEXTOID: Oid = 25;
11pub const VARCHAROID: Oid = 1043;
12pub const BYTEAOID: Oid = 17;
13pub const UUIDOID: Oid = 2950;
14pub const DATEOID: Oid = 1082;
15pub const TIMEOID: Oid = 1083;
16pub const TIMESTAMPOID: Oid = 1114;
17pub const TIMESTAMPTZOID: Oid = 1184;
18pub const JSONOID: Oid = 114;
19pub const JSONBOID: Oid = 3802;
20pub const INT2_ARRAY_OID: Oid = 1005;
21pub const INT4_ARRAY_OID: Oid = 1007;
22pub const INT8_ARRAY_OID: Oid = 1016;
23pub const TEXT_ARRAY_OID: Oid = 1009;
24pub const FLOAT8_ARRAY_OID: Oid = 1022;
25pub const BOOL_ARRAY_OID: Oid = 1000;
26pub const BYTEA_ARRAY_OID: Oid = 1001;
27pub const UUID_ARRAY_OID: Oid = 2951;
28pub const TIMESTAMPTZ_ARRAY_OID: Oid = 1185;
29pub const OIDOID: Oid = 26;
30
31#[derive(Debug, Clone, Copy, PartialEq, Eq)]
32pub enum Format {
33    Text,
34    Binary,
35}
36
37#[derive(Debug, Clone)]
38pub struct PgType {
39    pub oid: Oid,
40    pub name: &'static str,
41}
42
43impl PgType {
44    pub const fn new(oid: Oid, name: &'static str) -> Self {
45        PgType {
46            oid,
47            name,
48        }
49    }
50}
51
52pub static INT2: PgType = PgType::new(INT2OID, "int2");
53pub static INT4: PgType = PgType::new(INT4OID, "int4");
54pub static INT8: PgType = PgType::new(INT8OID, "int8");
55pub static FLOAT4: PgType = PgType::new(FLOAT4OID, "float4");
56pub static FLOAT8: PgType = PgType::new(FLOAT8OID, "float8");
57pub static BOOL: PgType = PgType::new(BOOLOID, "bool");
58pub static TEXT: PgType = PgType::new(TEXTOID, "text");
59pub static BYTEA: PgType = PgType::new(BYTEAOID, "bytea");
60pub static UUID: PgType = PgType::new(UUIDOID, "uuid");
61pub static TIMESTAMPTZ: PgType = PgType::new(TIMESTAMPTZOID, "timestamptz");
62pub static INT2_ARRAY: PgType = PgType::new(INT2_ARRAY_OID, "_int2");
63pub static INT4_ARRAY: PgType = PgType::new(INT4_ARRAY_OID, "_int4");
64pub static INT8_ARRAY: PgType = PgType::new(INT8_ARRAY_OID, "_int8");
65pub static TEXT_ARRAY: PgType = PgType::new(TEXT_ARRAY_OID, "_text");
66pub static FLOAT8_ARRAY: PgType = PgType::new(FLOAT8_ARRAY_OID, "_float8");
67pub static BOOL_ARRAY: PgType = PgType::new(BOOL_ARRAY_OID, "_bool");
68pub static UUID_ARRAY: PgType = PgType::new(UUID_ARRAY_OID, "_uuid");
69
70pub fn element_to_array(elem: &PgType) -> &'static PgType {
71    match elem.oid {
72        INT2OID => &INT2_ARRAY,
73        INT4OID => &INT4_ARRAY,
74        INT8OID => &INT8_ARRAY,
75        FLOAT8OID => &FLOAT8_ARRAY,
76        BOOLOID => &BOOL_ARRAY,
77        UUIDOID => &UUID_ARRAY,
78        TEXTOID | VARCHAROID => &TEXT_ARRAY,
79        _ => &INT4_ARRAY,
80    }
81}
82
83impl PgType {
84    pub fn array_of(elem: &PgType) -> Self {
85        let oid = match elem.oid {
86            INT2OID => INT2_ARRAY_OID,
87            INT4OID => INT4_ARRAY_OID,
88            INT8OID => INT8_ARRAY_OID,
89            FLOAT8OID => FLOAT8_ARRAY_OID,
90            BOOLOID => BOOL_ARRAY_OID,
91            TEXTOID | VARCHAROID => TEXT_ARRAY_OID,
92            BYTEAOID => BYTEA_ARRAY_OID,
93            UUIDOID => UUID_ARRAY_OID,
94            TIMESTAMPTZOID => TIMESTAMPTZ_ARRAY_OID,
95            _ => INT4_ARRAY_OID,
96        };
97        PgType {
98            oid,
99            name: "", // array name not preserved
100        }
101    }
102}