Skip to main content

sqlx_postgres/types/
oid.rs

1use 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/// The PostgreSQL [`OID`] type stores an object identifier,
10/// used internally by PostgreSQL as primary keys for various system tables.
11///
12/// [`OID`]: https://www.postgresql.org/docs/current/datatype-oid.html
13#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq, Default)]
14pub struct Oid(
15    /// The raw unsigned integer value sent over the wire
16    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}