感谢AI
use std::fmt::format;
use mysql::*;
use lazy_static::lazy_static;
use std::sync::Mutex;
use std::thread::sleep;
use std::time::Duration;
use log::log;
use mysql::prelude::Queryable;
use data::base::{ListData,SqlInstance};
use crate::data;lazy_static! {pub static ref MYSQL_USER:Mutex<String> = Mutex::new(String::from("root"));pub static ref MYSQL_PASSWORD:Mutex<String> = Mutex::new(String::from("123456"));pub static ref MYSQL_POOL: Mutex<Pool> = Mutex::new(Pool::new(format!("mysql://{}:{}@localhost::3306/ERP",MYSQL_USER.lock().unwrap().as_str(),MYSQL_PASSWORD.lock().unwrap().as_str()).as_str()).expect("Connection to Mysql Error"));
}//FIXME: 链接出错直接关闭回收链接错误
#[allow(non_snake_case)]
fn MysqlPoolConnect(max_retries:i32,delay:u64) -> Result<PooledConn> {let mut attempts = 0;let retry_delay = Duration::from_secs(delay); // 设置重试的间隔时间loop {attempts += 1;let pool = MYSQL_POOL.lock()?;let conn_result = pool.get_conn();match conn_result {Ok(conn) => {return Ok(conn);}Err(err) => {if attempts >= max_retries {return Err(err);}eprintln!("Failed to connect to database, attempt {} of {}: {}", attempts, max_retries, err);sleep(retry_delay);}}}
}#[allow(non_snake_case)]
pub fn MysqlPoolSql(query:&mut SqlInstance){match MysqlPoolConnect(3,1) {Ok(mut pool) => {query.buffer = pool.query_map(query.filter.as_str(),|(id,name)| ListData { id,name, name_and_color: "".to_string(), avatar: "".to_string(), zh_size: "".to_string(), u_size: "".to_string(), factory_name: "".to_string(), output: 0, input: 0, diff: 0, threshold: 0, inputDate: "".to_string(), outputDate: "".to_string() }).unwrap();}Err(err) => {query.result = false;eprintln!("Failed to connect to database: {}", err);}}
}
Rust 的全局静态挺麻烦,语言默认是非安全的操作
Rust 有spdlog的 日志封装