use std::collections::{BTreeMap, HashMap};
use zebra_chain::{block::Height, parameters::Network};
use zebra_state::TransactionIndex;
use crate::config::Config;
pub mod db;
pub use db::{SaplingScannedResult, SaplingScanningKey};
pub const INSERT_CONTROL_INTERVAL: u32 = 1_000;
#[derive(Clone, Debug)]
pub struct Storage {
db: db::ScannerDb,
}
impl Storage {
pub fn new(config: &Config, network: &Network, read_only: bool) -> Self {
let mut storage = Self::new_db(config, network, read_only);
for (sapling_key, birthday) in config.sapling_keys_to_scan.iter() {
storage.add_sapling_key(sapling_key, Some(zebra_chain::block::Height(*birthday)));
}
storage
}
pub fn add_sapling_key(
&mut self,
sapling_key: &SaplingScanningKey,
birthday: impl Into<Option<Height>>,
) {
let birthday = birthday.into();
self.insert_sapling_key(sapling_key, birthday);
}
pub fn sapling_keys_last_heights(&self) -> HashMap<SaplingScanningKey, Height> {
self.sapling_keys_and_last_scanned_heights()
}
pub fn add_sapling_results(
&mut self,
sapling_key: &SaplingScanningKey,
height: Height,
sapling_results: BTreeMap<TransactionIndex, SaplingScannedResult>,
) {
self.insert_sapling_results(sapling_key, height, sapling_results)
}
pub fn sapling_results(
&self,
sapling_key: &SaplingScanningKey,
) -> BTreeMap<Height, Vec<SaplingScannedResult>> {
self.sapling_results_for_key(sapling_key)
}
}