sqlx_postgres/types/
oid.rs

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