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 Oid {
21    pub(crate) fn incr_one(&mut self) {
22        self.0 = self.0.wrapping_add(1);
23    }
24}
25
26impl Type<Postgres> for Oid {
27    fn type_info() -> PgTypeInfo {
28        PgTypeInfo::OID
29    }
30}
31
32impl PgHasArrayType for Oid {
33    fn array_type_info() -> PgTypeInfo {
34        PgTypeInfo::OID_ARRAY
35    }
36}
37
38impl Encode<'_, Postgres> for Oid {
39    fn encode_by_ref(&self, buf: &mut PgArgumentBuffer) -> IsNull {
40        buf.extend(&self.0.to_be_bytes());
41
42        IsNull::No
43    }
44}
45
46impl Decode<'_, Postgres> for Oid {
47    fn decode(value: PgValueRef<'_>) -> Result<Self, BoxDynError> {
48        Ok(Self(match value.format() {
49            PgValueFormat::Binary => BigEndian::read_u32(value.as_bytes()?),
50            PgValueFormat::Text => value.as_str()?.parse()?,
51        }))
52    }
53}
54
55impl Serialize for Oid {
56    fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
57    where
58        S: Serializer,
59    {
60        self.0.serialize(serializer)
61    }
62}
63
64impl<'de> Deserialize<'de> for Oid {
65    fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
66    where
67        D: Deserializer<'de>,
68    {
69        u32::deserialize(deserializer).map(Self)
70    }
71}