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 }