novax_sqlx_postgres/
lib.rs

1use sqlx::postgres::PgPoolOptions;
2use sqlx::PgPool;
3
4pub struct PostgresConn {
5    port:   i16,
6    user:   String,
7    pwd:    String,
8    host:   String,
9    db:     String
10}
11
12/// Define postgres connection
13/// parameters
14/// 
15impl PostgresConn {
16    /// new create an new 
17    /// instance for PostgresConn
18    /// Paramter sequence:
19    /// * String (user)
20    /// * String (pwd)
21    /// * String (host)
22    /// * String (database)
23    /// * i16    (port)
24    pub fn new(param: (String, String, String, String, i16)) -> Self {
25        let (user, pwd, host, db, port) = param;
26        Self {
27            port, user, pwd, host, db
28        }
29    }
30    fn to_sql(&self) -> String {
31        format!("postgres://{}:{}@{}:{}/{}",
32            self.user, self.pwd, self.host, self.port, self.db)
33    }
34}
35
36pub async fn create_connection(my_conn: PostgresConn, num_cn: u32) -> Result<PgPool, sqlx::Error> {
37    let database_url = my_conn.to_sql();
38    PgPoolOptions::new()
39        .max_connections(num_cn)
40        .connect(&database_url).await
41
42}
43
44// re-export
45pub use sqlx;
46
47#[cfg(test)]
48mod tests {
49    use super::*;
50    use sqlx::Row;
51
52    #[tokio::test]
53    async fn should_postgres_connection_ok() -> Result<(), sqlx::Error> {
54        let postgres_cn = PostgresConn::new(
55            ("myuser".to_string(), "mypassword".to_string(), 
56            "localhost".to_string(), "mydatabase".to_string(), 5432)
57        );
58        let cn = create_connection(postgres_cn, 5).await;
59        assert_eq!(cn.is_ok(), true);
60        // check simple sql
61        let row: (i64,) = sqlx::query_as("SELECT $1").bind(150_i64).fetch_one(&cn?).await?;
62        assert_eq!(row.0 == 150, true);
63        Ok(())
64    }
65}