Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
suliangchun
dbeaver
提交
c7d52749
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,发现更多精彩内容 >>
提交
c7d52749
编写于
8月 10, 2020
作者:
S
Serge Rider
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
#8669 Stream import: use target column type as a hint for transformation
上级
55bbd6c0
变更
7
隐藏空白更改
内联
并排
Showing
7 changed file
with
100 addition
and
24 deletion
+100
-24
plugins/org.jkiss.dbeaver.data.transfer/src/org/jkiss/dbeaver/tools/transfer/IDataTransferConsumer.java
...g/jkiss/dbeaver/tools/transfer/IDataTransferConsumer.java
+4
-0
plugins/org.jkiss.dbeaver.data.transfer/src/org/jkiss/dbeaver/tools/transfer/database/DatabaseMappingType.java
.../dbeaver/tools/transfer/database/DatabaseMappingType.java
+14
-4
plugins/org.jkiss.dbeaver.data.transfer/src/org/jkiss/dbeaver/tools/transfer/stream/StreamDataImporterColumnInfo.java
...r/tools/transfer/stream/StreamDataImporterColumnInfo.java
+5
-1
plugins/org.jkiss.dbeaver.data.transfer/src/org/jkiss/dbeaver/tools/transfer/stream/StreamTransferConsumer.java
...dbeaver/tools/transfer/stream/StreamTransferConsumer.java
+5
-0
plugins/org.jkiss.dbeaver.data.transfer/src/org/jkiss/dbeaver/tools/transfer/stream/StreamTransferResultSet.java
...beaver/tools/transfer/stream/StreamTransferResultSet.java
+5
-1
plugins/org.jkiss.dbeaver.data.transfer/src/org/jkiss/dbeaver/tools/transfer/stream/importer/DataImporterCSV.java
...eaver/tools/transfer/stream/importer/DataImporterCSV.java
+2
-18
plugins/org.jkiss.dbeaver.data.transfer/src/org/jkiss/dbeaver/tools/transfer/stream/importer/StreamImporterAbstract.java
...ools/transfer/stream/importer/StreamImporterAbstract.java
+65
-0
未找到文件。
plugins/org.jkiss.dbeaver.data.transfer/src/org/jkiss/dbeaver/tools/transfer/IDataTransferConsumer.java
浏览文件 @
c7d52749
...
...
@@ -58,6 +58,10 @@ public interface IDataTransferConsumer<SETTINGS extends IDataTransferSettings, P
*/
void
finishTransfer
(
DBRProgressMonitor
monitor
,
boolean
last
);
// Target object. May be null or target database object (table)
@Nullable
Object
getTargetObject
();
// If not null then this consumer is a fake one which must be replaced by explicit target consumers on configuration stage
@Nullable
Object
getTargetObjectContainer
();
...
...
plugins/org.jkiss.dbeaver.data.transfer/src/org/jkiss/dbeaver/tools/transfer/database/DatabaseMappingType.java
浏览文件 @
c7d52749
...
...
@@ -20,8 +20,18 @@ package org.jkiss.dbeaver.tools.transfer.database;
* Mapping type
*/
public
enum
DatabaseMappingType
{
unspecified
,
existing
,
create
,
skip
unspecified
(
false
),
existing
(
true
),
create
(
true
),
skip
(
false
);
private
final
boolean
isValid
;
DatabaseMappingType
(
boolean
isValid
)
{
this
.
isValid
=
isValid
;
}
public
boolean
isValid
()
{
return
isValid
;
}
}
plugins/org.jkiss.dbeaver.data.transfer/src/org/jkiss/dbeaver/tools/transfer/stream/StreamDataImporterColumnInfo.java
浏览文件 @
c7d52749
...
...
@@ -27,7 +27,7 @@ import org.jkiss.dbeaver.model.struct.DBSEntityAttribute;
public
class
StreamDataImporterColumnInfo
extends
AbstractAttribute
implements
DBSEntityAttribute
{
private
StreamEntityMapping
entityMapping
;
private
final
DBPDataKind
dataKind
;
private
DBPDataKind
dataKind
;
public
StreamDataImporterColumnInfo
(
StreamEntityMapping
entity
,
int
columnIndex
,
String
columnName
,
String
typeName
,
int
maxLength
,
DBPDataKind
dataKind
)
{
super
(
columnName
,
typeName
,
-
1
,
columnIndex
,
maxLength
,
null
,
null
,
false
,
false
);
...
...
@@ -57,4 +57,8 @@ public class StreamDataImporterColumnInfo extends AbstractAttribute implements D
public
DBPDataSource
getDataSource
()
{
return
entityMapping
.
getDataSource
();
}
public
void
setDataKind
(
DBPDataKind
dataKind
)
{
this
.
dataKind
=
dataKind
;
}
}
plugins/org.jkiss.dbeaver.data.transfer/src/org/jkiss/dbeaver/tools/transfer/stream/StreamTransferConsumer.java
浏览文件 @
c7d52749
...
...
@@ -395,6 +395,11 @@ public class StreamTransferConsumer implements IDataTransferConsumer<StreamConsu
}
}
@Override
public
Object
getTargetObject
()
{
return
null
;
}
@Nullable
@Override
public
Object
getTargetObjectContainer
()
{
...
...
plugins/org.jkiss.dbeaver.data.transfer/src/org/jkiss/dbeaver/tools/transfer/stream/StreamTransferResultSet.java
浏览文件 @
c7d52749
...
...
@@ -60,6 +60,10 @@ public class StreamTransferResultSet implements DBCResultSet {
.
collect
(
Collectors
.
toList
());
}
public
List
<
StreamDataImporterColumnInfo
>
getAttributeMappings
()
{
return
attributeMappings
;
}
public
void
setStreamRow
(
Object
[]
streamRow
)
{
this
.
streamRow
=
streamRow
;
}
...
...
@@ -93,7 +97,7 @@ public class StreamTransferResultSet implements DBCResultSet {
}
catch
(
Exception
e
)
{
LocalDateTime
localDT
=
LocalDateTime
.
from
(
ta
);
if
(
localDT
!=
null
)
{
value
=
java
.
util
.
Date
.
from
(
localDT
.
atZone
(
ZoneId
.
systemDefault
(
)).
toInstant
());
value
=
java
.
util
.
Date
.
from
(
localDT
.
atZone
(
ZoneId
.
of
(
"UTC"
)).
toInstant
());
}
}
}
catch
(
Exception
e
)
{
...
...
plugins/org.jkiss.dbeaver.data.transfer/src/org/jkiss/dbeaver/tools/transfer/stream/importer/DataImporterCSV.java
浏览文件 @
c7d52749
...
...
@@ -19,7 +19,6 @@ package org.jkiss.dbeaver.tools.transfer.stream.importer;
import
au.com.bytecode.opencsv.CSVReader
;
import
org.jkiss.code.NotNull
;
import
org.jkiss.dbeaver.DBException
;
import
org.jkiss.dbeaver.Log
;
import
org.jkiss.dbeaver.model.DBPDataKind
;
import
org.jkiss.dbeaver.model.DBPDataSource
;
import
org.jkiss.dbeaver.model.DBUtils
;
...
...
@@ -34,7 +33,6 @@ import org.jkiss.dbeaver.utils.GeneralUtils;
import
org.jkiss.utils.CommonUtils
;
import
java.io.*
;
import
java.time.format.DateTimeFormatter
;
import
java.util.ArrayList
;
import
java.util.List
;
import
java.util.Map
;
...
...
@@ -44,8 +42,6 @@ import java.util.Map;
*/
public
class
DataImporterCSV
extends
StreamImporterAbstract
{
private
static
final
Log
log
=
Log
.
getLog
(
DataImporterCSV
.
class
);
private
static
final
String
PROP_ENCODING
=
"encoding"
;
private
static
final
String
PROP_HEADER
=
"header"
;
private
static
final
String
PROP_DELIMITER
=
"delimiter"
;
...
...
@@ -132,28 +128,16 @@ public class DataImporterCSV extends StreamImporterAbstract {
HeaderPosition
headerPosition
=
getHeaderPosition
(
properties
);
boolean
emptyStringNull
=
CommonUtils
.
getBoolean
(
properties
.
get
(
PROP_EMPTY_STRING_NULL
),
false
);
String
nullValueMark
=
CommonUtils
.
toString
(
properties
.
get
(
PROP_NULL_STRING
));
DateTimeFormatter
tsFormat
=
null
;
String
tsFormatPattern
=
CommonUtils
.
toString
(
properties
.
get
(
PROP_TIMESTAMP_FORMAT
));
if
(!
CommonUtils
.
isEmpty
(
tsFormatPattern
))
{
try
{
tsFormat
=
DateTimeFormatter
.
ofPattern
(
tsFormatPattern
);
}
catch
(
Exception
e
)
{
log
.
error
(
"Wrong timestamp format: "
+
tsFormatPattern
,
e
);
}
//Map<Object, Object> defTSProps = site.getSourceObject().getDataSource().getContainer().getDataFormatterProfile().getFormatterProperties(DBDDataFormatter.TYPE_NAME_TIMESTAMP);
}
DBCExecutionContext
context
=
streamDataSource
.
getDefaultInstance
().
getDefaultContext
(
monitor
,
false
);
try
(
DBCSession
producerSession
=
context
.
openSession
(
monitor
,
DBCExecutionPurpose
.
UTIL
,
"Transfer stream data"
))
{
LocalStatement
localStatement
=
new
LocalStatement
(
producerSession
,
"SELECT * FROM Stream"
);
StreamTransferResultSet
resultSet
=
new
StreamTransferResultSet
(
producerSession
,
localStatement
,
entityMapping
);
if
(
tsFormat
!=
null
)
{
resultSet
.
setDateTimeFormat
(
tsFormat
);
}
consumer
.
fetchStart
(
producerSession
,
resultSet
,
-
1
,
-
1
);
applyTransformHints
(
resultSet
,
consumer
,
getTimeStampFormat
(
properties
,
PROP_TIMESTAMP_FORMAT
));
try
(
Reader
reader
=
openStreamReader
(
inputStream
,
properties
))
{
try
(
CSVReader
csvReader
=
openCSVReader
(
reader
,
properties
))
{
...
...
plugins/org.jkiss.dbeaver.data.transfer/src/org/jkiss/dbeaver/tools/transfer/stream/importer/StreamImporterAbstract.java
浏览文件 @
c7d52749
...
...
@@ -17,15 +17,30 @@
package
org.jkiss.dbeaver.tools.transfer.stream.importer
;
import
org.jkiss.code.NotNull
;
import
org.jkiss.code.Nullable
;
import
org.jkiss.dbeaver.DBException
;
import
org.jkiss.dbeaver.Log
;
import
org.jkiss.dbeaver.model.DBPDataKind
;
import
org.jkiss.dbeaver.model.struct.DBSEntity
;
import
org.jkiss.dbeaver.model.struct.DBSEntityAttribute
;
import
org.jkiss.dbeaver.tools.transfer.IDataTransferConsumer
;
import
org.jkiss.dbeaver.tools.transfer.database.DatabaseTransferConsumer
;
import
org.jkiss.dbeaver.tools.transfer.stream.IStreamDataImporter
;
import
org.jkiss.dbeaver.tools.transfer.stream.IStreamDataImporterSite
;
import
org.jkiss.dbeaver.tools.transfer.stream.StreamDataImporterColumnInfo
;
import
org.jkiss.dbeaver.tools.transfer.stream.StreamTransferResultSet
;
import
org.jkiss.utils.CommonUtils
;
import
java.time.format.DateTimeFormatter
;
import
java.util.Map
;
/**
* Abstract stream importer
*/
public
abstract
class
StreamImporterAbstract
implements
IStreamDataImporter
{
private
static
final
Log
log
=
Log
.
getLog
(
StreamImporterAbstract
.
class
);
private
IStreamDataImporterSite
site
;
public
IStreamDataImporterSite
getSite
()
...
...
@@ -45,4 +60,54 @@ public abstract class StreamImporterAbstract implements IStreamDataImporter {
// do nothing
}
@Nullable
protected
DateTimeFormatter
getTimeStampFormat
(
Map
<
String
,
Object
>
properties
,
String
propName
)
{
DateTimeFormatter
tsFormat
=
null
;
String
tsFormatPattern
=
CommonUtils
.
toString
(
properties
.
get
(
propName
));
if
(!
CommonUtils
.
isEmpty
(
tsFormatPattern
))
{
try
{
tsFormat
=
DateTimeFormatter
.
ofPattern
(
tsFormatPattern
);
}
catch
(
Exception
e
)
{
log
.
error
(
"Wrong timestamp format: "
+
tsFormatPattern
,
e
);
}
}
return
tsFormat
;
}
protected
void
applyTransformHints
(
StreamTransferResultSet
resultSet
,
IDataTransferConsumer
consumer
,
DateTimeFormatter
tsFormat
)
throws
DBException
{
if
(
tsFormat
!=
null
)
{
resultSet
.
setDateTimeFormat
(
tsFormat
);
}
// Try to find source/target attributes
// Modify source data type and data kind for timestamps and numerics
// Do it only for valid String mappings
if
(
consumer
instanceof
DatabaseTransferConsumer
)
{
for
(
DatabaseTransferConsumer
.
ColumnMapping
cm
:
((
DatabaseTransferConsumer
)
consumer
).
getColumnMappings
())
{
for
(
StreamDataImporterColumnInfo
attributeMapping
:
resultSet
.
getAttributeMappings
())
{
if
(
cm
.
targetAttr
.
getMappingType
().
isValid
())
{
if
(
cm
.
sourceAttr
.
getDataKind
()
==
DBPDataKind
.
STRING
&&
cm
.
sourceAttr
.
getName
().
equals
(
attributeMapping
.
getName
()))
{
// Gotcha
DBSEntityAttribute
targetAttr
=
cm
.
targetAttr
.
getTarget
();
if
(
targetAttr
!=
null
)
{
switch
(
targetAttr
.
getDataKind
())
{
case
DATETIME:
case
NUMERIC:
case
BOOLEAN:
attributeMapping
.
setDataKind
(
targetAttr
.
getDataKind
());
break
;
}
}
}
}
}
}
Object
targetObject
=
consumer
.
getTargetObject
();
if
(
targetObject
instanceof
DBSEntity
)
{
}
}
}
}
\ No newline at end of file
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录