r2d2_mysql/
lib.rs

1//! MySQL support for the [`r2d2`] connection pool (Rust).
2//!
3//! # Examples
4//! ```
5//! use std::{env, sync::Arc, thread};
6//!
7//! use r2d2_mysql::{
8//!     mysql::{prelude::*, Opts, OptsBuilder},
9//!     r2d2, MySqlConnectionManager,
10//! };
11//!
12//! let url = env::var("DATABASE_URL").unwrap();
13//! let opts = Opts::from_url(&url).unwrap();
14//! let builder = OptsBuilder::from_opts(opts);
15//! let manager = MySqlConnectionManager::new(builder);
16//! let pool = Arc::new(r2d2::Pool::builder().max_size(4).build(manager).unwrap());
17//!
18//! let mut tasks = vec![];
19//!
20//! for _ in 0..3 {
21//!     let pool = pool.clone();
22//!     let th = thread::spawn(move || {
23//!         let mut conn = pool.get().expect("error getting connection from pool");
24//!
25//!         let _ = conn
26//!             .query("SELECT version()")
27//!             .map(|rows: Vec<String>| rows.is_empty())
28//!             .expect("error executing query");
29//!     });
30//!
31//!     tasks.push(th);
32//! }
33//!
34//! for th in tasks {
35//!     let _ = th.join();
36//! }
37//! ```
38
39pub use mysql;
40pub use r2d2;
41
42mod pool;
43pub use self::pool::MySqlConnectionManager;
44
45#[cfg(test)]
46mod test {
47    use std::{env, sync::Arc, thread};
48
49    use mysql::{prelude::*, Opts, OptsBuilder};
50
51    use super::MySqlConnectionManager;
52
53    #[test]
54    fn query_pool() {
55        let url = env::var("DATABASE_URL").unwrap();
56        let opts = Opts::from_url(&url).unwrap();
57        let builder = OptsBuilder::from_opts(opts);
58        let manager = MySqlConnectionManager::new(builder);
59        let pool = Arc::new(r2d2::Pool::builder().max_size(4).build(manager).unwrap());
60
61        let mut tasks = vec![];
62
63        for _ in 0..3 {
64            let pool = pool.clone();
65            let th = thread::spawn(move || {
66                let mut conn = pool.get().expect("error getting connection from pool");
67
68                let _ = conn
69                    .query("SELECT version()")
70                    .map(|rows: Vec<String>| rows.is_empty())
71                    .expect("error executing query");
72            });
73
74            tasks.push(th);
75        }
76
77        for th in tasks {
78            let _ = th.join();
79        }
80    }
81}