|
17 | 17 |
|
18 | 18 | package org.apache.seatunnel.connectors.seatunnel.jdbc.internal.dialect.db2;
|
19 | 19 |
|
20 |
| -import org.apache.seatunnel.api.table.type.BasicType; |
21 |
| -import org.apache.seatunnel.api.table.type.DecimalType; |
22 |
| -import org.apache.seatunnel.api.table.type.LocalTimeType; |
23 |
| -import org.apache.seatunnel.api.table.type.PrimitiveByteArrayType; |
24 |
| -import org.apache.seatunnel.api.table.type.SeaTunnelDataType; |
25 |
| -import org.apache.seatunnel.common.exception.CommonError; |
26 |
| -import org.apache.seatunnel.connectors.seatunnel.jdbc.internal.dialect.DatabaseIdentifier; |
27 |
| -import org.apache.seatunnel.connectors.seatunnel.jdbc.internal.dialect.JdbcDialect; |
| 20 | +import org.apache.seatunnel.api.table.catalog.Column; |
| 21 | +import org.apache.seatunnel.api.table.converter.BasicTypeDefine; |
28 | 22 | import org.apache.seatunnel.connectors.seatunnel.jdbc.internal.dialect.JdbcDialectTypeMapper;
|
29 | 23 |
|
30 |
| -import org.slf4j.Logger; |
31 |
| -import org.slf4j.LoggerFactory; |
32 |
| - |
33 | 24 | import java.sql.ResultSetMetaData;
|
34 | 25 | import java.sql.SQLException;
|
35 | 26 |
|
36 | 27 | public class DB2TypeMapper implements JdbcDialectTypeMapper {
|
37 | 28 |
|
38 |
| - private static final Logger LOG = LoggerFactory.getLogger(JdbcDialect.class); |
39 |
| - |
40 |
| - // reference https://www.ibm.com/docs/en/ssw_ibm_i_75/pdf/rbafzpdf.pdf |
41 |
| - // ============================data types===================== |
42 |
| - private static final String DB2_BOOLEAN = "BOOLEAN"; |
43 |
| - |
44 |
| - private static final String DB2_ROWID = "ROWID"; |
45 |
| - private static final String DB2_SMALLINT = "SMALLINT"; |
46 |
| - private static final String DB2_INTEGER = "INTEGER"; |
47 |
| - private static final String DB2_INT = "INT"; |
48 |
| - private static final String DB2_BIGINT = "BIGINT"; |
49 |
| - // exact |
50 |
| - private static final String DB2_DECIMAL = "DECIMAL"; |
51 |
| - private static final String DB2_DEC = "DEC"; |
52 |
| - private static final String DB2_NUMERIC = "NUMERIC"; |
53 |
| - private static final String DB2_NUM = "NUM"; |
54 |
| - // float |
55 |
| - private static final String DB2_REAL = "REAL"; |
56 |
| - private static final String DB2_FLOAT = "FLOAT"; |
57 |
| - private static final String DB2_DOUBLE = "DOUBLE"; |
58 |
| - private static final String DB2_DOUBLE_PRECISION = "DOUBLE PRECISION"; |
59 |
| - private static final String DB2_DECFLOAT = "DECFLOAT"; |
60 |
| - // string |
61 |
| - private static final String DB2_CHAR = "CHAR"; |
62 |
| - private static final String DB2_VARCHAR = "VARCHAR"; |
63 |
| - private static final String DB2_LONG_VARCHAR = "LONG VARCHAR"; |
64 |
| - private static final String DB2_CLOB = "CLOB"; |
65 |
| - // graphic |
66 |
| - private static final String DB2_GRAPHIC = "GRAPHIC"; |
67 |
| - private static final String DB2_VARGRAPHIC = "VARGRAPHIC"; |
68 |
| - private static final String DB2_LONG_VARGRAPHIC = "LONG VARGRAPHIC"; |
69 |
| - private static final String DB2_DBCLOB = "DBCLOB"; |
70 |
| - |
71 |
| - // ---------------------------binary--------------------------- |
72 |
| - private static final String DB2_BINARY = "BINARY"; |
73 |
| - private static final String DB2_VARBINARY = "VARBINARY"; |
74 |
| - |
75 |
| - // ------------------------------time------------------------- |
76 |
| - private static final String DB2_DATE = "DATE"; |
77 |
| - private static final String DB2_TIME = "TIME"; |
78 |
| - private static final String DB2_TIMESTAMP = "TIMESTAMP"; |
79 |
| - |
80 |
| - // ------------------------------blob------------------------- |
81 |
| - private static final String DB2_BLOB = "BLOB"; |
82 |
| - |
83 |
| - // other |
84 |
| - private static final String DB2_XML = "XML"; |
| 29 | + @Override |
| 30 | + public Column mappingColumn(BasicTypeDefine typeDefine) { |
| 31 | + return DB2TypeConverter.INSTANCE.convert(typeDefine); |
| 32 | + } |
85 | 33 |
|
86 | 34 | @Override
|
87 |
| - public SeaTunnelDataType<?> mapping(ResultSetMetaData metadata, int colIndex) |
88 |
| - throws SQLException { |
89 |
| - String columnType = metadata.getColumnTypeName(colIndex).toUpperCase(); |
| 35 | + public Column mappingColumn(ResultSetMetaData metadata, int colIndex) throws SQLException { |
| 36 | + String columnName = metadata.getColumnLabel(colIndex); |
| 37 | + String nativeType = metadata.getColumnTypeName(colIndex); |
| 38 | + int isNullable = metadata.isNullable(colIndex); |
90 | 39 | int precision = metadata.getPrecision(colIndex);
|
91 |
| - switch (columnType) { |
92 |
| - case DB2_BOOLEAN: |
93 |
| - return BasicType.BOOLEAN_TYPE; |
94 |
| - case DB2_SMALLINT: |
95 |
| - return BasicType.SHORT_TYPE; |
96 |
| - case DB2_INT: |
97 |
| - case DB2_INTEGER: |
98 |
| - return BasicType.INT_TYPE; |
99 |
| - case DB2_BIGINT: |
100 |
| - return BasicType.LONG_TYPE; |
101 |
| - case DB2_DECIMAL: |
102 |
| - case DB2_DEC: |
103 |
| - case DB2_NUMERIC: |
104 |
| - case DB2_NUM: |
105 |
| - if (precision > 0) { |
106 |
| - return new DecimalType(precision, metadata.getScale(colIndex)); |
107 |
| - } |
108 |
| - LOG.warn("decimal did define precision,scale, will be Decimal(38,18)"); |
109 |
| - return new DecimalType(38, 18); |
110 |
| - case DB2_REAL: |
111 |
| - return BasicType.FLOAT_TYPE; |
112 |
| - case DB2_FLOAT: |
113 |
| - case DB2_DOUBLE: |
114 |
| - case DB2_DOUBLE_PRECISION: |
115 |
| - case DB2_DECFLOAT: |
116 |
| - return BasicType.DOUBLE_TYPE; |
117 |
| - case DB2_CHAR: |
118 |
| - case DB2_VARCHAR: |
119 |
| - case DB2_LONG_VARCHAR: |
120 |
| - case DB2_CLOB: |
121 |
| - case DB2_GRAPHIC: |
122 |
| - case DB2_VARGRAPHIC: |
123 |
| - case DB2_LONG_VARGRAPHIC: |
124 |
| - case DB2_DBCLOB: |
125 |
| - return BasicType.STRING_TYPE; |
126 |
| - case DB2_BINARY: |
127 |
| - case DB2_VARBINARY: |
128 |
| - case DB2_BLOB: |
129 |
| - return PrimitiveByteArrayType.INSTANCE; |
130 |
| - case DB2_DATE: |
131 |
| - return LocalTimeType.LOCAL_DATE_TYPE; |
132 |
| - case DB2_TIME: |
133 |
| - return LocalTimeType.LOCAL_TIME_TYPE; |
134 |
| - case DB2_TIMESTAMP: |
135 |
| - return LocalTimeType.LOCAL_DATE_TIME_TYPE; |
136 |
| - case DB2_ROWID: |
137 |
| - // maybe should support |
138 |
| - case DB2_XML: |
139 |
| - default: |
140 |
| - final String jdbcColumnName = metadata.getColumnName(colIndex); |
141 |
| - throw CommonError.convertToSeaTunnelTypeError( |
142 |
| - DatabaseIdentifier.DB_2, columnType, jdbcColumnName); |
143 |
| - } |
| 40 | + int scale = metadata.getScale(colIndex); |
| 41 | + BasicTypeDefine typeDefine = |
| 42 | + BasicTypeDefine.builder() |
| 43 | + .name(columnName) |
| 44 | + .columnType(nativeType) |
| 45 | + .dataType(nativeType) |
| 46 | + .nullable(isNullable == ResultSetMetaData.columnNullable) |
| 47 | + .length((long) precision) |
| 48 | + .precision((long) precision) |
| 49 | + .scale(scale) |
| 50 | + .build(); |
| 51 | + return mappingColumn(typeDefine); |
144 | 52 | }
|
145 | 53 | }
|
0 commit comments