@@ -722,20 +722,14 @@ impl FoldersTree {
722
722
} ) ;
723
723
}
724
724
725
- fn delete_folder (
726
- & mut self ,
727
- id : u32 ,
728
- now_ms : u64 ,
729
- checker : impl FnOnce ( & FolderMetadata ) -> Result < ( ) , String > ,
730
- ) -> Result < bool , String > {
725
+ fn delete_folder ( & mut self , id : u32 , now_ms : u64 ) -> Result < bool , String > {
731
726
if id == 0 {
732
727
Err ( "root folder cannot be deleted" . to_string ( ) ) ?;
733
728
}
734
729
735
730
let parent_id = match self . get ( & id) {
736
731
None => return Ok ( false ) ,
737
732
Some ( folder) => {
738
- checker ( folder) ?;
739
733
if folder. status > 0 {
740
734
Err ( "folder is readonly" . to_string ( ) ) ?;
741
735
}
@@ -1349,7 +1343,44 @@ pub mod fs {
1349
1343
now_ms : u64 ,
1350
1344
checker : impl FnOnce ( & FolderMetadata ) -> Result < ( ) , String > ,
1351
1345
) -> Result < bool , String > {
1352
- FOLDERS . with ( |r| r. borrow_mut ( ) . delete_folder ( id, now_ms, checker) )
1346
+ if id == 0 {
1347
+ Err ( "root folder cannot be deleted" . to_string ( ) ) ?;
1348
+ }
1349
+
1350
+ FOLDERS . with ( |r| {
1351
+ let mut folders = r. borrow_mut ( ) ;
1352
+ let folder = folders. parent_to_update ( id) ?;
1353
+ let files = folder. files . clone ( ) ;
1354
+ checker ( & folder) ?;
1355
+
1356
+ FS_METADATA_STORE . with ( |r| {
1357
+ let mut fs_metadata = r. borrow_mut ( ) ;
1358
+
1359
+ FS_CHUNKS_STORE . with ( |r| {
1360
+ let mut fs_data = r. borrow_mut ( ) ;
1361
+ for id in files {
1362
+ match fs_metadata. get ( & id) {
1363
+ Some ( file) => {
1364
+ if file. status < 1 && fs_metadata. remove ( & id) . is_some ( ) {
1365
+ folder. files . remove ( & id) ;
1366
+ if let Some ( hash) = file. hash {
1367
+ HASHS . with ( |r| r. borrow_mut ( ) . remove ( & hash) ) ;
1368
+ }
1369
+
1370
+ for i in 0 ..file. chunks {
1371
+ fs_data. remove ( & FileId ( id, i) ) ;
1372
+ }
1373
+ }
1374
+ }
1375
+ None => {
1376
+ folder. files . remove ( & id) ;
1377
+ }
1378
+ }
1379
+ }
1380
+ } ) ;
1381
+ } ) ;
1382
+ folders. delete_folder ( id, now_ms)
1383
+ } )
1353
1384
}
1354
1385
1355
1386
pub fn delete_file (
@@ -2139,11 +2170,11 @@ mod test {
2139
2170
fn test_folders_delete_folder ( ) {
2140
2171
let mut tree = FoldersTree :: new ( ) ;
2141
2172
assert ! ( tree
2142
- . delete_folder( 0 , 99 , |_| Ok ( ( ) ) )
2173
+ . delete_folder( 0 , 99 )
2143
2174
. err( )
2144
2175
. unwrap( )
2145
2176
. contains( "root folder cannot be deleted" ) ) ;
2146
- assert ! ( !tree. delete_folder( 1 , 99 , |_| Ok ( ( ) ) ) . unwrap( ) ) ;
2177
+ assert ! ( !tree. delete_folder( 1 , 99 ) . unwrap( ) ) ;
2147
2178
tree. add_folder (
2148
2179
FolderMetadata {
2149
2180
parent : 0 ,
@@ -2158,25 +2189,25 @@ mod test {
2158
2189
)
2159
2190
. unwrap ( ) ;
2160
2191
assert ! ( tree
2161
- . delete_folder( 1 , 99 , |_| Ok ( ( ) ) )
2192
+ . delete_folder( 1 , 99 )
2162
2193
. err( )
2163
2194
. unwrap( )
2164
2195
. contains( "folder is readonly" ) ) ;
2165
2196
tree. get_mut ( & 1 ) . unwrap ( ) . status = 0 ;
2166
2197
assert ! ( tree
2167
- . delete_folder( 1 , 99 , |_| Ok ( ( ) ) )
2198
+ . delete_folder( 1 , 99 )
2168
2199
. err( )
2169
2200
. unwrap( )
2170
2201
. contains( "folder is not empty" ) ) ;
2171
2202
tree. get_mut ( & 1 ) . unwrap ( ) . files . clear ( ) ;
2172
2203
tree. get_mut ( & 0 ) . unwrap ( ) . status = 1 ;
2173
2204
assert ! ( tree
2174
- . delete_folder( 1 , 99 , |_| Ok ( ( ) ) )
2205
+ . delete_folder( 1 , 99 )
2175
2206
. err( )
2176
2207
. unwrap( )
2177
2208
. contains( "parent folder is not writable" ) ) ;
2178
2209
tree. get_mut ( & 0 ) . unwrap ( ) . status = 0 ;
2179
- assert ! ( tree. delete_folder( 1 , 99 , |_| Ok ( ( ) ) ) . unwrap( ) ) ;
2210
+ assert ! ( tree. delete_folder( 1 , 99 ) . unwrap( ) ) ;
2180
2211
assert_eq ! ( tree. len( ) , 1 ) ;
2181
2212
assert_eq ! ( tree. get_mut( & 0 ) . unwrap( ) . folders, BTreeSet :: new( ) ) ;
2182
2213
assert_eq ! ( tree. get_mut( & 0 ) . unwrap( ) . updated_at, 99 ) ;
0 commit comments