2018-06-04 10:19:50 +02:00
|
|
|
// Copyright 2015-2018 Parity Technologies (UK) Ltd.
|
|
|
|
// This file is part of Parity.
|
|
|
|
|
|
|
|
// Parity is free software: you can redistribute it and/or modify
|
|
|
|
// it under the terms of the GNU General Public License as published by
|
|
|
|
// the Free Software Foundation, either version 3 of the License, or
|
|
|
|
// (at your option) any later version.
|
|
|
|
|
|
|
|
// Parity is distributed in the hope that it will be useful,
|
|
|
|
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
|
|
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
|
|
// GNU General Public License for more details.
|
|
|
|
|
|
|
|
// You should have received a copy of the GNU General Public License
|
|
|
|
// along with Parity. If not, see <http://www.gnu.org/licenses/>.
|
|
|
|
|
2016-05-24 21:56:32 +02:00
|
|
|
//! Helper type with all filter state data.
|
2016-02-23 18:51:29 +01:00
|
|
|
|
2018-07-04 17:37:55 +02:00
|
|
|
use std::{
|
|
|
|
collections::{BTreeSet, HashSet},
|
|
|
|
sync::Arc,
|
|
|
|
};
|
2018-01-10 13:35:18 +01:00
|
|
|
use ethereum_types::H256;
|
2018-07-04 17:37:55 +02:00
|
|
|
use parking_lot::Mutex;
|
2018-08-13 09:47:10 +02:00
|
|
|
use ethcore::filter::Filter;
|
|
|
|
use v1::types::Log;
|
2016-02-23 18:51:29 +01:00
|
|
|
|
2016-03-11 12:31:42 +01:00
|
|
|
pub type BlockNumber = u64;
|
|
|
|
|
2018-07-04 17:37:55 +02:00
|
|
|
/// Thread-safe filter state.
|
|
|
|
#[derive(Clone)]
|
|
|
|
pub struct SyncPollFilter(Arc<Mutex<PollFilter>>);
|
|
|
|
|
|
|
|
impl SyncPollFilter {
|
|
|
|
/// New `SyncPollFilter`
|
|
|
|
pub fn new(f: PollFilter) -> Self {
|
|
|
|
SyncPollFilter(Arc::new(Mutex::new(f)))
|
|
|
|
}
|
|
|
|
|
|
|
|
/// Modify underlying filter
|
|
|
|
pub fn modify<F, R>(&self, f: F) -> R where
|
|
|
|
F: FnOnce(&mut PollFilter) -> R,
|
|
|
|
{
|
|
|
|
f(&mut self.0.lock())
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2016-05-24 21:56:32 +02:00
|
|
|
/// Filter state.
|
2016-02-23 18:51:29 +01:00
|
|
|
#[derive(Clone)]
|
|
|
|
pub enum PollFilter {
|
2016-05-24 21:56:32 +02:00
|
|
|
/// Number of last block which client was notified about.
|
2016-03-11 12:31:42 +01:00
|
|
|
Block(BlockNumber),
|
2018-07-04 17:37:55 +02:00
|
|
|
/// Hashes of all pending transactions the client knows about.
|
|
|
|
PendingTransaction(BTreeSet<H256>),
|
2018-06-13 13:39:27 +02:00
|
|
|
/// Number of From block number, last seen block hash, pending logs and log filter itself.
|
2018-08-13 09:47:10 +02:00
|
|
|
Logs {
|
|
|
|
block_number: BlockNumber,
|
|
|
|
last_block_hash: Option<H256>,
|
|
|
|
previous_logs: HashSet<Log>,
|
|
|
|
filter: Filter,
|
|
|
|
include_pending: bool,
|
|
|
|
}
|
2016-02-23 18:51:29 +01:00
|
|
|
}
|
2016-09-21 12:51:10 +02:00
|
|
|
|
|
|
|
/// Returns only last `n` logs
|
|
|
|
pub fn limit_logs(mut logs: Vec<Log>, limit: Option<usize>) -> Vec<Log> {
|
|
|
|
let len = logs.len();
|
|
|
|
match limit {
|
|
|
|
Some(limit) if len >= limit => logs.split_off(len - limit),
|
|
|
|
_ => logs,
|
|
|
|
}
|
|
|
|
}
|