1use std::num::NonZeroU32;
2use std::ops::Range;
34/// Raw postgres value as received from the database
5#[derive(#[automatically_derived]
#[allow(missing_debug_implementations)]
impl<'a> ::core::clone::Clone for PgValue<'a> {
#[inline]
fn clone(&self) -> PgValue<'a> {
let _: ::core::clone::AssertParamIsClone<&'a [u8]>;
let _: ::core::clone::AssertParamIsClone<&'a dyn TypeOidLookup>;
*self
}
}Clone, #[automatically_derived]
#[allow(missing_debug_implementations)]
impl<'a> ::core::marker::Copy for PgValue<'a> { }Copy)]
6#[allow(missing_debug_implementations)]
7#[cfg(feature = "postgres_backend")]
8pub struct PgValue<'a> {
9 raw_value: &'a [u8],
10 type_oid_lookup: &'a dyn TypeOidLookup,
11}
1213/// This is a helper trait to defer a type oid
14/// lookup to a later point in time
15///
16/// This is mainly used in the `PgConnection`
17/// implementation so that we do not need to call
18/// into libpq if we do not need the type oid.
19///
20/// Backend implementations based on pure rustc
21/// database connection crates can likely reuse
22/// the implementation for `NonZeroU32` here instead
23/// of providing their own custom implementation
24#[cfg_attr(
25 diesel_docsrs,
26 doc(cfg(feature = "i-implement-a-third-party-backend-and-opt-into-breaking-changes"))
27)]
28#[allow(unreachable_pub)]
29pub trait TypeOidLookup {
30/// Lookup the type oid for the current value
31fn lookup(&self) -> NonZeroU32;
32}
3334impl<F> TypeOidLookupfor F
35where
36F: Fn() -> NonZeroU32,
37{
38fn lookup(&self) -> NonZeroU32 {
39 (self)()
40 }
41}
4243impl TypeOidLookupfor PgValue<'_> {
44fn lookup(&self) -> NonZeroU32 {
45self.type_oid_lookup.lookup()
46 }
47}
4849impl TypeOidLookupfor NonZeroU32 {
50fn lookup(&self) -> NonZeroU32 {
51*self52 }
53}
5455impl<'a> PgValue<'a> {
56#[cfg(test)]
57pub(crate) fn for_test(raw_value: &'a [u8]) -> Self {
58static FAKE_OID: NonZeroU32 = NonZeroU32::new(42).unwrap();
59Self {
60 raw_value,
61 type_oid_lookup: &FAKE_OID,
62 }
63 }
6465/// Create a new instance of `PgValue` based on a byte buffer
66 /// and a way to receive information about the type of the value
67 /// represented by the buffer
68#[cfg(feature = "i-implement-a-third-party-backend-and-opt-into-breaking-changes")]
69pub fn new(raw_value: &'a [u8], type_oid_lookup: &'a dyn TypeOidLookup) -> Self {
70Self::new_internal(raw_value, type_oid_lookup)
71 }
7273pub(in crate::pg) fn new_internal(
74 raw_value: &'a [u8],
75 type_oid_lookup: &'a dyn TypeOidLookup,
76 ) -> Self {
77Self {
78raw_value,
79type_oid_lookup,
80 }
81 }
8283/// Get the underlying raw byte representation
84pub fn as_bytes(&self) -> &[u8] {
85self.raw_value
86 }
8788/// Get the type oid of this value
89pub fn get_oid(&self) -> NonZeroU32 {
90self.type_oid_lookup.lookup()
91 }
9293pub(crate) fn subslice(&self, range: Range<usize>) -> Self {
94Self {
95 raw_value: &self.raw_value[range],
96 ..*self97 }
98 }
99}