1use std::path::PathBuf;
2
3use db::{connection, query, sqlez::domain::Domain, sqlez_macros::sql};
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 &[sql!(
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 UPDATE terminals
38 SET workspace_id = ?
39 WHERE workspace_id = ? AND item_id = ?
40 }
41 }
42
43 query! {
44 pub async fn save_working_directory(
45 item_id: ItemId,
46 workspace_id: WorkspaceId,
47 working_directory: PathBuf
48 ) -> Result<()> {
49 INSERT OR REPLACE INTO terminals(item_id, workspace_id, working_directory)
50 VALUES (?, ?, ?)
51 }
52 }
53
54 query! {
55 pub fn get_working_directory(item_id: ItemId, workspace_id: WorkspaceId) -> Result<Option<PathBuf>> {
56 SELECT working_directory
57 FROM terminals
58 WHERE item_id = ? AND workspace_id = ?
59 }
60 }
61}