提交 c660e12c 编写于 作者: J jurgen

SQL model refactoring

Former-commit-id: 41decd8a
上级 2b187278
......@@ -97,7 +97,7 @@ Export-Package: org.jkiss.dbeaver,
org.jkiss.dbeaver.ui.editors.entity.handlers,
org.jkiss.dbeaver.ui.editors.object,
org.jkiss.dbeaver.ui.editors.sql,
org.jkiss.dbeaver.ui.editors.sql.format,
org.jkiss.dbeaver.model.sql.format,
org.jkiss.dbeaver.ui.editors.sql.handlers,
org.jkiss.dbeaver.ui.editors.sql.indent,
org.jkiss.dbeaver.ui.editors.sql.log,
......
/*
* DBeaver - Universal Database Manager
* Copyright (C) 2010-2015 Serge Rieder (serge@jkiss.org)
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License (version 2)
* as published by the Free Software Foundation.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License along
* with this program; if not, write to the Free Software Foundation, Inc.,
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
*/
package org.jkiss.dbeaver.model.sql;
import org.jkiss.code.NotNull;
import org.jkiss.code.Nullable;
import org.jkiss.dbeaver.DBeaverPreferences;
import org.jkiss.dbeaver.model.impl.sql.BasicSQLDialect;
import java.util.LinkedHashSet;
import java.util.Set;
import java.util.StringTokenizer;
/**
* SQLSyntaxManager.
* <p/>
* Contains information about some concrete datasource underlying database syntax.
* Support runtime change of datasource (reloads syntax information)
*/
public class SQLSyntaxManager {
@NotNull
private SQLDialect sqlDialect;
@Nullable
private String quoteSymbol;
private char structSeparator;
@NotNull
private String catalogSeparator;
@NotNull
private Set<String> statementDelimiters = new LinkedHashSet<String>();//SQLConstants.DEFAULT_STATEMENT_DELIMITER;
private char escapeChar;
private boolean unassigned;
public SQLSyntaxManager()
{
}
/**
* Returns true if this syntax manager wasn't assigned to a some particular data source container/ SQL dialect
*/
public boolean isUnassigned() {
return unassigned;
}
@NotNull
public SQLDialect getDialect() {
return sqlDialect;
}
public char getStructSeparator()
{
return structSeparator;
}
@NotNull
public String getCatalogSeparator()
{
return catalogSeparator;
}
@NotNull
public Set<String> getStatementDelimiters()
{
return statementDelimiters;
}
@Nullable
public String getQuoteSymbol()
{
return quoteSymbol;
}
public char getEscapeChar() {
return escapeChar;
}
public void setDataSource(@Nullable SQLDataSource dataSource)
{
this.unassigned = dataSource == null;
this.statementDelimiters.clear();
if (dataSource == null) {
sqlDialect = new BasicSQLDialect();
quoteSymbol = null;
structSeparator = SQLConstants.STRUCT_SEPARATOR;
catalogSeparator = String.valueOf(SQLConstants.STRUCT_SEPARATOR);
escapeChar = '\\';
statementDelimiters.add(SQLConstants.DEFAULT_STATEMENT_DELIMITER);
} else {
sqlDialect = dataSource.getSQLDialect();
quoteSymbol = sqlDialect.getIdentifierQuoteString();
structSeparator = sqlDialect.getStructSeparator();
catalogSeparator = sqlDialect.getCatalogSeparator();
sqlDialect.getSearchStringEscape();
escapeChar = '\\';
if (!dataSource.getContainer().getPreferenceStore().getBoolean(DBeaverPreferences.SCRIPT_IGNORE_NATIVE_DELIMITER)) {
statementDelimiters.add(sqlDialect.getScriptDelimiter().toLowerCase());
}
String extraDelimiters = dataSource.getContainer().getPreferenceStore().getString(DBeaverPreferences.SCRIPT_STATEMENT_DELIMITER);
StringTokenizer st = new StringTokenizer(extraDelimiters, " \t,");
while (st.hasMoreTokens()) {
statementDelimiters.add(st.nextToken());
}
}
}
}
......@@ -32,9 +32,8 @@ import org.jkiss.dbeaver.model.exec.DBCSession;
import org.jkiss.dbeaver.model.struct.DBSAttributeBase;
import org.jkiss.dbeaver.model.struct.DBSObject;
import org.jkiss.dbeaver.model.struct.DBSTypedObject;
import org.jkiss.dbeaver.ui.editors.sql.format.SQLFormatterConfiguration;
import org.jkiss.dbeaver.ui.editors.sql.format.tokenized.SQLTokenizedFormatter;
import org.jkiss.dbeaver.ui.editors.sql.syntax.SQLSyntaxManager;
import org.jkiss.dbeaver.model.sql.format.SQLFormatterConfiguration;
import org.jkiss.dbeaver.model.sql.format.tokenized.SQLTokenizedFormatter;
import org.jkiss.utils.CommonUtils;
import org.jkiss.utils.Pair;
......
......@@ -15,7 +15,7 @@
* with this program; if not, write to the Free Software Foundation, Inc.,
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
*/
package org.jkiss.dbeaver.ui.editors.sql.format;
package org.jkiss.dbeaver.model.sql.format;
/**
......@@ -29,5 +29,5 @@ public interface SQLFormatter {
*
* @return formatted version
*/
public String format(String source, SQLFormatterConfiguration configuration);
String format(String source, SQLFormatterConfiguration configuration);
}
......@@ -16,10 +16,10 @@
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
*/
package org.jkiss.dbeaver.ui.editors.sql.format;
package org.jkiss.dbeaver.model.sql.format;
import org.jkiss.dbeaver.model.DBPKeywordType;
import org.jkiss.dbeaver.ui.editors.sql.syntax.SQLSyntaxManager;
import org.jkiss.dbeaver.model.sql.SQLSyntaxManager;
/**
* SQLFormatterConfiguration
......
......@@ -16,7 +16,7 @@
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
*/
package org.jkiss.dbeaver.ui.editors.sql.format.tokenized;
package org.jkiss.dbeaver.model.sql.format.tokenized;
class FormatterConstants {
......
......@@ -19,7 +19,7 @@
/*
* FormatterToken
*/
package org.jkiss.dbeaver.ui.editors.sql.format.tokenized;
package org.jkiss.dbeaver.model.sql.format.tokenized;
class FormatterToken {
......
......@@ -16,10 +16,10 @@
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
*/
package org.jkiss.dbeaver.ui.editors.sql.format.tokenized;
package org.jkiss.dbeaver.model.sql.format.tokenized;
import org.jkiss.dbeaver.ui.editors.sql.format.SQLFormatter;
import org.jkiss.dbeaver.ui.editors.sql.format.SQLFormatterConfiguration;
import org.jkiss.dbeaver.model.sql.format.SQLFormatter;
import org.jkiss.dbeaver.model.sql.format.SQLFormatterConfiguration;
import org.jkiss.dbeaver.utils.GeneralUtils;
import org.jkiss.utils.Pair;
......
......@@ -16,9 +16,9 @@
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
*/
package org.jkiss.dbeaver.ui.editors.sql.format.tokenized;
package org.jkiss.dbeaver.model.sql.format.tokenized;
import org.jkiss.dbeaver.ui.editors.sql.format.SQLFormatterConfiguration;
import org.jkiss.dbeaver.model.sql.format.SQLFormatterConfiguration;
import java.util.ArrayList;
import java.util.List;
......
......@@ -55,11 +55,11 @@ import org.jkiss.dbeaver.model.DBPPreferenceStore;
import org.jkiss.dbeaver.model.DBUtils;
import org.jkiss.dbeaver.model.exec.DBCExecutionContext;
import org.jkiss.dbeaver.model.sql.*;
import org.jkiss.dbeaver.model.sql.SQLConstants;
import org.jkiss.dbeaver.ui.ICommandIds;
import org.jkiss.dbeaver.ui.ICommentsSupport;
import org.jkiss.dbeaver.ui.editors.sql.syntax.SQLPartitionScanner;
import org.jkiss.dbeaver.ui.editors.sql.syntax.SQLSyntaxManager;
import org.jkiss.dbeaver.ui.editors.sql.syntax.SQLRuleManager;
import org.jkiss.dbeaver.model.sql.SQLSyntaxManager;
import org.jkiss.dbeaver.ui.editors.sql.syntax.tokens.*;
import org.jkiss.dbeaver.ui.editors.sql.templates.SQLTemplatesPage;
import org.jkiss.dbeaver.ui.editors.sql.util.SQLSymbolInserter;
......@@ -79,6 +79,8 @@ public abstract class SQLEditorBase extends BaseTextEditor {
@NotNull
private final SQLSyntaxManager syntaxManager;
@NotNull
private final SQLRuleManager ruleManager;
private ProjectionSupport projectionSupport;
private ProjectionAnnotationModel annotationModel;
......@@ -94,6 +96,7 @@ public abstract class SQLEditorBase extends BaseTextEditor {
{
super();
syntaxManager = new SQLSyntaxManager();
ruleManager = new SQLRuleManager(syntaxManager);
themeListener = new IPropertyChangeListener() {
@Override
public void propertyChange(PropertyChangeEvent event)
......@@ -107,9 +110,7 @@ public abstract class SQLEditorBase extends BaseTextEditor {
PlatformUI.getWorkbench().getThemeManager().addPropertyChangeListener(themeListener);
setDocumentProvider(new SQLDocumentProvider());
setSourceViewerConfiguration(new SQLEditorSourceViewerConfiguration(
this,
syntaxManager));
setSourceViewerConfiguration(new SQLEditorSourceViewerConfiguration(this));
setKeyBindingScopes(new String[]{"org.eclipse.ui.textEditorScope", "org.jkiss.dbeaver.ui.editors.sql"}); //$NON-NLS-1$
}
......@@ -137,6 +138,11 @@ public abstract class SQLEditorBase extends BaseTextEditor {
return syntaxManager;
}
@NotNull
public SQLRuleManager getRuleManager() {
return ruleManager;
}
public ProjectionAnnotationModel getAnnotationModel()
{
return annotationModel;
......@@ -315,7 +321,6 @@ public abstract class SQLEditorBase extends BaseTextEditor {
decorationSupport.dispose();
decorationSupport = null;
}
syntaxManager.dispose();
if (themeListener != null) {
PlatformUI.getWorkbench().getThemeManager().removePropertyChangeListener(themeListener);
themeListener = null;
......@@ -383,13 +388,14 @@ public abstract class SQLEditorBase extends BaseTextEditor {
DBPDataSource dataSource = executionContext == null ? null : executionContext.getDataSource();
// Refresh syntax
if (dataSource instanceof SQLDataSource) {
SQLDialect dialect = ((SQLDataSource) dataSource).getSQLDialect();
syntaxManager.setDataSource((SQLDataSource) dataSource);
syntaxManager.refreshRules();
ruleManager.refreshRules();
Document document = getDocument();
if (document != null) {
IDocumentPartitioner partitioner = new FastPartitioner(
new SQLPartitionScanner(syntaxManager),
new SQLPartitionScanner(dialect),
SQLPartitionScanner.SQL_PARTITION_TYPES);
partitioner.connect(document);
document.setDocumentPartitioner(SQLPartitionScanner.SQL_PARTITIONING, partitioner);
......@@ -408,8 +414,8 @@ public abstract class SQLEditorBase extends BaseTextEditor {
}
}
Color fgColor = getSyntaxManager().getColor(SQLConstants.CONFIG_COLOR_TEXT);
Color bgColor = getSyntaxManager().getColor(!syntaxManager.isUnassigned() && dataSource == null ?
Color fgColor = ruleManager.getColor(SQLConstants.CONFIG_COLOR_TEXT);
Color bgColor = ruleManager.getColor(!syntaxManager.isUnassigned() && dataSource == null ?
SQLConstants.CONFIG_COLOR_DISABLED :
SQLConstants.CONFIG_COLOR_BACKGROUND);
if (fgColor != null) {
......@@ -529,14 +535,14 @@ public abstract class SQLEditorBase extends BaseTextEditor {
return null;
}
// Parse range
syntaxManager.setRange(document, startPos, endPos - startPos);
ruleManager.setRange(document, startPos, endPos - startPos);
int statementStart = startPos;
int bracketDepth = 0;
boolean hasValuableTokens = false;
for (; ; ) {
IToken token = syntaxManager.nextToken();
int tokenOffset = syntaxManager.getTokenOffset();
final int tokenLength = syntaxManager.getTokenLength();
IToken token = ruleManager.nextToken();
int tokenOffset = ruleManager.getTokenOffset();
final int tokenLength = ruleManager.getTokenLength();
boolean isDelimiter = token instanceof SQLDelimiterToken;
if (tokenLength == 1) {
try {
......@@ -624,12 +630,12 @@ public abstract class SQLEditorBase extends BaseTextEditor {
protected List<SQLQueryParameter> parseParameters(IDocument document, SQLQuery query) {
boolean execQuery = DBUtils.isExecQuery(getDataSource(), query.getQuery());
List<SQLQueryParameter> parameters = null;
syntaxManager.setRange(document, query.getOffset(), query.getLength());
ruleManager.setRange(document, query.getOffset(), query.getLength());
int blockDepth = 0;
for (;;) {
IToken token = syntaxManager.nextToken();
int tokenOffset = syntaxManager.getTokenOffset();
final int tokenLength = syntaxManager.getTokenLength();
IToken token = ruleManager.nextToken();
int tokenOffset = ruleManager.getTokenOffset();
final int tokenLength = ruleManager.getTokenLength();
if (token.isEOF() || tokenOffset > query.getOffset() + query.getLength()) {
break;
}
......
......@@ -65,7 +65,7 @@ public class SQLEditorSourceViewerConfiguration extends SourceViewerConfiguratio
* The editor with which this configuration is associated.
*/
private SQLEditorBase editor;
private SQLSyntaxManager syntaxManager;
private SQLRuleManager ruleManager;
private IContentAssistProcessor completionProcessor;
private IHyperlinkDetector hyperlinkDetector;
......@@ -87,13 +87,12 @@ public class SQLEditorSourceViewerConfiguration extends SourceViewerConfiguratio
* @param editor the SQLEditor to configure
*/
public SQLEditorSourceViewerConfiguration(
SQLEditorBase editor,
SQLSyntaxManager syntaxManager)
SQLEditorBase editor)
{
this.editor = editor;
this.syntaxManager = syntaxManager;
this.ruleManager = editor.getRuleManager();
this.completionProcessor = new SQLCompletionProcessor(editor);
this.hyperlinkDetector = new SQLHyperlinkDetector(editor, syntaxManager);
this.hyperlinkDetector = new SQLHyperlinkDetector(editor, editor.getSyntaxManager());
}
@Override
......@@ -240,7 +239,7 @@ public class SQLEditorSourceViewerConfiguration extends SourceViewerConfiguratio
ContentFormatter formatter = new ContentFormatter();
formatter.setDocumentPartitioning(SQLPartitionScanner.SQL_PARTITIONING);
IFormattingStrategy formattingStrategy = new SQLFormattingStrategy(syntaxManager);
IFormattingStrategy formattingStrategy = new SQLFormattingStrategy(editor.getSyntaxManager());
for (String ct : SQLPartitionScanner.SQL_PARTITION_TYPES) {
formatter.setFormattingStrategy(formattingStrategy, ct);
}
......@@ -279,7 +278,7 @@ public class SQLEditorSourceViewerConfiguration extends SourceViewerConfiguratio
reconciler.setDocumentPartitioning(docPartitioning);
// Add a "damager-repairer" for changes in default text (SQL code).
DefaultDamagerRepairer dr = new DefaultDamagerRepairer(syntaxManager);
DefaultDamagerRepairer dr = new DefaultDamagerRepairer(ruleManager);
reconciler.setDamager(dr, IDocument.DEFAULT_CONTENT_TYPE);
reconciler.setRepairer(dr, IDocument.DEFAULT_CONTENT_TYPE);
......@@ -288,27 +287,27 @@ public class SQLEditorSourceViewerConfiguration extends SourceViewerConfiguratio
// We just need a scanner that does nothing but returns a token with
// the corresponding text attributes
dr = new DefaultDamagerRepairer(new SingleTokenScanner(
new TextAttribute(syntaxManager.getColor(SQLConstants.CONFIG_COLOR_COMMENT))));
new TextAttribute(ruleManager.getColor(SQLConstants.CONFIG_COLOR_COMMENT))));
reconciler.setDamager(dr, SQLPartitionScanner.SQL_MULTILINE_COMMENT);
reconciler.setRepairer(dr, SQLPartitionScanner.SQL_MULTILINE_COMMENT);
// Add a "damager-repairer" for changes within one-line SQL comments.
dr = new DefaultDamagerRepairer(new SingleTokenScanner(
new TextAttribute(syntaxManager.getColor(SQLConstants.CONFIG_COLOR_COMMENT))));
new TextAttribute(ruleManager.getColor(SQLConstants.CONFIG_COLOR_COMMENT))));
reconciler.setDamager(dr, SQLPartitionScanner.SQL_COMMENT);
reconciler.setRepairer(dr, SQLPartitionScanner.SQL_COMMENT);
// Add a "damager-repairer" for changes within quoted literals.
dr = new DefaultDamagerRepairer(
new SingleTokenScanner(
new TextAttribute(syntaxManager.getColor(SQLConstants.CONFIG_COLOR_STRING))));
new TextAttribute(ruleManager.getColor(SQLConstants.CONFIG_COLOR_STRING))));
reconciler.setDamager(dr, SQLPartitionScanner.SQL_STRING);
reconciler.setRepairer(dr, SQLPartitionScanner.SQL_STRING);
// // Add a "damager-repairer" for changes within delimited identifiers.
// dr = new DefaultDamagerRepairer(
// new SingleTokenScanner(
// new TextAttribute(syntaxManager.getColor(SQLSyntaxManager.CONFIG_COLOR_DELIMITER))));
// new TextAttribute(ruleManager.getColor(SQLSyntaxManager.CONFIG_COLOR_DELIMITER))));
// reconciler.setDamager(dr, SQLPartitionScanner.SQL_DOUBLE_QUOTES_IDENTIFIER);
// reconciler.setRepairer(dr, SQLPartitionScanner.SQL_DOUBLE_QUOTES_IDENTIFIER);
......
......@@ -25,9 +25,10 @@ import org.eclipse.jface.text.ITextSelection;
import org.eclipse.jface.text.rules.IToken;
import org.eclipse.swt.dnd.TextTransfer;
import org.eclipse.swt.widgets.Display;
import org.jkiss.dbeaver.model.sql.SQLDialect;
import org.jkiss.dbeaver.ui.UIUtils;
import org.jkiss.dbeaver.ui.editors.sql.SQLEditorBase;
import org.jkiss.dbeaver.ui.editors.sql.syntax.SQLSyntaxManager;
import org.jkiss.dbeaver.ui.editors.sql.syntax.SQLRuleManager;
import org.jkiss.dbeaver.ui.editors.sql.syntax.tokens.SQLCommentToken;
import org.jkiss.utils.Pair;
......@@ -65,19 +66,20 @@ public class CopyUnformattedTextAction extends Action {
}
StringBuilder result = new StringBuilder();
SQLSyntaxManager syntaxManager = sqlEditor.getSyntaxManager();
syntaxManager.setRange(document, startPos, endPos - startPos);
String[] singleLineComments = syntaxManager.getDialect().getSingleLineComments();
Pair<String, String> multiLineComments = syntaxManager.getDialect().getMultiLineComments();
SQLRuleManager ruleManager = sqlEditor.getRuleManager();
SQLDialect dialect = sqlEditor.getSyntaxManager().getDialect();
ruleManager.setRange(document, startPos, endPos - startPos);
String[] singleLineComments = dialect.getSingleLineComments();
Pair<String, String> multiLineComments = dialect.getMultiLineComments();
boolean lastWhitespace = false;
try {
for (;;) {
IToken token = syntaxManager.nextToken();
IToken token = ruleManager.nextToken();
if (token.isEOF()) {
break;
}
int tokenOffset = syntaxManager.getTokenOffset();
final int tokenLength = syntaxManager.getTokenLength();
int tokenOffset = ruleManager.getTokenOffset();
final int tokenLength = ruleManager.getTokenLength();
if (token.isWhitespace()) {
if (!lastWhitespace) {
result.append(' ');
......
......@@ -29,6 +29,7 @@ import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.graphics.Point;
import org.jkiss.code.Nullable;
import org.jkiss.dbeaver.model.DBPNamedObject;
import org.jkiss.dbeaver.model.sql.SQLSyntaxManager;
import org.jkiss.dbeaver.model.struct.DBSObject;
import org.jkiss.dbeaver.model.struct.DBSObjectReference;
import org.jkiss.utils.CommonUtils;
......
......@@ -19,8 +19,9 @@ package org.jkiss.dbeaver.ui.editors.sql.syntax;
import org.eclipse.jface.text.formatter.ContextBasedFormattingStrategy;
import org.jkiss.dbeaver.model.DBPKeywordType;
import org.jkiss.dbeaver.ui.editors.sql.format.SQLFormatterConfiguration;
import org.jkiss.dbeaver.ui.editors.sql.format.tokenized.SQLTokenizedFormatter;
import org.jkiss.dbeaver.model.sql.SQLSyntaxManager;
import org.jkiss.dbeaver.model.sql.format.SQLFormatterConfiguration;
import org.jkiss.dbeaver.model.sql.format.tokenized.SQLTokenizedFormatter;
import java.util.StringTokenizer;
......
......@@ -32,6 +32,7 @@ import org.jkiss.dbeaver.model.DBIcon;
import org.jkiss.dbeaver.model.DBPKeywordType;
import org.jkiss.dbeaver.model.DBUtils;
import org.jkiss.dbeaver.model.runtime.DBRProgressMonitor;
import org.jkiss.dbeaver.model.sql.SQLSyntaxManager;
import org.jkiss.dbeaver.model.struct.*;
import org.jkiss.dbeaver.runtime.jobs.DataSourceJob;
import org.jkiss.dbeaver.ui.DBeaverIcons;
......
......@@ -23,6 +23,7 @@ import org.eclipse.jface.text.ITypedRegion;
import org.eclipse.jface.text.TextUtilities;
import org.eclipse.jface.text.rules.*;
import org.jkiss.dbeaver.model.sql.SQLConstants;
import org.jkiss.dbeaver.model.sql.SQLDialect;
import org.jkiss.utils.Pair;
import java.util.ArrayList;
......@@ -130,7 +131,7 @@ public class SQLPartitionScanner extends RuleBasedPartitionScanner {
setPredicateRules(result);
}
private void initRules(SQLSyntaxManager sqlSyntax)
private void initRules(SQLDialect dialect)
{
/*
//Add rule for identifier which is enclosed in double quotes.
......@@ -149,7 +150,7 @@ public class SQLPartitionScanner extends RuleBasedPartitionScanner {
rules.add(new MultiLineRule(SQLConstants.STR_QUOTE_SINGLE, SQLConstants.STR_QUOTE_SINGLE, sqlStringToken, '\\'));
for (String lineComment : sqlSyntax.getDialect().getSingleLineComments()) {
for (String lineComment : dialect.getSingleLineComments()) {
rules.add(new EndOfLineRule(lineComment, commentToken));
}
......@@ -158,24 +159,24 @@ public class SQLPartitionScanner extends RuleBasedPartitionScanner {
rules.add(wordRule);
// Add rules for multi-line comments
Pair<String, String> multiLineComments = sqlSyntax.getDialect().getMultiLineComments();
Pair<String, String> multiLineComments = dialect.getMultiLineComments();
if (multiLineComments != null) {
rules.add(new MultiLineRule(multiLineComments.getFirst(), multiLineComments.getSecond(), multilineCommentToken, (char) 0, true));
}
}
public SQLPartitionScanner(SQLSyntaxManager sqlSyntax)
public SQLPartitionScanner(SQLDialect dialect)
{
initRules(sqlSyntax);
initRules(dialect);
//database specific rules
setCommentsScanner(sqlSyntax);
setCommentsScanner(dialect);
setupRules();
}
private void setCommentsScanner(SQLSyntaxManager sqlSyntax)
private void setCommentsScanner(SQLDialect dialect)
{
String[] singleLineComments = sqlSyntax.getDialect().getSingleLineComments();
String[] singleLineComments = dialect.getSingleLineComments();
for (String singleLineComment : singleLineComments) {
// Add rule for single line comments.
......
......@@ -104,8 +104,8 @@ public class SQLReconcilingStrategy implements IReconcilingStrategy, IReconcilin
if (annotationModel == null) {
return;
}
Set<SQLScriptPosition> removedPositions = editor.getSyntaxManager().getRemovedPositions(true);
Set<SQLScriptPosition> addedPositions = editor.getSyntaxManager().getAddedPositions(true);
Set<SQLScriptPosition> removedPositions = editor.getRuleManager().getRemovedPositions(true);
Set<SQLScriptPosition> addedPositions = editor.getRuleManager().getAddedPositions(true);
Annotation[] removedAnnotations = null;
if (!removedPositions.isEmpty()) {
......
......@@ -27,12 +27,9 @@ import org.eclipse.ui.PlatformUI;
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;
import org.jkiss.dbeaver.model.sql.SQLConstants;
import org.jkiss.dbeaver.model.sql.SQLDialect;
import org.jkiss.dbeaver.model.sql.SQLSyntaxManager;
import org.jkiss.dbeaver.ui.editors.sql.syntax.tokens.*;
import org.jkiss.dbeaver.ui.editors.text.TextWhiteSpaceDetector;
import org.jkiss.utils.Pair;
......@@ -45,73 +42,27 @@ import java.util.*;
* Contains information about some concrete datasource underlying database syntax.
* Support runtime change of datasource (reloads syntax information)
*/
public class SQLSyntaxManager extends RuleBasedScanner {
public class SQLRuleManager extends RuleBasedScanner {
@NotNull
private final IThemeManager themeManager;
@Nullable
private SQLDataSource dataSource;
@NotNull
private SQLDialect sqlDialect;
@Nullable
private String quoteSymbol;
private char structSeparator;
@NotNull
private String catalogSeparator;
@NotNull
private Set<String> statementDelimiters = new LinkedHashSet<String>();//SQLConstants.DEFAULT_STATEMENT_DELIMITER;
private SQLSyntaxManager syntaxManager;
@NotNull
private TreeMap<Integer, SQLScriptPosition> positions = new TreeMap<Integer, SQLScriptPosition>();
private Set<SQLScriptPosition> addedPositions = new HashSet<SQLScriptPosition>();
private Set<SQLScriptPosition> removedPositions = new HashSet<SQLScriptPosition>();
private char escapeChar;
private boolean unassigned;
public SQLSyntaxManager()
public SQLRuleManager(SQLSyntaxManager syntaxManager)
{
themeManager = PlatformUI.getWorkbench().getThemeManager();
this.syntaxManager = syntaxManager;
this.themeManager = PlatformUI.getWorkbench().getThemeManager();
}
public void dispose()
{
}
/**
* Returns true if this syntax manager wasn't assigned to a some particular data source container/ SQL dialect
*/
public boolean isUnassigned() {
return unassigned;
}
@NotNull
public SQLDialect getDialect() {
return sqlDialect;
}
public char getStructSeparator()
{
return structSeparator;
}
@NotNull
public String getCatalogSeparator()
{
return catalogSeparator;
}
@NotNull
public Set<String> getStatementDelimiters()
{
return statementDelimiters;
}
@Nullable
public String getQuoteSymbol()
{
return quoteSymbol;
}
@NotNull
public Collection<? extends Position> getPositions(int offset, int length)
{
......@@ -138,37 +89,6 @@ public class SQLSyntaxManager extends RuleBasedScanner {
return posList;
}
public void setDataSource(@Nullable SQLDataSource dataSource)
{
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 = '\\';
statementDelimiters.add(SQLConstants.DEFAULT_STATEMENT_DELIMITER);
} else {
sqlDialect = this.dataSource.getSQLDialect();
quoteSymbol = sqlDialect.getIdentifierQuoteString();
structSeparator = sqlDialect.getStructSeparator();
catalogSeparator = sqlDialect.getCatalogSeparator();
sqlDialect.getSearchStringEscape();
escapeChar = '\\';
if (!this.dataSource.getContainer().getPreferenceStore().getBoolean(DBeaverPreferences.SCRIPT_IGNORE_NATIVE_DELIMITER)) {
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());
}
}
}
public void refreshRules()
{
/*final Color backgroundColor = null;unassigned || dataSource != null ?
......@@ -200,8 +120,9 @@ public class SQLSyntaxManager extends RuleBasedScanner {
setDefaultReturnToken(otherToken);
List<IRule> rules = new ArrayList<IRule>();
SQLDialect dialect = syntaxManager.getDialect();
// Add rule for single-line comments.
for (String lineComment : sqlDialect.getSingleLineComments()) {
for (String lineComment : dialect.getSingleLineComments()) {
if (lineComment.startsWith("^")) {
rules.add(new LineCommentRule(lineComment, commentToken)); //$NON-NLS-1$
} else {
......@@ -210,6 +131,8 @@ public class SQLSyntaxManager extends RuleBasedScanner {
}
// Add rules for delimited identifiers and string literals.
char escapeChar = syntaxManager.getEscapeChar();
String quoteSymbol = syntaxManager.getQuoteSymbol();
if (quoteSymbol != null) {
rules.add(new SingleLineRule(quoteSymbol, quoteSymbol, quotedToken, escapeChar));
}
......@@ -220,7 +143,7 @@ public class SQLSyntaxManager extends RuleBasedScanner {
rules.add(new SingleLineRule(SQLConstants.STR_QUOTE_DOUBLE, SQLConstants.STR_QUOTE_DOUBLE, quotedToken, escapeChar));
}
Pair<String, String> multiLineComments = sqlDialect.getMultiLineComments();
Pair<String, String> multiLineComments = dialect.getMultiLineComments();
if (multiLineComments != null) {
// Add rules for multi-line comments
rules.add(new MultiLineRule(multiLineComments.getFirst(), multiLineComments.getSecond(), commentToken, (char) 0, true));
......@@ -232,7 +155,7 @@ public class SQLSyntaxManager extends RuleBasedScanner {
// Add numeric rule
rules.add(new NumberRule(numberToken));
for (final String delimiter : statementDelimiters) {
for (final String delimiter : syntaxManager.getStatementDelimiters()) {
WordRule delimRule;
if (Character.isLetterOrDigit(delimiter.charAt(0))) {
delimRule = new WordRule(new SQLWordDetector(), Token.UNDEFINED, true);
......@@ -257,13 +180,13 @@ public class SQLSyntaxManager extends RuleBasedScanner {
// Add word rule for keywords, types, and constants.
WordRule wordRule = new WordRule(new SQLWordDetector(), otherToken, true);
for (String reservedWord : sqlDialect.getReservedWords()) {
for (String reservedWord : dialect.getReservedWords()) {
wordRule.addWord(reservedWord, keywordToken);
}
for (String function : sqlDialect.getFunctions()) {
for (String function : dialect.getFunctions()) {
wordRule.addWord(function, typeToken);
}
for (String type : sqlDialect.getTypes()) {
for (String type : dialect.getTypes()) {
wordRule.addWord(type, typeToken);
}
wordRule.addWord(SQLConstants.BLOCK_BEGIN, blockBeginToken);
......
......@@ -21,6 +21,7 @@ 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.sql.SQLDialect;
import org.jkiss.dbeaver.model.sql.SQLSyntaxManager;
import java.util.ArrayList;
import java.util.List;
......
......@@ -163,9 +163,7 @@ public class SQLTemplatesPage extends AbstractTemplatesPage {
{
IDocument document = new Document();
SQLEditorSourceViewer viewer = new SQLEditorSourceViewer(parent, null, null, false, SWT.V_SCROLL | SWT.H_SCROLL);
SQLEditorSourceViewerConfiguration configuration = new SQLEditorSourceViewerConfiguration(
sqlEditor,
sqlEditor.getSyntaxManager());
SQLEditorSourceViewerConfiguration configuration = new SQLEditorSourceViewerConfiguration(sqlEditor);
viewer.configure(configuration);
viewer.setEditable(false);
viewer.setDocument(document);
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册