(
&self,
prefix: &str,
entry_type_filter: Option<VaultEntryType>,
)
| 686 | } |
| 687 | |
| 688 | fn list_vault_entries( |
| 689 | &self, |
| 690 | prefix: &str, |
| 691 | entry_type_filter: Option<VaultEntryType>, |
| 692 | ) -> PristineResult<Vec<VaultEntryMeta>> { |
| 693 | let table = match self.txn.open_table(VAULT_ENTRIES) { |
| 694 | Ok(table) => table, |
| 695 | Err(redb::TableError::TableDoesNotExist(_)) => return Ok(Vec::new()), |
| 696 | Err(e) => return Err(PristineError::from(e)), |
| 697 | }; |
| 698 | |
| 699 | let mut results = Vec::new(); |
| 700 | |
| 701 | let iter = if prefix.is_empty() { |
| 702 | table.iter()? |
| 703 | } else { |
| 704 | table.range(prefix..)? |
| 705 | }; |
| 706 | |
| 707 | for item in iter { |
| 708 | let (key, value) = item?; |
| 709 | let key_str = key.value(); |
| 710 | |
| 711 | // Stop iterating once we pass the prefix range |
| 712 | if !prefix.is_empty() && !key_str.starts_with(prefix) { |
| 713 | break; |
| 714 | } |
| 715 | |
| 716 | let entry: VaultEntry = |
| 717 | postcard::from_bytes(value.value()).map_err(|e| PristineError::Serialization { |
| 718 | message: format!("failed to deserialize VaultEntry at '{}': {}", key_str, e), |
| 719 | })?; |
| 720 | |
| 721 | // Apply type filter |
| 722 | if let Some(ref filter) = entry_type_filter { |
| 723 | if entry.entry_type != *filter { |
| 724 | continue; |
| 725 | } |
| 726 | } |
| 727 | |
| 728 | results.push(VaultEntryMeta { |
| 729 | path: key_str.to_string(), |
| 730 | entry_type: entry.entry_type, |
| 731 | content_hash: entry.content_hash, |
| 732 | content_size: entry.content_bytes.len(), |
| 733 | updated_at: entry.updated_at, |
| 734 | }); |
| 735 | } |
| 736 | |
| 737 | Ok(results) |
| 738 | } |
| 739 | |
| 740 | fn get_vault_manifest(&self) -> PristineResult<VaultManifest> { |
| 741 | let table = match self.txn.open_table(VAULT_MANIFEST) { |
no test coverage detected