persistence.rs

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