tea_orm/
new_database_connection.rs

1use anyhow::Result;
2use log::LevelFilter;
3use sea_orm::ConnectOptions;
4use sea_orm::Database;
5use sea_orm::DatabaseConnection;
6use serde::Deserialize;
7use serde::Serialize;
8use std::time::Duration;
9
10#[derive(Serialize, Deserialize, Clone, Debug)]
11pub struct DatabaseConnectionOptions {
12    pub sqlx_logging_level: Option<LevelFilter>,
13
14    pub min_connections: Option<u32>,
15    pub max_connections: Option<u32>,
16
17    pub acquire_timeout: Option<Duration>,
18    pub connection_timeout: Option<Duration>,
19    pub idle_timeout: Option<Duration>,
20
21    pub max_lifetime: Option<Duration>,
22
23    pub sqlcipher_key: Option<String>,
24}
25
26impl Default for DatabaseConnectionOptions {
27    fn default() -> Self {
28        Self {
29            sqlx_logging_level: None,
30
31            min_connections: None,
32            max_connections: None,
33
34            acquire_timeout: None,
35            connection_timeout: None,
36            idle_timeout: None,
37            max_lifetime: None,
38
39            sqlcipher_key: None,
40        }
41    }
42}
43
44pub async fn new_database_connection(url: String) -> Result<DatabaseConnection> {
45    new_database_connection_with_options(url, DatabaseConnectionOptions::default()).await
46}
47
48pub async fn new_database_connection_with_options(
49    url: String,
50    options: DatabaseConnectionOptions,
51) -> Result<DatabaseConnection> {
52    let mut opt = ConnectOptions::new(url);
53
54    if let Some(sqlx_logging_level) = options.sqlx_logging_level {
55        opt.sqlx_logging(true)
56            .sqlx_logging_level(sqlx_logging_level);
57    } else {
58        opt.sqlx_logging(false);
59    }
60
61    if let Some(min_connections) = options.min_connections {
62        opt.min_connections(min_connections);
63    }
64
65    if let Some(max_connections) = options.max_connections {
66        opt.max_connections(max_connections);
67    }
68
69    if let Some(acquire_timeout) = options.acquire_timeout {
70        opt.acquire_timeout(acquire_timeout);
71    }
72
73    if let Some(connection_timeout) = options.connection_timeout {
74        opt.connect_timeout(connection_timeout);
75    }
76
77    if let Some(idle_timeout) = options.idle_timeout {
78        opt.idle_timeout(idle_timeout);
79    }
80
81    if let Some(max_lifetime) = options.max_lifetime {
82        opt.max_lifetime(max_lifetime);
83    }
84
85    if let Some(sqlcipher_key) = options.sqlcipher_key {
86        opt.sqlcipher_key(sqlcipher_key);
87    }
88
89    let db_connection = Database::connect(opt).await?;
90
91    Ok(db_connection)
92}