Skip to content

Commit 608908c

Browse files
committed
fixes after review
1 parent c8ae9c8 commit 608908c

File tree

5 files changed

+40
-19
lines changed

5 files changed

+40
-19
lines changed

Diff for: sqlx-core/src/decode.rs

+8-11
Original file line numberDiff line numberDiff line change
@@ -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
}

Diff for: 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,

Diff for: 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()

Diff for: 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};

Diff for: tests/sqlite/types.rs

+27-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,29 @@ 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+
async fn borrowed_data<'a>(val: Cow<'a, Status>) -> anyhow::Result<()> {
280+
let mut conn = new::<Sqlite>().await?;
281+
sqlx::query("select ?")
282+
.bind(val)
283+
.fetch_one(&mut conn)
284+
.await?;
285+
Ok(())
286+
}
287+
288+
let owned = Status::New;
289+
290+
borrowed_data(Cow::Borrowed(&owned)).await?;
291+
292+
Ok(())
293+
}

0 commit comments

Comments
 (0)