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:
parent
b231b82bdd
commit
79f7b1d81c
3 changed files with 10 additions and 1 deletions
1
Cargo.lock
generated
1
Cargo.lock
generated
|
@ -151,6 +151,7 @@ dependencies = [
|
||||||
"memchr",
|
"memchr",
|
||||||
"minspan",
|
"minspan",
|
||||||
"parse_duration",
|
"parse_duration",
|
||||||
|
"rand",
|
||||||
"regex",
|
"regex",
|
||||||
"reqwest",
|
"reqwest",
|
||||||
"rmp-serde",
|
"rmp-serde",
|
||||||
|
|
|
@ -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"
|
||||||
|
|
|
@ -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
|
||||||
|
|
Loading…
Reference in a new issue