Skip to content

Commit e528cfb

Browse files
authored
Merge pull request #82 from weiznich/fix/81
Fix #81 by adding the missing impl
2 parents c61deaf + 849cf9d commit e528cfb

File tree

3 files changed

+123
-4
lines changed

3 files changed

+123
-4
lines changed

src/pooled_connection/mod.rs

+18-1
Original file line numberDiff line numberDiff line change
@@ -5,8 +5,10 @@
55
//! * [deadpool](self::deadpool)
66
//! * [bb8](self::bb8)
77
//! * [mobc](self::mobc)
8-
use crate::TransactionManager;
98
use crate::{AsyncConnection, SimpleAsyncConnection};
9+
use crate::{TransactionManager, UpdateAndFetchResults};
10+
use diesel::associations::HasTable;
11+
use diesel::QueryResult;
1012
use futures_util::{future, FutureExt};
1113
use std::fmt;
1214
use std::ops::DerefMut;
@@ -188,6 +190,21 @@ where
188190
}
189191
}
190192

193+
#[async_trait::async_trait]
194+
impl<'b, Changes, Output, Conn> UpdateAndFetchResults<Changes, Output> for Conn
195+
where
196+
Conn: DerefMut + Send,
197+
Changes: diesel::prelude::Identifiable + HasTable + Send,
198+
Conn::Target: UpdateAndFetchResults<Changes, Output>,
199+
{
200+
async fn update_and_fetch(&mut self, changeset: Changes) -> QueryResult<Output>
201+
where
202+
Changes: 'async_trait,
203+
{
204+
self.deref_mut().update_and_fetch(changeset).await
205+
}
206+
}
207+
191208
#[derive(diesel::query_builder::QueryId)]
192209
struct CheckConnectionQuery;
193210

tests/lib.rs

+12-3
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,8 @@ use std::pin::Pin;
77

88
#[cfg(feature = "postgres")]
99
mod custom_types;
10+
#[cfg(any(feature = "bb8", feature = "deadpool", feature = "mobc"))]
11+
mod pooling;
1012
mod type_check;
1113

1214
async fn transaction_test(conn: &mut TestConnection) -> QueryResult<()> {
@@ -70,7 +72,14 @@ diesel::table! {
7072
}
7173
}
7274

73-
#[derive(diesel::Queryable, diesel::Selectable, Debug, PartialEq)]
75+
#[derive(
76+
diesel::Queryable,
77+
diesel::Selectable,
78+
Debug,
79+
PartialEq,
80+
diesel::AsChangeset,
81+
diesel::Identifiable,
82+
)]
7483
struct User {
7584
id: i32,
7685
name: String,
@@ -101,7 +110,7 @@ async fn test_basic_insert_and_load() -> QueryResult<()> {
101110
#[cfg(feature = "mysql")]
102111
async fn setup(connection: &mut TestConnection) {
103112
diesel::sql_query(
104-
"CREATE TABLE IF NOT EXISTS users (
113+
"CREATE TEMPORARY TABLE users (
105114
id INTEGER PRIMARY KEY AUTO_INCREMENT,
106115
name TEXT NOT NULL
107116
) CHARACTER SET utf8mb4",
@@ -153,7 +162,7 @@ async fn postgres_cancel_token() {
153162
#[cfg(feature = "postgres")]
154163
async fn setup(connection: &mut TestConnection) {
155164
diesel::sql_query(
156-
"CREATE TABLE IF NOT EXISTS users (
165+
"CREATE TEMPORARY TABLE users (
157166
id SERIAL PRIMARY KEY,
158167
name VARCHAR NOT NULL
159168
)",

tests/pooling.rs

+93
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,93 @@
1+
use super::{users, User};
2+
use diesel::prelude::*;
3+
use diesel_async::{RunQueryDsl, SaveChangesDsl};
4+
5+
#[tokio::test]
6+
#[cfg(feature = "bb8")]
7+
async fn save_changes_bb8() {
8+
use diesel_async::pooled_connection::bb8::Pool;
9+
use diesel_async::pooled_connection::AsyncDieselConnectionManager;
10+
11+
let db_url = std::env::var("DATABASE_URL").unwrap();
12+
13+
let config = AsyncDieselConnectionManager::<super::TestConnection>::new(db_url);
14+
let pool = Pool::builder().max_size(1).build(config).await.unwrap();
15+
16+
let mut conn = pool.get().await.unwrap();
17+
18+
super::setup(&mut *conn).await;
19+
20+
diesel::insert_into(users::table)
21+
.values(users::name.eq("John"))
22+
.execute(&mut conn)
23+
.await
24+
.unwrap();
25+
26+
let mut u = users::table.first::<User>(&mut conn).await.unwrap();
27+
assert_eq!(u.name, "John");
28+
29+
u.name = "Jane".into();
30+
let u2: User = u.save_changes(&mut conn).await.unwrap();
31+
32+
assert_eq!(u2.name, "Jane");
33+
}
34+
35+
#[tokio::test]
36+
#[cfg(feature = "deadpool")]
37+
async fn save_changes_deadpool() {
38+
use diesel_async::pooled_connection::deadpool::Pool;
39+
use diesel_async::pooled_connection::AsyncDieselConnectionManager;
40+
41+
let db_url = std::env::var("DATABASE_URL").unwrap();
42+
43+
let config = AsyncDieselConnectionManager::<super::TestConnection>::new(db_url);
44+
let pool = Pool::builder(config).max_size(1).build().unwrap();
45+
46+
let mut conn = pool.get().await.unwrap();
47+
48+
super::setup(&mut *conn).await;
49+
50+
diesel::insert_into(users::table)
51+
.values(users::name.eq("John"))
52+
.execute(&mut conn)
53+
.await
54+
.unwrap();
55+
56+
let mut u = users::table.first::<User>(&mut conn).await.unwrap();
57+
assert_eq!(u.name, "John");
58+
59+
u.name = "Jane".into();
60+
let u2: User = u.save_changes(&mut conn).await.unwrap();
61+
62+
assert_eq!(u2.name, "Jane");
63+
}
64+
65+
#[tokio::test]
66+
#[cfg(feature = "mobc")]
67+
async fn save_changes_mobc() {
68+
use diesel_async::pooled_connection::mobc::Pool;
69+
use diesel_async::pooled_connection::AsyncDieselConnectionManager;
70+
71+
let db_url = std::env::var("DATABASE_URL").unwrap();
72+
73+
let config = AsyncDieselConnectionManager::<super::TestConnection>::new(db_url);
74+
let pool = Pool::new(config);
75+
76+
let mut conn = pool.get().await.unwrap();
77+
78+
super::setup(&mut *conn).await;
79+
80+
diesel::insert_into(users::table)
81+
.values(users::name.eq("John"))
82+
.execute(&mut conn)
83+
.await
84+
.unwrap();
85+
86+
let mut u = users::table.first::<User>(&mut conn).await.unwrap();
87+
assert_eq!(u.name, "John");
88+
89+
u.name = "Jane".into();
90+
let u2: User = u.save_changes(&mut conn).await.unwrap();
91+
92+
assert_eq!(u2.name, "Jane");
93+
}

0 commit comments

Comments
 (0)