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}