| 553 | } |
| 554 | |
| 555 | fn del_change( |
| 556 | &mut self, |
| 557 | view: &mut ViewState, |
| 558 | change_id: NodeId, |
| 559 | _change_hash: &Hash, |
| 560 | ) -> PristineResult<Option<u64>> { |
| 561 | // Find the sequence number for this change |
| 562 | let seq = { |
| 563 | let table = self.txn.open_table(REV_VIEW_CHANGES)?; |
| 564 | let key = encode_view_seq(view.id, change_id.get()); |
| 565 | let result = table.get(&key)?; |
| 566 | match result { |
| 567 | Some(value) => { |
| 568 | let v = value.value(); |
| 569 | drop(value); |
| 570 | v |
| 571 | } |
| 572 | None => return Ok(None), // Change not in this view |
| 573 | } |
| 574 | }; |
| 575 | |
| 576 | // Remove from VIEW_CHANGES |
| 577 | { |
| 578 | let mut table = self.txn.open_table(VIEW_CHANGES)?; |
| 579 | let key = encode_view_seq(view.id, seq); |
| 580 | table.remove(&key)?; |
| 581 | } |
| 582 | |
| 583 | // Remove from REV_VIEW_CHANGES |
| 584 | { |
| 585 | let mut table = self.txn.open_table(REV_VIEW_CHANGES)?; |
| 586 | let key = encode_view_seq(view.id, change_id.get()); |
| 587 | table.remove(&key)?; |
| 588 | } |
| 589 | |
| 590 | // Remove from MERKLE_CHAIN (the merkle state at this sequence) |
| 591 | { |
| 592 | let mut table = self.txn.open_table(MERKLE_CHAIN)?; |
| 593 | let key = encode_view_seq(view.id, seq); |
| 594 | table.remove(&key)?; |
| 595 | } |
| 596 | |
| 597 | // Shift all subsequent changes down by 1 |
| 598 | // We need to update sequences from seq+1 to change_count-1 |
| 599 | let original_count = view.change_count; |
| 600 | for s in (seq + 1)..original_count { |
| 601 | // Get the change_id at this sequence |
| 602 | let cid = { |
| 603 | let table = self.txn.open_table(VIEW_CHANGES)?; |
| 604 | let key = encode_view_seq(view.id, s); |
| 605 | let result = table.get(&key)?; |
| 606 | match result { |
| 607 | Some(v) => { |
| 608 | let id = NodeId::new(v.value()); |
| 609 | drop(v); |
| 610 | id |
| 611 | } |
| 612 | None => continue, |