提交 b53a15e7 编写于 作者: S Serge Rider

#1562 Manual commit mode enable on modifying query or data change


Former-commit-id: 837ecdee
上级 2939c344
......@@ -35,6 +35,8 @@ import org.jkiss.dbeaver.model.net.DBWNetworkHandler;
import org.jkiss.dbeaver.model.runtime.DBRProgressMonitor;
import org.jkiss.dbeaver.model.runtime.DBRRunnableParametrized;
import org.jkiss.dbeaver.model.runtime.VoidProgressMonitor;
import org.jkiss.dbeaver.model.sql.SQLDialect;
import org.jkiss.dbeaver.model.sql.SQLUtils;
import org.jkiss.dbeaver.runtime.DBWorkbench;
import org.jkiss.dbeaver.runtime.jobs.InvalidateJob;
import org.jkiss.dbeaver.runtime.net.GlobalProxyAuthenticator;
......@@ -267,4 +269,20 @@ public class DBExecUtils {
}
}
public static void checkSmartAutoCommit(DBCSession session, String queryText) {
SQLDialect sqlDialect = SQLUtils.getDialectFromDataSource(session.getDataSource());
if (!sqlDialect.isTransactionModifyingQuery(queryText)) {
return;
}
DBCTransactionManager txnManager = DBUtils.getTransactionManager(session.getExecutionContext());
if (txnManager != null) {
try {
if (txnManager.isAutoCommit()) {
txnManager.setAutoCommit(session.getProgressMonitor(), false);
}
} catch (DBCException e) {
log.warn(e);
}
}
}
}
\ No newline at end of file
......@@ -580,9 +580,24 @@ class ResultSetPersister {
private Throwable executeStatements(DBRProgressMonitor monitor) {
try (DBCSession session = getExecutionContext().openSession(monitor, DBCExecutionPurpose.USER, ResultSetMessages.controls_resultset_viewer_job_update)) {
monitor.beginTask(
ResultSetMessages.controls_resultset_viewer_monitor_aply_changes,
ResultSetPersister.this.deleteStatements.size() + ResultSetPersister.this.insertStatements.size() + ResultSetPersister.this.updateStatements.size() + 1);
if (!generateScript) {
IResultSetContainer container = viewer.getContainer();
if (container instanceof ISmartTransactionManager) {
if (((ISmartTransactionManager) container).isSmartAutoCommit()) {
DBCTransactionManager txnManager = DBUtils.getTransactionManager(session.getExecutionContext());
if (txnManager != null) {
monitor.subTask("Disable auto-commit mode");
txnManager.setAutoCommit(monitor, false);
}
}
}
}
Throwable[] error = new Throwable[1];
DBExecUtils.tryExecuteRecover(monitor, session.getDataSource(), param -> {
error[0] = executeStatements(session);
......
......@@ -3632,6 +3632,7 @@ public class ResultSetViewer extends Viewer
}
}
};
return persister.applyChanges(monitor, false, settings, applyListener);
} catch (DBException e) {
DBWorkbench.getPlatformUI().showError("Apply changes error", "Error saving changes in database", e);
......
......@@ -2639,7 +2639,7 @@ public class SQLEditor extends SQLEditorBase implements
}
}
public class QueryResultsContainer implements DBSDataContainer, IResultSetContainer, IResultSetListener, SQLQueryContainer {
public class QueryResultsContainer implements DBSDataContainer, IResultSetContainer, IResultSetListener, SQLQueryContainer, ISmartTransactionManager {
private final QueryProcessor queryProcessor;
private final ResultSetViewer viewer;
......@@ -3015,6 +3015,16 @@ public class SQLEditor extends SQLEditorBase implements
public SQLScriptElement getQuery() {
return query;
}
@Override
public boolean isSmartAutoCommit() {
return SQLEditor.this.isSmartAutoCommit();
}
@Override
public void setSmartAutoCommit(boolean smartAutoCommit) {
SQLEditor.this.setSmartAutoCommit(smartAutoCommit);
}
}
private String getResultsTabName(int resultSetNumber, int queryIndex, String name) {
......@@ -3073,6 +3083,9 @@ public class SQLEditor extends SQLEditorBase implements
@Override
public void onStartQuery(DBCSession session, final SQLQuery query) {
try {
if (isSmartAutoCommit()) {
DBExecUtils.checkSmartAutoCommit(session, query.getText());
}
boolean isInExecute = getTotalQueryRunning() > 0;
if (!isInExecute) {
UIUtils.asyncExec(() -> {
......
......@@ -72,19 +72,16 @@ public class SQLCommandInclude implements SQLControlCommandHandler {
throw new DBException("IO error reading file '" + fileName + "'", e);
}
final File finalIncFile = incFile;
final boolean statusFlag[] = new boolean[1];
UIUtils.syncExec(new Runnable() {
@Override
public void run() {
final IWorkbenchWindow workbenchWindow = UIUtils.getActiveWorkbenchWindow();
final IncludeEditorInput input = new IncludeEditorInput(finalIncFile, fileContents);
SQLEditor sqlEditor = OpenHandler.openSQLConsole(
workbenchWindow,
scriptContext.getExecutionContext().getDataSource().getContainer(),
input);
final IncludeScriptListener scriptListener = new IncludeScriptListener(workbenchWindow, sqlEditor, statusFlag);
sqlEditor.processSQL(false, true, null, scriptListener);
}
final boolean[] statusFlag = new boolean[1];
UIUtils.syncExec(() -> {
final IWorkbenchWindow workbenchWindow = UIUtils.getActiveWorkbenchWindow();
final IncludeEditorInput input = new IncludeEditorInput(finalIncFile, fileContents);
SQLEditor sqlEditor = OpenHandler.openSQLConsole(
workbenchWindow,
scriptContext.getExecutionContext().getDataSource().getContainer(),
input);
final IncludeScriptListener scriptListener = new IncludeScriptListener(workbenchWindow, sqlEditor, statusFlag);
sqlEditor.processSQL(false, true, null, scriptListener);
});
// Wait until script finished
......@@ -126,12 +123,7 @@ public class SQLCommandInclude implements SQLControlCommandHandler {
@Override
public void onEndScript(DBCStatistics statistics, boolean hasErrors) {
UIUtils.syncExec(new Runnable() {
@Override
public void run() {
workbenchWindow.getActivePage().closeEditor(editor, false);
}
});
UIUtils.syncExec(() -> workbenchWindow.getActivePage().closeEditor(editor, false));
statusFlag[0] = true;
}
}
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册