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
82
83
84
85
86
87
88
89
90
91
92
93
94
95
use crate::error::CustomError;
use mysql::prelude::{AsStatement, Queryable};
pub use mysql::Pool;
pub use mysql::TxOpts;
use mysql::{Opts, PooledConn};
pub use mysql_common;
use crate::env::get_env;

fn mysql_url() -> String {
    get_env("DATABASE_URL", "")
}


pub fn mysql_search<T, S, P>(pool: &Pool, stmt: S, params: P) -> Result<Vec<T>, CustomError>
where
    S: AsStatement,
    P: Into<mysql::Params>,
    T: mysql::prelude::FromRow,
    mysql::Params: std::convert::From<P>,
{
    let mut conn = mysql_pool_to_connection(pool)?;
    let res = conn.exec(stmt, params);

    if res.is_err() {
        return Err(CustomError::Database("SQL ERROR".to_string()));
    }
    Ok(res.unwrap_or_default())
}
pub fn mysql_search_first<T, S, P>(
    pool: &Pool,
    stmt: S,
    params: P,
) -> Result<Option<T>, CustomError>
where
    S: AsStatement,
    P: Into<mysql::Params>,
    T: mysql::prelude::FromRow,
    mysql::Params: std::convert::From<P>,
{
    let mut conn = mysql_pool_to_connection(pool)?;
    let res = conn.exec_first(stmt, params);
    if res.is_err() {
        return Err(CustomError::Database("SQL ERROR".to_string()));
    }
    Ok(res.unwrap())
}
pub fn mysql_update<S, P>(pool: &Pool, stmt: S, params: P) -> Result<u64, CustomError>
where
    S: AsStatement,
    P: Into<mysql::Params>,
    mysql::Params: std::convert::From<P>,
{
    let mut conn = mysql_pool_to_connection(pool)?;
    let res = conn.exec_drop(stmt, params);
    if res.is_err() {
        return Err(CustomError::Database("SQL ERROR".to_string()));
    }
    Ok(conn.affected_rows())
}

pub fn mysql_pool_to_connection(pool: &Pool) -> Result<PooledConn, CustomError> {
    let conn = pool.get_conn();
    if let Err(..) = conn {
        return Err(CustomError::Database(conn.unwrap_err().to_string()));
    }
    Ok(conn.unwrap())
}

pub fn get_mysql_pool() -> Result<Pool, CustomError> {
    let url = mysql_url();
    let opts = Opts::from_url(url.as_str());
    if opts.is_err() {
        return Err(CustomError::Database(opts.err().unwrap().to_string()));
    }
    // let pool = Pool::new(opts.unwrap());
    let pool = Pool::new_manual(1, 20, opts.unwrap());
    if pool.is_err() {
        return Err(CustomError::Database(pool.err().unwrap().to_string()));
    }
    Ok(pool.unwrap())
}
pub fn get_mysql_pool_manual(min: usize, max: usize) -> Result<Pool, CustomError> {
    let url = mysql_url();
    let opts = Opts::from_url(url.as_str());
    if opts.is_err() {
        return Err(CustomError::Database(opts.err().unwrap().to_string()));
    }
    // let pool = Pool::new(opts.unwrap());
    let opts = opts.unwrap();
    let pool = Pool::new_manual(min, max, opts);
    if pool.is_err() {
        return Err(CustomError::Database(pool.err().unwrap().to_string()));
    }
    Ok(pool.unwrap())
}