luna_orm/database/
mysql.rs

1use crate::database::lib::Database;
2use crate::database::lib::DatabaseType;
3use crate::database::DB;
4use crate::{error::LunaOrmError, LunaOrmResult};
5
6use sqlx::any::AnyConnectOptions;
7use sqlx::AnyPool;
8
9use crate::command_executor::CommandExecutor;
10use crate::sql_executor::SqlExecutor;
11use crate::sql_generator::MySqlGenerator;
12use crate::sql_generator::SqlGenerator;
13use luna_orm_trait::Entity;
14use std::str::FromStr;
15use tracing::debug;
16
17#[derive(Debug)]
18pub struct MysqlDatabase {
19    database_type: DatabaseType,
20    pool: AnyPool,
21    sql_generator: MySqlGenerator,
22}
23
24impl SqlExecutor for MysqlDatabase {
25    fn get_pool(&self) -> LunaOrmResult<&AnyPool> {
26        Ok(&self.pool)
27    }
28}
29
30impl CommandExecutor for MysqlDatabase {
31    type G = MySqlGenerator;
32
33    fn get_generator(&self) -> &Self::G {
34        &self.sql_generator
35    }
36
37    async fn create<'a>(&mut self, entity: &'a mut dyn Entity) -> LunaOrmResult<bool> {
38        debug!(target: "luna_orm", command = "create",  entity = ?entity);
39        let sql = self.get_generator().get_insert_sql(entity);
40        debug!(target: "luna_orm", command = "create", sql = sql);
41        let args = entity.any_arguments_of_insert();
42        let result = self.execute(&sql, args).await?;
43        entity.set_auto_increment_field(result.last_insert_id());
44        debug!(target: "luna_orm", command = "create", result = ?entity);
45        return Ok(result.rows_affected() > 0);
46    }
47}
48
49impl Database for MysqlDatabase {
50    fn get_type(&self) -> &DatabaseType {
51        &self.database_type
52    }
53}
54
55impl From<MysqlDatabase> for DB<MysqlDatabase> {
56    fn from(value: MysqlDatabase) -> Self {
57        Self(value)
58    }
59}
60
61impl MysqlDatabase {
62    pub async fn build(url: &str, user: &str, password: &str) -> LunaOrmResult<Self> {
63        let url = format!("mysql://{}:{}@{}", user, password, url);
64
65        let any_options = AnyConnectOptions::from_str(&url).unwrap();
66        let pool = AnyPool::connect_with(any_options)
67            .await
68            .map_err(|_e| LunaOrmError::DatabaseInitFail("init pool fail".to_string()))?;
69
70        let generator = MySqlGenerator::new();
71        let database = MysqlDatabase {
72            database_type: DatabaseType::MySql,
73            pool,
74            sql_generator: generator,
75        };
76        return Ok(database);
77    }
78}