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}