use super::*;
impl StorageManager {
pub fn commit(&mut self, account: &str) -> Result<Vec<StorageChange>, RuntimeError> {
if let Some(account_storage) = self.storage.get_mut(account) {
let changes: Vec<StorageChange> =
account_storage.pending_changes.values().cloned().collect();
for (key, change) in account_storage.pending_changes.drain() {
match change.change_type {
StorageChangeType::Create | StorageChangeType::Update => {
if let Some(new_value) = change.new_value {
account_storage.storage.insert(key, new_value);
}
}
StorageChangeType::Delete => {
account_storage.storage.remove(&key);
}
StorageChangeType::NoChange => {
}
}
}
Ok(changes)
} else {
Ok(Vec::new())
}
}
pub fn rollback(&mut self, account: &str) -> Result<(), RuntimeError> {
if let Some(account_storage) = self.storage.get_mut(account) {
account_storage.pending_changes.clear();
}
Ok(())
}
pub fn get_pending_changes(&self, account: &str) -> Vec<&StorageChange> {
self.storage
.get(account)
.map(|storage| storage.pending_changes.values().collect())
.unwrap_or_default()
}
pub fn calculate_pending_gas_cost(&self, account: &str) -> u64 {
self.storage
.get(account)
.map(|storage| storage.pending_changes.values().map(|c| c.gas_cost).sum())
.unwrap_or(0)
}
}