plug to store
This commit is contained in:
parent
43ce5bef7e
commit
513cc6261a
@ -219,6 +219,10 @@ impl<T> KeyDirectory for DiskDirectory<T> where T: KeyFileManager {
|
||||
fn as_vault_provider(&self) -> Option<&VaultKeyDirectoryProvider> {
|
||||
Some(self)
|
||||
}
|
||||
|
||||
fn hash(&self) -> Result<H256, Error> {
|
||||
self.files_hash()
|
||||
}
|
||||
}
|
||||
|
||||
impl<T> VaultKeyDirectoryProvider for DiskDirectory<T> where T: KeyFileManager {
|
||||
|
@ -16,6 +16,7 @@
|
||||
|
||||
use std::path::{PathBuf};
|
||||
use {SafeAccount, Error};
|
||||
use util::{H256, FixedHash};
|
||||
|
||||
mod disk;
|
||||
mod geth;
|
||||
@ -62,6 +63,8 @@ pub trait KeyDirectory: Send + Sync {
|
||||
fn path(&self) -> Option<&PathBuf> { None }
|
||||
/// Return vault provider, if available
|
||||
fn as_vault_provider(&self) -> Option<&VaultKeyDirectoryProvider> { None }
|
||||
/// Returns hash of the directory content, if supported
|
||||
fn hash(&self) -> Result<H256, Error> { Ok(H256::zero()) }
|
||||
}
|
||||
|
||||
/// Vaults provider
|
||||
|
@ -27,6 +27,7 @@ use account::SafeAccount;
|
||||
use presale::PresaleWallet;
|
||||
use json::{self, Uuid};
|
||||
use {import, Error, SimpleSecretStore, SecretStore, SecretVaultRef, StoreAccountRef, Derivation};
|
||||
use util::H256;
|
||||
|
||||
pub struct EthStore {
|
||||
store: EthMultiStore,
|
||||
@ -230,6 +231,7 @@ pub struct EthMultiStore {
|
||||
// order lock: cache, then vaults
|
||||
cache: RwLock<BTreeMap<StoreAccountRef, Vec<SafeAccount>>>,
|
||||
vaults: Mutex<HashMap<String, Box<VaultKeyDirectory>>>,
|
||||
dir_hash: RwLock<Option<H256>>,
|
||||
}
|
||||
|
||||
impl EthMultiStore {
|
||||
@ -244,11 +246,23 @@ impl EthMultiStore {
|
||||
vaults: Mutex::new(HashMap::new()),
|
||||
iterations: iterations,
|
||||
cache: Default::default(),
|
||||
dir_hash: Default::default(),
|
||||
};
|
||||
store.reload_accounts()?;
|
||||
Ok(store)
|
||||
}
|
||||
|
||||
fn reload_if_changed(&self) -> Result<(), Error> {
|
||||
let mut last_dir_hash = self.dir_hash.write();
|
||||
let dir_hash = Some(self.dir.hash()?);
|
||||
if *last_dir_hash == dir_hash {
|
||||
return Ok(())
|
||||
}
|
||||
self.reload_accounts()?;
|
||||
*last_dir_hash = dir_hash;
|
||||
Ok(())
|
||||
}
|
||||
|
||||
fn reload_accounts(&self) -> Result<(), Error> {
|
||||
let mut cache = self.cache.write();
|
||||
|
||||
@ -284,7 +298,7 @@ impl EthMultiStore {
|
||||
}
|
||||
}
|
||||
|
||||
self.reload_accounts()?;
|
||||
self.reload_if_changed()?;
|
||||
let cache = self.cache.read();
|
||||
let accounts = cache.get(account).ok_or(Error::InvalidAccount)?;
|
||||
if accounts.is_empty() {
|
||||
@ -431,7 +445,7 @@ impl SimpleSecretStore for EthMultiStore {
|
||||
}
|
||||
|
||||
fn account_ref(&self, address: &Address) -> Result<StoreAccountRef, Error> {
|
||||
self.reload_accounts()?;
|
||||
self.reload_if_changed()?;
|
||||
self.cache.read().keys()
|
||||
.find(|r| &r.address == address)
|
||||
.cloned()
|
||||
@ -439,7 +453,7 @@ impl SimpleSecretStore for EthMultiStore {
|
||||
}
|
||||
|
||||
fn accounts(&self) -> Result<Vec<StoreAccountRef>, Error> {
|
||||
self.reload_accounts()?;
|
||||
self.reload_if_changed()?;
|
||||
Ok(self.cache.read().keys().cloned().collect())
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user