| 798 | } |
| 799 | |
| 800 | fn del_view(&mut self, view: &ViewState) -> PristineResult<()> { |
| 801 | // Guard: Shared views cannot be deleted (they own global GRAPH edges). |
| 802 | if view.kind.is_shared() { |
| 803 | return Err(PristineError::CannotDeleteSharedView { |
| 804 | name: view.name.clone(), |
| 805 | }); |
| 806 | } |
| 807 | |
| 808 | // Guard: Check for child views that reference this view as parent. |
| 809 | // Deleting a parent would leave children with a dangling parent pointer. |
| 810 | let children = ViewTxnT::get_children_views(self, view.id)?; |
| 811 | if !children.is_empty() { |
| 812 | let child_names: Vec<String> = children.iter().map(|c| c.name.clone()).collect(); |
| 813 | return Err(PristineError::ViewHasChildren { |
| 814 | name: view.name.clone(), |
| 815 | children: child_names, |
| 816 | }); |
| 817 | } |
| 818 | |
| 819 | // Remove from VIEWS table |
| 820 | { |
| 821 | let mut table = self.txn.open_table(VIEWS)?; |
| 822 | table.remove(view.name.as_str())?; |
| 823 | } |
| 824 | |
| 825 | // Remove all change log entries for this view |
| 826 | { |
| 827 | let mut table = self.txn.open_table(VIEW_CHANGES)?; |
| 828 | for seq in 0..view.change_count { |
| 829 | let key = encode_view_seq(view.id, seq); |
| 830 | table.remove(&key)?; |
| 831 | } |
| 832 | } |
| 833 | |
| 834 | // Remove all reverse change log entries |
| 835 | { |
| 836 | let mut rev_table = self.txn.open_table(REV_VIEW_CHANGES)?; |
| 837 | let table = self.txn.open_table(VIEW_CHANGES)?; |
| 838 | for seq in 0..view.change_count { |
| 839 | let key = encode_view_seq(view.id, seq); |
| 840 | if let Some(change_id) = table.get(&key)? { |
| 841 | let rev_key = encode_view_seq(view.id, change_id.value()); |
| 842 | rev_table.remove(&rev_key)?; |
| 843 | } |
| 844 | } |
| 845 | } |
| 846 | |
| 847 | // Remove all state/sequence mappings from STATES table |
| 848 | { |
| 849 | let mut table = self.txn.open_table(STATES)?; |
| 850 | let merkle_table = self.txn.open_table(MERKLE_CHAIN)?; |
| 851 | for seq in 0..view.change_count { |
| 852 | let key = encode_view_seq(view.id, seq); |
| 853 | if let Some(merkle_bytes) = merkle_table.get(&key)? { |
| 854 | let merkle = merkle_bytes.value(); |
| 855 | let state_key = encode_view_merkle(view.id, merkle); |
| 856 | table.remove(&state_key)?; |
| 857 | } |