From b24b59dc38fcd044417b65437022e7b5b1e7f59a Mon Sep 17 00:00:00 2001 From: Jason Volk Date: Wed, 29 Oct 2025 23:05:10 +0000 Subject: [PATCH] Add admin query raw command to clear table. Signed-off-by: Jason Volk --- src/admin/query/raw.rs | 52 ++++++++++++++++++++++++++++++++++-------- 1 file changed, 42 insertions(+), 10 deletions(-) diff --git a/src/admin/query/raw.rs b/src/admin/query/raw.rs index 6431fbe3..e9fddc33 100644 --- a/src/admin/query/raw.rs +++ b/src/admin/query/raw.rs @@ -37,15 +37,6 @@ pub(crate) enum RawCommand { base64: bool, }, - /// - Raw database delete (for string keys) - Del { - /// Map name - map: String, - - /// Key - key: String, - }, - /// - Raw database keys iteration Keys { /// Map name @@ -135,7 +126,26 @@ pub(crate) enum RawCommand { prefix: Option, }, - /// - Compact database + /// - Raw database delete (for string keys) DANGER!!! + Del { + /// Map name + map: String, + + /// Key + key: String, + }, + + /// - Clear database table DANGER!!! + Clear { + /// Map name + map: String, + + /// Confirm + #[arg(long)] + confirm: bool, + }, + + /// - Compact database DANGER!!! Compact { #[arg(short, long, alias("column"))] map: Option>, @@ -425,6 +435,28 @@ pub(super) async fn raw_del(&self, map: String, key: String) -> Result { .await } +#[admin_command] +pub(super) async fn raw_clear(&self, map: String, confirm: bool) -> Result { + let map = self.services.db.get(&map)?; + + if !confirm { + return Err!("Are you really sure you want to clear all data? Add the --confirm option."); + } + + let timer = Instant::now(); + let cork = self.services.db.cork(); + map.raw_keys() + .ignore_err() + .ready_for_each(|key| map.remove(&key)) + .boxed() + .await; + + drop(cork); + let query_time = timer.elapsed(); + self.write_str(&format!("Operation completed in {query_time:?}")) + .await +} + #[admin_command] pub(super) async fn raw_get(&self, map: String, key: String, base64: bool) -> Result { let map = self.services.db.get(&map)?;