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
use postgres::{NoTls};
use crate::{DB_PROPERTIES};
use r2d2_postgres::PostgresConnectionManager;
use r2d2::{Pool, PooledConnection};
use parking_lot::{ RwLock};
use std::time::Duration;

lazy_static!{

    static ref PG_POOL: RwLock<Pool<PostgresConnectionManager<NoTls>>> = {
        RwLock::new(create_postgres_connection_manager())
    };
}
pub fn connect_db() -> Result<PooledConnection<PostgresConnectionManager<NoTls>>, r2d2::Error>{

    let conn = PG_POOL.read();
    return match conn.get() {

        Ok(t) => Ok(t),
        Err(e) => {
            error!("==> {:?}", e);
            drop(conn);

            let mut conn = PG_POOL.write();
            *conn = create_postgres_connection_manager();
            conn.get()
        }
    };
}
pub fn create_postgres_connection_manager() -> Pool<PostgresConnectionManager<NoTls>> {

    let pool_size = match DB_PROPERTIES.get("db.pgsql.pool_size") {
        Some(t) =>   t.parse::<u32>().unwrap(),
        None => panic!("No such property: db.pgsql.pool_size")
    };
    let idle_timeout_sec = match DB_PROPERTIES.get("db.pgsql.idle_timeout_sec") {
        Some(t) =>   t.parse::<u64>().unwrap_or(15),
        None => 15,
    };

    let manager = PostgresConnectionManager::new( get_data_source().parse().unwrap(),NoTls,);
    let pool = r2d2::Pool::builder()
        .idle_timeout(Some(Duration::from_secs(idle_timeout_sec)))
        .max_size(pool_size)
        .build(manager).unwrap();
    pool
}

fn get_data_source() -> String{
    let data_source
        = format!("host={} port={} user={} password={} dbname={}",
                  match DB_PROPERTIES.get("db.pgsql.host") {
                      Some(v) => v,
                      _ => panic!("No such property: db.pgsql.host"),
                  },
                  match DB_PROPERTIES.get("db.pgsql.port") {
                      Some(v) => v,
                      _ => panic!("No such property: db.pgsql.port"),
                  },
                  match DB_PROPERTIES.get("db.pgsql.user") {
                      Some(v) => v,
                      _ => panic!("No such property: db.pgsql.user"),
                  },
                  match DB_PROPERTIES.get("db.pgsql.password") {
                      Some(v) => v,
                      _ => panic!("No such property: db.pgsql.password"),
                  },
                  match DB_PROPERTIES.get("db.pgsql.dbname") {
                      Some(v) => v,
                      _ => panic!("No such property: db.pgsql.dbname"),
                  }
    );
    data_source
}