mirror of
https://github.com/hl-archive-node/nanoreth.git
synced 2025-12-06 10:59:55 +00:00
feat(bin): db version CLI (#3243)
This commit is contained in:
@ -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(())
|
||||
|
||||
@ -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<P: AsRef<Path>>(db_path: P) -> Result<(), DatabaseVersionError> {
|
||||
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::<u64>().map_err(|_| DatabaseVersionError::MalformedFile)?;
|
||||
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<P: AsRef<Path>>(db_path: P) -> Result<u64, DatabaseVersionError> {
|
||||
let version_file_path = db_version_file_path(db_path);
|
||||
match fs::read_to_string(&version_file_path) {
|
||||
Ok(raw_version) => {
|
||||
Ok(raw_version.parse::<u64>().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 }),
|
||||
|
||||
Reference in New Issue
Block a user