From b552f1788c7282f6c75d7476817770ed775b36a4 Mon Sep 17 00:00:00 2001 From: Mikayla Maki Date: Wed, 2 Nov 2022 16:31:36 -0700 Subject: [PATCH] WIP2 --- crates/db/src/workspace.rs | 115 +++++++++++++++---------------------- 1 file changed, 46 insertions(+), 69 deletions(-) diff --git a/crates/db/src/workspace.rs b/crates/db/src/workspace.rs index 03ca321b5d..bec9f98823 100644 --- a/crates/db/src/workspace.rs +++ b/crates/db/src/workspace.rs @@ -5,7 +5,6 @@ use std::{ fmt::Debug, os::unix::prelude::OsStrExt, path::{Path, PathBuf}, - sync::Arc, }; use indoc::indoc; @@ -95,7 +94,6 @@ type WorkspaceRow = (WorkspaceId, DockAnchor, bool); #[derive(Default, Debug)] pub struct SerializedWorkspace { - pub worktree_roots: Vec>, pub center_group: SerializedPaneGroup, pub dock_anchor: DockAnchor, pub dock_visible: bool, @@ -105,40 +103,30 @@ pub struct SerializedWorkspace { impl Db { /// Finds or creates a workspace id for the given set of worktree roots. If the passed worktree roots is empty, /// returns the last workspace which was updated + pub fn workspace_for_roots

(&self, worktree_roots: &[P]) -> Option where P: AsRef + Debug, { // Find the workspace id which is uniquely identified by this set of paths // return it if found - let mut workspace_row = self.workspace(worktree_roots); + let mut workspace_row = get_workspace(worktree_roots, &self) + .log_err() + .unwrap_or_default(); if workspace_row.is_none() && worktree_roots.len() == 0 { - workspace_row = self.last_workspace_id(); + workspace_row = self.last_workspace(); } - workspace_row.and_then( - |(workspace_id, dock_anchor, dock_visible)| SerializedWorkspace { + workspace_row.and_then(|(workspace_id, dock_anchor, dock_visible)| { + Some(SerializedWorkspace { dock_pane: self.get_dock_pane(workspace_id)?, center_group: self.get_center_group(workspace_id), dock_anchor, dock_visible, - }, - ) + }) + }) } - fn workspace

(&self, worktree_roots: &[P]) -> Option - where - P: AsRef + Debug, - { - get_workspace(worktree_roots, &self) - .log_err() - .unwrap_or_default() - } - - // fn get_workspace_row(&self, workspace_id: WorkspaceId) -> WorkspaceRow { - // unimplemented!() - // } - /// Updates the open paths for the given workspace id. Will garbage collect items from /// any workspace ids which are no replaced by the new workspace id. Updates the timestamps /// in the workspace id table @@ -147,13 +135,46 @@ impl Db { P: AsRef + Debug, { self.with_savepoint("update_worktrees", |conn| { - update_worktree_roots(conn, workspace_id, worktree_roots) + // Lookup any old WorkspaceIds which have the same set of roots, and delete them. + let preexisting_workspace = get_workspace(worktree_roots, &conn)?; + if let Some((preexisting_workspace_id, _, _)) = preexisting_workspace { + if preexisting_workspace_id != *workspace_id { + // Should also delete fields in other tables with cascading updates + conn.prepare("DELETE FROM workspaces WHERE workspace_id = ?")? + .with_bindings(preexisting_workspace_id)? + .exec()?; + } + } + + conn.prepare("DELETE FROM worktree_roots WHERE workspace_id = ?")? + .with_bindings(workspace_id.0)? + .exec()?; + + for root in worktree_roots { + let path = root.as_ref().as_os_str().as_bytes(); + // If you need to debug this, here's the string parsing: + // let path = root.as_ref().to_string_lossy().to_string(); + + conn.prepare( + "INSERT INTO worktree_roots(workspace_id, worktree_root) VALUES (?, ?)", + )? + .with_bindings((workspace_id.0, path))? + .exec()?; + } + + conn.prepare( + "UPDATE workspaces SET timestamp = CURRENT_TIMESTAMP WHERE workspace_id = ?", + )? + .with_bindings(workspace_id.0)? + .exec()?; + + Ok(()) }) .context("Update workspace {workspace_id:?} with roots {worktree_roots:?}") .log_err(); } - fn last_workspace_id(&self) -> Option { + fn last_workspace(&self) -> Option { iife! ({ self.prepare("SELECT workspace_id, dock_anchor, dock_visible FROM workspaces ORDER BY timestamp DESC LIMIT 1")? .maybe_row::() @@ -178,50 +199,6 @@ impl Db { } } -fn update_worktree_roots

( - connection: &Connection, - workspace_id: &WorkspaceId, - worktree_roots: &[P], -) -> Result<()> -where - P: AsRef + Debug, -{ - // Lookup any old WorkspaceIds which have the same set of roots, and delete them. - let preexisting_workspace = get_workspace(worktree_roots, &connection)?; - if let Some((preexisting_workspace_id, _, _)) = preexisting_workspace { - if preexisting_workspace_id != *workspace_id { - // Should also delete fields in other tables with cascading updates - connection - .prepare("DELETE FROM workspaces WHERE workspace_id = ?")? - .with_bindings(preexisting_workspace_id)? - .exec()?; - } - } - - connection - .prepare("DELETE FROM worktree_roots WHERE workspace_id = ?")? - .with_bindings(workspace_id.0)? - .exec()?; - - for root in worktree_roots { - let path = root.as_ref().as_os_str().as_bytes(); - // If you need to debug this, here's the string parsing: - // let path = root.as_ref().to_string_lossy().to_string(); - - connection - .prepare("INSERT INTO worktree_roots(workspace_id, worktree_root) VALUES (?, ?)")? - .with_bindings((workspace_id.0, path))? - .exec()?; - } - - connection - .prepare("UPDATE workspaces SET timestamp = CURRENT_TIMESTAMP WHERE workspace_id = ?")? - .with_bindings(workspace_id.0)? - .exec()?; - - Ok(()) -} - fn get_workspace

(worktree_roots: &[P], connection: &Connection) -> Result> where P: AsRef + Debug, @@ -393,7 +370,7 @@ mod tests { // workspace, and None otherwise assert_eq!(db.workspace::(&[]), None,); - assert_eq!(db.last_workspace_id().unwrap().0, WorkspaceId(1)); + assert_eq!(db.last_workspace().unwrap().0, WorkspaceId(1)); assert_eq!( db.recent_workspaces(2), @@ -505,7 +482,7 @@ mod tests { // And that workspace 2 is no longer registered under these roots assert_eq!(db.workspace(&["/tmp", "/tmp2"]), None); - assert_eq!(db.last_workspace_id().unwrap().0, WorkspaceId(2)); + assert_eq!(db.last_workspace().unwrap().0, WorkspaceId(2)); let recent_workspaces = db.recent_workspaces(10); assert_eq!(