性能优化

This commit is contained in:
zhongluofeng
2026-08-06 10:33:16 +08:00
parent c7578a2e6b
commit e66c53e66d
105 changed files with 7273 additions and 5002 deletions
+13 -8
View File
@@ -3,12 +3,13 @@
//! 表结构见 `init_db`。所有方法线程安全(内部 Mutex 包裹 Connection)。
use rusqlite::{params, Connection, OptionalExtension};
use specta::Type;
use std::fs;
use std::path::PathBuf;
use std::sync::Mutex;
/// 列表项(不含大字段,用于历史/搜索结果)
#[derive(Debug, Clone, serde::Serialize)]
#[derive(Debug, Clone, serde::Serialize, Type)]
#[serde(rename_all = "camelCase")]
pub struct ClipboardItem {
pub id: i64,
@@ -21,7 +22,7 @@ pub struct ClipboardItem {
}
/// 详情(含文本内容或图片 base64)
#[derive(Debug, Clone, serde::Serialize)]
#[derive(Debug, Clone, serde::Serialize, Type)]
#[serde(rename_all = "camelCase")]
pub struct ClipboardItemDetail {
#[serde(flatten)]
@@ -206,10 +207,11 @@ impl Storage {
}
/// 获取详情(含文本/图片预览 base64)
/// 先锁内查询数据,释放锁后再执行耗时编码(DIB→PNG + base64),避免长时间占用连接锁
pub fn get_detail(&self, id: i64, image_to_base64: impl Fn(&[u8]) -> Option<String>) -> Option<ClipboardItemDetail> {
let conn = self.conn.lock().ok()?;
let row = conn
.query_row(
let (item, content, blob) = {
let conn = self.conn.lock().ok()?;
conn.query_row(
"SELECT id, kind, preview, size, pinned, pinned_order, created_at, content, blob
FROM clipboard_history WHERE id = ?1",
params![id],
@@ -232,8 +234,9 @@ impl Storage {
))
},
)
.ok()?;
let (item, content, blob) = row;
.ok()?
};
// conn 已在此处释放,以下编码不占用连接锁
let image_base64 = if item.kind == "image" {
blob.as_deref().and_then(|b| image_to_base64(b))
} else {
@@ -342,6 +345,7 @@ impl Storage {
}
/// 按搜索关键词统计匹配的非固定条目总数
/// 与 `search` 保持一致的匹配字段(preview + content),避免分页总数错误
pub fn count_search(&self, query: &str) -> i64 {
let conn = match self.conn.lock() {
Ok(c) => c,
@@ -349,7 +353,8 @@ impl Storage {
};
let pattern = format!("%{}%", query);
conn.query_row(
"SELECT COUNT(*) FROM clipboard_history WHERE pinned = 0 AND preview LIKE ?1",
"SELECT COUNT(*) FROM clipboard_history
WHERE pinned = 0 AND (preview LIKE ?1 OR content LIKE ?1)",
params![pattern],
|r| r.get(0),
)