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/// The arguments for the `reth db clear` command
14#[derive(Parser, Debug)]
15pub struct Command {
16    #[command(subcommand)]
17    subcommand: Subcommands,
18}
19
20impl Command {
21    /// Execute `db clear` command
22    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    /// Deletes all database table entries
49    Mdbx { table: Tables },
50    /// Deletes all static file segment entries
51    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}