Fix --delete-it-all and --delete commands (#913)

* Add `delete_at` is null condition during search

Since entries are searched everytime a delete process ends, the
--delete-it-all command will enter an infinite loop if searching the
whole history.

* Remove command blanking

Command blanking may violate the `unique(timestamp, cwd, command)`
condition.

* Overwrite command with random string when deleting

* Add rand dependency to client crate

---------

Co-authored-by: Ellie Huxtable <ellie@elliehuxtable.com>
This commit is contained in:
J. Emiliano Deustua 2023-06-13 02:43:06 -05:00 committed by GitHub
parent b231b82bdd
commit 79f7b1d81c
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
3 changed files with 10 additions and 1 deletions

1
Cargo.lock generated
View file

@ -151,6 +151,7 @@ dependencies = [
"memchr", "memchr",
"minspan", "minspan",
"parse_duration", "parse_duration",
"rand",
"regex", "regex",
"reqwest", "reqwest",
"rmp-serde", "rmp-serde",

View file

@ -41,6 +41,7 @@ serde_json = { workspace = true }
parse_duration = "2.1.1" parse_duration = "2.1.1"
async-trait = { workspace = true } async-trait = { workspace = true }
itertools = { workspace = true } itertools = { workspace = true }
rand = { workspace = true }
shellexpand = "2" shellexpand = "2"
sqlx = { workspace = true, features = ["sqlite"] } sqlx = { workspace = true, features = ["sqlite"] }
minspan = "0.1.1" minspan = "0.1.1"

View file

@ -6,6 +6,7 @@ use chrono::{prelude::*, Utc};
use fs_err as fs; use fs_err as fs;
use itertools::Itertools; use itertools::Itertools;
use lazy_static::lazy_static; use lazy_static::lazy_static;
use rand::{distributions::Alphanumeric, Rng};
use regex::Regex; use regex::Regex;
use sql_builder::{esc, quote, SqlBuilder, SqlName}; use sql_builder::{esc, quote, SqlBuilder, SqlName};
use sqlx::{ use sqlx::{
@ -460,6 +461,8 @@ impl Database for Sqlite {
.map(|after| sql.and_where_gt("timestamp", quote(after.timestamp_nanos()))) .map(|after| sql.and_where_gt("timestamp", quote(after.timestamp_nanos())))
}); });
sql.and_where_is_null("deleted_at");
let query = sql.sql().expect("bug in search query. please report"); let query = sql.sql().expect("bug in search query. please report");
let res = sqlx::query(&query) let res = sqlx::query(&query)
@ -519,7 +522,11 @@ impl Database for Sqlite {
// but the time that the system marks it as deleted // but the time that the system marks it as deleted
async fn delete(&self, mut h: History) -> Result<()> { async fn delete(&self, mut h: History) -> Result<()> {
let now = chrono::Utc::now(); let now = chrono::Utc::now();
h.command = String::from(""); // blank it h.command = rand::thread_rng()
.sample_iter(&Alphanumeric)
.take(32)
.map(char::from)
.collect(); // overwrite with random string
h.deleted_at = Some(now); // delete it h.deleted_at = Some(now); // delete it
self.update(&h).await?; // save it self.update(&h).await?; // save it