neo_devpack_solidity/runtime/storage/storage_impl/manager/
commit.rs1use super::*;
2
3impl StorageManager {
4 pub fn commit(&mut self, account: &str) -> Result<Vec<StorageChange>, RuntimeError> {
6 if let Some(account_storage) = self.storage.get_mut(account) {
7 let changes: Vec<StorageChange> =
8 account_storage.pending_changes.values().cloned().collect();
9
10 for (key, change) in account_storage.pending_changes.drain() {
12 match change.change_type {
13 StorageChangeType::Create | StorageChangeType::Update => {
14 if let Some(new_value) = change.new_value {
15 account_storage.storage.insert(key, new_value);
16 }
17 }
18 StorageChangeType::Delete => {
19 account_storage.storage.remove(&key);
20 }
21 StorageChangeType::NoChange => {
22 }
24 }
25 }
26
27 Ok(changes)
28 } else {
29 Ok(Vec::new())
30 }
31 }
32
33 pub fn rollback(&mut self, account: &str) -> Result<(), RuntimeError> {
35 if let Some(account_storage) = self.storage.get_mut(account) {
36 account_storage.pending_changes.clear();
37 }
38 Ok(())
39 }
40
41 pub fn get_pending_changes(&self, account: &str) -> Vec<&StorageChange> {
43 self.storage
44 .get(account)
45 .map(|storage| storage.pending_changes.values().collect())
46 .unwrap_or_default()
47 }
48
49 pub fn calculate_pending_gas_cost(&self, account: &str) -> u64 {
51 self.storage
52 .get(account)
53 .map(|storage| storage.pending_changes.values().map(|c| c.gas_cost).sum())
54 .unwrap_or(0)
55 }
56}