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
extern crate r2d2; extern crate r2d2_odbc; use crate::{DB_PROPERTIES}; use r2d2_odbc::ODBCConnectionManager; use r2d2::{Pool, PooledConnection, Error}; use parking_lot::{ RwLock}; use std::time::Duration; lazy_static!{ static ref ODBC_POOL: RwLock<Pool<ODBCConnectionManager>> = { RwLock::new(create_odbc_connection_manager()) }; } pub fn connect_db() -> Result<PooledConnection <ODBCConnectionManager>, r2d2::Error> { let conn = ODBC_POOL.read(); return match conn.get() { Ok(t) => Ok(t), Err(e) => { error!("==> {:?}", e); drop(conn); let mut conn = ODBC_POOL.write(); *conn = create_odbc_connection_manager(); conn.get() } }; } pub fn create_odbc_connection_manager() -> Pool<ODBCConnectionManager> { let dsn = match DB_PROPERTIES.get("db.odbc.dsn") { Some(v) => v, _ => panic!("No such property: db.odbc.dsn"), }; let uid = match DB_PROPERTIES.get("db.odbc.uid") { Some(v) => v, _ => panic!("No such property: db.odbc.uid"), }; let pwd = match DB_PROPERTIES.get("db.odbc.pwd") { Some(v) => v, _ => panic!("No such property: db.odbc.pwd"), }; let database = match DB_PROPERTIES.get("db.odbc.database") { Some(v) => v, _ => panic!("No such property: db.odbc.database"), }; let pool_size = match DB_PROPERTIES.get("db.odbc.pool_size") { Some(t) => t.parse::<u32>().unwrap(), None => panic!("No such property: db.oracle.pool_size") }; let idle_timeout_sec = match DB_PROPERTIES.get("db.odbc.idle_timeout_sec") { Some(t) => t.parse::<u64>().unwrap_or(15), None => 15, }; let connection_string = format!("DSN={};UID={};PWD={};DB={}",dsn, uid, pwd, database); let manager = ODBCConnectionManager::new(connection_string); let pool = r2d2::Pool::builder() .idle_timeout(Some(Duration::from_secs(idle_timeout_sec))) .max_size(pool_size) .build(manager).unwrap(); pool }