persistence.rs

 1use std::path::{Path, PathBuf};
 2
 3use db::{connection, indoc, sqlez::domain::Domain};
 4use util::{iife, ResultExt};
 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        &[indoc! {"
18            CREATE TABLE terminals (
19                item_id INTEGER,
20                workspace_id BLOB,
21                working_directory BLOB,
22                PRIMARY KEY(item_id, workspace_id),
23                FOREIGN KEY(workspace_id) REFERENCES workspaces(workspace_id)
24                    ON DELETE CASCADE
25                    ON UPDATE CASCADE
26            ) STRICT;
27        "}]
28    }
29}
30
31impl TerminalDb {
32    pub fn save_working_directory(
33        &self,
34        item_id: ItemId,
35        workspace_id: &WorkspaceId,
36        working_directory: &Path,
37    ) {
38        iife!({
39            self.exec_bound::<(ItemId, &WorkspaceId, &Path)>(indoc! {"
40                INSERT OR REPLACE INTO terminals(item_id, workspace_id, working_directory) 
41                VALUES (?, ?, ?)  
42            "})?((item_id, workspace_id, working_directory))
43        })
44        .log_err();
45    }
46
47    pub fn get_working_directory(
48        &self,
49        item_id: ItemId,
50        workspace_id: &WorkspaceId,
51    ) -> Option<PathBuf> {
52        iife!({
53            self.select_row_bound::<(ItemId, &WorkspaceId), PathBuf>(indoc! {"
54            SELECT working_directory 
55            FROM terminals 
56            WHERE item_id = ? workspace_id = ?"})?((item_id, workspace_id))
57        })
58        .log_err()
59        .flatten()
60    }
61}