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        // Remove the unique constraint on the item_id table
19        // SQLite doesn't have a way of doing this automatically, so
20        // we have to do this silly copying.
21        sql!(
22            CREATE TABLE terminals2 (
23                workspace_id INTEGER,
24                item_id INTEGER,
25                working_directory BLOB,
26                PRIMARY KEY(workspace_id, item_id),
27                FOREIGN KEY(workspace_id) REFERENCES workspaces(workspace_id)
28                ON DELETE CASCADE
29            ) STRICT;
30
31            INSERT INTO terminals2 (workspace_id, item_id, working_directory)
32            SELECT workspace_id, item_id, working_directory FROM terminals;
33
34            DROP TABLE terminals;
35
36            ALTER TABLE terminals2 RENAME TO terminals;
37        )];
38}
39
40impl TerminalDb {
41    query! {
42       pub async fn update_workspace_id(
43            new_id: WorkspaceId,
44            old_id: WorkspaceId,
45            item_id: ItemId
46        ) -> Result<()> {
47            UPDATE terminals
48            SET workspace_id = ?
49            WHERE workspace_id = ? AND item_id = ?
50        }
51    }
52
53    query! {
54        pub async fn save_working_directory(
55            item_id: ItemId,
56            workspace_id: WorkspaceId,
57            working_directory: PathBuf
58        ) -> Result<()> {
59            INSERT OR REPLACE INTO terminals(item_id, workspace_id, working_directory)
60            VALUES (?, ?, ?)
61        }
62    }
63
64    query! {
65        pub fn get_working_directory(item_id: ItemId, workspace_id: WorkspaceId) -> Result<Option<PathBuf>> {
66            SELECT working_directory
67            FROM terminals
68            WHERE item_id = ? AND workspace_id = ?
69        }
70    }
71}