@@ -2,7 +2,7 @@ use diesel::prelude::*;
22use diesel:: sqlite:: { Sqlite , SqliteConnection } ;
33use diesel_async:: async_connection_wrapper:: AsyncConnectionWrapper ;
44use diesel_async:: sync_connection_wrapper:: SyncConnectionWrapper ;
5- use diesel_async:: { AsyncConnection , RunQueryDsl , SimpleAsyncConnection } ;
5+ use diesel_async:: { AsyncConnection , RunQueryDsl } ;
66use diesel_migrations:: { embed_migrations, EmbeddedMigrations , MigrationHarness } ;
77
88// ordinary diesel model setup
@@ -15,7 +15,7 @@ table! {
1515}
1616
1717#[ allow( dead_code) ]
18- #[ derive( Debug , Queryable , Selectable ) ]
18+ #[ derive( Debug , Queryable , QueryableByName , Selectable ) ]
1919#[ diesel( table_name = users) ]
2020struct User {
2121 id : i32 ,
4747 . map_err ( |e| Box :: new ( e) as Box < dyn std:: error:: Error > )
4848}
4949
50+ async fn transaction (
51+ async_conn : & mut SyncConnectionWrapper < InnerConnection > ,
52+ old_name : & str ,
53+ new_name : & str ,
54+ ) -> Result < Vec < User > , diesel:: result:: Error > {
55+ async_conn
56+ . transaction :: < Vec < User > , diesel:: result:: Error , _ > ( |c| {
57+ Box :: pin ( async {
58+ if old_name. is_empty ( ) {
59+ Ok ( Vec :: new ( ) )
60+ } else {
61+ diesel:: update ( users:: table. filter ( users:: name. eq ( old_name) ) )
62+ . set ( users:: name. eq ( new_name) )
63+ . load ( c)
64+ . await
65+ }
66+ } )
67+ } )
68+ . await
69+ }
70+
5071#[ tokio:: main]
5172async fn main ( ) -> Result < ( ) , Box < dyn std:: error:: Error > > {
5273 let db_url = std:: env:: var ( "DATABASE_URL" ) . expect ( "Env var `DATABASE_URL` not set" ) ;
@@ -57,10 +78,13 @@ async fn main() -> Result<(), Box<dyn std::error::Error>> {
5778
5879 let mut sync_wrapper: SyncConnectionWrapper < InnerConnection > = establish ( & db_url) . await ?;
5980
60- sync_wrapper. batch_execute ( "DELETE FROM users" ) . await ?;
81+ diesel:: delete ( users:: table)
82+ . execute ( & mut sync_wrapper)
83+ . await ?;
6184
62- sync_wrapper
63- . batch_execute ( "INSERT INTO users(id, name) VALUES (3, 'toto')" )
85+ diesel:: insert_into ( users:: table)
86+ . values ( ( users:: id. eq ( 3 ) , users:: name. eq ( "toto" ) ) )
87+ . execute ( & mut sync_wrapper)
6488 . await ?;
6589
6690 let data: Vec < User > = users:: table
@@ -86,5 +110,28 @@ async fn main() -> Result<(), Box<dyn std::error::Error>> {
86110 . await ?;
87111 println ! ( "{data:?}" ) ;
88112
113+ // a quick test to check if we correctly handle transactions
114+ let mut conn_a: SyncConnectionWrapper < InnerConnection > = establish ( & db_url) . await ?;
115+ let mut conn_b: SyncConnectionWrapper < InnerConnection > = establish ( & db_url) . await ?;
116+
117+ let handle_1 = tokio:: spawn ( async move {
118+ loop {
119+ let changed = transaction ( & mut conn_a, "iLuke" , "JustLuke" ) . await ;
120+ println ! ( "Changed {changed:?}" ) ;
121+ std:: thread:: sleep ( std:: time:: Duration :: from_secs ( 1 ) ) ;
122+ }
123+ } ) ;
124+
125+ let handle_2 = tokio:: spawn ( async move {
126+ loop {
127+ let changed = transaction ( & mut conn_b, "JustLuke" , "iLuke" ) . await ;
128+ println ! ( "Changed {changed:?}" ) ;
129+ std:: thread:: sleep ( std:: time:: Duration :: from_secs ( 1 ) ) ;
130+ }
131+ } ) ;
132+
133+ let _ = handle_2. await ;
134+ let _ = handle_1. await ;
135+
89136 Ok ( ( ) )
90137}
0 commit comments