From edb853ca357abb3513adfdb46ffcf8a7e37b72a4 Mon Sep 17 00:00:00 2001 From: arkpar Date: Mon, 12 Dec 2016 17:19:41 +0100 Subject: [PATCH] KillDB command --- parity/blockchain.rs | 21 +++++++++++++++++++++ parity/cli/mod.rs | 4 ++++ parity/cli/usage.txt | 7 +++---- parity/configuration.rs | 8 +++++++- 4 files changed, 35 insertions(+), 5 deletions(-) diff --git a/parity/blockchain.rs b/parity/blockchain.rs index cc80f9d13..9cc81796d 100644 --- a/parity/blockchain.rs +++ b/parity/blockchain.rs @@ -64,11 +64,19 @@ impl FromStr for DataFormat { #[derive(Debug, PartialEq)] pub enum BlockchainCmd { + Kill(KillBlockchain), Import(ImportBlockchain), Export(ExportBlockchain), ExportState(ExportState), } +#[derive(Debug, PartialEq)] +pub struct KillBlockchain { + pub spec: SpecType, + pub dirs: Directories, + pub pruning: Pruning, +} + #[derive(Debug, PartialEq)] pub struct ImportBlockchain { pub spec: SpecType, @@ -128,6 +136,7 @@ pub struct ExportState { pub fn execute(cmd: BlockchainCmd) -> Result { match cmd { + BlockchainCmd::Kill(kill_cmd) => kill_db(kill_cmd), BlockchainCmd::Import(import_cmd) => execute_import(import_cmd), BlockchainCmd::Export(export_cmd) => execute_export(export_cmd), BlockchainCmd::ExportState(export_cmd) => execute_export_state(export_cmd), @@ -473,6 +482,18 @@ fn execute_export_state(cmd: ExportState) -> Result { Ok("Export completed.".into()) } +pub fn kill_db(cmd: KillBlockchain) -> Result { + let spec = try!(cmd.spec.spec()); + let genesis_hash = spec.genesis_header().hash(); + let db_dirs = cmd.dirs.database(genesis_hash, None, spec.data_dir); + let user_defaults_path = db_dirs.user_defaults_path(); + let user_defaults = try!(UserDefaults::load(&user_defaults_path)); + let algorithm = cmd.pruning.to_algorithm(&user_defaults); + let dir = db_dirs.db_path(algorithm); + try!(fs::remove_dir_all(&dir).map_err(|e| format!("Error removing database: {:?}", e))); + Ok("Database deleted.".to_owned()) +} + #[cfg(test)] mod test { use super::DataFormat; diff --git a/parity/cli/mod.rs b/parity/cli/mod.rs index 9f9ed0119..aa1e939f5 100644 --- a/parity/cli/mod.rs +++ b/parity/cli/mod.rs @@ -36,6 +36,8 @@ usage! { cmd_ui: bool, cmd_tools: bool, cmd_hash: bool, + cmd_kill: bool, + cmd_db: bool, // Arguments arg_pid_file: String, @@ -512,6 +514,8 @@ mod tests { cmd_ui: false, cmd_tools: false, cmd_hash: false, + cmd_db: false, + cmd_kill: false, // Arguments arg_pid_file: "".into(), diff --git a/parity/cli/usage.txt b/parity/cli/usage.txt index c58672542..e30ab372f 100644 --- a/parity/cli/usage.txt +++ b/parity/cli/usage.txt @@ -15,6 +15,7 @@ Usage: parity snapshot [options] parity restore [ ] [options] parity tools hash + parity db kill [options] Operating Options: --mode MODE Set the operating mode. MODE can be one of: @@ -282,10 +283,8 @@ Import/Export Options: (default: {flag_format:?} = Import: auto, Export: binary) --no-seal-check Skip block seal check. (default: {flag_no_seal_check}) --at BLOCK Export state at the given block, which may be an - index, hash, or 'latest'. Note that taking snapshots at - non-recent blocks will only work with --pruning archive - (default: {flag_at}) - --no-storage Don't export account storge. (default: {flag_no_storage}) + index, hash, or 'latest'. (default: {flag_at}) + --no-storage Don't export account storage. (default: {flag_no_storage}) --no-code Don't export account code. (default: {flag_no_code}) --min-balance WEI Don't export accounts with balance less than specified. (default: {flag_min_balance:?}) diff --git a/parity/configuration.rs b/parity/configuration.rs index 164384e7e..04f8d527b 100644 --- a/parity/configuration.rs +++ b/parity/configuration.rs @@ -38,7 +38,7 @@ use dir::Directories; use dapps::Configuration as DappsConfiguration; use signer::{Configuration as SignerConfiguration}; use run::RunCmd; -use blockchain::{BlockchainCmd, ImportBlockchain, ExportBlockchain, ExportState, DataFormat}; +use blockchain::{BlockchainCmd, ImportBlockchain, ExportBlockchain, KillBlockchain, ExportState, DataFormat}; use presale::ImportWallet; use account::{AccountCmd, NewAccount, ListAccounts, ImportAccounts, ImportFromGethAccounts}; use snapshot::{self, SnapshotCommand}; @@ -107,6 +107,12 @@ impl Configuration { Cmd::SignerToken(signer_conf) } else if self.args.cmd_tools && self.args.cmd_hash { Cmd::Hash(self.args.arg_file) + } else if self.args.cmd_db && self.args.cmd_kill { + Cmd::Blockchain(BlockchainCmd::Kill(KillBlockchain { + spec: spec, + dirs: dirs, + pruning: pruning, + })) } else if self.args.cmd_account { let account_cmd = if self.args.cmd_new { let new_acc = NewAccount {