-
Notifications
You must be signed in to change notification settings - Fork 8
Expand file tree
/
Copy pathconnection.rs
More file actions
68 lines (59 loc) · 2.21 KB
/
connection.rs
File metadata and controls
68 lines (59 loc) · 2.21 KB
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
use crate::common::lazy::CONFIG;
use crate::common::types::DatabaseType;
use crate::common::SQL;
use crate::core::mysql::prepare as mysql_explain;
use crate::core::postgres::prepare as postgres_explain;
use crate::core::sqlite::prepare as sqlite_explain;
use crate::ts_generator::types::ts_query::TsQuery;
use bb8::Pool;
use std::collections::HashMap;
use std::sync::Arc;
use tokio::sync::Mutex;
use super::mysql::pool::MySqlConnectionManager;
use super::postgres::pool::PostgresConnectionManager;
use super::sqlite::pool::SqliteConnectionManager;
use crate::common::errors::DB_CONN_FROM_LOCAL_CACHE_ERROR;
use color_eyre::Result;
use swc_common::errors::Handler;
/// Enum to hold a specific database connection instance
pub enum DBConn {
MySQLPooledConn(Mutex<Pool<MySqlConnectionManager>>),
PostgresConn(Mutex<Pool<PostgresConnectionManager>>),
SqliteConn(Mutex<Pool<SqliteConnectionManager>>),
}
impl DBConn {
pub async fn prepare(
&self,
sql: &SQL,
should_generate_types: &bool,
handler: &Handler,
) -> Result<(bool, Option<TsQuery>)> {
let (explain_failed, ts_query) = match &self {
DBConn::MySQLPooledConn(_conn) => mysql_explain::prepare(self, sql, should_generate_types, handler).await?,
DBConn::PostgresConn(_conn) => postgres_explain::prepare(self, sql, should_generate_types, handler).await?,
DBConn::SqliteConn(_conn) => sqlite_explain::prepare(self, sql, should_generate_types, handler).await?,
};
Ok((explain_failed, ts_query))
}
/// Get the database type for this connection
pub fn get_db_type(&self) -> DatabaseType {
match self {
DBConn::MySQLPooledConn(_) => DatabaseType::Mysql,
DBConn::PostgresConn(_) => DatabaseType::Postgres,
DBConn::SqliteConn(_) => DatabaseType::Sqlite,
}
}
}
pub struct DBConnections<'a> {
pub cache: &'a HashMap<String, Arc<Mutex<DBConn>>>,
}
impl<'a> DBConnections<'a> {
pub fn new(cache: &'a HashMap<String, Arc<Mutex<DBConn>>>) -> Self {
Self { cache }
}
pub fn get_connection(&mut self, raw_sql: &str) -> Arc<Mutex<DBConn>> {
let db_conn_name = &CONFIG.get_correct_db_connection(raw_sql);
let conn = self.cache.get(db_conn_name).expect(DB_CONN_FROM_LOCAL_CACHE_ERROR);
conn.to_owned()
}
}