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}