persistence.rs

 1use std::path::PathBuf;
 2
 3use db::sqlez_macros::sql;
 4use db::{define_connection, query};
 5
 6use workspace::{ItemId, WorkspaceDb, WorkspaceId};
 7
 8define_connection!(
 9    // Current schema shape using pseudo-rust syntax:
10    // editors(
11    //   item_id: usize,
12    //   workspace_id: usize,
13    //   path: PathBuf,
14    //   scroll_top_row: usize,
15    //   scroll_vertical_offset: f32,
16    //   scroll_horizontal_offset: f32,
17    // )
18    pub static ref DB: EditorDb<WorkspaceDb> =
19        &[sql! (
20            CREATE TABLE editors(
21                item_id INTEGER NOT NULL,
22                workspace_id INTEGER NOT NULL,
23                path BLOB NOT NULL,
24                PRIMARY KEY(item_id, workspace_id),
25                FOREIGN KEY(workspace_id) REFERENCES workspaces(workspace_id)
26                ON DELETE CASCADE
27                ON UPDATE CASCADE
28            ) STRICT;
29        ),
30        sql! (
31            ALTER TABLE editors ADD COLUMN scroll_top_row INTEGER NOT NULL DEFAULT 0;
32            ALTER TABLE editors ADD COLUMN scroll_horizontal_offset REAL NOT NULL DEFAULT 0;
33            ALTER TABLE editors ADD COLUMN scroll_vertical_offset REAL NOT NULL DEFAULT 0;
34        )];
35);
36
37impl EditorDb {
38    query! {
39        pub fn get_path(item_id: ItemId, workspace_id: WorkspaceId) -> Result<Option<PathBuf>> {
40            SELECT path FROM editors
41            WHERE item_id = ? AND workspace_id = ?
42        }
43    }
44
45    query! {
46        pub async fn save_path(item_id: ItemId, workspace_id: WorkspaceId, path: PathBuf) -> Result<()> {
47            INSERT INTO editors
48                (item_id, workspace_id, path)
49            VALUES
50                (?1, ?2, ?3)
51            ON CONFLICT DO UPDATE SET
52                item_id = ?1,
53                workspace_id = ?2,
54                path = ?3
55        }
56    }
57
58    // Returns the scroll top row, and offset
59    query! {
60        pub fn get_scroll_position(item_id: ItemId, workspace_id: WorkspaceId) -> Result<Option<(u32, f32, f32)>> {
61            SELECT scroll_top_row, scroll_horizontal_offset, scroll_vertical_offset
62            FROM editors
63            WHERE item_id = ? AND workspace_id = ?
64        }
65    }
66
67    query! {
68        pub async fn save_scroll_position(
69            item_id: ItemId,
70            workspace_id: WorkspaceId,
71            top_row: u32,
72            vertical_offset: f32,
73            horizontal_offset: f32
74        ) -> Result<()> {
75            UPDATE OR IGNORE editors
76            SET
77                scroll_top_row = ?3,
78                scroll_horizontal_offset = ?4,
79                scroll_vertical_offset = ?5
80            WHERE item_id = ?1 AND workspace_id = ?2
81        }
82    }
83}