提交 8080fe13 编写于 作者: J jurgen

Do not close editor if RSV save fails

上级 b491d36a
......@@ -66,7 +66,7 @@ public interface IResultSetController extends DBPContextProvider {
@NotNull
DBPPreferenceStore getPreferenceStore();
void applyChanges(@Nullable DBRProgressMonitor monitor);
boolean applyChanges(@Nullable DBRProgressMonitor monitor);
void rejectChanges();
......
......@@ -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();
......
......@@ -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;
}
}
......
......@@ -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
......
......@@ -147,7 +147,9 @@ public class DatabaseDataEditor extends AbstractDatabaseObjectEditor<DBSDataCont
public void doSave(IProgressMonitor monitor)
{
if (resultSetView != null && resultSetView.isDirty()) {
resultSetView.applyChanges(RuntimeUtils.makeMonitor(monitor));
if (!resultSetView.applyChanges(RuntimeUtils.makeMonitor(monitor))) {
monitor.setCanceled(true);
}
}
}
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册