diff options
Diffstat (limited to 'crates/atuin-client/src/database.rs')
| -rw-r--r-- | crates/atuin-client/src/database.rs | 29 |
1 files changed, 29 insertions, 0 deletions
diff --git a/crates/atuin-client/src/database.rs b/crates/atuin-client/src/database.rs index fac0eb89..3c88350f 100644 --- a/crates/atuin-client/src/database.rs +++ b/crates/atuin-client/src/database.rs @@ -20,6 +20,7 @@ use sqlx::{ }, }; use time::OffsetDateTime; +use uuid::Uuid; use crate::{ history::{HistoryId, HistoryStats}, @@ -75,6 +76,16 @@ pub fn current_context() -> Context { } } +fn get_session_start_time(session_id: &str) -> Option<i64> { + if let Ok(uuid) = Uuid::parse_str(session_id) { + if let Some(timestamp) = uuid.get_timestamp() { + let (seconds, nanos) = timestamp.to_unix(); + return Some(seconds as i64 * 1_000_000_000 + nanos as i64); + } + } + None +} + #[async_trait] pub trait Database: Send + Sync + 'static { async fn save(&self, h: &History) -> Result<()>; @@ -316,11 +327,20 @@ impl Database for Sqlite { context.cwd.clone() }; + let session_start = get_session_start_time(&context.session); + for filter in filters { match filter { FilterMode::Global => &mut query, FilterMode::Host => query.and_where_eq("hostname", quote(&context.hostname)), FilterMode::Session => query.and_where_eq("session", quote(&context.session)), + FilterMode::SessionPreload => { + query.and_where_eq("session", quote(&context.session)); + if let Some(session_start) = session_start { + query.or_where_lt("timestamp", session_start); + } + &mut query + } FilterMode::Directory => query.and_where_eq("cwd", quote(&context.cwd)), FilterMode::Workspace => query.and_where_like_left("cwd", &git_root), }; @@ -437,12 +457,21 @@ impl Database for Sqlite { context.cwd.clone() }; + let session_start = get_session_start_time(&context.session); + match filter { FilterMode::Global => &mut sql, FilterMode::Host => { sql.and_where_eq("lower(hostname)", quote(context.hostname.to_lowercase())) } FilterMode::Session => sql.and_where_eq("session", quote(&context.session)), + FilterMode::SessionPreload => { + sql.and_where_eq("session", quote(&context.session)); + if let Some(session_start) = session_start { + sql.or_where_lt("timestamp", session_start); + } + &mut sql + } FilterMode::Directory => sql.and_where_eq("cwd", quote(&context.cwd)), FilterMode::Workspace => sql.and_where_like_left("cwd", git_root), }; |
