Skip to content

Commit 86d11ef

Browse files
committed
fixes after review
1 parent c8ae9c8 commit 86d11ef

File tree

11 files changed

+78
-59
lines changed

11 files changed

+78
-59
lines changed

sqlx-core/src/decode.rs

+10-13
Original file line numberDiff line numberDiff line change
@@ -108,10 +108,10 @@ macro_rules! impl_decode_for_smartpointer {
108108
impl<'r, DB> Decode<'r, DB> for $smart_pointer<[u8]>
109109
where
110110
DB: Database,
111-
&'r [u8]: Decode<'r, DB>,
111+
Vec<u8>: Decode<'r, DB>,
112112
{
113113
fn decode(value: <DB as Database>::ValueRef<'r>) -> Result<Self, BoxDynError> {
114-
let ref_str = <&[u8] as Decode<DB>>::decode(value)?;
114+
let ref_str = <Vec<u8> as Decode<DB>>::decode(value)?;
115115
Ok(ref_str.into())
116116
}
117117
}
@@ -123,36 +123,33 @@ impl_decode_for_smartpointer!(Box);
123123
impl_decode_for_smartpointer!(Rc);
124124

125125
// implement `Decode` for Cow<T> for all SQL types
126-
impl<'r, DB, T> Decode<'r, DB> for Cow<'_, T>
126+
impl<'r, 'a, DB, T> Decode<'r, DB> for Cow<'a, T>
127127
where
128128
DB: Database,
129129
T: ToOwned,
130130
<T as ToOwned>::Owned: Decode<'r, DB>,
131131
{
132132
fn decode(value: <DB as Database>::ValueRef<'r>) -> Result<Self, BoxDynError> {
133-
let owned = <<T as ToOwned>::Owned as Decode<DB>>::decode(value)?;
134-
Ok(Cow::Owned(owned))
133+
<<T as ToOwned>::Owned as Decode<DB>>::decode(value).map(Cow::Owned)
135134
}
136135
}
137136

138-
impl<'r, DB> Decode<'r, DB> for Cow<'r, str>
137+
impl<'r, 'a, DB> Decode<'r, DB> for Cow<'a, str>
139138
where
140139
DB: Database,
141-
&'r str: Decode<'r, DB>,
140+
String: Decode<'r, DB>,
142141
{
143142
fn decode(value: <DB as Database>::ValueRef<'r>) -> Result<Self, BoxDynError> {
144-
let borrowed = <&str as Decode<DB>>::decode(value)?;
145-
Ok(Cow::Borrowed(borrowed))
143+
<String as Decode<DB>>::decode(value).map(Cow::Owned)
146144
}
147145
}
148146

149-
impl<'r, DB> Decode<'r, DB> for Cow<'r, [u8]>
147+
impl<'r, 'a, DB> Decode<'r, DB> for Cow<'a, [u8]>
150148
where
151149
DB: Database,
152-
&'r [u8]: Decode<'r, DB>,
150+
Vec<u8>: Decode<'r, DB>,
153151
{
154152
fn decode(value: <DB as Database>::ValueRef<'r>) -> Result<Self, BoxDynError> {
155-
let borrowed = <&[u8] as Decode<DB>>::decode(value)?;
156-
Ok(Cow::Borrowed(borrowed))
153+
<Vec<u8> as Decode<DB>>::decode(value).map(Cow::Owned)
157154
}
158155
}

sqlx-core/src/encode.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -172,7 +172,7 @@ impl_encode_for_smartpointer!(Arc<T>);
172172
impl_encode_for_smartpointer!(Box<T>);
173173
impl_encode_for_smartpointer!(Rc<T>);
174174

175-
impl<'q, T, DB: Database> Encode<'q, DB> for Cow<'_, T>
175+
impl<'q, T, DB: Database> Encode<'q, DB> for Cow<'q, T>
176176
where
177177
T: Encode<'q, DB>,
178178
T: ToOwned,

sqlx-core/src/types/mod.rs

+3-5
Original file line numberDiff line numberDiff line change
@@ -255,8 +255,7 @@ macro_rules! impl_type_for_smartpointer {
255255
($smart_pointer:ty) => {
256256
impl<T, DB: Database> Type<DB> for $smart_pointer
257257
where
258-
T: Type<DB>,
259-
T: ?Sized,
258+
T: Type<DB> + ?Sized,
260259
{
261260
fn type_info() -> DB::TypeInfo {
262261
<T as Type<DB>>::type_info()
@@ -275,9 +274,8 @@ impl_type_for_smartpointer!(Rc<T>);
275274

276275
impl<T, DB: Database> Type<DB> for Cow<'_, T>
277276
where
278-
T: Type<DB>,
279-
T: ToOwned,
280-
T: ?Sized,
277+
// `ToOwned` is required here to satisfy `Cow`
278+
T: Type<DB> + ToOwned + ?Sized,
281279
{
282280
fn type_info() -> DB::TypeInfo {
283281
<T as Type<DB>>::type_info()

sqlx-mysql/src/types/bytes.rs

+8
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
1+
use std::borrow::Cow;
2+
13
use crate::decode::Decode;
24
use crate::encode::{Encode, IsNull};
35
use crate::error::BoxDynError;
@@ -67,3 +69,9 @@ impl Decode<'_, MySql> for Vec<u8> {
6769
<&[u8] as Decode<MySql>>::decode(value).map(ToOwned::to_owned)
6870
}
6971
}
72+
73+
impl Encode<'_, MySql> for Cow<'_, [u8]> {
74+
fn encode_by_ref(&self, buf: &mut Vec<u8>) -> Result<IsNull, BoxDynError> {
75+
<&[u8] as Encode<MySql>>::encode(self.as_ref(), buf)
76+
}
77+
}

sqlx-mysql/src/types/str.rs

-6
Original file line numberDiff line numberDiff line change
@@ -83,9 +83,3 @@ impl Encode<'_, MySql> for Cow<'_, str> {
8383
}
8484
}
8585
}
86-
87-
impl Encode<'_, MySql> for Cow<'_, [u8]> {
88-
fn encode_by_ref(&self, buf: &mut Vec<u8>) -> Result<IsNull, BoxDynError> {
89-
<&[u8] as Encode<MySql>>::encode(self.as_ref(), buf)
90-
}
91-
}

sqlx-postgres/src/types/bytes.rs

+8
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
1+
use std::borrow::Cow;
2+
13
use crate::decode::Decode;
24
use crate::encode::{Encode, IsNull};
35
use crate::error::BoxDynError;
@@ -101,3 +103,9 @@ impl<const N: usize> Decode<'_, Postgres> for [u8; N] {
101103
Ok(bytes)
102104
}
103105
}
106+
107+
impl Encode<'_, Postgres> for Cow<'_, [u8]> {
108+
fn encode_by_ref(&self, buf: &mut PgArgumentBuffer) -> Result<IsNull, BoxDynError> {
109+
<&[u8] as Encode<Postgres>>::encode(self.as_ref(), buf)
110+
}
111+
}

sqlx-postgres/src/types/str.rs

+9-15
Original file line numberDiff line numberDiff line change
@@ -82,6 +82,15 @@ impl Encode<'_, Postgres> for &'_ str {
8282
}
8383
}
8484

85+
impl Encode<'_, Postgres> for Cow<'_, str> {
86+
fn encode_by_ref(&self, buf: &mut PgArgumentBuffer) -> Result<IsNull, BoxDynError> {
87+
match self {
88+
Cow::Borrowed(str) => <&str as Encode<Postgres>>::encode(*str, buf),
89+
Cow::Owned(str) => <&str as Encode<Postgres>>::encode(&**str, buf),
90+
}
91+
}
92+
}
93+
8594
impl Encode<'_, Postgres> for Box<str> {
8695
fn encode_by_ref(&self, buf: &mut PgArgumentBuffer) -> Result<IsNull, BoxDynError> {
8796
<&str as Encode<Postgres>>::encode(&**self, buf)
@@ -105,18 +114,3 @@ impl Decode<'_, Postgres> for String {
105114
Ok(value.as_str()?.to_owned())
106115
}
107116
}
108-
109-
impl Encode<'_, Postgres> for Cow<'_, str> {
110-
fn encode_by_ref(&self, buf: &mut PgArgumentBuffer) -> Result<IsNull, BoxDynError> {
111-
match self {
112-
Cow::Borrowed(str) => <&str as Encode<Postgres>>::encode(*str, buf),
113-
Cow::Owned(str) => <&str as Encode<Postgres>>::encode(&**str, buf),
114-
}
115-
}
116-
}
117-
118-
impl Encode<'_, Postgres> for Cow<'_, [u8]> {
119-
fn encode_by_ref(&self, buf: &mut PgArgumentBuffer) -> Result<IsNull, BoxDynError> {
120-
<&[u8] as Encode<Postgres>>::encode(self.as_ref(), buf)
121-
}
122-
}

sqlx-sqlite/src/types/bytes.rs

+17
Original file line numberDiff line numberDiff line change
@@ -85,3 +85,20 @@ impl<'r> Decode<'r, Sqlite> for Vec<u8> {
8585
Ok(value.blob().to_owned())
8686
}
8787
}
88+
89+
impl<'q> Encode<'q, Sqlite> for Cow<'q, [u8]> {
90+
fn encode(self, args: &mut Vec<SqliteArgumentValue<'q>>) -> Result<IsNull, BoxDynError> {
91+
args.push(SqliteArgumentValue::Blob(self));
92+
93+
Ok(IsNull::No)
94+
}
95+
96+
fn encode_by_ref(
97+
&self,
98+
args: &mut Vec<SqliteArgumentValue<'q>>,
99+
) -> Result<IsNull, BoxDynError> {
100+
args.push(SqliteArgumentValue::Blob(self.clone()));
101+
102+
Ok(IsNull::No)
103+
}
104+
}

sqlx-sqlite/src/types/str.rs

-17
Original file line numberDiff line numberDiff line change
@@ -94,20 +94,3 @@ impl<'q> Encode<'q, Sqlite> for Cow<'q, str> {
9494
Ok(IsNull::No)
9595
}
9696
}
97-
98-
impl<'q> Encode<'q, Sqlite> for Cow<'q, [u8]> {
99-
fn encode(self, args: &mut Vec<SqliteArgumentValue<'q>>) -> Result<IsNull, BoxDynError> {
100-
args.push(SqliteArgumentValue::Blob(self));
101-
102-
Ok(IsNull::No)
103-
}
104-
105-
fn encode_by_ref(
106-
&self,
107-
args: &mut Vec<SqliteArgumentValue<'q>>,
108-
) -> Result<IsNull, BoxDynError> {
109-
args.push(SqliteArgumentValue::Blob(self.clone()));
110-
111-
Ok(IsNull::No)
112-
}
113-
}

tests/postgres/types.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,8 @@ extern crate time_ as time;
33
use std::borrow::Cow;
44
use std::net::SocketAddr;
55
use std::ops::Bound;
6-
use std::str::FromStr;
76
use std::rc::Rc;
7+
use std::str::FromStr;
88
use std::sync::Arc;
99

1010
use sqlx::postgres::types::{Oid, PgCiText, PgInterval, PgMoney, PgRange};

tests/sqlite/types.rs

+21-1
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
extern crate time_ as time;
22

33
use sqlx::sqlite::{Sqlite, SqliteRow};
4-
use sqlx::FromRow;
4+
use sqlx::{FromRow, Type};
55
use sqlx_core::executor::Executor;
66
use sqlx_core::row::Row;
77
use sqlx_core::types::Text;
@@ -265,3 +265,23 @@ CREATE TEMPORARY TABLE user_login (
265265

266266
Ok(())
267267
}
268+
269+
#[sqlx_macros::test]
270+
async fn it_binds_with_borrowed_data() -> anyhow::Result<()> {
271+
#[derive(Debug, Type, Clone)]
272+
#[sqlx(rename_all = "lowercase")]
273+
enum Status {
274+
New,
275+
Open,
276+
Closed,
277+
}
278+
279+
let owned = Status::New;
280+
281+
let mut conn = new::<Sqlite>().await?;
282+
sqlx::query("select ?")
283+
.bind(Cow::Borrowed(&owned))
284+
.fetch_one(&mut conn)
285+
.await?;
286+
Ok(())
287+
}

0 commit comments

Comments
 (0)