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