AsSubstore trait

This commit is contained in:
debris 2016-12-10 14:00:34 +01:00
parent cfc90b79aa
commit 087c314fd1
6 changed files with 43 additions and 37 deletions

View File

@ -33,8 +33,3 @@ pub trait BlockProvider: BlockHeaderProvider {
/// returns all transactions in the block by block reference (number/hash)
fn block_transactions(&self, block_ref: BlockRef) -> Vec<chain::Transaction>;
}
pub trait AsBlockHeaderProvider {
/// returns `BlockHeaderProvider`
fn as_block_header_provider(&self) -> &BlockHeaderProvider;
}

View File

@ -67,13 +67,13 @@ impl BlockLocation {
pub type SharedStore = std::sync::Arc<Store + Send + Sync>;
pub use best_block::BestBlock;
pub use storage::{Storage, Store};
pub use storage::{Storage, Store, AsSubstore};
pub use error::{Error, ConsistencyError};
pub use kvdb::Database;
pub use transaction_provider::{TransactionProvider, AsTransactionProvider, PreviousTransactionOutputProvider};
pub use transaction_provider::{TransactionProvider, PreviousTransactionOutputProvider};
pub use transaction_meta_provider::TransactionMetaProvider;
pub use block_stapler::{BlockStapler, BlockInsertedChain};
pub use block_provider::{BlockProvider, BlockHeaderProvider, AsBlockHeaderProvider};
pub use block_provider::{BlockProvider, BlockHeaderProvider};
pub use indexed_block::IndexedBlock;
pub use indexed_header::IndexedBlockHeader;
pub use indexed_transaction::IndexedTransaction;

View File

@ -15,7 +15,7 @@ use lru_cache::LruCache;
use transaction_meta::TransactionMeta;
use error::{Error, ConsistencyError, MetaError};
use update_context::UpdateContext;
use block_provider::{BlockProvider, BlockHeaderProvider, AsBlockHeaderProvider};
use block_provider::{BlockProvider, BlockHeaderProvider};
use transaction_provider::TransactionProvider;
use transaction_meta_provider::TransactionMetaProvider;
use block_stapler::{BlockStapler, BlockInsertedChain, Reorganization};
@ -43,7 +43,7 @@ const MAX_FORK_ROUTE_PRESET: usize = 2048;
const TRANSACTION_CACHE_SIZE: usize = 524288;
/// Blockchain storage interface
pub trait Store : BlockProvider + BlockStapler + TransactionProvider + TransactionMetaProvider + AsBlockHeaderProvider {
pub trait Store: AsSubstore {
/// get best block
fn best_block(&self) -> Option<BestBlock>;
@ -51,6 +51,41 @@ pub trait Store : BlockProvider + BlockStapler + TransactionProvider + Transacti
fn best_header(&self) -> Option<chain::BlockHeader>;
}
/// Allows casting Arc<Store> to reference to any substore type
pub trait AsSubstore: BlockProvider + BlockStapler + TransactionProvider + TransactionMetaProvider {
fn as_block_provider(&self) -> &BlockProvider;
fn as_block_header_provider(&self) -> &BlockHeaderProvider;
fn as_block_stapler(&self) -> &BlockStapler;
fn as_transaction_provider(&self) -> &TransactionProvider;
fn as_transaction_meta_provider(&self) -> &TransactionMetaProvider;
}
impl<T> AsSubstore for T where T: BlockProvider + BlockStapler + TransactionProvider + TransactionMetaProvider {
fn as_block_provider(&self) -> &BlockProvider {
&*self
}
fn as_block_header_provider(&self) -> &BlockHeaderProvider {
&*self
}
fn as_block_stapler(&self) -> &BlockStapler {
&*self
}
fn as_transaction_provider(&self) -> &TransactionProvider {
&*self
}
fn as_transaction_meta_provider(&self) -> &TransactionMetaProvider {
&*self
}
}
/// Blockchain storage with rocksdb database
pub struct Storage {
database: Database,
@ -432,12 +467,6 @@ impl BlockHeaderProvider for Storage {
}
}
impl AsBlockHeaderProvider for Storage {
fn as_block_header_provider(&self) -> &BlockHeaderProvider {
&*self
}
}
impl BlockProvider for Storage {
fn block_number(&self, hash: &H256) -> Option<u32> {
self.get(COL_BLOCK_NUMBERS, &**hash)

View File

@ -2,8 +2,8 @@
use super::{
BlockRef, Store, Error, BestBlock, BlockLocation, BlockInsertedChain, BlockProvider,
BlockStapler, TransactionMetaProvider, TransactionProvider, AsTransactionProvider,
IndexedBlock, BlockHeaderProvider, AsBlockHeaderProvider,
BlockStapler, TransactionMetaProvider, TransactionProvider,
IndexedBlock, BlockHeaderProvider,
};
use chain::{self, Block};
use primitives::hash::H256;
@ -84,12 +84,6 @@ impl BlockHeaderProvider for TestStorage {
}
}
impl AsBlockHeaderProvider for TestStorage {
fn as_block_header_provider(&self) -> &BlockHeaderProvider {
&*self
}
}
impl BlockProvider for TestStorage {
fn block_number(&self, hash: &H256) -> Option<u32> {
let data = self.data.read();
@ -192,12 +186,6 @@ impl TransactionProvider for TestStorage {
}
}
impl AsTransactionProvider for TestStorage {
fn as_transaction_provider(&self) -> &TransactionProvider {
&*self
}
}
impl TransactionMetaProvider for TestStorage {
// just spawns new meta so far, use real store for proper tests
fn transaction_meta(&self, hash: &H256) -> Option<TransactionMeta> {

View File

@ -14,12 +14,6 @@ pub trait TransactionProvider {
/// resolves serialized transaction info by transaction hash
fn transaction(&self, hash: &H256) -> Option<chain::Transaction>;
}
pub trait AsTransactionProvider {
/// returns `TransactionProvider`
fn as_transaction_provider(&self) -> &TransactionProvider;
}
/// During transaction the only part of old transaction that we need is `TransactionOutput`.

View File

@ -19,7 +19,7 @@ pub fn transaction_fee_rate(store: &TransactionProvider, transaction: &Transacti
#[cfg(test)]
mod tests {
use std::sync::Arc;
use db::{TestStorage, AsTransactionProvider};
use db::{TestStorage, AsSubstore};
use test_data;
use super::*;