persistence.rs

 1use std::path::PathBuf;
 2
 3use db::{define_connection, query, sqlez_macros::sql};
 4
 5use workspace::{ItemId, WorkspaceDb, WorkspaceId};
 6
 7define_connection! {
 8    pub static ref TERMINAL_CONNECTION: TerminalDb<WorkspaceDb> =
 9        &[sql!(
10            CREATE TABLE terminals (
11                workspace_id INTEGER,
12                item_id INTEGER UNIQUE,
13                working_directory BLOB,
14                PRIMARY KEY(workspace_id, item_id),
15                FOREIGN KEY(workspace_id) REFERENCES workspaces(workspace_id)
16                    ON DELETE CASCADE
17            ) STRICT;
18        )];
19}
20
21impl TerminalDb {
22    query! {
23       pub async fn update_workspace_id(
24            new_id: WorkspaceId,
25            old_id: WorkspaceId,
26            item_id: ItemId
27        ) -> Result<()> {
28            UPDATE terminals
29            SET workspace_id = ?
30            WHERE workspace_id = ? AND item_id = ?
31        }
32    }
33
34    query! {
35        pub async fn save_working_directory(
36            item_id: ItemId,
37            workspace_id: WorkspaceId,
38            working_directory: PathBuf
39        ) -> Result<()> {
40            INSERT OR REPLACE INTO terminals(item_id, workspace_id, working_directory)
41            VALUES (?, ?, ?)
42        }
43    }
44
45    query! {
46        pub fn get_working_directory(item_id: ItemId, workspace_id: WorkspaceId) -> Result<Option<PathBuf>> {
47            SELECT working_directory
48            FROM terminals
49            WHERE item_id = ? AND workspace_id = ?
50        }
51    }
52}