luna_orm/database/
mysql.rs1use 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}