From 8080fe13a7efee854b04d7e61126c4f082dc133e Mon Sep 17 00:00:00 2001 From: jurgen Date: Fri, 16 Oct 2015 14:11:01 +0000 Subject: [PATCH] Do not close editor if RSV save fails --- .../resultset/IResultSetController.java | 2 +- .../resultset/ResultSetPersister.java | 14 ++++++--- .../controls/resultset/ResultSetViewer.java | 13 +++++---- .../resultset/spreadsheet/Spreadsheet.java | 29 +++++++++++-------- .../ui/editors/data/DatabaseDataEditor.java | 4 ++- 5 files changed, 38 insertions(+), 24 deletions(-) diff --git a/plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/ui/controls/resultset/IResultSetController.java b/plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/ui/controls/resultset/IResultSetController.java index c9bffd4728..4074680364 100644 --- a/plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/ui/controls/resultset/IResultSetController.java +++ b/plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/ui/controls/resultset/IResultSetController.java @@ -66,7 +66,7 @@ public interface IResultSetController extends DBPContextProvider { @NotNull DBPPreferenceStore getPreferenceStore(); - void applyChanges(@Nullable DBRProgressMonitor monitor); + boolean applyChanges(@Nullable DBRProgressMonitor monitor); void rejectChanges(); diff --git a/plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/ui/controls/resultset/ResultSetPersister.java b/plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/ui/controls/resultset/ResultSetPersister.java index e966aebcb4..00889ba517 100644 --- a/plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/ui/controls/resultset/ResultSetPersister.java +++ b/plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/ui/controls/resultset/ResultSetPersister.java @@ -75,7 +75,7 @@ class ResultSetPersister { * @param monitor progress monitor * @param listener value listener */ - void applyChanges(@Nullable DBRProgressMonitor monitor, @Nullable DataUpdateListener listener) + boolean applyChanges(@Nullable DBRProgressMonitor monitor, @Nullable DataUpdateListener listener) throws DBException { collectChanges(); @@ -83,7 +83,7 @@ class ResultSetPersister { prepareDeleteStatements(); prepareInsertStatements(); prepareUpdateStatements(); - execute(monitor, listener); + return execute(monitor, listener); } private void collectChanges() { @@ -187,7 +187,7 @@ class ResultSetPersister { } } - private void execute(@Nullable DBRProgressMonitor monitor, @Nullable final DataUpdateListener listener) + private boolean execute(@Nullable DBRProgressMonitor monitor, @Nullable final DataUpdateListener listener) throws DBException { DBCExecutionContext executionContext = viewer.getContainer().getExecutionContext(); @@ -197,8 +197,10 @@ class ResultSetPersister { DataUpdaterJob job = new DataUpdaterJob(listener, executionContext); if (monitor == null) { job.schedule(); + return true; } else { job.run(monitor); + return job.getError() == null; } } @@ -304,6 +306,7 @@ class ResultSetPersister { private boolean autocommit; private DBCStatistics updateStats, insertStats, deleteStats; private DBCSavepoint savepoint; + private Throwable error; protected DataUpdaterJob(@Nullable DataUpdateListener listener, @NotNull DBCExecutionContext executionContext) { @@ -311,10 +314,13 @@ class ResultSetPersister { this.listener = listener; } + public Throwable getError() { + return error; + } + @Override protected IStatus run(DBRProgressMonitor monitor) { - final Throwable error; model.setUpdateInProgress(true); updateStats = new DBCStatistics(); insertStats = new DBCStatistics(); diff --git a/plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/ui/controls/resultset/ResultSetViewer.java b/plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/ui/controls/resultset/ResultSetViewer.java index a977cc227a..de6746e337 100644 --- a/plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/ui/controls/resultset/ResultSetViewer.java +++ b/plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/ui/controls/resultset/ResultSetViewer.java @@ -1710,9 +1710,9 @@ public class ResultSetViewer extends Viewer } @Override - public void applyChanges(@Nullable DBRProgressMonitor monitor) + public boolean applyChanges(@Nullable DBRProgressMonitor monitor) { - applyChanges(monitor, null); + return applyChanges(monitor, null); } /** @@ -1720,11 +1720,11 @@ public class ResultSetViewer extends Viewer * @param monitor monitor. If null then save will be executed in async job * @param listener finish listener (may be null) */ - public void applyChanges(@Nullable DBRProgressMonitor monitor, @Nullable ResultSetPersister.DataUpdateListener listener) + public boolean applyChanges(@Nullable DBRProgressMonitor monitor, @Nullable ResultSetPersister.DataUpdateListener listener) { if (!model.isSingleSource()) { UIUtils.showErrorDialog(getControl().getShell(), "Apply changes error", "Can't save data for result set from multiple sources"); - return; + return false; } try { boolean needPK = false; @@ -1738,12 +1738,13 @@ public class ResultSetViewer extends Viewer // If we have deleted or updated rows then check for unique identifier if (!checkEntityIdentifier()) { //UIUtils.showErrorDialog(getControl().getShell(), "Can't apply changes", "Can't apply data changes - not unique identifier defined"); - return; + return false; } } - new ResultSetPersister(this).applyChanges(monitor, listener); + return new ResultSetPersister(this).applyChanges(monitor, listener); } catch (DBException e) { UIUtils.showErrorDialog(getControl().getShell(), "Apply changes error", "Error saving changes in database", e); + return false; } } diff --git a/plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/ui/controls/resultset/spreadsheet/Spreadsheet.java b/plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/ui/controls/resultset/spreadsheet/Spreadsheet.java index b26e52345b..5c5ec5d243 100644 --- a/plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/ui/controls/resultset/spreadsheet/Spreadsheet.java +++ b/plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/ui/controls/resultset/spreadsheet/Spreadsheet.java @@ -237,18 +237,23 @@ public class Spreadsheet extends LightGrid implements Listener { { final Control editorControl = presentation.openValueEditor(true); if (editorControl != null && event.keyCode != SWT.CR) { - // Forward the same key event to just created control - final Event kdEvent = new Event(); - kdEvent.type = SWT.KeyDown; - kdEvent.character = event.character; - kdEvent.keyCode = event.keyCode; - UIUtils.postEvent(editorControl, kdEvent); - - final Event kuEvent = new Event(); - kuEvent.type = SWT.KeyUp; - kuEvent.character = event.character; - kuEvent.keyCode = event.keyCode; - UIUtils.postEvent(editorControl, kuEvent); + UIUtils.runInDetachedUI(getShell(), new Runnable() { + @Override + public void run() { + // Forward the same key event to just created control + final Event kdEvent = new Event(); + kdEvent.type = SWT.KeyDown; + kdEvent.character = event.character; + kdEvent.keyCode = event.keyCode; + UIUtils.postEvent(editorControl, kdEvent); + + final Event kuEvent = new Event(); + kuEvent.type = SWT.KeyUp; + kuEvent.character = event.character; + kuEvent.keyCode = event.keyCode; + UIUtils.postEvent(editorControl, kuEvent); + } + }); } } else if (event.keyCode == SWT.ESC) { // Reset cell value diff --git a/plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/ui/editors/data/DatabaseDataEditor.java b/plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/ui/editors/data/DatabaseDataEditor.java index d8c4bf61bf..d98e04de94 100644 --- a/plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/ui/editors/data/DatabaseDataEditor.java +++ b/plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/ui/editors/data/DatabaseDataEditor.java @@ -147,7 +147,9 @@ public class DatabaseDataEditor extends AbstractDatabaseObjectEditor