tea_orm/
new_database_connection.rs1use 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}