sqlx_postgres/types/
oid.rs1use byteorder::{BigEndian, ByteOrder};
2use serde::{de::Deserializer, ser::Serializer, Deserialize, Serialize};
3
4use crate::decode::Decode;
5use crate::encode::{Encode, IsNull};
6use crate::error::BoxDynError;
7use crate::types::Type;
8use crate::{PgArgumentBuffer, PgHasArrayType, PgTypeInfo, PgValueFormat, PgValueRef, Postgres};
9
10#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq, Default)]
15pub struct Oid(
16 pub u32,
18);
19
20impl Type<Postgres> for Oid {
21 fn type_info() -> PgTypeInfo {
22 PgTypeInfo::OID
23 }
24}
25
26impl PgHasArrayType for Oid {
27 fn array_type_info() -> PgTypeInfo {
28 PgTypeInfo::OID_ARRAY
29 }
30}
31
32impl Encode<'_, Postgres> for Oid {
33 fn encode_by_ref(&self, buf: &mut PgArgumentBuffer) -> Result<IsNull, BoxDynError> {
34 buf.extend(&self.0.to_be_bytes());
35
36 Ok(IsNull::No)
37 }
38}
39
40impl Decode<'_, Postgres> for Oid {
41 fn decode(value: PgValueRef<'_>) -> Result<Self, BoxDynError> {
42 Ok(Self(match value.format() {
43 PgValueFormat::Binary => BigEndian::read_u32(value.as_bytes()?),
44 PgValueFormat::Text => value.as_str()?.parse()?,
45 }))
46 }
47}
48
49impl Serialize for Oid {
50 fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
51 where
52 S: Serializer,
53 {
54 self.0.serialize(serializer)
55 }
56}
57
58impl<'de> Deserialize<'de> for Oid {
59 fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
60 where
61 D: Deserializer<'de>,
62 {
63 u32::deserialize(deserializer).map(Self)
64 }
65}