1use std::path::PathBuf;
2
3use db::{connection, indoc, query, sqlez::domain::Domain};
4
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 workspace_id INTEGER,
20 item_id INTEGER UNIQUE,
21 working_directory BLOB,
22 PRIMARY KEY(workspace_id, item_id),
23 FOREIGN KEY(workspace_id) REFERENCES workspaces(workspace_id)
24 ON DELETE CASCADE
25 ) STRICT;
26 "}]
27 }
28}
29
30impl TerminalDb {
31 query! {
32 pub async fn update_workspace_id(
33 new_id: WorkspaceId,
34 old_id: WorkspaceId,
35 item_id: ItemId
36 ) -> Result<()> {
37 indoc!{"
38 UPDATE terminals
39 SET workspace_id = ?
40 WHERE workspace_id = ? AND item_id = ?
41 "}
42 }
43 }
44
45 query! {
46 pub async fn save_working_directory(
47 item_id: ItemId,
48 workspace_id: WorkspaceId,
49 working_directory: PathBuf
50 ) -> Result<()> {
51 indoc!{"
52 INSERT OR REPLACE INTO terminals(item_id, workspace_id, working_directory)
53 VALUES (?1, ?2, ?3)
54 "}
55 }
56 }
57
58 query! {
59 pub fn get_working_directory(item_id: ItemId, workspace_id: WorkspaceId) -> Result<Option<PathBuf>> {
60 indoc!{"
61 SELECT working_directory
62 FROM terminals
63 WHERE item_id = ? AND workspace_id = ?
64 "}
65 }
66 }
67}