sqlx_core/postgres/types/
oid.rs

1use byteorder::{BigEndian, ByteOrder};
2#[cfg(feature = "serde")]
3use serde::{de::Deserializer, ser::Serializer, Deserialize, Serialize};
4
5use crate::decode::Decode;
6use crate::encode::{Encode, IsNull};
7use crate::error::BoxDynError;
8use crate::postgres::{
9    PgArgumentBuffer, PgHasArrayType, PgTypeInfo, PgValueFormat, PgValueRef, Postgres,
10};
11use crate::types::Type;
12
13/// The PostgreSQL [`OID`] type stores an object identifier,
14/// used internally by PostgreSQL as primary keys for various system tables.
15///
16/// [`OID`]: https://www.postgresql.org/docs/current/datatype-oid.html
17#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq, Default)]
18pub struct Oid(
19    /// The raw unsigned integer value sent over the wire
20    pub u32,
21);
22
23impl Oid {
24    pub(crate) fn incr_one(&mut self) {
25        self.0 = self.0.wrapping_add(1);
26    }
27}
28
29impl Type<Postgres> for Oid {
30    fn type_info() -> PgTypeInfo {
31        PgTypeInfo::OID
32    }
33}
34
35impl PgHasArrayType for Oid {
36    fn array_type_info() -> PgTypeInfo {
37        PgTypeInfo::OID_ARRAY
38    }
39}
40
41impl Encode<'_, Postgres> for Oid {
42    fn encode_by_ref(&self, buf: &mut PgArgumentBuffer) -> IsNull {
43        buf.extend(&self.0.to_be_bytes());
44
45        IsNull::No
46    }
47}
48
49impl Decode<'_, Postgres> for Oid {
50    fn decode(value: PgValueRef<'_>) -> Result<Self, BoxDynError> {
51        Ok(Self(match value.format() {
52            PgValueFormat::Binary => BigEndian::read_u32(value.as_bytes()?),
53            PgValueFormat::Text => value.as_str()?.parse()?,
54        }))
55    }
56}
57
58#[cfg(feature = "serde")]
59impl Serialize for Oid {
60    fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
61    where
62        S: Serializer,
63    {
64        self.0.serialize(serializer)
65    }
66}
67
68#[cfg(feature = "serde")]
69impl<'de> Deserialize<'de> for Oid {
70    fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
71    where
72        D: Deserializer<'de>,
73    {
74        u32::deserialize(deserializer).map(Self)
75    }
76}