1// use std::{
2// ffi::OsStr,
3// fmt::Display,
4// hash::Hash,
5// os::unix::prelude::OsStrExt,
6// path::{Path, PathBuf},
7// sync::Arc,
8// };
9
10// use anyhow::Result;
11// use collections::HashSet;
12// use rusqlite::{named_params, params, types::FromSql};
13
14// use crate::workspace::WorkspaceId;
15
16// use super::Db;
17
18// /// Current design makes the cut at the item level,
19// /// - Maybe A little more bottom up, serialize 'Terminals' and 'Editors' directly, and then make a seperate
20// /// - items table, with a kind, and an integer that acts as a key to one of these other tables
21// /// This column is a foreign key to ONE OF: editors, terminals, searches
22// /// -
23
24// // (workspace_id, item_id)
25// // kind -> ::Editor::
26
27// // ->
28// // At the workspace level
29// // -> (Workspace_ID, item_id)
30// // -> One shot, big query, load everything up:
31
32// // -> SerializedWorkspace::deserialize(tx, itemKey)
33// // -> SerializedEditor::deserialize(tx, itemKey)
34
35// // ->
36// // -> Workspace::new(SerializedWorkspace)
37// // -> Editor::new(serialized_workspace[???]serializedEditor)
38
39// // //Pros: Keeps sql out of every body elese, makes changing it easier (e.g. for loading from a network or RocksDB)
40// // //Cons: DB has to know the internals of the entire rest of the app
41
42// // Workspace
43// // Worktree roots
44// // Pane groups
45// // Dock
46// // Items
47// // Sidebars
48
49// // Things I'm doing: finding about nullability for foreign keys
50// pub(crate) const ITEMS_M_1: &str = "
51// CREATE TABLE project_searches(
52// workspace_id INTEGER,
53// item_id INTEGER,
54// query TEXT,
55// PRIMARY KEY (workspace_id, item_id)
56// FOREIGN KEY(workspace_id) REFERENCES workspace_ids(workspace_id)
57// ) STRICT;
58
59// CREATE TABLE editors(
60// workspace_id INTEGER,
61// item_id INTEGER,
62// path BLOB NOT NULL,
63// PRIMARY KEY (workspace_id, item_id)
64// FOREIGN KEY(workspace_id) REFERENCES workspace_ids(workspace_id)
65// ) STRICT;
66// ";
67
68#[derive(Debug, PartialEq, Eq)]
69pub struct ItemId {
70 workspace_id: usize,
71 item_id: usize,
72}
73
74// enum SerializedItemKind {
75// Editor,
76// Diagnostics,
77// ProjectSearch,
78// Terminal,
79// }
80
81// struct SerializedItemRow {
82// kind: SerializedItemKind,
83// item_id: usize,
84// path: Option<Arc<Path>>,
85// query: Option<String>,
86// }
87
88// #[derive(Debug, PartialEq, Eq)]
89// pub enum SerializedItem {
90// Editor { item_id: usize, path: Arc<Path> },
91// Diagnostics { item_id: usize },
92// ProjectSearch { item_id: usize, query: String },
93// Terminal { item_id: usize },
94// }
95
96// impl SerializedItem {
97// pub fn item_id(&self) -> usize {
98// match self {
99// SerializedItem::Editor { item_id, .. } => *item_id,
100// SerializedItem::Diagnostics { item_id } => *item_id,
101// SerializedItem::ProjectSearch { item_id, .. } => *item_id,
102// SerializedItem::Terminal { item_id } => *item_id,
103// }
104// }
105// }
106
107// impl Db {
108// pub fn get_item(&self, item_id: ItemId) -> SerializedItem {
109// unimplemented!()
110// }
111
112// pub fn save_item(&self, workspace_id: WorkspaceId, item: &SerializedItem) {}
113
114// pub fn close_item(&self, item_id: ItemId) {}
115// }