Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
suliangchun
dbeaver
提交
99a758d3
D
dbeaver
项目概览
suliangchun
/
dbeaver
与 Fork 源项目一致
从无法访问的项目Fork
通知
3
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,发现更多精彩内容 >>
提交
99a758d3
编写于
11月 30, 2016
作者:
S
Serge Rider
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
#1007 Refresh RSV row after insert
上级
1931a206
变更
2
隐藏空白更改
内联
并排
Showing
2 changed file
with
101 addition
and
54 deletion
+101
-54
plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/ui/controls/resultset/ResultSetPersister.java
...iss/dbeaver/ui/controls/resultset/ResultSetPersister.java
+87
-51
plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/ui/controls/resultset/ResultSetViewer.java
.../jkiss/dbeaver/ui/controls/resultset/ResultSetViewer.java
+14
-3
未找到文件。
plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/ui/controls/resultset/ResultSetPersister.java
浏览文件 @
99a758d3
...
...
@@ -32,9 +32,7 @@ import org.jkiss.dbeaver.model.data.*;
import
org.jkiss.dbeaver.model.edit.DBEPersistAction
;
import
org.jkiss.dbeaver.model.exec.*
;
import
org.jkiss.dbeaver.model.impl.AbstractExecutionSource
;
import
org.jkiss.dbeaver.model.navigator.DBNNode
;
import
org.jkiss.dbeaver.model.runtime.DBRProgressMonitor
;
import
org.jkiss.dbeaver.model.runtime.load.DatabaseLoadService
;
import
org.jkiss.dbeaver.model.struct.DBSDataContainer
;
import
org.jkiss.dbeaver.model.struct.DBSDataManipulator
;
import
org.jkiss.dbeaver.model.struct.DBSEntity
;
...
...
@@ -46,7 +44,6 @@ import org.jkiss.dbeaver.ui.UIUtils;
import
org.jkiss.dbeaver.utils.GeneralUtils
;
import
org.jkiss.utils.CommonUtils
;
import
java.lang.reflect.InvocationTargetException
;
import
java.util.*
;
/**
...
...
@@ -133,7 +130,7 @@ class ResultSetPersister {
return
execute
(
monitor
,
generateScript
,
listener
);
}
public
boolean
refreshInsertedRows
(
@Nullable
DBRProgressMonitor
monitor
)
{
public
boolean
refreshInsertedRows
(
@Nullable
DBRProgressMonitor
monitor
)
throws
DBCException
{
if
(!
viewer
.
getModel
().
isSingleSource
())
{
return
false
;
}
...
...
@@ -145,6 +142,20 @@ class ResultSetPersister {
return
false
;
}
DBCExecutionContext
executionContext
=
viewer
.
getContainer
().
getExecutionContext
();
if
(
executionContext
==
null
)
{
throw
new
DBCException
(
"No execution context"
);
}
RowRefreshJob
job
=
new
RowRefreshJob
(
executionContext
,
viewer
.
getDataContainer
(),
rowIdentifier
,
addedRows
);
if
(
monitor
==
null
)
{
job
.
schedule
();
return
true
;
}
else
{
IStatus
result
=
job
.
run
(
monitor
);
if
(!
result
.
isOK
())
{
return
false
;
}
}
return
true
;
}
...
...
@@ -716,6 +727,11 @@ class ResultSetPersister {
}
class
RowDataReceiver
implements
DBDDataReceiver
{
private
final
DBDAttributeBinding
[]
curAttributes
;
private
Object
[]
rowValues
;
public
RowDataReceiver
(
DBDAttributeBinding
[]
curAttributes
)
{
this
.
curAttributes
=
curAttributes
;
}
@Override
public
void
fetchStart
(
DBCSession
session
,
DBCResultSet
resultSet
,
long
offset
,
long
maxRows
)
...
...
@@ -729,39 +745,27 @@ class ResultSetPersister {
throws
DBCException
{
DBCResultSetMetaData
rsMeta
=
resultSet
.
getMeta
();
// Compare attributes with existing model attributes
List
<
DBCAttributeMetaData
>
attributes
=
rsMeta
.
getAttributes
();
/*
for (int i = 0; i < attributes.size(); i++) {
DBCAttributeMetaData attr = attributes.get(i);
DBDValueHandler valueHandler = DBUtils.findValueHandler(session, attr);
Object keyValue = valueHandler.fetchValueObject(session, resultSet, attr, i);
boolean updated = false;
if (!CommonUtils.isEmpty(attr.getName())) {
DBDAttributeBinding binding = model.getAttributeBinding(statement.entity, attr.getName());
if (binding != null) {
// Got it. Just update column oldValue
statement.updatedCells.put(binding.getOrdinalPosition(), keyValue);
//curRows.get(statement.row.row)[colIndex] = keyValue;
updated = true;
}
}
if (!updated) {
// Key not found
// Try to find and update auto-increment column
for (int k = 0; k < columns.length; k++) {
DBDAttributeBinding column = columns[k];
if (column.isAutoGenerated()) {
// Got it
statement.updatedCells.put(k, keyValue);
//curRows.get(statement.row.row)[k] = keyValue;
updated = true;
break;
}
}
if
(
attributes
.
size
()
!=
curAttributes
.
length
)
{
log
.
debug
(
"Wrong meta attributes count - can't refresh"
);
return
;
}
for
(
int
i
=
0
;
i
<
curAttributes
.
length
;
i
++)
{
if
(!
ResultSetUtils
.
equalAttributes
(
curAttributes
[
i
].
getMetaAttribute
(),
attributes
.
get
(
i
)))
{
log
.
debug
(
"Attribute '"
+
curAttributes
[
i
].
getMetaAttribute
().
getName
()
+
"' doesn't match '"
+
attributes
.
get
(
i
).
getName
()
+
"'"
);
return
;
}
}
*/
rowValues
=
new
Object
[
curAttributes
.
length
];
for
(
int
i
=
0
;
i
<
curAttributes
.
length
;
i
++)
{
final
DBDAttributeBinding
attr
=
curAttributes
[
i
];
DBDValueHandler
valueHandler
=
attr
.
getValueHandler
();
Object
attrValue
=
valueHandler
.
fetchValueObject
(
session
,
resultSet
,
attr
,
i
);
rowValues
[
i
]
=
attrValue
;
}
}
@Override
...
...
@@ -777,37 +781,69 @@ class ResultSetPersister {
}
}
private
class
RowRefresh
Service
extends
DatabaseLoadService
<
Collection
<
DBNNode
>>
{
private
class
RowRefresh
Job
extends
DataSourceJob
{
private
DBCExecutionContext
context
;
private
DBSDataContainer
dataContainer
;
private
DBDRowIdentifier
rowIdentifier
;
private
List
<
ResultSetRow
>
rows
;
public
RowRefreshService
(
DBCExecutionContext
context
,
DBSDataContainer
dataContainer
,
DBDRowIdentifier
rowIdentifier
,
List
<
ResultSetRow
>
rows
)
{
super
(
"Refresh rows"
,
context
);
this
.
context
=
context
;
public
RowRefreshJob
(
DBCExecutionContext
context
,
DBSDataContainer
dataContainer
,
DBDRowIdentifier
rowIdentifier
,
List
<
ResultSetRow
>
rows
)
{
super
(
"Refresh rows"
,
null
,
context
);
this
.
dataContainer
=
dataContainer
;
this
.
rowIdentifier
=
rowIdentifier
;
this
.
rows
=
rows
;
this
.
rows
=
new
ArrayList
<>(
rows
)
;
}
@Override
public
Collection
<
DBNNode
>
evaluate
()
throws
InvocationTargetException
,
InterruptedException
{
protected
IStatus
run
(
DBRProgressMonitor
monitor
)
{
try
{
final
AbstractExecutionSource
executionSource
=
new
AbstractExecutionSource
(
dataContainer
,
context
,
this
);
List
<
DBDAttributeConstraint
>
constraints
=
new
ArrayList
<>();
DBDDataFilter
filter
=
new
DBDDataFilter
(
constraints
);
RowDataReceiver
dataReceiver
=
new
RowDataReceiver
();
try
(
DBCSession
session
=
context
.
openSession
(
getProgressMonitor
(),
DBCExecutionPurpose
.
UTIL
,
"Refresh row(s) after insert/update"
))
{
final
Object
[][]
refreshValues
=
new
Object
[
rows
.
size
()][];
final
DBDAttributeBinding
[]
curAttributes
=
viewer
.
getModel
().
getAttributes
();
final
AbstractExecutionSource
executionSource
=
new
AbstractExecutionSource
(
dataContainer
,
getExecutionContext
(),
this
);
try
(
DBCSession
session
=
getExecutionContext
().
openSession
(
monitor
,
DBCExecutionPurpose
.
UTIL
,
"Refresh row(s) after insert/update"
))
{
for
(
int
i
=
0
;
i
<
rows
.
size
();
i
++)
{
ResultSetRow
row
=
rows
.
get
(
i
);
boolean
hasKey
=
true
;
List
<
DBDAttributeConstraint
>
constraints
=
new
ArrayList
<>();
for
(
DBDAttributeBinding
keyAttr
:
rowIdentifier
.
getAttributes
())
{
final
Object
keyValue
=
row
.
values
[
keyAttr
.
getOrdinalPosition
()];
if
(
DBUtils
.
isNullValue
(
keyValue
))
{
hasKey
=
false
;
break
;
}
final
DBDAttributeConstraint
constraint
=
new
DBDAttributeConstraint
(
keyAttr
);
constraint
.
setOperator
(
DBCLogicalOperator
.
EQUALS
);
constraint
.
setValue
(
keyValue
);
constraints
.
add
(
constraint
);
}
if
(!
hasKey
)
{
// No key value for this row
continue
;
}
DBDDataFilter
filter
=
new
DBDDataFilter
(
constraints
);
final
DBCStatistics
stats
=
dataContainer
.
readData
(
executionSource
,
session
,
dataReceiver
,
filter
,
-
1
,
1
,
DBSDataContainer
.
FLAG_NONE
);
RowDataReceiver
dataReceiver
=
new
RowDataReceiver
(
curAttributes
);
final
DBCStatistics
stats
=
dataContainer
.
readData
(
executionSource
,
session
,
dataReceiver
,
filter
,
0
,
0
,
DBSDataContainer
.
FLAG_NONE
);
refreshValues
[
i
]
=
dataReceiver
.
rowValues
;
}
}
return
null
;
// Ok, now we have refreshed values. Let's update real model
DBeaverUI
.
syncExec
(
new
Runnable
()
{
@Override
public
void
run
()
{
for
(
int
i
=
0
;
i
<
rows
.
size
();
i
++)
{
if
(
refreshValues
[
i
]
!=
null
)
{
rows
.
get
(
i
).
values
=
refreshValues
[
i
];
}
}
viewer
.
redrawData
(
true
);
}
});
return
Status
.
OK_STATUS
;
}
catch
(
Throwable
ex
)
{
throw
new
InvocationTargetException
(
ex
);
return
GeneralUtils
.
makeExceptionStatus
(
ex
);
}
}
}
...
...
plugins/org.jkiss.dbeaver.core/src/org/jkiss/dbeaver/ui/controls/resultset/ResultSetViewer.java
浏览文件 @
99a758d3
...
...
@@ -2305,11 +2305,22 @@ 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
boolean
applyChanges
(
@Nullable
DBRProgressMonitor
monitor
,
@Nullable
ResultSetPersister
.
DataUpdateListener
listener
)
public
boolean
applyChanges
(
@Nullable
final
DBRProgressMonitor
monitor
,
@Nullable
final
ResultSetPersister
.
DataUpdateListener
listener
)
{
try
{
ResultSetPersister
persister
=
createDataPersister
(
false
);
return
persister
.
applyChanges
(
monitor
,
false
,
listener
);
final
ResultSetPersister
persister
=
createDataPersister
(
false
);
return
persister
.
applyChanges
(
monitor
,
false
,
new
ResultSetPersister
.
DataUpdateListener
()
{
@Override
public
void
onUpdate
(
boolean
success
)
{
if
(
listener
!=
null
)
listener
.
onUpdate
(
success
);
try
{
persister
.
refreshInsertedRows
(
monitor
);
}
catch
(
Throwable
e
)
{
log
.
error
(
"Error refreshing rows after update"
,
e
);
}
}
});
}
catch
(
DBException
e
)
{
UIUtils
.
showErrorDialog
(
null
,
"Apply changes error"
,
"Error saving changes in database"
,
e
);
return
false
;
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录