提交 e99b1029 编写于 作者: J jurgen

Custom statement delimiters

Former-commit-id: 612dafaa
上级 2f0f52c1
......@@ -237,7 +237,7 @@ public final class SQLUtils {
public static String trimQueryStatement(SQLSyntaxManager syntaxManager, String sql)
{
sql = sql.trim();
String statementDelimiter = syntaxManager.getStatementDelimiter();
for (String statementDelimiter : syntaxManager.getStatementDelimiters()) {
if (sql.endsWith(statementDelimiter) && sql.length() > statementDelimiter.length()) {
if (Character.isAlphabetic(statementDelimiter.charAt(0))) {
// Delimiter is alphabetic (e.g. "GO") so it must be prefixed with whitespace
......@@ -253,6 +253,7 @@ public final class SQLUtils {
sql = trimmed;
}
}
}
return sql;
}
......
......@@ -29,6 +29,8 @@ import org.eclipse.jface.action.IMenuListener;
import org.eclipse.jface.action.IMenuManager;
import org.eclipse.jface.action.MenuManager;
import org.eclipse.jface.text.*;
import org.eclipse.jface.util.IPropertyChangeListener;
import org.eclipse.jface.util.PropertyChangeEvent;
import org.eclipse.jface.viewers.ISelectionProvider;
import org.eclipse.jface.viewers.StructuredSelection;
import org.eclipse.swt.SWT;
......@@ -97,8 +99,7 @@ import java.util.concurrent.atomic.AtomicInteger;
* SQL Executor
*/
public class SQLEditor extends SQLEditorBase
implements IDataSourceContainerProviderEx, DBPEventListener, ISaveablePart2, IResultSetContainer, DBPDataSourceUser, DBPDataSourceHandler
{
implements IDataSourceContainerProviderEx, DBPEventListener, ISaveablePart2, IResultSetContainer, DBPDataSourceUser, DBPDataSourceHandler, IPropertyChangeListener {
private static final long SCRIPT_UI_UPDATE_PERIOD = 100;
private static Image IMG_DATA_GRID = DBeaverActivator.getImageDescriptor("/icons/sql/page_data_grid.png").createImage(); //$NON-NLS-1$
......@@ -189,6 +190,7 @@ public class SQLEditor extends SQLEditorBase
}
// Acquire ds container
if (dataSourceContainer != null) {
dataSourceContainer.getPreferenceStore().removePropertyChangeListener(this);
dataSourceContainer.release(this);
dataSourceContainer = null;
}
......@@ -196,6 +198,9 @@ public class SQLEditor extends SQLEditorBase
closeAllJobs();
dataSourceContainer = container;
if (dataSourceContainer != null) {
dataSourceContainer.getPreferenceStore().addPropertyChangeListener(this);
}
IPathEditorInput input = getEditorInput();
if (input == null) {
return false;
......@@ -691,10 +696,7 @@ public class SQLEditor extends SQLEditorBase
public void dispose()
{
// Acquire ds container
final DBSDataSourceContainer dsContainer = getDataSourceContainer();
if (dsContainer != null) {
dsContainer.release(this);
}
setDataSourceContainer(null);
closeAllJobs();
......@@ -871,6 +873,13 @@ public class SQLEditor extends SQLEditorBase
return queryProcessor;
}
@Override
public void propertyChange(PropertyChangeEvent event) {
if (event.getProperty().equals(DBeaverPreferences.SCRIPT_STATEMENT_DELIMITER)) {
reloadSyntaxRules();
}
}
public class QueryProcessor implements SQLResultsConsumer {
private SQLQueryJob curJob;
......
......@@ -70,6 +70,8 @@ import org.jkiss.dbeaver.ui.editors.sql.util.SQLSymbolInserter;
import org.jkiss.dbeaver.ui.editors.text.BaseTextEditor;
import org.jkiss.utils.CommonUtils;
import java.util.Collection;
import java.util.Collections;
import java.util.ResourceBundle;
/**
......@@ -577,15 +579,17 @@ public abstract class SQLEditorBase extends BaseTextEditor {
String queryText = document.get(statementStart, tokenOffset - statementStart);
queryText = queryText.trim();
String delimiterText;
Collection<String> delimiterTexts;
if (isDelimiter) {
delimiterText = document.get(tokenOffset, tokenLength);
delimiterTexts = Collections.singleton(document.get(tokenOffset, tokenLength));
} else {
delimiterText = syntaxManager.getStatementDelimiter();
delimiterTexts = syntaxManager.getStatementDelimiters();
}
if (queryText.endsWith(delimiterText)) {
queryText = queryText.substring(0, queryText.length() - delimiterText.length());
for (String delim : delimiterTexts) {
if (queryText.endsWith(delim)) {
queryText = queryText.substring(0, queryText.length() - delim.length());
}
}
// make script line
return new SQLQuery(
......
......@@ -19,13 +19,13 @@
package org.jkiss.dbeaver.ui.editors.sql.format.tokenized;
import org.jkiss.dbeaver.ui.editors.sql.SQLConstants;
import org.jkiss.dbeaver.ui.editors.sql.format.SQLFormatter;
import org.jkiss.dbeaver.ui.editors.sql.format.SQLFormatterConfiguration;
import org.jkiss.dbeaver.utils.ContentUtils;
import org.jkiss.utils.Pair;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
/**
......@@ -34,14 +34,13 @@ import java.util.List;
public class SQLTokenizedFormatter implements SQLFormatter {
private SQLFormatterConfiguration formatterCfg;
private List<Boolean> functionBracket = new ArrayList<Boolean>();
private List<String> statementDelimiters = new ArrayList<String>(2);
private Collection<String> statementDelimiters = new ArrayList<String>(2);
@Override
public String format(final String argSql, SQLFormatterConfiguration configuration)
{
formatterCfg = configuration;
statementDelimiters.add(SQLConstants.DEFAULT_STATEMENT_DELIMITER);
statementDelimiters.add(formatterCfg.getSyntaxManager().getStatementDelimiter().toUpperCase());
statementDelimiters = formatterCfg.getSyntaxManager().getStatementDelimiters();
SQLTokensParser fParser = new SQLTokensParser(formatterCfg);
functionBracket.clear();
......
......@@ -29,6 +29,7 @@ import org.eclipse.ui.themes.ITheme;
import org.eclipse.ui.themes.IThemeManager;
import org.jkiss.code.NotNull;
import org.jkiss.code.Nullable;
import org.jkiss.dbeaver.DBeaverPreferences;
import org.jkiss.dbeaver.model.impl.sql.BasicSQLDialect;
import org.jkiss.dbeaver.model.sql.SQLDataSource;
import org.jkiss.dbeaver.model.sql.SQLDialect;
......@@ -59,7 +60,7 @@ public class SQLSyntaxManager extends RuleBasedScanner {
@NotNull
private String catalogSeparator;
@NotNull
private String statementDelimiter = SQLConstants.DEFAULT_STATEMENT_DELIMITER;
private Set<String> statementDelimiters = new LinkedHashSet<String>();//SQLConstants.DEFAULT_STATEMENT_DELIMITER;
@NotNull
private TreeMap<Integer, SQLScriptPosition> positions = new TreeMap<Integer, SQLScriptPosition>();
......@@ -101,9 +102,9 @@ public class SQLSyntaxManager extends RuleBasedScanner {
}
@NotNull
public String getStatementDelimiter()
public Set<String> getStatementDelimiters()
{
return statementDelimiter;
return statementDelimiters;
}
@Nullable
......@@ -142,13 +143,14 @@ public class SQLSyntaxManager extends RuleBasedScanner {
{
this.unassigned = dataSource == null;
this.dataSource = dataSource;
this.statementDelimiters.clear();
if (this.dataSource == null) {
sqlDialect = new BasicSQLDialect();
quoteSymbol = null;
structSeparator = SQLConstants.STRUCT_SEPARATOR;
catalogSeparator = String.valueOf(SQLConstants.STRUCT_SEPARATOR);
escapeChar = '\\';
statementDelimiter = SQLConstants.DEFAULT_STATEMENT_DELIMITER;
statementDelimiters.add(SQLConstants.DEFAULT_STATEMENT_DELIMITER);
} else {
sqlDialect = this.dataSource.getSQLDialect();
quoteSymbol = sqlDialect.getIdentifierQuoteString();
......@@ -156,7 +158,13 @@ public class SQLSyntaxManager extends RuleBasedScanner {
catalogSeparator = sqlDialect.getCatalogSeparator();
sqlDialect.getSearchStringEscape();
escapeChar = '\\';
statementDelimiter = sqlDialect.getScriptDelimiter().toLowerCase();
statementDelimiters.add(sqlDialect.getScriptDelimiter().toLowerCase());
String extraDelimiters = this.dataSource.getContainer().getPreferenceStore().getString(DBeaverPreferences.SCRIPT_STATEMENT_DELIMITER);
StringTokenizer st = new StringTokenizer(extraDelimiters, " \t,");
while (st.hasMoreTokens()) {
statementDelimiters.add(st.nextToken());
}
}
}
......@@ -223,27 +231,26 @@ public class SQLSyntaxManager extends RuleBasedScanner {
// Add numeric rule
rules.add(new NumberRule(numberToken));
{
for (final String delimiter : statementDelimiters) {
WordRule delimRule;
if (Character.isLetterOrDigit(delimiter.charAt(0))) {
delimRule = new WordRule(new SQLWordDetector(), Token.UNDEFINED, true);
delimRule.addWord(delimiter, delimiterToken);
} else {
// Default delim rule
WordRule delimRule = new WordRule(new IWordDetector() {
delimRule = new WordRule(new IWordDetector() {
@Override
public boolean isWordStart(char c)
{
return SQLConstants.DEFAULT_STATEMENT_DELIMITER.charAt(0) == c;
public boolean isWordStart(char c) {
return delimiter.charAt(0) == c;
}
@Override
public boolean isWordPart(char c)
{
return SQLConstants.DEFAULT_STATEMENT_DELIMITER.indexOf(c) != -1;
public boolean isWordPart(char c) {
return delimiter.indexOf(c) != -1;
}
}, Token.UNDEFINED, false);
delimRule.addWord(SQLConstants.DEFAULT_STATEMENT_DELIMITER, delimiterToken);
rules.add(delimRule);
delimRule.addWord(delimiter, delimiterToken);
}
if (!statementDelimiter.equals(SQLConstants.DEFAULT_STATEMENT_DELIMITER)) {
WordRule delimRule = new WordRule(new SQLWordDetector(), Token.UNDEFINED, true);
delimRule.addWord(statementDelimiter, delimiterToken);
rules.add(delimRule);
}
......
......@@ -21,7 +21,6 @@ package org.jkiss.dbeaver.ui.editors.sql.syntax;
import org.eclipse.jface.text.BadLocationException;
import org.eclipse.jface.text.IDocument;
import org.jkiss.dbeaver.model.DBPKeywordType;
import org.jkiss.dbeaver.model.sql.SQLDialect;
import java.util.ArrayList;
......@@ -83,10 +82,12 @@ public class SQLWordPartDetector extends SQLIdentifierDetector
if (prevDelimiter == null) {
prevDelimiter = prevPiece.toString();
}
if (prevPiece.indexOf(syntaxManager.getStatementDelimiter()) != -1) {
for (String delim : syntaxManager.getStatementDelimiters()) {
if (prevPiece.indexOf(delim) != -1) {
// Statement delimiter found - do not process to previous keyword
return;
}
}
int prevStartOffset = prevOffset + 1;
while (prevOffset >= topIndex) {
char ch = document.getChar(prevOffset);
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册