sqlx_core/postgres/types/
oid.rs1use 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#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq, Default)]
18pub struct Oid(
19 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}