| 1272 | } |
| 1273 | |
| 1274 | fn del_view(&mut self, view: &ViewState) -> PristineResult<()> { |
| 1275 | // Guard: Shared views cannot be deleted (they own global GRAPH edges). |
| 1276 | if view.kind.is_shared() { |
| 1277 | return Err(PristineError::CannotDeleteSharedView { |
| 1278 | name: view.name.clone(), |
| 1279 | }); |
| 1280 | } |
| 1281 | |
| 1282 | // Guard: Check for child views that reference this view as parent. |
| 1283 | // Deleting a parent would leave children with a dangling parent pointer. |
| 1284 | let children = ViewTxnT::get_children_views(self, view.id)?; |
| 1285 | if !children.is_empty() { |
| 1286 | let child_names: Vec<String> = children.iter().map(|c| c.name.clone()).collect(); |
| 1287 | return Err(PristineError::ViewHasChildren { |
| 1288 | name: view.name.clone(), |
| 1289 | children: child_names, |
| 1290 | }); |
| 1291 | } |
| 1292 | |
| 1293 | // Remove from VIEWS table |
| 1294 | { |
| 1295 | let mut table = self.txn.open_table(VIEWS)?; |
| 1296 | table.remove(view.name.as_str())?; |
| 1297 | } |
| 1298 | |
| 1299 | // Remove all change log entries for this view |
| 1300 | { |
| 1301 | let mut table = self.txn.open_table(VIEW_CHANGES)?; |
| 1302 | for seq in 0..view.change_count { |
| 1303 | let key = encode_view_seq(view.id, seq); |
| 1304 | table.remove(&key)?; |
| 1305 | } |
| 1306 | } |
| 1307 | |
| 1308 | // Remove all reverse change log entries |
| 1309 | { |
| 1310 | let mut rev_table = self.txn.open_table(REV_VIEW_CHANGES)?; |
| 1311 | let table = self.txn.open_table(VIEW_CHANGES)?; |
| 1312 | for seq in 0..view.change_count { |
| 1313 | let key = encode_view_seq(view.id, seq); |
| 1314 | if let Some(change_id) = table.get(&key)? { |
| 1315 | let rev_key = encode_view_seq(view.id, change_id.value()); |
| 1316 | rev_table.remove(&rev_key)?; |
| 1317 | } |
| 1318 | } |
| 1319 | } |
| 1320 | |
| 1321 | // Remove all state/sequence mappings from STATES table |
| 1322 | { |
| 1323 | let mut table = self.txn.open_table(STATES)?; |
| 1324 | let merkle_table = self.txn.open_table(MERKLE_CHAIN)?; |
| 1325 | for seq in 0..view.change_count { |
| 1326 | let key = encode_view_seq(view.id, seq); |
| 1327 | if let Some(merkle_bytes) = merkle_table.get(&key)? { |
| 1328 | let merkle = merkle_bytes.value(); |
| 1329 | let state_key = encode_view_merkle(view.id, merkle); |
| 1330 | table.remove(&state_key)?; |
| 1331 | } |