1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
//! Type metadata and registry.
/// Metadata about a PostgreSQL type.
#[derive(Debug, Clone)]
#[non_exhaustive]
pub struct TypeInfo {
/// Object identifier from `pg_type`.
pub oid: u32,
/// Postgres type name (e.g., `"int4"`, `"text"`).
pub name: &'static str,
/// Wire-format size in bytes, or `-1` for variable-length types.
pub size: i16,
}
/// Look up type info by OID.
#[allow(dead_code)]
pub fn type_info(oid: u32) -> Option<TypeInfo> {
match oid {
16 => Some(TypeInfo {
oid: 16,
name: "bool",
size: 1,
}),
17 => Some(TypeInfo {
oid: 17,
name: "bytea",
size: -1,
}),
18 => Some(TypeInfo {
oid: 18,
name: "char",
size: 1,
}),
19 => Some(TypeInfo {
oid: 19,
name: "name",
size: 64,
}),
20 => Some(TypeInfo {
oid: 20,
name: "int8",
size: 8,
}),
21 => Some(TypeInfo {
oid: 21,
name: "int2",
size: 2,
}),
23 => Some(TypeInfo {
oid: 23,
name: "int4",
size: 4,
}),
25 => Some(TypeInfo {
oid: 25,
name: "text",
size: -1,
}),
26 => Some(TypeInfo {
oid: 26,
name: "oid",
size: 4,
}),
114 => Some(TypeInfo {
oid: 114,
name: "json",
size: -1,
}),
700 => Some(TypeInfo {
oid: 700,
name: "float4",
size: 4,
}),
701 => Some(TypeInfo {
oid: 701,
name: "float8",
size: 8,
}),
1043 => Some(TypeInfo {
oid: 1043,
name: "varchar",
size: -1,
}),
1082 => Some(TypeInfo {
oid: 1082,
name: "date",
size: 4,
}),
1083 => Some(TypeInfo {
oid: 1083,
name: "time",
size: 8,
}),
1114 => Some(TypeInfo {
oid: 1114,
name: "timestamp",
size: 8,
}),
1184 => Some(TypeInfo {
oid: 1184,
name: "timestamptz",
size: 8,
}),
1186 => Some(TypeInfo {
oid: 1186,
name: "interval",
size: 16,
}),
2950 => Some(TypeInfo {
oid: 2950,
name: "uuid",
size: 16,
}),
3802 => Some(TypeInfo {
oid: 3802,
name: "jsonb",
size: -1,
}),
_ => None,
}
}
/// Get the Rust-side type name for a PostgreSQL OID (for error messages).
#[allow(dead_code)]
pub fn rust_type_for_oid(oid: u32) -> &'static str {
match oid {
16 => "bool",
20 => "i64",
21 => "i16",
23 => "i32",
25 | 1043 => "String",
700 => "f32",
701 => "f64",
17 => "Vec<u8>",
_ => "unknown",
}
}