reth_cli_commands/db/
clear.rs
1use clap::{Parser, Subcommand};
2use reth_db::static_file::iter_static_files;
3use reth_db_api::{
4 database::Database,
5 table::Table,
6 transaction::{DbTx, DbTxMut},
7 TableViewer, Tables,
8};
9use reth_node_builder::NodeTypesWithDB;
10use reth_provider::{ProviderFactory, StaticFileProviderFactory};
11use reth_static_file_types::StaticFileSegment;
12
13#[derive(Parser, Debug)]
15pub struct Command {
16 #[command(subcommand)]
17 subcommand: Subcommands,
18}
19
20impl Command {
21 pub fn execute<N: NodeTypesWithDB>(
23 self,
24 provider_factory: ProviderFactory<N>,
25 ) -> eyre::Result<()> {
26 match self.subcommand {
27 Subcommands::Mdbx { table } => {
28 table.view(&ClearViewer { db: provider_factory.db_ref() })?
29 }
30 Subcommands::StaticFile { segment } => {
31 let static_file_provider = provider_factory.static_file_provider();
32 let static_files = iter_static_files(static_file_provider.directory())?;
33
34 if let Some(segment_static_files) = static_files.get(&segment) {
35 for (block_range, _) in segment_static_files {
36 static_file_provider.delete_jar(segment, block_range.start())?;
37 }
38 }
39 }
40 }
41
42 Ok(())
43 }
44}
45
46#[derive(Subcommand, Debug)]
47enum Subcommands {
48 Mdbx { table: Tables },
50 StaticFile { segment: StaticFileSegment },
52}
53
54struct ClearViewer<'a, DB: Database> {
55 db: &'a DB,
56}
57
58impl<DB: Database> TableViewer<()> for ClearViewer<'_, DB> {
59 type Error = eyre::Report;
60
61 fn view<T: Table>(&self) -> Result<(), Self::Error> {
62 let tx = self.db.tx_mut()?;
63 tx.clear::<T>()?;
64 tx.commit()?;
65 Ok(())
66 }
67}