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",
"minspan",
"parse_duration",
"rand",
"regex",
"reqwest",
"rmp-serde",

View file

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

View file

@ -6,6 +6,7 @@ use chrono::{prelude::*, Utc};
use fs_err as fs;
use itertools::Itertools;
use lazy_static::lazy_static;
use rand::{distributions::Alphanumeric, Rng};
use regex::Regex;
use sql_builder::{esc, quote, SqlBuilder, SqlName};
use sqlx::{
@ -460,6 +461,8 @@ impl Database for Sqlite {
.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 res = sqlx::query(&query)
@ -519,7 +522,11 @@ impl Database for Sqlite {
// but the time that the system marks it as deleted
async fn delete(&self, mut h: History) -> Result<()> {
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
self.update(&h).await?; // save it