working serialized writes with panics on failure. Everything seems to be working
This commit is contained in:
parent
b01243109e
commit
1cc3e4820a
34 changed files with 669 additions and 312 deletions
|
@ -1,4 +1,4 @@
|
|||
use std::path::{Path, PathBuf};
|
||||
use std::path::PathBuf;
|
||||
|
||||
use db::{connection, indoc, sql_method, sqlez::domain::Domain};
|
||||
|
||||
|
@ -17,7 +17,7 @@ impl Domain for Terminal {
|
|||
&[indoc! {"
|
||||
CREATE TABLE terminals (
|
||||
workspace_id INTEGER,
|
||||
item_id INTEGER,
|
||||
item_id INTEGER UNIQUE,
|
||||
working_directory BLOB,
|
||||
PRIMARY KEY(workspace_id, item_id),
|
||||
FOREIGN KEY(workspace_id) REFERENCES workspaces(workspace_id)
|
||||
|
@ -29,21 +29,35 @@ impl Domain for Terminal {
|
|||
|
||||
impl TerminalDb {
|
||||
sql_method! {
|
||||
save_working_directory(item_id: ItemId,
|
||||
workspace_id: WorkspaceId,
|
||||
working_directory: &Path) -> Result<()>:
|
||||
indoc!{"
|
||||
INSERT OR REPLACE INTO terminals(item_id, workspace_id, working_directory)
|
||||
VALUES (?1, ?2, ?3)
|
||||
async update_workspace_id(
|
||||
new_id: WorkspaceId,
|
||||
old_id: WorkspaceId,
|
||||
item_id: ItemId
|
||||
) -> Result<()>:
|
||||
indoc! {"
|
||||
UPDATE terminals
|
||||
SET workspace_id = ?
|
||||
WHERE workspace_id = ? AND item_id = ?
|
||||
"}
|
||||
}
|
||||
|
||||
sql_method! {
|
||||
async save_working_directory(
|
||||
item_id: ItemId,
|
||||
workspace_id: WorkspaceId,
|
||||
working_directory: PathBuf) -> Result<()>:
|
||||
indoc!{"
|
||||
INSERT OR REPLACE INTO terminals(item_id, workspace_id, working_directory)
|
||||
VALUES (?1, ?2, ?3)
|
||||
"}
|
||||
}
|
||||
|
||||
sql_method! {
|
||||
get_working_directory(item_id: ItemId, workspace_id: WorkspaceId) -> Result<Option<PathBuf>>:
|
||||
indoc!{"
|
||||
SELECT working_directory
|
||||
FROM terminals
|
||||
WHERE item_id = ? AND workspace_id = ?
|
||||
"}
|
||||
indoc!{"
|
||||
SELECT working_directory
|
||||
FROM terminals
|
||||
WHERE item_id = ? AND workspace_id = ?
|
||||
"}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -57,7 +57,8 @@ use gpui::{
|
|||
geometry::vector::{vec2f, Vector2F},
|
||||
keymap::Keystroke,
|
||||
scene::{MouseDown, MouseDrag, MouseScrollWheel, MouseUp},
|
||||
ClipboardItem, Entity, ModelContext, MouseButton, MouseMovedEvent, MutableAppContext, Task,
|
||||
AppContext, ClipboardItem, Entity, ModelContext, MouseButton, MouseMovedEvent,
|
||||
MutableAppContext, Task,
|
||||
};
|
||||
|
||||
use crate::mappings::{
|
||||
|
@ -585,7 +586,8 @@ impl Terminal {
|
|||
cx.background()
|
||||
.spawn(async move {
|
||||
TERMINAL_CONNECTION
|
||||
.save_working_directory(item_id, workspace_id, cwd.as_path())
|
||||
.save_working_directory(item_id, workspace_id, cwd)
|
||||
.await
|
||||
.log_err();
|
||||
})
|
||||
.detach();
|
||||
|
@ -1192,6 +1194,21 @@ impl Terminal {
|
|||
}
|
||||
}
|
||||
|
||||
pub fn set_workspace_id(&mut self, id: WorkspaceId, cx: &AppContext) {
|
||||
let old_workspace_id = self.workspace_id;
|
||||
let item_id = self.item_id;
|
||||
cx.background()
|
||||
.spawn(async move {
|
||||
TERMINAL_CONNECTION
|
||||
.update_workspace_id(id, old_workspace_id, item_id)
|
||||
.await
|
||||
.log_err()
|
||||
})
|
||||
.detach();
|
||||
|
||||
self.workspace_id = id;
|
||||
}
|
||||
|
||||
pub fn find_matches(
|
||||
&mut self,
|
||||
query: project::search::SearchQuery,
|
||||
|
|
|
@ -400,6 +400,14 @@ impl Item for TerminalContainer {
|
|||
)
|
||||
})))
|
||||
}
|
||||
|
||||
fn added_to_workspace(&mut self, workspace: &mut Workspace, cx: &mut ViewContext<Self>) {
|
||||
if let Some(connected) = self.connected() {
|
||||
let id = workspace.database_id();
|
||||
let terminal_handle = connected.read(cx).terminal().clone();
|
||||
terminal_handle.update(cx, |terminal, cx| terminal.set_workspace_id(id, cx))
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
impl SearchableItem for TerminalContainer {
|
||||
|
|
|
@ -31,6 +31,7 @@ impl<'a> TerminalTestContext<'a> {
|
|||
let (_, workspace) = self.cx.add_window(|cx| {
|
||||
Workspace::new(
|
||||
Default::default(),
|
||||
0,
|
||||
project.clone(),
|
||||
|_, _| unimplemented!(),
|
||||
cx,
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue