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

pub use mysql;
pub use r2d2;

mod pool;
pub use self::pool::MySqlConnectionManager;

#[cfg(test)]
mod test {
    use std::{env, sync::Arc, thread};

    use mysql::{prelude::*, Opts, OptsBuilder};

    use super::MySqlConnectionManager;

    #[test]
    fn query_pool() {
        let url = env::var("DATABASE_URL").unwrap();
        let opts = Opts::from_url(&url).unwrap();
        let builder = OptsBuilder::from_opts(opts);
        let manager = MySqlConnectionManager::new(builder);
        let pool = Arc::new(r2d2::Pool::builder().max_size(4).build(manager).unwrap());

        let mut tasks = vec![];

        for _ in 0..3 {
            let pool = pool.clone();
            let th = thread::spawn(move || {
                let mut conn = pool.get().expect("error getting connection from pool");

                let _ = conn
                    .query("SELECT version()")
                    .map(|rows: Vec<String>| rows.is_empty())
                    .expect("error executing query");
            });

            tasks.push(th);
        }

        for th in tasks {
            let _ = th.join();
        }
    }
}