use sqlx::mysql::MySqlPoolOptions; use sqlx::mysql::MySqlPool; use dotenvy::dotenv_override; use std::env; // use crate::schema::equipment::dsl::*; // use crate::schema::worker::dsl::*; use crate::models::*; pub struct DBOperator{ pool: MySqlPool, } impl DBOperator{ pub async fn new() -> Self{ dotenv_override().ok(); let db_url = env::var("DATABASE_URL").expect("DATABASE_URL установи!"); Self{pool: MySqlPool::connect(&db_url).await.unwrap()} } pub async fn get_position(&self) -> Result, sqlx::Error>{ let rets: Vec = sqlx::query_as:: <_, Position>("SELECT * FROM `position`").fetch_all(&self.pool).await?; Ok(rets) } pub async fn get_workers(&self) -> Result, sqlx::Error>{ let pre_rets: Vec = sqlx::query_as::<_, WorkerRow>("SELECT * FROM `worker`").fetch_all(&self.pool).await?; let mut rets:Vec = Vec::new(); let pos = self.get_position().await.unwrap(); for worker in pre_rets{ let mut ppos = Position::default(); for position in pos.clone(){ if position.id == worker.position_id{ ppos = position.clone(); break; } } rets.push(Worker{ id: worker.id, full_name: worker.full_name, hire_date: worker.hire_date, position: ppos, is_fired: worker.is_fired }); } Ok(rets) } pub async fn get_equipment(&self) -> Result,sqlx::Error>{ let pre_rets = sqlx::query_as::<_, EquipmentRow>("SELECT * FROM `equipment`").fetch_all(&self.pool).await?; let mut rets: Vec = Vec::new(); let workers = self.get_workers().await?; for eq in pre_rets{ let mut pworker = Worker::default(); for worker in workers.clone(){ if worker.id == eq.worker_id{ pworker = worker.clone(); break; } } rets.push(Equipment { id: eq.id, name: eq.name, inv_number: eq.inv_number, maintenance_date: eq.maintenance_date, worker: pworker }); } Ok(rets) } pub async fn check_worker(&self, worker: Worker) -> Result{ let ret = sqlx::query(&format!("SELECT * FROM `worker` WHERE full_name = {}, position_id = {}, hire_date = {}", worker.full_name, worker.position.id, worker.hire_date.to_string())).fetch_all(&self.pool).await?; if ret.len() > 0{ return Ok(true) } Ok(false) } pub async fn add_worker(&self, worker: Worker){ match sqlx::query!("INSERT INTO Brewery.worker (id, position_id, hire_date, is_fired, full_name) VALUES(0, ?, ?, ?, ?);",worker.position.id, worker.hire_date ,worker.is_fired,worker.full_name).fetch(&self.pool).{ Ok(_) =>{ } } } } pub async fn estabilish_connection() -> Result<(), sqlx::Error>{ dotenv_override().ok(); let db_url = env::var("DATABASE_URL").expect("DATABASE_URL установи!"); let pool = MySqlPoolOptions::new() .max_connections(5) .connect(&db_url).await?; Ok(()) }