2024-11-11 19:31:40 +08:00
|
|
|
|
// /d:/data/echoes/backend/src/main.rs
|
2024-11-09 00:05:18 +08:00
|
|
|
|
|
2024-11-11 19:31:40 +08:00
|
|
|
|
/**
|
|
|
|
|
* 主程序入口,提供数据库连接和相关API接口。
|
|
|
|
|
*
|
|
|
|
|
* 接口:
|
|
|
|
|
* - GET /api/install: 测试数据库连接
|
|
|
|
|
* - GET /api/sql: 执行SQL查询并返回结果
|
|
|
|
|
*/
|
|
|
|
|
|
|
|
|
|
mod config; // 配置模块
|
|
|
|
|
mod sql; // SQL模块
|
|
|
|
|
use crate::sql::Database; // 引入数据库结构
|
|
|
|
|
use once_cell::sync::Lazy; // 用于延迟初始化
|
|
|
|
|
use rocket::{get, http::Status, launch, response::status, routes, serde::json::Json}; // 引入Rocket框架相关功能
|
|
|
|
|
use std::sync::Arc; // 引入Arc用于线程安全的引用计数
|
|
|
|
|
use tokio::sync::Mutex; // 引入Mutex用于异步锁
|
|
|
|
|
|
|
|
|
|
// 全局数据库连接变量
|
2024-11-11 13:45:02 +08:00
|
|
|
|
static DB: Lazy<Arc<Mutex<Option<Database>>>> = Lazy::new(|| Arc::new(Mutex::new(None)));
|
2024-11-09 00:05:18 +08:00
|
|
|
|
|
2024-11-11 19:31:40 +08:00
|
|
|
|
/**
|
|
|
|
|
* 初始化数据库连接
|
|
|
|
|
*
|
|
|
|
|
* # 参数
|
|
|
|
|
* - `database`: 数据库配置
|
|
|
|
|
*
|
|
|
|
|
* # 返回
|
|
|
|
|
* - `Result<(), Box<dyn std::error::Error>>`: 初始化结果
|
|
|
|
|
*/
|
2024-11-11 13:45:02 +08:00
|
|
|
|
async fn init_db(database: config::Database) -> Result<(), Box<dyn std::error::Error>> {
|
2024-11-11 19:31:40 +08:00
|
|
|
|
let database = Database::init(database).await?; // 初始化数据库
|
|
|
|
|
*DB.lock().await = Some(database); // 保存数据库实例
|
2024-11-11 01:38:58 +08:00
|
|
|
|
Ok(())
|
2024-11-09 00:05:18 +08:00
|
|
|
|
}
|
2024-11-11 19:31:40 +08:00
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* 获取数据库的引用
|
|
|
|
|
*
|
|
|
|
|
* # 返回
|
|
|
|
|
* - `Result<Database, Box<dyn std::error::Error>>`: 数据库实例或错误
|
|
|
|
|
*/
|
2024-11-11 01:38:58 +08:00
|
|
|
|
async fn get_db() -> Result<Database, Box<dyn std::error::Error>> {
|
2024-11-11 13:45:02 +08:00
|
|
|
|
DB.lock()
|
|
|
|
|
.await
|
|
|
|
|
.clone()
|
2024-11-11 19:31:40 +08:00
|
|
|
|
.ok_or_else(|| "Database not initialized".into()) // 返回错误信息
|
2024-11-09 00:05:18 +08:00
|
|
|
|
}
|
2024-11-11 19:31:40 +08:00
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* 测试数据库接口
|
|
|
|
|
*
|
|
|
|
|
* # 返回
|
|
|
|
|
* - `Result<Json<Vec<std::collections::HashMap<String, String>>>, status::Custom<String>>`: 查询结果或错误
|
|
|
|
|
*/
|
2024-11-09 00:05:18 +08:00
|
|
|
|
#[get("/sql")]
|
2024-11-11 19:31:40 +08:00
|
|
|
|
async fn ssql() -> Result<Json<Vec<std::collections::HashMap<String, String>>>, status::Custom<String>> {
|
2024-11-11 01:38:58 +08:00
|
|
|
|
let db = get_db().await.map_err(|e| {
|
2024-11-11 13:45:02 +08:00
|
|
|
|
status::Custom(
|
|
|
|
|
Status::InternalServerError,
|
2024-11-11 19:31:40 +08:00
|
|
|
|
format!("Database error: {}", e), // 数据库错误信息
|
2024-11-11 13:45:02 +08:00
|
|
|
|
)
|
2024-11-11 01:38:58 +08:00
|
|
|
|
})?;
|
|
|
|
|
|
2024-11-11 13:45:02 +08:00
|
|
|
|
let query_result = db
|
|
|
|
|
.get_db()
|
|
|
|
|
.query("SELECT * FROM info".to_string())
|
2024-11-11 01:38:58 +08:00
|
|
|
|
.await
|
2024-11-11 13:45:02 +08:00
|
|
|
|
.map_err(|e| status::Custom(Status::InternalServerError, format!("Query error: {}", e)))?;
|
2024-11-11 01:38:58 +08:00
|
|
|
|
|
2024-11-11 19:31:40 +08:00
|
|
|
|
Ok(Json(query_result)) // 返回查询结果
|
2024-11-09 00:05:18 +08:00
|
|
|
|
}
|
2024-11-11 19:31:40 +08:00
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* 数据库安装接口
|
|
|
|
|
*
|
|
|
|
|
* # 返回
|
|
|
|
|
* - `status::Custom<String>`: 连接成功或失败的信息
|
|
|
|
|
*/
|
2024-11-11 01:38:58 +08:00
|
|
|
|
#[get("/install")]
|
|
|
|
|
async fn install() -> status::Custom<String> {
|
2024-11-11 13:45:02 +08:00
|
|
|
|
get_db()
|
|
|
|
|
.await
|
2024-11-11 19:31:40 +08:00
|
|
|
|
.map(|_| status::Custom(Status::Ok, "Database connected successfully".into())) // 连接成功
|
2024-11-11 13:45:02 +08:00
|
|
|
|
.unwrap_or_else(|e| {
|
|
|
|
|
status::Custom(
|
|
|
|
|
Status::InternalServerError,
|
2024-11-11 19:31:40 +08:00
|
|
|
|
format!("Failed to connect: {}", e), // 连接失败信息
|
2024-11-11 13:45:02 +08:00
|
|
|
|
)
|
|
|
|
|
})
|
2024-11-11 01:38:58 +08:00
|
|
|
|
}
|
2024-11-11 19:31:40 +08:00
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* 启动Rocket应用
|
|
|
|
|
*
|
|
|
|
|
* # 返回
|
|
|
|
|
* - `rocket::Rocket`: Rocket实例
|
|
|
|
|
*/
|
2024-11-09 00:05:18 +08:00
|
|
|
|
#[launch]
|
|
|
|
|
async fn rocket() -> _ {
|
2024-11-11 19:31:40 +08:00
|
|
|
|
let config = config::Config::read("./src/config/config.toml").expect("Failed to read config"); // 读取配置
|
2024-11-11 13:45:02 +08:00
|
|
|
|
init_db(config.database)
|
|
|
|
|
.await
|
2024-11-11 19:31:40 +08:00
|
|
|
|
.expect("Failed to connect to database"); // 初始化数据库连接
|
|
|
|
|
rocket::build().mount("/api", routes![install, ssql]) // 挂载API路由
|
2024-11-11 13:45:02 +08:00
|
|
|
|
}
|