(
&self,
prefix: &str,
entry_type_filter: Option<VaultEntryType>,
)
| 842 | } |
| 843 | |
| 844 | fn list_vault_entries( |
| 845 | &self, |
| 846 | prefix: &str, |
| 847 | entry_type_filter: Option<VaultEntryType>, |
| 848 | ) -> PristineResult<Vec<VaultEntryMeta>> { |
| 849 | let table = match self.txn.open_table(VAULT_ENTRIES) { |
| 850 | Ok(table) => table, |
| 851 | Err(redb::TableError::TableDoesNotExist(_)) => return Ok(Vec::new()), |
| 852 | Err(e) => return Err(PristineError::from(e)), |
| 853 | }; |
| 854 | |
| 855 | let mut results = Vec::new(); |
| 856 | |
| 857 | let iter = if prefix.is_empty() { |
| 858 | table.iter()? |
| 859 | } else { |
| 860 | table.range(prefix..)? |
| 861 | }; |
| 862 | |
| 863 | for item in iter { |
| 864 | let (key, value) = item?; |
| 865 | let key_str = key.value(); |
| 866 | |
| 867 | // Stop iterating once we pass the prefix range |
| 868 | if !prefix.is_empty() && !key_str.starts_with(prefix) { |
| 869 | break; |
| 870 | } |
| 871 | |
| 872 | let entry: VaultEntry = |
| 873 | postcard::from_bytes(value.value()).map_err(|e| PristineError::Serialization { |
| 874 | message: format!("failed to deserialize VaultEntry at '{}': {}", key_str, e), |
| 875 | })?; |
| 876 | |
| 877 | // Apply type filter |
| 878 | if let Some(ref filter) = entry_type_filter { |
| 879 | if entry.entry_type != *filter { |
| 880 | continue; |
| 881 | } |
| 882 | } |
| 883 | |
| 884 | results.push(VaultEntryMeta { |
| 885 | path: key_str.to_string(), |
| 886 | entry_type: entry.entry_type, |
| 887 | content_hash: entry.content_hash, |
| 888 | content_size: entry.content_bytes.len(), |
| 889 | updated_at: entry.updated_at, |
| 890 | }); |
| 891 | } |
| 892 | |
| 893 | Ok(results) |
| 894 | } |
| 895 | |
| 896 | fn get_vault_manifest(&self) -> PristineResult<VaultManifest> { |
| 897 | let table = match self.txn.open_table(VAULT_MANIFEST) { |
no test coverage detected