1use crate::arguments::PgArgumentBuffer;
2use crate::type_info::PgTypeInfo;
3use crate::types::decode::Decode;
4use crate::types::encode::{Encode, IsNull};
5use crate::types::TypeInfo;
6use crate::value::{PgValueFormat, PgValueRef};
7use byteorder::{BigEndian, ByteOrder};
8use rbdc::Error;
9
10impl Decode for u64 {
11 fn decode(value: PgValueRef) -> Result<Self, Error> {
12 Ok(match value.format() {
13 PgValueFormat::Binary => BigEndian::read_u64(value.as_bytes()?),
14 PgValueFormat::Text => value.as_str()?.parse()?,
15 })
16 }
17}
18
19impl Decode for u32 {
20 fn decode(value: PgValueRef) -> Result<Self, Error> {
21 Ok(match value.format() {
22 PgValueFormat::Binary => {
23 let bytes = value.as_bytes()?;
24 if bytes.len() == 8 {
25 BigEndian::read_u64(bytes) as u32
26 } else if bytes.len() == 4 {
27 BigEndian::read_u32(bytes)
28 } else {
29 return Err(Error::from("error u32 bytes len"));
30 }
31 }
32 PgValueFormat::Text => value.as_str()?.parse()?,
33 })
34 }
35}
36
37impl Decode for u16 {
38 fn decode(value: PgValueRef) -> Result<Self, Error> {
39 Ok(match value.format() {
40 PgValueFormat::Binary => {
41 let bytes = value.as_bytes()?;
42 if bytes.len() == 8 {
43 BigEndian::read_u64(bytes) as u16
44 } else if bytes.len() == 4 {
45 BigEndian::read_u32(bytes) as u16
46 } else if bytes.len() == 2 {
47 BigEndian::read_u16(bytes)
48 } else {
49 return Err(Error::from("error u16 bytes len"));
50 }
51 }
52 PgValueFormat::Text => value.as_str()?.parse()?,
53 })
54 }
55}
56
57impl Decode for u8 {
58 fn decode(value: PgValueRef) -> Result<Self, Error> {
59 Ok(value.as_bytes()?.get(0).copied().unwrap_or_default() as u8)
61 }
62}
63
64impl Decode for i64 {
65 fn decode(value: PgValueRef) -> Result<Self, Error> {
66 Ok(match value.format() {
67 PgValueFormat::Binary => BigEndian::read_i64(value.as_bytes()?),
68 PgValueFormat::Text => value.as_str()?.parse()?,
69 })
70 }
71}
72
73impl Decode for i32 {
74 fn decode(value: PgValueRef) -> Result<Self, Error> {
75 Ok(match value.format() {
76 PgValueFormat::Binary => {
77 let bytes = value.as_bytes()?;
78 if bytes.len() == 8 {
79 BigEndian::read_i64(bytes) as i32
80 } else if bytes.len() == 4 {
81 BigEndian::read_i32(bytes)
82 } else {
83 return Err(Error::from("error i32 bytes len"));
84 }
85 }
86 PgValueFormat::Text => value.as_str()?.parse()?,
87 })
88 }
89}
90
91impl Decode for i16 {
92 fn decode(value: PgValueRef) -> Result<Self, Error> {
93 Ok(match value.format() {
94 PgValueFormat::Binary => {
95 let bytes = value.as_bytes()?;
96 if bytes.len() == 8 {
97 BigEndian::read_i64(bytes) as i16
98 } else if bytes.len() == 4 {
99 BigEndian::read_i32(bytes) as i16
100 } else if bytes.len() == 2 {
101 BigEndian::read_i16(bytes)
102 } else {
103 return Err(Error::from("error i16 bytes len"));
104 }
105 }
106 PgValueFormat::Text => value.as_str()?.parse()?,
107 })
108 }
109}
110
111impl Decode for i8 {
112 fn decode(value: PgValueRef) -> Result<Self, Error> {
113 Ok(value.as_bytes()?.get(0).copied().unwrap_or_default() as i8)
115 }
116}
117
118impl Encode for u64 {
121 fn encode(self, buf: &mut PgArgumentBuffer) -> Result<IsNull, Error> {
122 buf.extend(&self.to_be_bytes());
123 Ok(IsNull::No)
124 }
125}
126
127impl Encode for u32 {
128 fn encode(self, buf: &mut PgArgumentBuffer) -> Result<IsNull, Error> {
129 buf.extend(&self.to_be_bytes());
130
131 Ok(IsNull::No)
132 }
133}
134
135impl Encode for u16 {
136 fn encode(self, buf: &mut PgArgumentBuffer) -> Result<IsNull, Error> {
137 buf.extend(&self.to_be_bytes());
138
139 Ok(IsNull::No)
140 }
141}
142
143impl Encode for u8 {
144 fn encode(self, buf: &mut PgArgumentBuffer) -> Result<IsNull, Error> {
145 buf.extend(&self.to_be_bytes());
146
147 Ok(IsNull::No)
148 }
149}
150
151impl Encode for i64 {
152 fn encode(self, buf: &mut PgArgumentBuffer) -> Result<IsNull, Error> {
153 buf.extend(&self.to_be_bytes());
154
155 Ok(IsNull::No)
156 }
157}
158
159impl Encode for i32 {
160 fn encode(self, buf: &mut PgArgumentBuffer) -> Result<IsNull, Error> {
161 buf.extend(&self.to_be_bytes());
162
163 Ok(IsNull::No)
164 }
165}
166
167impl Encode for i16 {
168 fn encode(self, buf: &mut PgArgumentBuffer) -> Result<IsNull, Error> {
169 buf.extend(&self.to_be_bytes());
170
171 Ok(IsNull::No)
172 }
173}
174
175impl Encode for i8 {
176 fn encode(self, buf: &mut PgArgumentBuffer) -> Result<IsNull, Error> {
177 buf.extend(&self.to_be_bytes());
178
179 Ok(IsNull::No)
180 }
181}
182
183impl TypeInfo for i8 {
186 fn type_info(&self) -> PgTypeInfo {
187 PgTypeInfo::BYTEA
188 }
189}