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