/
germanubis
/
sqlx
Обзор
Документация
Войти
/
germanubis
/
sqlx
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
Аналитика
Безопасность
main
sqlx-postgres/src/types/bytes.rs
106 строк
3 KB
Joey de Waal
feat: implement Encode, Decode, Type for `Arc<str>` and `Arc<[u8]>` (and `Rc` equivalents) (#3675)
05 июл 2025, 03:58
Не верифицирован
05 июл 2025, 03:58
60f67db
Код
Авторство
О чём код?
use std::borrow::Cow; use std::rc::Rc; use std::sync::Arc; use crate::decode::Decode; use crate::encode::{Encode, IsNull}; use crate::error::BoxDynError; use crate::types::Type; use crate::{PgArgumentBuffer, PgHasArrayType, PgTypeInfo, PgValueFormat, PgValueRef, Postgres}; impl PgHasArrayType for u8 { fn array_type_info() -> PgTypeInfo { PgTypeInfo::BYTEA } } impl PgHasArrayType for &'_ [u8] { fn array_type_info() -> PgTypeInfo { PgTypeInfo::BYTEA_ARRAY } } impl PgHasArrayType for Box<[u8]> { fn array_type_info() -> PgTypeInfo { <[&[u8]] as Type<Postgres>>::type_info() } } impl PgHasArrayType for Vec<u8> { fn array_type_info() -> PgTypeInfo { <[&[u8]] as Type<Postgres>>::type_info() } } impl<const N: usize> PgHasArrayType for [u8; N] { fn array_type_info() -> PgTypeInfo { <[&[u8]] as Type<Postgres>>::type_info() } } impl Encode<'_, Postgres> for &'_ [u8] { fn encode_by_ref(&self, buf: &mut PgArgumentBuffer) -> Result<IsNull, BoxDynError> { buf.extend_from_slice(self); Ok(IsNull::No) } } impl Encode<'_, Postgres> for Vec<u8> { fn encode_by_ref(&self, buf: &mut PgArgumentBuffer) -> Result<IsNull, BoxDynError> { <&[u8] as Encode<Postgres>>::encode(self, buf) } } impl<const N: usize> Encode<'_, Postgres> for [u8; N] { fn encode_by_ref(&self, buf: &mut PgArgumentBuffer) -> Result<IsNull, BoxDynError> { <&[u8] as Encode<Postgres>>::encode(self.as_slice(), buf) } } impl<'r> Decode<'r, Postgres> for &'r [u8] { fn decode(value: PgValueRef<'r>) -> Result<Self, BoxDynError> { match value.format() { PgValueFormat::Binary => value.as_bytes(), PgValueFormat::Text => { Err("unsupported decode to `&[u8]` of BYTEA in a simple query; use a prepared query or decode to `Vec<u8>`".into()) } } } } fn text_hex_decode_input(value: PgValueRef<'_>) -> Result<&[u8], BoxDynError> { // BYTEA is formatted as \x followed by hex characters value .as_bytes()? .strip_prefix(b"\\x") .ok_or("text does not start with \\x") .map_err(Into::into) } impl Decode<'_, Postgres> for Vec<u8> { fn decode(value: PgValueRef<'_>) -> Result<Self, BoxDynError> { Ok(match value.format() { PgValueFormat::Binary => value.as_bytes()?.to_owned(), PgValueFormat::Text => hex::decode(text_hex_decode_input(value)?)?, }) } } impl<const N: usize> Decode<'_, Postgres> for [u8; N] { fn decode(value: PgValueRef<'_>) -> Result<Self, BoxDynError> { let mut bytes = [0u8; N]; match value.format() { PgValueFormat::Binary => { bytes = value.as_bytes()?.try_into()?; } PgValueFormat::Text => hex::decode_to_slice(text_hex_decode_input(value)?, &mut bytes)?, }; Ok(bytes) } } forward_encode_impl!(Arc<[u8]>, &[u8], Postgres); forward_encode_impl!(Rc<[u8]>, &[u8], Postgres); forward_encode_impl!(Box<[u8]>, &[u8], Postgres); forward_encode_impl!(Cow<'_, [u8]>, &[u8], Postgres);