| 722 | } |
| 723 | |
| 724 | pub fn update_all_userdata<F, C>(&self, check: C, mut func: F) |
| 725 | where |
| 726 | C: Fn(&D) -> bool, |
| 727 | F: FnMut(&mut D), |
| 728 | { |
| 729 | let mut wrtxn = self.cache.write_stats(TraceStat::default()); |
| 730 | |
| 731 | let keys: Vec<_> = wrtxn |
| 732 | .iter() |
| 733 | .filter_map(|(k, mref)| { |
| 734 | if check(&mref.userdata) { |
| 735 | Some(k.clone()) |
| 736 | } else { |
| 737 | None |
| 738 | } |
| 739 | }) |
| 740 | .collect(); |
| 741 | |
| 742 | for k in keys { |
| 743 | if let Some(mref) = wrtxn.get_mut(&k, false) { |
| 744 | func(&mut mref.userdata); |
| 745 | |
| 746 | let objmeta = CacheObjMeta { |
| 747 | key: mref.key.clone(), |
| 748 | path: mref.fhandle.path.clone(), |
| 749 | crc: mref.fhandle.crc, |
| 750 | userdata: mref.userdata.clone(), |
| 751 | }; |
| 752 | |
| 753 | // This will truncate the metadata if it does exist. |
| 754 | let m_file = File::create(&mref.fhandle.meta_path) |
| 755 | .map(BufWriter::new) |
| 756 | .map_err(|e| { |
| 757 | error!("Failed to open metadata {:?}", e); |
| 758 | }) |
| 759 | .unwrap(); |
| 760 | |
| 761 | serde_json::to_writer(m_file, &objmeta) |
| 762 | .map_err(|e| { |
| 763 | error!("Failed to write metadata {:?}", e); |
| 764 | }) |
| 765 | .unwrap(); |
| 766 | |
| 767 | info!("Persisted metadata for {:?}", &mref.fhandle.meta_path); |
| 768 | } |
| 769 | } |
| 770 | |
| 771 | debug!("commit"); |
| 772 | let stats = wrtxn.commit(); |
| 773 | let mut stat_guard = self.stats.write(); |
| 774 | (*stat_guard).update(stats); |
| 775 | stat_guard.commit(); |
| 776 | } |
| 777 | |
| 778 | // Remove a key |
| 779 | pub fn remove(&self, k: K) { |