From 709b743676ace2f3805fbd1a7b23758cd9b9263d Mon Sep 17 00:00:00 2001 From: huangzhe <3451701311@qq.com> Date: Fri, 1 Aug 2025 14:13:41 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E4=BD=BF=E7=94=A8=20diesel=20=E6=9B=BF?= =?UTF-8?q?=E4=BB=A3=20r2d2=5Fsqlite?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .idea/dataSources.xml | 22 +++++++++++++ .idea/dictionaries/project.xml | 7 ++++ .idea/serv.iml | 2 ++ .vscode/settings.json | 6 +++- db.sqlite | 0 packages/gotify-ws/Cargo.toml | 5 +-- packages/gotify-ws/src/main.rs | 14 ++++---- packages/gotify-ws/src/model/ws.rs | 17 ++++++---- packages/gotify-ws/src/utils/sql/mod.rs | 3 +- .../gotify-ws/src/utils/sql/sqlite/mod.rs | 30 ++++++++++------- .../src/utils/sql/sqlite/sql_line.rs | 21 ++++-------- packages/gotify-ws/src/utils/sql/tests/mod.rs | 1 + .../gotify-ws/src/utils/sql/tests/sqlite.rs | 32 +++++++++++++++++++ 13 files changed, 116 insertions(+), 44 deletions(-) create mode 100644 .idea/dictionaries/project.xml delete mode 100644 db.sqlite create mode 100644 packages/gotify-ws/src/utils/sql/tests/mod.rs create mode 100644 packages/gotify-ws/src/utils/sql/tests/sqlite.rs diff --git a/.idea/dataSources.xml b/.idea/dataSources.xml index 7939530..b6a716b 100644 --- a/.idea/dataSources.xml +++ b/.idea/dataSources.xml @@ -15,5 +15,27 @@ jdbc:sqlite:D:\dev\code\mine\home-api\database.sqlite $ProjectFileDir$ + + sqlite.xerial + true + org.sqlite.JDBC + jdbc:sqlite:D:\code\mine\rust\home-api\packages\gotify-ws\test.sqlite + $ProjectFileDir$ + + + sqlite.xerial + true + org.sqlite.JDBC + jdbc:sqlite:D:\code\mine\rust\home-api\database.sqlite + $ProjectFileDir$ + + + file://$APPLICATION_CONFIG_DIR$/jdbc-drivers/Xerial SQLiteJDBC/3.45.1/org/xerial/sqlite-jdbc/3.45.1.0/sqlite-jdbc-3.45.1.0.jar + + + file://$APPLICATION_CONFIG_DIR$/jdbc-drivers/Xerial SQLiteJDBC/3.45.1/org/slf4j/slf4j-api/1.7.36/slf4j-api-1.7.36.jar + + + \ No newline at end of file diff --git a/.idea/dictionaries/project.xml b/.idea/dictionaries/project.xml new file mode 100644 index 0000000..65f4cb9 --- /dev/null +++ b/.idea/dictionaries/project.xml @@ -0,0 +1,7 @@ + + + + gotify + + + \ No newline at end of file diff --git a/.idea/serv.iml b/.idea/serv.iml index cf84ae4..d80460a 100644 --- a/.idea/serv.iml +++ b/.idea/serv.iml @@ -2,6 +2,8 @@ + + diff --git a/.vscode/settings.json b/.vscode/settings.json index 2b6429b..83960f6 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -1,5 +1,9 @@ { "cSpell.words": [ - "actix" + "actix", + "gotify", + "hzer", + "serde", + "tungstenite" ] } \ No newline at end of file diff --git a/db.sqlite b/db.sqlite deleted file mode 100644 index e69de29..0000000 diff --git a/packages/gotify-ws/Cargo.toml b/packages/gotify-ws/Cargo.toml index 5a54823..3eec402 100644 --- a/packages/gotify-ws/Cargo.toml +++ b/packages/gotify-ws/Cargo.toml @@ -4,13 +4,14 @@ version = "0.1.0" edition = "2024" [dependencies] +diesel = { version = "2.2.12", features = ["r2d2", "serde_json", "sqlite"] } env_logger = "0.11.8" futures = "0.3.31" log = "0.4.27" r2d2 = "0.8.10" -r2d2_sqlite = "0.31.0" +#r2d2_sqlite = "0.31.0" rusqlite = { version = "0.37.0", features = ["bundled"] } serde = { version = "1.0.219", features = ["derive"] } -serde_json = "1.0.133" +serde_json = "1.0.142" tokio = { version = "1.47.0", features = ["full"] } tokio-tungstenite = { version = "0.27.0", features = ["native-tls"] } diff --git a/packages/gotify-ws/src/main.rs b/packages/gotify-ws/src/main.rs index 9d579d4..40eedcb 100644 --- a/packages/gotify-ws/src/main.rs +++ b/packages/gotify-ws/src/main.rs @@ -6,20 +6,20 @@ use futures::StreamExt; use log::info; use serde_json; use tokio_tungstenite::connect_async; -use utils::{logger, sql}; use utils::sql::sqlite::SqliteDB; +use utils::{logger, sql}; #[tokio::main] async fn main() { logger::init_logger(); - const WS: &str = "wss://home.hzer.xyz/gotify/stream?token=CDIwYlYJuxWxVr5"; - let (stream, _) = connect_async(WS).await.unwrap(); - info!("Connected to Gotify server {WS}"); - + const ADDR: &str = "wss://home.hzer.xyz/gotify/stream?token=CDIwYlYJuxWxVr5"; + let (stream, _) = connect_async(ADDR).await.unwrap(); + info!("Connected to Gotify server {ADDR}"); + let (_, mut read) = stream.split(); while let Some(msg) = read.next().await { match msg { Ok(msg) => { - let str = msg.to_text().unwrap().to_string(); + let str = msg.to_text().unwrap(); match serde_json::from_str::(&str) { Ok(ws) => { info!("Got {} from Gotify", ws.message); @@ -27,7 +27,7 @@ async fn main() { db.create_table(); } Err(_) => { - info!("监听到心跳{}", &str) + info!("监听到心跳{}", &msg) } } } diff --git a/packages/gotify-ws/src/model/ws.rs b/packages/gotify-ws/src/model/ws.rs index f69910e..6c0a46c 100644 --- a/packages/gotify-ws/src/model/ws.rs +++ b/packages/gotify-ws/src/model/ws.rs @@ -1,9 +1,12 @@ -#[derive(Debug, serde::Deserialize)] +use diesel::Queryable; +use serde::Deserialize; + +#[derive(Debug, Deserialize, Queryable)] pub struct WsMessage { - id: u64, - appid: u64, - pub message: String, - title: String, - priority: u64, - date: String, + id: u64, + appid: u64, + pub message: String, + title: String, + priority: u64, + date: String, } diff --git a/packages/gotify-ws/src/utils/sql/mod.rs b/packages/gotify-ws/src/utils/sql/mod.rs index 78f2d8f..0382ff2 100644 --- a/packages/gotify-ws/src/utils/sql/mod.rs +++ b/packages/gotify-ws/src/utils/sql/mod.rs @@ -1 +1,2 @@ -pub mod sqlite; \ No newline at end of file +pub mod sqlite; +mod tests; \ No newline at end of file diff --git a/packages/gotify-ws/src/utils/sql/sqlite/mod.rs b/packages/gotify-ws/src/utils/sql/sqlite/mod.rs index bcd4bb1..c5cfb24 100644 --- a/packages/gotify-ws/src/utils/sql/sqlite/mod.rs +++ b/packages/gotify-ws/src/utils/sql/sqlite/mod.rs @@ -1,21 +1,23 @@ mod sql_line; +use crate::utils::sql::sqlite::sql_line::CREATE_TABLE; +use diesel::RunQueryDsl; +use diesel::r2d2::ConnectionManager; +use diesel::sqlite::SqliteConnection; use log::warn; -use r2d2::{Pool}; -use r2d2_sqlite::SqliteConnectionManager; -use crate::utils::sql::sqlite::sql_line::{generate_sql_line}; +use r2d2::Pool; -#[derive(Debug)] +// #[derive(Debug)] pub struct SqliteDB { - pub connection_pool: Pool, + pub connection_pool: Pool>, } impl SqliteDB { pub fn new(address: &str) -> Option { - let manager = SqliteConnectionManager::file(address); + let manager = ConnectionManager::::new(address); match Pool::builder().build(manager) { Ok(pool) => Some(SqliteDB { - connection_pool: pool + connection_pool: pool, }), Err(e) => { warn!("Failed to create connection pool: {}", e); @@ -23,9 +25,15 @@ impl SqliteDB { } } } + pub fn create_table(&self) { - let conn = self.connection_pool.get().unwrap(); - let line = generate_sql_line(); - conn.execute(line.get("create_table").unwrap(), []).expect(&format!("Failed to create db table: {:?}", self)); + let mut conn = self + .connection_pool + .get() + .expect("无法连接,数据库连接池未初始化"); + + diesel::sql_query(CREATE_TABLE) + .execute(&mut conn) + .expect("创建表失败"); } -} \ No newline at end of file +} diff --git a/packages/gotify-ws/src/utils/sql/sqlite/sql_line.rs b/packages/gotify-ws/src/utils/sql/sqlite/sql_line.rs index 391e088..2ca5af7 100644 --- a/packages/gotify-ws/src/utils/sql/sqlite/sql_line.rs +++ b/packages/gotify-ws/src/utils/sql/sqlite/sql_line.rs @@ -1,15 +1,6 @@ -use std::collections::HashMap; - -pub fn generate_sql_line() -> HashMap<&'static str, &'static str> { - let mut line = HashMap::new(); - line.insert("create_table", " - CREATE TABLE IF NOT EXISTS gotify ( - id INTEGER PRIMARY KEY, - appid INTEGER, - message TEXT, - title TEXT, - priority INTEGER, - date TEXT - "); - line -} \ No newline at end of file +pub static CREATE_TABLE: &'static str = r#"CREATE TABLE IF NOT EXISTS gotify ( + id INTEGER PRIMARY KEY, + appid INTEGER, + message TEXT, + title TEXT, + priority INTEGER, date TEXT)"#; diff --git a/packages/gotify-ws/src/utils/sql/tests/mod.rs b/packages/gotify-ws/src/utils/sql/tests/mod.rs new file mode 100644 index 0000000..80f2bb3 --- /dev/null +++ b/packages/gotify-ws/src/utils/sql/tests/mod.rs @@ -0,0 +1 @@ +mod sqlite; \ No newline at end of file diff --git a/packages/gotify-ws/src/utils/sql/tests/sqlite.rs b/packages/gotify-ws/src/utils/sql/tests/sqlite.rs new file mode 100644 index 0000000..c21a36d --- /dev/null +++ b/packages/gotify-ws/src/utils/sql/tests/sqlite.rs @@ -0,0 +1,32 @@ +#[cfg(test)] +mod sqlite_test { + use std::fs::remove_file; + use std::path::Path; + + use crate::utils::sql::sqlite::SqliteDB; + + #[test] + fn new_database() { + let file_path: &str = "test.sqlite"; + SqliteDB::new(&file_path).unwrap(); + + let file = Path::new(&file_path); + assert!(file.exists()); + + if file.exists() { + remove_file(file).unwrap(); + } + } + + #[test] + fn create_table() { + let file_path: &str = "test.sqlite"; + let db = SqliteDB::new(&file_path).unwrap(); + db.create_table(); + drop(db.connection_pool); + + if Path::new(&file_path).exists() { + remove_file(file_path).unwrap(); + } + } +}