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 59ad60a6f4..e828f007d1 100644 --- a/crates/db/examples/serialize-pane.rs +++ b/crates/db/examples/serialize-pane.rs @@ -19,27 +19,31 @@ 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.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(); - 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(); - println!("Wrote database!"); Ok(()) diff --git a/crates/db/src/pane.rs b/crates/db/src/pane.rs index 51d8e5ad5b..0a1812c60c 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 5d84ecfccb..2dc988a7e3 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 zcmWFz^vNtqRY=P(%1ta$FlG>7U}R))P*7lCVBlb2VBljw01%%A!DV1%U|?WI;$vfS zFzCfg@$&y*;AMWyz#qqHx2>T|LixJAG4mqrgcSxT-{xR6#V={6#PPce00D{z*-6t^YADES&7?#%#;coMh66W`Z@+h zDtNm_Drg`(MF-+gsI58*PzyA{4s!Dka`klg1L;E1q^S_(>gF2c>gVhljPO`7ni_vU z1s7Kz*AQ0)XUAY?M;BL!FOdyJ_A!c~aEW3KI5R#oMN@$YLt$P(b|grwSOY|YOu;aO zOH&~@B*@b_#F&>&++C58Au}%}wW7E%C$l6qKC!eUAIy&jI|XD&al9dd&DR{x#V)R_ z%-B{6P8;b(`K1Mr#DT=*MoAq=5=18tXdK~)VUV+^oHC#m(mPQ=twl)>;P6UKi3iCQ zYk){lJW?k$V44C?4yN2};-1R5k^|ULkcf^qMB?x?CUdfji;FWhtAY~*C~Atq1Q$vo z01H8)AH+nCJ*4~!$u-D%7Do!m&df_u2yu-FK`T~}GaRxpC;<$YAef8cfzy=5!7i?@ z&e#em62Sogiy{;bCyK98q#(YB#wXlg?2s}>6P%=wv?DP&Py!lB0uszHdngL$g2bZKypnjZSulfi6m)gL z^_W6tUP@+iVo7STLP6)C(k(ig9kzW*FkYAixl9``}Gw9Ww@=Hqc zbHU*rl$oAU0%o~Z6eQ-Qq^3Z^zbvyjGbtw(7Wat41{8x%`T04iiFve$D0o(A5@ul+ z*VJTeP6P)lC=HYprKZM%l2|b+j};|&QRN^(j3TDs4S~@R7!85Z5Eu=C(GVC7fzc2c4S~@R7!85Z5Eu=C(GVD}A;1Ol z*l7PB6bhqwGz3ONU^E0qLtr!nMnhmU1V%$(Gz3ONU^E0qLtr!nhHVId=Kq=aUor51 z<$pD7Jvr*J(GVC7fzc2c4S~@R7!85Z5Eu=C(GVC7fzc2c4S~@R7%?Hh$;8aS%Gjbm z<$E?KBaE2?>HoiF;Q!A5cEkk5s7FUbU^E0qLtr!nMnhmU1V%$(Gz3ONU^E0qLtr!n zMnhmYhX4l?vlyp-Np67=J0r6Qm<3w@&&2-*)c=1ooV`Bkx6u$74S~@R7!85Z5Eu=C z(GVC7fzc2c4S~@R7!85Z5Ev;Tz{MiQ$q4TLGjXtpaDw~)p!t7>(f$7;B?*lBb2J1- zLtr!nMnhmU1V%$(Gz3ONU^E0qLtr!nMnhnPhQMh5e}qQ-sJBN$U^E0qLtr!nMnhmU z1V%$(Gz3ONU^E0qLtr!nMpOul_WwszbdP#=Gz3ONU^E0qLtr!nMnhmU1V%$(Gz3ON zU^E0qLtuo4z-a$}ghu?Rw?{)@Gz3ONU^E0qLtr!nMnhmU1V%$(Gz3ONU^E0qR0xdr z|3_4Gk9u}A1V%$(Gz3ONU^E0qLtr!nMnhmU1V%$(Gz3ONV1$MM==}fD^Z!O@7Y^kB)}GXb6mkz-S1J zhQMeDjE2By2#kinXb6mkz-S1J;1C#{{~y7TKkD_-5Eu=C(GVC7fzc2c4S~@R7!85Z Q5Eu=C(GVC7fe{k|0Bft@^Z)<=