1use std::path::{Path, PathBuf};
2
3use db::{connection, indoc, sqlez::domain::Domain};
4use util::{iife, ResultExt};
5use workspace::{ItemId, Workspace, WorkspaceId};
6
7use crate::Terminal;
8
9connection!(TERMINAL_CONNECTION: TerminalDb<(Workspace, Terminal)>);
10
11impl Domain for Terminal {
12 fn name() -> &'static str {
13 "terminal"
14 }
15
16 fn migrations() -> &'static [&'static str] {
17 &[indoc! {"
18 CREATE TABLE terminals (
19 item_id INTEGER,
20 workspace_id BLOB,
21 working_directory BLOB,
22 PRIMARY KEY(item_id, workspace_id),
23 FOREIGN KEY(workspace_id) REFERENCES workspaces(workspace_id)
24 ON DELETE CASCADE
25 ON UPDATE CASCADE
26 ) STRICT;
27 "}]
28 }
29}
30
31impl TerminalDb {
32 pub fn save_working_directory(
33 &self,
34 item_id: ItemId,
35 workspace_id: &WorkspaceId,
36 working_directory: &Path,
37 ) {
38 iife!({
39 self.exec_bound::<(ItemId, &WorkspaceId, &Path)>(indoc! {"
40 INSERT OR REPLACE INTO terminals(item_id, workspace_id, working_directory)
41 VALUES (?, ?, ?)
42 "})?((item_id, workspace_id, working_directory))
43 })
44 .log_err();
45 }
46
47 pub fn get_working_directory(
48 &self,
49 item_id: ItemId,
50 workspace_id: &WorkspaceId,
51 ) -> Option<PathBuf> {
52 iife!({
53 self.select_row_bound::<(ItemId, &WorkspaceId), PathBuf>(indoc! {"
54 SELECT working_directory
55 FROM terminals
56 WHERE item_id = ? workspace_id = ?"})?((item_id, workspace_id))
57 })
58 .log_err()
59 .flatten()
60 }
61}