From 7744c9ba45ed45886f760a6862c1a3819b9a2877 Mon Sep 17 00:00:00 2001 From: Mikayla Maki Date: Mon, 31 Oct 2022 14:11:55 -0700 Subject: [PATCH] Abandoning rusqlite, the API is miserable --- crates/db/examples/serialize-pane.rs | 42 +++++++++------- crates/db/src/pane.rs | 71 ++++++++++++++++++++++++--- crates/db/src/workspace.rs | 6 +++ crates/db/test.db | Bin 57344 -> 0 bytes 4 files changed, 94 insertions(+), 25 deletions(-) delete mode 100644 crates/db/test.db diff --git a/crates/db/examples/serialize-pane.rs b/crates/db/examples/serialize-pane.rs index 59ad60a6f4423c5da23e5525d7f73860668cdc81..e828f007d120c81a590227227ffa1ef808b30a88 100644 --- a/crates/db/examples/serialize-pane.rs +++ b/crates/db/examples/serialize-pane.rs @@ -19,26 +19,30 @@ fn main() -> anyhow::Result<()> { let workspace_1 = db.workspace_for_roots(&["/tmp"]); let workspace_2 = db.workspace_for_roots(&["/tmp", "/tmp2"]); let workspace_3 = db.workspace_for_roots(&["/tmp3", "/tmp2"]); - dbg!(&workspace_1, &workspace_2, &workspace_3); - db.write_to(file).ok(); - db.save_dock_pane(&SerializedDockPane { - workspace_id: workspace_1.workspace_id, - anchor_position: DockAnchor::Expanded, - visible: true, - }); - db.save_dock_pane(&SerializedDockPane { - workspace_id: workspace_2.workspace_id, - anchor_position: DockAnchor::Bottom, - visible: true, - }); - db.save_dock_pane(&SerializedDockPane { - workspace_id: workspace_3.workspace_id, - anchor_position: DockAnchor::Right, - visible: false, - }); - - // db.write_to(file).ok(); + db.save_dock_pane( + workspace_1.workspace_id, + &SerializedDockPane { + anchor_position: DockAnchor::Expanded, + visible: true, + }, + ); + db.save_dock_pane( + workspace_2.workspace_id, + &SerializedDockPane { + anchor_position: DockAnchor::Bottom, + visible: true, + }, + ); + db.save_dock_pane( + workspace_3.workspace_id, + &SerializedDockPane { + anchor_position: DockAnchor::Right, + visible: false, + }, + ); + + db.write_to(file).ok(); println!("Wrote database!"); diff --git a/crates/db/src/pane.rs b/crates/db/src/pane.rs index 51d8e5ad5b2faf91af3150c4ab35d07d4e2b8f8a..0a1812c60cc68a38c2e4238cadb620a923b7f28a 100644 --- a/crates/db/src/pane.rs +++ b/crates/db/src/pane.rs @@ -1,7 +1,9 @@ + use gpui::Axis; +use rusqlite::{OptionalExtension, Connection}; use serde::{Deserialize, Serialize}; -use serde_rusqlite::to_params_named; +use serde_rusqlite::{from_row, to_params_named}; use crate::{items::ItemId, workspace::WorkspaceId}; @@ -134,6 +136,10 @@ pub struct SerializedPane { children: Vec, } + +//********* CURRENTLY IN USE TYPES: ********* + + #[derive(Default, Debug, PartialEq, Eq, Deserialize, Serialize)] pub enum DockAnchor { #[default] @@ -144,11 +150,29 @@ pub enum DockAnchor { #[derive(Default, Debug, PartialEq, Eq, Deserialize, Serialize)] pub struct SerializedDockPane { - pub workspace_id: WorkspaceId, pub anchor_position: DockAnchor, pub visible: bool, } +impl SerializedDockPane { + pub fn to_row(&self, workspace: WorkspaceId) -> DockRow { + DockRow { workspace_id: workspace, anchor_position: self.anchor_position, visible: self.visible } + } +} + +#[derive(Default, Debug, PartialEq, Eq, Deserialize, Serialize)] +pub(crate) struct DockRow { + workspace_id: WorkspaceId, + anchor_position: DockAnchor, + visible: bool, +} + +impl DockRow { + pub fn to_pane(&self) -> SerializedDockPane { + SerializedDockPane { anchor_position: self.anchor_position, visible: self.visible } + } +} + impl Db { pub fn get_pane_group(&self, pane_group_id: PaneGroupId) -> SerializedPaneGroup { let axis = self.get_pane_group_axis(pane_group_id); @@ -203,17 +227,52 @@ impl Db { unimplemented!(); } - pub fn get_dock_pane(&self, _workspace: WorkspaceId) -> Option { - None + pub fn get_dock_pane(&self, workspace: WorkspaceId) -> Option { + fn logic(conn: &Connection, workspace: WorkspaceId) -> anyhow::Result> { + + let mut stmt = conn.prepare("SELECT workspace_id, anchor_position, visible FROM dock_panes WHERE workspace_id = ?")?; + + let dock_panes = stmt.query_row([workspace.raw_id()], |row_ref| from_row::).optional(); + + let mut dock_panes_iter = stmt.query_and_then([workspace.raw_id()], from_row::)?; + let dock_pane = dock_panes_iter + .next() + .and_then(|dock_row| + dock_row + .ok() + .map(|dock_row| dock_row.to_pane())); + + Ok(dock_pane) + } + + self.real() + .map(|db| { + let lock = db.connection.lock(); + + match logic(&lock, workspace) { + Ok(dock_pane) => dock_pane, + Err(err) => { + log::error!("Failed to get the dock pane: {}", err); + None + }, + } + }) + .unwrap_or(None) + } - pub fn save_dock_pane(&self, dock_pane: &SerializedDockPane) { - to_params_named(dock_pane) + pub fn save_dock_pane(&self, workspace: WorkspaceId, dock_pane: SerializedDockPane) { + to_params_named(dock_pane.to_row(workspace)) + .map_err(|err| { + log::error!("Failed to parse params for the dock row: {}", err); + err + }) .ok() .zip(self.real()) .map(|(params, db)| { // TODO: overwrite old dock panes if need be let query = "INSERT INTO dock_panes (workspace_id, anchor_position, visible) VALUES (:workspace_id, :anchor_position, :visible);"; + db.connection .lock() .execute(query, params.to_slice().as_slice()) diff --git a/crates/db/src/workspace.rs b/crates/db/src/workspace.rs index 5d84ecfccbc57914f8f4bbd2c607a1b46ab402ab..2dc988a7e367499ca872ae71b41216dfdba35489 100644 --- a/crates/db/src/workspace.rs +++ b/crates/db/src/workspace.rs @@ -36,6 +36,12 @@ CREATE TABLE worktree_roots( #[derive(Debug, PartialEq, Eq, Copy, Clone, Default, Deserialize, Serialize)] pub struct WorkspaceId(i64); +impl WorkspaceId { + pub fn raw_id(&self) -> i64 { + self.0 + } +} + #[derive(Default, Debug)] pub struct SerializedWorkspace { pub workspace_id: WorkspaceId, diff --git a/crates/db/test.db b/crates/db/test.db deleted file mode 100644 index b3a78a995a034d7f6dde834e12a47313f8bde62c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 57344 zcmeI)U2oe|7{GBmY4f(WsnltfkSd+3LT#jus!ZI#4Q=O@ijqPa7`w7eV^-6|&SJL| z?)n0J0lpAdNPGjXcZar17c68BSzg!W)>ua}n=ylC~%dlHwyWZ5d^oFSKHbwo@ot+iAiQJ`Y zI{&gsc*x-m*sYTxO@G|j{%F1NKzyh_5X*B7yqX#0J>wBB)cl9XBbff8rGmRz{-f~h5;;xA+G#ZDH z?xY;5<+x^`kxEVMH5=QT%{$WtZEHbQY^Po(U6D;0YyI-f`Ta^! zTU=DXKa#oeu;(6iqvS{xZ)CC~RdMC?c;%V#KPAQGVKez4y{wiI)_Kdx76Su0m}2pm z56_0doJ!K+of`#hdvRDgqz2JgOD#;D?w5<2rm5#|%7l;^BR?vcB#^73;lJ!$` zM4hRMqQ4x^B(4{U{?dQg+&X+}yk?%k42*l0@s=UW8gIG3!9YGI*yn4-XpX7LluGTM zDwZKF&)ycg>#V_=apNZfHf^zAdj~B1l1d-}Eg{_y@tQuzz5CBKR>y&vkv_ zxGhUwSj>}PWj0mACUobh^R5s}pIJRWXr{d+R>jf>ZqNSKb^KuQ)m)U)5x&%zoiz*c zp5eml-!p`R65TV%QZX}P$)(PV1}s@lU-Dn%BvF}ed;RtTHZrd`Q|6-t$Q{ilGqNvqs>bWUd!TzbVz