diff --git a/bin/reth/src/db/mod.rs b/bin/reth/src/db/mod.rs index 272a67763..4f3706ba1 100644 --- a/bin/reth/src/db/mod.rs +++ b/bin/reth/src/db/mod.rs @@ -8,7 +8,11 @@ use clap::{Parser, Subcommand}; use comfy_table::{Cell, Row, Table as ComfyTable}; use eyre::WrapErr; use human_bytes::human_bytes; -use reth_db::{database::Database, tables}; +use reth_db::{ + database::Database, + tables, + version::{get_db_version, DatabaseVersionError, DB_VERSION}, +}; use reth_primitives::ChainSpec; use reth_staged_sync::utils::init::init_db; use std::sync::Arc; @@ -66,6 +70,8 @@ pub enum Subcommands { Get(get::Command), /// Deletes all database entries Drop, + /// Lists current and local database versions + Version, } #[derive(Parser, Debug)] @@ -222,6 +228,21 @@ impl Command { Subcommands::Drop => { tool.drop(db_path)?; } + Subcommands::Version => { + let local_db_version = match get_db_version(&db_path) { + Ok(version) => Some(version), + Err(DatabaseVersionError::MissingFile) => None, + Err(err) => return Err(err.into()), + }; + + println!("Current database version: {DB_VERSION}"); + + if let Some(version) = local_db_version { + println!("Local database version: {version}"); + } else { + println!("Local database is uninitialized"); + } + } } Ok(()) diff --git a/crates/storage/db/src/version.rs b/crates/storage/db/src/version.rs index 6a9b49232..db6174459 100644 --- a/crates/storage/db/src/version.rs +++ b/crates/storage/db/src/version.rs @@ -34,16 +34,23 @@ pub enum DatabaseVersionError { /// Returns [Ok] if file is found and has one line which equals to [DB_VERSION]. /// Otherwise, returns different [DatabaseVersionError] error variants. pub fn check_db_version_file>(db_path: P) -> Result<(), DatabaseVersionError> { + let version = get_db_version(db_path)?; + if version != DB_VERSION { + return Err(DatabaseVersionError::VersionMismatch { version }) + } + + Ok(()) +} + +/// Returns the database version from file with [DB_VERSION_FILE_NAME] name. +/// +/// Returns [Ok] if file is found and contains a valid version. +/// Otherwise, returns different [DatabaseVersionError] error variants. +pub fn get_db_version>(db_path: P) -> Result { let version_file_path = db_version_file_path(db_path); match fs::read_to_string(&version_file_path) { Ok(raw_version) => { - let version = - raw_version.parse::().map_err(|_| DatabaseVersionError::MalformedFile)?; - if version != DB_VERSION { - return Err(DatabaseVersionError::VersionMismatch { version }) - } - - Ok(()) + Ok(raw_version.parse::().map_err(|_| DatabaseVersionError::MalformedFile)?) } Err(err) if err.kind() == io::ErrorKind::NotFound => Err(DatabaseVersionError::MissingFile), Err(err) => Err(DatabaseVersionError::IORead { err, path: version_file_path }),