forked from rwf2/Rocket
-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Add support for 'diesel-async' to 'db_pools'.
- Loading branch information
1 parent
792bab2
commit 9a9cd76
Showing
20 changed files
with
410 additions
and
84 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,149 @@ | ||
//! Re-export of [`diesel`] with prelude types overridden with `async` variants | ||
//! from [`diesel_async`]. | ||
//! | ||
//! # Usage | ||
//! | ||
//! To use `async` `diesel` support provided here, enable the following | ||
//! dependencies in your `Cargo.toml`: | ||
//! | ||
//! ```toml | ||
//! [dependencies] | ||
//! rocket = "=0.5.0-rc.3" | ||
//! diesel = "2" | ||
//! | ||
//! [dependencies.rocket_db_pools] | ||
//! version = "=0.1.0-rc.3" | ||
//! features = ["diesel_mysql"] | ||
//! ``` | ||
//! | ||
//! Then, import `rocket_db_pools::diesel::prelude::*` as well as the | ||
//! appropriate pool type and, optionally, [`QueryResult`]. To use macros or | ||
//! `diesel` functions, use `diesel::` directly. That is, _do not_ import | ||
//! `rocket_db_pools::diesel`. Doing so will, by design, cause import errors. | ||
//! | ||
//! # Example | ||
//! | ||
//! ```rust | ||
//! # #[macro_use] extern crate rocket; | ||
//! # #[cfg(feature = "diesel_mysql")] { | ||
//! use rocket_db_pools::{Database, Connection}; | ||
//! use rocket_db_pools::diesel::{QueryResult, MysqlPool, prelude::*}; | ||
//! | ||
//! #[derive(Database)] | ||
//! #[database("diesel_mysql")] | ||
//! struct Db(MysqlPool); | ||
//! | ||
//! #[derive(Queryable, Insertable)] | ||
//! #[diesel(table_name = posts)] | ||
//! struct Post { | ||
//! id: i64, | ||
//! title: String, | ||
//! published: bool, | ||
//! } | ||
//! | ||
//! diesel::table! { | ||
//! posts (id) { | ||
//! id -> BigInt, | ||
//! title -> Text, | ||
//! published -> Bool, | ||
//! } | ||
//! } | ||
//! | ||
//! #[get("/")] | ||
//! async fn list(mut db: Connection<Db>) -> QueryResult<String> { | ||
//! let post_ids: Vec<i64> = posts::table | ||
//! .select(posts::id) | ||
//! .load(&mut db) | ||
//! .await?; | ||
//! | ||
//! Ok(format!("{post_ids:?}")) | ||
//! } | ||
//! # } | ||
//! ``` | ||
|
||
/// The [`diesel`] prelude with `sync`-only traits replaced with their | ||
/// [`diesel_async`] variants. | ||
pub mod prelude { | ||
#[doc(inline)] | ||
pub use diesel::prelude::*; | ||
|
||
#[doc(inline)] | ||
pub use diesel_async::{AsyncConnection, RunQueryDsl, SaveChangesDsl}; | ||
} | ||
|
||
#[doc(hidden)] | ||
pub use diesel::*; | ||
|
||
#[doc(hidden)] | ||
pub use diesel_async::{RunQueryDsl, SaveChangesDsl, *}; | ||
|
||
#[doc(hidden)] | ||
#[cfg(feature = "diesel_postgres")] | ||
pub use diesel_async::pg; | ||
|
||
#[doc(inline)] | ||
pub use diesel_async::pooled_connection::deadpool::Pool; | ||
|
||
#[doc(inline)] | ||
#[cfg(feature = "diesel_mysql")] | ||
pub use diesel_async::AsyncMysqlConnection; | ||
|
||
#[doc(inline)] | ||
#[cfg(feature = "diesel_postgres")] | ||
pub use diesel_async::AsyncPgConnection; | ||
|
||
/// Alias of a `Result` with an error type of [`Debug`] for a `diesel::Error`. | ||
/// | ||
/// `QueryResult` is a [`Responder`](rocket::response::Responder) when `T` (the | ||
/// `Ok` value) is a `Responder`. By using this alias as a route handler's | ||
/// return type, the `?` operator can be applied to fallible `diesel` functions | ||
/// in the route handler while still providing a valid `Responder` return type. | ||
/// | ||
/// See the [module level docs](self#example) for a usage example. | ||
/// | ||
/// [`Debug`]: rocket::response::Debug | ||
pub type QueryResult<T, E = rocket::response::Debug<diesel::result::Error>> = Result<T, E>; | ||
|
||
/// Type alias for an `async` pool of MySQL connections for `async` [diesel]. | ||
/// | ||
/// ```rust | ||
/// # extern crate rocket; | ||
/// # #[cfg(feature = "diesel_mysql")] { | ||
/// # use rocket::get; | ||
/// use rocket_db_pools::{Database, Connection}; | ||
/// use rocket_db_pools::diesel::{MysqlPool, prelude::*}; | ||
/// | ||
/// #[derive(Database)] | ||
/// #[database("my_mysql_db_name")] | ||
/// struct Db(MysqlPool); | ||
/// | ||
/// #[get("/")] | ||
/// async fn use_db(mut db: Connection<Db>) { | ||
/// /* .. */ | ||
/// } | ||
/// # } | ||
/// ``` | ||
#[cfg(feature = "diesel_mysql")] | ||
pub type MysqlPool = Pool<AsyncMysqlConnection>; | ||
|
||
/// Type alias for an `async` pool of Postgres connections for `async` [diesel]. | ||
/// | ||
/// ```rust | ||
/// # extern crate rocket; | ||
/// # #[cfg(feature = "diesel_postgres")] { | ||
/// # use rocket::get; | ||
/// use rocket_db_pools::{Database, Connection}; | ||
/// use rocket_db_pools::diesel::{PgPool, prelude::*}; | ||
/// | ||
/// #[derive(Database)] | ||
/// #[database("my_pg_db_name")] | ||
/// struct Db(PgPool); | ||
/// | ||
/// #[get("/")] | ||
/// async fn use_db(mut db: Connection<Db>) { | ||
/// /* .. */ | ||
/// } | ||
/// # } | ||
/// ``` | ||
#[cfg(feature = "diesel_postgres")] | ||
pub type PgPool = Pool<AsyncPgConnection>; |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
50 changes: 25 additions & 25 deletions
50
contrib/sync_db_pools/codegen/tests/ui-fail-nightly/database-syntax.stderr
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,57 +1,57 @@ | ||
error: unexpected end of input, expected string literal | ||
--> tests/ui-fail-nightly/database-syntax.rs:6:1 | ||
| | ||
6 | #[database] | ||
| ^^^^^^^^^^^ | ||
| | ||
= note: this error originates in the attribute macro `database` (in Nightly builds, run with -Z macro-backtrace for more info) | ||
--> tests/ui-fail-nightly/database-syntax.rs:27:1 | ||
| | ||
27 | #[database] | ||
| ^^^^^^^^^^^ | ||
| | ||
= note: this error originates in the attribute macro `database` (in Nightly builds, run with -Z macro-backtrace for more info) | ||
|
||
error: expected string literal | ||
--> tests/ui-fail-nightly/database-syntax.rs:9:12 | ||
| | ||
9 | #[database(1)] | ||
| ^ | ||
--> tests/ui-fail-nightly/database-syntax.rs:30:12 | ||
| | ||
30 | #[database(1)] | ||
| ^ | ||
|
||
error: expected string literal | ||
--> tests/ui-fail-nightly/database-syntax.rs:12:12 | ||
--> tests/ui-fail-nightly/database-syntax.rs:33:12 | ||
| | ||
12 | #[database(123)] | ||
33 | #[database(123)] | ||
| ^^^ | ||
|
||
error: unexpected token | ||
--> tests/ui-fail-nightly/database-syntax.rs:15:20 | ||
--> tests/ui-fail-nightly/database-syntax.rs:36:20 | ||
| | ||
15 | #[database("hello" "hi")] | ||
36 | #[database("hello" "hi")] | ||
| ^^^^ | ||
|
||
error: `database` attribute can only be used on structs | ||
--> tests/ui-fail-nightly/database-syntax.rs:19:1 | ||
--> tests/ui-fail-nightly/database-syntax.rs:40:1 | ||
| | ||
19 | enum Foo { } | ||
40 | enum Foo { } | ||
| ^^^^^^^^^^^^^ | ||
|
||
error: `database` attribute can only be applied to structs with exactly one unnamed field | ||
--> tests/ui-fail-nightly/database-syntax.rs:22:11 | ||
--> tests/ui-fail-nightly/database-syntax.rs:43:11 | ||
| | ||
22 | struct Bar(diesel::SqliteConnection, diesel::SqliteConnection); | ||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ | ||
43 | struct Bar(Connection, Connection); | ||
| ^^^^^^^^^^^^^^^^^^^^^^^^ | ||
| | ||
= help: example: `struct MyDatabase(diesel::SqliteConnection);` | ||
|
||
error: `database` attribute can only be used on structs | ||
--> tests/ui-fail-nightly/database-syntax.rs:25:1 | ||
--> tests/ui-fail-nightly/database-syntax.rs:46:1 | ||
| | ||
25 | union Baz { } | ||
46 | union Baz { } | ||
| ^^^^^^^^^^^^^^ | ||
|
||
error: `database` attribute cannot be applied to structs with generics | ||
--> tests/ui-fail-nightly/database-syntax.rs:28:9 | ||
--> tests/ui-fail-nightly/database-syntax.rs:49:9 | ||
| | ||
28 | struct E<'r>(&'r str); | ||
49 | struct E<'r>(&'r str); | ||
| ^^^^ | ||
|
||
error: `database` attribute cannot be applied to structs with generics | ||
--> tests/ui-fail-nightly/database-syntax.rs:31:9 | ||
--> tests/ui-fail-nightly/database-syntax.rs:52:9 | ||
| | ||
31 | struct F<T>(T); | ||
52 | struct F<T>(T); | ||
| ^^^ |
Oops, something went wrong.