persistence.rs

 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}