1- use super :: { models:: { CreateFileDTO , File , FileFilter , FileCondition } , AppError } ;
1+ use super :: { models:: { UpdateFileDTO , CreateFileDTO , File , FileFilter , FileCondition } } ;
22use diesel:: prelude:: * ;
33
4- pub fn create_file ( conn : & mut SqliteConnection , new_file : & CreateFileDTO ) -> Result < File , AppError > {
4+ pub fn create_file ( conn : & mut SqliteConnection , new_file : & CreateFileDTO ) -> Result < usize , diesel :: result :: Error > {
55 diesel:: insert_into ( files:: table)
6- . values ( new_file)
7- // NOTE: as_returning 只有一部分数据库支持
8- // TODO: 若不支持则需要另外处理
9- . returning ( File :: as_returning ( ) )
10- . get_result ( conn)
11- . map_err ( |e| AppError :: CreateFileFailed ( e. to_string ( ) ) )
6+ . values ( new_file) . execute ( conn)
127}
138
9+ pub fn find_file_by_id ( conn : & mut SqliteConnection , _id : i32 ) -> Result < Option < File > , diesel:: result:: Error > {
10+ files:: table
11+ . filter ( files:: id. eq ( _id) )
12+ . select ( File :: as_select ( ) )
13+ . first ( conn)
14+ . optional ( )
15+ }
1416pub fn increase_file_reference_count (
1517 conn : & mut SqliteConnection ,
1618 file_id : i32 ,
17- ) -> Result < ( ) , AppError > {
19+ ) -> Result < usize , diesel :: result :: Error > {
1820 diesel:: update ( files:: table. find ( file_id) )
1921 . set ( files:: reference_count. eq ( files:: reference_count + 1 ) )
20- . execute ( conn) ?;
21-
22- Ok ( ( ) )
22+ . execute ( conn)
2323}
2424
25- #[ allow( dead_code) ]
2625pub fn decrease_file_reference_count (
2726 conn : & mut SqliteConnection ,
2827 file_id : i32 ,
29- ) -> Result < ( ) , AppError > {
28+ ) -> Result < usize , diesel :: result :: Error > {
3029 diesel:: update ( files:: table. find ( file_id) )
3130 . set ( files:: reference_count. eq ( files:: reference_count - 1 ) )
32- . execute ( conn) ?;
33-
34- Ok ( ( ) )
31+ . execute ( conn)
3532}
3633
3734#[ deprecated]
@@ -64,52 +61,10 @@ pub fn select_files(
6461 base_query. load ( conn)
6562}
6663
67- // pub fn update_file(
68- // conn: &mut SqliteConnection,
69- // update_input: UpdateFile,
70- // ) -> Result<usize, diesel::result::Error> {
71- // // 初始化更新查询
72- // let mut query = diesel::update(files).into_boxed();
73-
74- // // 动态设置需要更新的字段
75- // if let Some(new_path) = update_input.set.path {
76- // query = query.set(path.eq(new_path));
77- // }
78- // if let Some(new_type) = update_input.set.type_ {
79- // query = query.set(type_.eq(new_type));
80- // }
81- // if let Some(new_ref_count) = update_input.set.reference_count {
82- // query = query.set(reference_count.eq(new_ref_count));
83- // }
84- // if let Some(new_group) = update_input.set.group_id {
85- // query = query.set(group_id.eq(new_group));
86- // }
87-
88- // // 动态添加过滤条件
89- // if let Some(file_id) = update_input.filter.id {
90- // query = query.filter(id.eq(file_id));
91- // }
92- // if let Some(file_type) = update_input.filter.type_ {
93- // query = query.filter(type_.eq(file_type));
94- // }
95- // if let Some(file_path) = update_input.filter.path {
96- // query = query.filter(path.eq(file_path));
97- // }
98- // if let Some(ref_count) = update_input.filter.reference_count {
99- // query = query.filter(reference_count.eq(ref_count));
100- // }
101- // if let Some(group) = update_input.filter.group_id {
102- // query = query.filter(group_id.eq(group));
103- // }
104- // query.load(conn)
105- // }
106-
107- pub fn delete_file ( conn : & mut SqliteConnection , file_id : i32 ) -> Result < ( ) , diesel:: result:: Error > {
108- match diesel:: delete ( files. filter ( files:: id. eq ( file_id) ) ) . execute ( conn) {
109- Ok ( _) => Ok ( ( ) ) ,
110- Err ( e) => Err ( e) ,
111- }
64+ pub fn delete_file_by_id ( conn : & mut SqliteConnection , file_id : i32 ) -> Result < usize , diesel:: result:: Error > {
65+ diesel:: delete ( files. filter ( files:: id. eq ( file_id) ) ) . execute ( conn)
11266}
67+
11368use crate :: model:: schema:: files;
11469use crate :: model:: schema:: files:: dsl:: * ;
11570use std:: fmt:: { Debug , Formatter , Result as fmtResult} ;
@@ -126,8 +81,6 @@ impl Debug for File {
12681 }
12782}
12883
129- use diesel:: dsl:: not;
130- use crate :: model:: models:: UpdateFileDTO ;
13184
13285// 将 FileCondition 转换为 diesel 查询条件的辅助函数
13386// 更新 build_condition 函数以处理新增的条件类型
@@ -173,7 +126,7 @@ fn build_file_condition(condition: FileCondition) -> Box<dyn BoxableExpression<f
173126 } ,
174127 FileCondition :: Not ( condition) => {
175128 let expr = build_file_condition ( * condition) ;
176- Box :: new ( not ( expr) )
129+ Box :: new ( diesel :: dsl :: not ( expr) )
177130 }
178131 }
179132}
@@ -203,7 +156,7 @@ pub fn update_files_by_conditions(
203156 conn : & mut SqliteConnection ,
204157 conditions : Vec < FileCondition > ,
205158 update_set : UpdateFileDTO ,
206- ) -> Result < usize , AppError > {
159+ ) -> Result < usize , diesel :: result :: Error > {
207160 let mut query = diesel:: update ( files:: table) . into_boxed :: < Sqlite > ( ) ;
208161
209162 // 应用所有条件
@@ -212,7 +165,20 @@ pub fn update_files_by_conditions(
212165 query = query. filter ( boxed_condition) ;
213166 }
214167
215- let result = query. set ( update_set) . execute ( conn) ?;
216- Ok ( result)
168+ query. set ( update_set) . execute ( conn)
217169}
218170
171+ pub fn delete_files_by_conditions (
172+ conn : & mut SqliteConnection ,
173+ conditions : Vec < FileCondition > ,
174+ ) -> Result < usize , diesel:: result:: Error > {
175+ let mut query = diesel:: delete ( files:: table) . into_boxed :: < Sqlite > ( ) ;
176+
177+ // 应用所有条件
178+ for condition in conditions {
179+ let boxed_condition = build_file_condition ( condition) ;
180+ query = query. filter ( boxed_condition) ;
181+ }
182+
183+ query. execute ( conn)
184+ }
0 commit comments