Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
suliangchun
dbeaver
提交
e99b1029
D
dbeaver
项目概览
suliangchun
/
dbeaver
与 Fork 源项目一致
从无法访问的项目Fork
通知
2
Star
0
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
D
dbeaver
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
提交
Issue看板
体验新版 GitCode,发现更多精彩内容 >>
提交
e99b1029
编写于
5月 06, 2015
作者:
J
jurgen
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
Custom statement delimiters
Former-commit-id:
612dafaa
上级
2f0f52c1
变更
6
隐藏空白更改
内联
并排
Showing
6 changed file
with
78 addition
and
57 deletion
+78
-57
plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/model/sql/SQLUtils.java
...beaver.core/src/org/jkiss/dbeaver/model/sql/SQLUtils.java
+14
-13
plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/ui/editors/sql/SQLEditor.java
....core/src/org/jkiss/dbeaver/ui/editors/sql/SQLEditor.java
+15
-6
plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/ui/editors/sql/SQLEditorBase.java
...e/src/org/jkiss/dbeaver/ui/editors/sql/SQLEditorBase.java
+9
-5
plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/ui/editors/sql/format/tokenized/SQLTokenizedFormatter.java
...i/editors/sql/format/tokenized/SQLTokenizedFormatter.java
+3
-4
plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/ui/editors/sql/syntax/SQLSyntaxManager.java
...jkiss/dbeaver/ui/editors/sql/syntax/SQLSyntaxManager.java
+32
-25
plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/ui/editors/sql/syntax/SQLWordPartDetector.java
...ss/dbeaver/ui/editors/sql/syntax/SQLWordPartDetector.java
+5
-4
未找到文件。
plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/model/sql/SQLUtils.java
浏览文件 @
e99b1029
...
...
@@ -237,20 +237,21 @@ public final class SQLUtils {
public
static
String
trimQueryStatement
(
SQLSyntaxManager
syntaxManager
,
String
sql
)
{
sql
=
sql
.
trim
();
String
statementDelimiter
=
syntaxManager
.
getStatementDelimiter
();
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
char
lastChar
=
sql
.
charAt
(
sql
.
length
()
-
statementDelimiter
.
length
()
-
1
);
if
(
Character
.
isUnicodeIdentifierPart
(
lastChar
))
{
return
sql
;
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
char
lastChar
=
sql
.
charAt
(
sql
.
length
()
-
statementDelimiter
.
length
()
-
1
);
if
(
Character
.
isUnicodeIdentifierPart
(
lastChar
))
{
return
sql
;
}
}
// Remove trailing delimiter only if it is not block end
String
trimmed
=
sql
.
substring
(
0
,
sql
.
length
()
-
statementDelimiter
.
length
());
String
test
=
trimmed
.
toUpperCase
().
trim
();
if
(!
test
.
endsWith
(
SQLConstants
.
BLOCK_END
))
{
sql
=
trimmed
;
}
}
// Remove trailing delimiter only if it is not block end
String
trimmed
=
sql
.
substring
(
0
,
sql
.
length
()
-
statementDelimiter
.
length
());
String
test
=
trimmed
.
toUpperCase
().
trim
();
if
(!
test
.
endsWith
(
SQLConstants
.
BLOCK_END
))
{
sql
=
trimmed
;
}
}
return
sql
;
...
...
plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/ui/editors/sql/SQLEditor.java
浏览文件 @
e99b1029
...
...
@@ -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
;
...
...
plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/ui/editors/sql/SQLEditorBase.java
浏览文件 @
e99b1029
...
...
@@ -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
);
delimiterText
s
=
Collections
.
singleton
(
document
.
get
(
tokenOffset
,
tokenLength
)
);
}
else
{
delimiterText
=
syntaxManager
.
getStatementDelimiter
();
delimiterText
s
=
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
(
...
...
plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/ui/editors/sql/format/tokenized/SQLTokenizedFormatter.java
浏览文件 @
e99b1029
...
...
@@ -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
();
...
...
plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/ui/editors/sql/syntax/SQLSyntaxManager.java
浏览文件 @
e99b1029
...
...
@@ -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
S
tring
statementDelimiter
=
SQLConstants
.
DEFAULT_STATEMENT_DELIMITER
;
private
S
et
<
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
S
tring
getStatementDelimiter
()
public
S
et
<
String
>
getStatementDelimiters
()
{
return
statementDelimiter
;
return
statementDelimiter
s
;
}
@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
;
statementDelimiter
s
.
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
));
{
// Default delim rule
WordRule
delimRule
=
new
WordRule
(
new
IWordDetector
()
{
@Override
public
boolean
isWordStart
(
char
c
)
{
return
SQLConstants
.
DEFAULT_STATEMENT_DELIMITER
.
charAt
(
0
)
==
c
;
}
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
delimRule
=
new
WordRule
(
new
IWordDetector
()
{
@Override
public
boolean
isWordStart
(
char
c
)
{
return
delimiter
.
charAt
(
0
)
==
c
;
}
@Override
public
boolean
isWordPart
(
char
c
)
{
return
SQLConstants
.
DEFAULT_STATEMENT_DELIMITER
.
indexOf
(
c
)
!=
-
1
;
}
},
Token
.
UNDEFINED
,
false
);
delimRule
.
addWord
(
SQLConstants
.
DEFAULT_STATEMENT_DELIMITER
,
delimiterToken
);
rules
.
add
(
delimRule
);
}
if
(!
statementDelimiter
.
equals
(
SQLConstants
.
DEFAULT_STATEMENT_DELIMITER
))
{
WordRule
delimRule
=
new
WordRule
(
new
SQLWordDetector
(),
Token
.
UNDEFINED
,
true
);
delimRule
.
addWord
(
statementDelimiter
,
delimiterToken
);
@Override
public
boolean
isWordPart
(
char
c
)
{
return
delimiter
.
indexOf
(
c
)
!=
-
1
;
}
},
Token
.
UNDEFINED
,
false
);
delimRule
.
addWord
(
delimiter
,
delimiterToken
);
}
rules
.
add
(
delimRule
);
}
...
...
plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/ui/editors/sql/syntax/SQLWordPartDetector.java
浏览文件 @
e99b1029
...
...
@@ -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,9 +82,11 @@ public class SQLWordPartDetector extends SQLIdentifierDetector
if
(
prevDelimiter
==
null
)
{
prevDelimiter
=
prevPiece
.
toString
();
}
if
(
prevPiece
.
indexOf
(
syntaxManager
.
getStatementDelimiter
())
!=
-
1
)
{
// Statement delimiter found - do not process to previous keyword
return
;
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
)
{
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录