embulk-output-jdbc 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +7 -0
- data/build.gradle +2 -0
- data/classpath/embulk-output-jdbc-0.1.0.jar +0 -0
- data/lib/embulk/output/jdbc.rb +3 -0
- data/src/main/java/org/embulk/output/JdbcOutputPlugin.java +104 -0
- data/src/main/java/org/embulk/output/jdbc/AbstractJdbcOutputPlugin.java +701 -0
- data/src/main/java/org/embulk/output/jdbc/BatchInsert.java +54 -0
- data/src/main/java/org/embulk/output/jdbc/JdbcColumn.java +71 -0
- data/src/main/java/org/embulk/output/jdbc/JdbcOutputConnection.java +423 -0
- data/src/main/java/org/embulk/output/jdbc/JdbcOutputConnector.java +8 -0
- data/src/main/java/org/embulk/output/jdbc/JdbcSchema.java +37 -0
- data/src/main/java/org/embulk/output/jdbc/JdbcUtils.java +155 -0
- data/src/main/java/org/embulk/output/jdbc/RetryExecutor.java +105 -0
- data/src/main/java/org/embulk/output/jdbc/StandardBatchInsert.java +180 -0
- data/src/main/java/org/embulk/output/jdbc/setter/BooleanColumnSetter.java +52 -0
- data/src/main/java/org/embulk/output/jdbc/setter/ColumnSetter.java +121 -0
- data/src/main/java/org/embulk/output/jdbc/setter/ColumnSetterFactory.java +137 -0
- data/src/main/java/org/embulk/output/jdbc/setter/DoubleColumnSetter.java +51 -0
- data/src/main/java/org/embulk/output/jdbc/setter/LongColumnSetter.java +62 -0
- data/src/main/java/org/embulk/output/jdbc/setter/NullColumnSetter.java +43 -0
- data/src/main/java/org/embulk/output/jdbc/setter/SkipColumnSetter.java +35 -0
- data/src/main/java/org/embulk/output/jdbc/setter/SqlTimestampColumnSetter.java +48 -0
- data/src/main/java/org/embulk/output/jdbc/setter/StringColumnSetter.java +48 -0
- data/src/test/java/org/embulk/output/TestJdbcOutputPlugin.java +5 -0
- metadata +67 -0
@@ -0,0 +1,52 @@
|
|
1
|
+
package org.embulk.output.jdbc.setter;
|
2
|
+
|
3
|
+
import java.io.IOException;
|
4
|
+
import java.sql.SQLException;
|
5
|
+
import com.google.common.collect.ImmutableSet;
|
6
|
+
import org.embulk.spi.PageReader;
|
7
|
+
import org.embulk.spi.time.Timestamp;
|
8
|
+
import org.embulk.output.jdbc.JdbcColumn;
|
9
|
+
import org.embulk.output.jdbc.BatchInsert;
|
10
|
+
|
11
|
+
public class BooleanColumnSetter
|
12
|
+
extends ColumnSetter
|
13
|
+
{
|
14
|
+
private static final ImmutableSet<String> trueStrings =
|
15
|
+
ImmutableSet.<String>of(
|
16
|
+
"true", "True", "TRUE",
|
17
|
+
"yes", "Yes", "YES",
|
18
|
+
"y", "Y",
|
19
|
+
"on", "On", "ON",
|
20
|
+
"1");
|
21
|
+
|
22
|
+
public BooleanColumnSetter(BatchInsert batch, PageReader pageReader,
|
23
|
+
JdbcColumn column)
|
24
|
+
{
|
25
|
+
super(batch, pageReader, column);
|
26
|
+
}
|
27
|
+
|
28
|
+
protected void booleanValue(boolean v) throws IOException, SQLException
|
29
|
+
{
|
30
|
+
batch.setBoolean(v);
|
31
|
+
}
|
32
|
+
|
33
|
+
protected void longValue(long v) throws IOException, SQLException
|
34
|
+
{
|
35
|
+
batch.setBoolean(v > 0);
|
36
|
+
}
|
37
|
+
|
38
|
+
protected void doubleValue(double v) throws IOException, SQLException
|
39
|
+
{
|
40
|
+
batch.setBoolean(v > 0.0);
|
41
|
+
}
|
42
|
+
|
43
|
+
protected void stringValue(String v) throws IOException, SQLException
|
44
|
+
{
|
45
|
+
batch.setBoolean(trueStrings.contains(v));
|
46
|
+
}
|
47
|
+
|
48
|
+
protected void timestampValue(Timestamp v) throws IOException, SQLException
|
49
|
+
{
|
50
|
+
nullValue();
|
51
|
+
}
|
52
|
+
}
|
@@ -0,0 +1,121 @@
|
|
1
|
+
package org.embulk.output.jdbc.setter;
|
2
|
+
|
3
|
+
import java.io.IOException;
|
4
|
+
import java.sql.SQLException;
|
5
|
+
import org.embulk.spi.Column;
|
6
|
+
import org.embulk.spi.ColumnVisitor;
|
7
|
+
import org.embulk.spi.PageReader;
|
8
|
+
import org.embulk.spi.time.Timestamp;
|
9
|
+
import org.embulk.output.jdbc.JdbcColumn;
|
10
|
+
import org.embulk.output.jdbc.BatchInsert;
|
11
|
+
|
12
|
+
public abstract class ColumnSetter
|
13
|
+
implements ColumnVisitor
|
14
|
+
{
|
15
|
+
protected final BatchInsert batch;
|
16
|
+
protected final PageReader pageReader;
|
17
|
+
protected final JdbcColumn column;
|
18
|
+
|
19
|
+
public ColumnSetter(BatchInsert batch, PageReader pageReader,
|
20
|
+
JdbcColumn column)
|
21
|
+
{
|
22
|
+
this.batch = batch;
|
23
|
+
this.pageReader = pageReader;
|
24
|
+
this.column = column;
|
25
|
+
}
|
26
|
+
|
27
|
+
public int getSqlType()
|
28
|
+
{
|
29
|
+
return column.getSqlType();
|
30
|
+
}
|
31
|
+
|
32
|
+
public void booleanColumn(Column column)
|
33
|
+
{
|
34
|
+
try {
|
35
|
+
if (pageReader.isNull(column)) {
|
36
|
+
nullValue();
|
37
|
+
} else {
|
38
|
+
booleanValue(pageReader.getBoolean(column));
|
39
|
+
}
|
40
|
+
} catch (IOException | SQLException ex) {
|
41
|
+
// TODO exception class
|
42
|
+
throw new RuntimeException(ex);
|
43
|
+
}
|
44
|
+
}
|
45
|
+
|
46
|
+
public void longColumn(Column column)
|
47
|
+
{
|
48
|
+
try {
|
49
|
+
if (pageReader.isNull(column)) {
|
50
|
+
nullValue();
|
51
|
+
} else {
|
52
|
+
longValue(pageReader.getLong(column));
|
53
|
+
}
|
54
|
+
} catch (IOException | SQLException ex) {
|
55
|
+
// TODO exception class
|
56
|
+
throw new RuntimeException(ex);
|
57
|
+
}
|
58
|
+
}
|
59
|
+
|
60
|
+
public void doubleColumn(Column column)
|
61
|
+
{
|
62
|
+
try {
|
63
|
+
if (pageReader.isNull(column)) {
|
64
|
+
nullValue();
|
65
|
+
} else {
|
66
|
+
doubleValue(pageReader.getDouble(column));
|
67
|
+
}
|
68
|
+
} catch (IOException | SQLException ex) {
|
69
|
+
// TODO exception class
|
70
|
+
throw new RuntimeException(ex);
|
71
|
+
}
|
72
|
+
}
|
73
|
+
|
74
|
+
public void stringColumn(Column column)
|
75
|
+
{
|
76
|
+
try {
|
77
|
+
if (pageReader.isNull(column)) {
|
78
|
+
nullValue();
|
79
|
+
} else {
|
80
|
+
stringValue(pageReader.getString(column));
|
81
|
+
}
|
82
|
+
} catch (IOException | SQLException ex) {
|
83
|
+
// TODO exception class
|
84
|
+
throw new RuntimeException(ex);
|
85
|
+
}
|
86
|
+
}
|
87
|
+
|
88
|
+
public void timestampColumn(Column column)
|
89
|
+
{
|
90
|
+
try {
|
91
|
+
if (pageReader.isNull(column)) {
|
92
|
+
nullValue();
|
93
|
+
} else {
|
94
|
+
timestampValue(pageReader.getTimestamp(column));
|
95
|
+
}
|
96
|
+
} catch (IOException | SQLException ex) {
|
97
|
+
// TODO exception class
|
98
|
+
throw new RuntimeException(ex);
|
99
|
+
}
|
100
|
+
}
|
101
|
+
|
102
|
+
protected void nullValue() throws IOException, SQLException
|
103
|
+
{
|
104
|
+
try {
|
105
|
+
batch.setNull(getSqlType());
|
106
|
+
} catch (IOException | SQLException ex) {
|
107
|
+
// TODO exception class
|
108
|
+
throw new RuntimeException(ex);
|
109
|
+
}
|
110
|
+
}
|
111
|
+
|
112
|
+
protected abstract void booleanValue(boolean v) throws IOException, SQLException;
|
113
|
+
|
114
|
+
protected abstract void longValue(long v) throws IOException, SQLException;
|
115
|
+
|
116
|
+
protected abstract void doubleValue(double v) throws IOException, SQLException;
|
117
|
+
|
118
|
+
protected abstract void stringValue(String v) throws IOException, SQLException;
|
119
|
+
|
120
|
+
protected abstract void timestampValue(Timestamp v) throws IOException, SQLException;
|
121
|
+
}
|
@@ -0,0 +1,137 @@
|
|
1
|
+
package org.embulk.output.jdbc.setter;
|
2
|
+
|
3
|
+
import java.sql.Types;
|
4
|
+
import org.embulk.spi.time.TimestampFormatter;
|
5
|
+
import org.embulk.spi.PageReader;
|
6
|
+
import org.embulk.output.jdbc.BatchInsert;
|
7
|
+
import org.embulk.output.jdbc.JdbcColumn;
|
8
|
+
|
9
|
+
public class ColumnSetterFactory
|
10
|
+
{
|
11
|
+
protected final BatchInsert batch;
|
12
|
+
protected final PageReader pageReader;
|
13
|
+
protected final TimestampFormatter timestampFormatter;
|
14
|
+
|
15
|
+
public ColumnSetterFactory(BatchInsert batch, PageReader pageReader,
|
16
|
+
TimestampFormatter timestampFormatter)
|
17
|
+
{
|
18
|
+
this.batch = batch;
|
19
|
+
this.pageReader = pageReader;
|
20
|
+
this.timestampFormatter = timestampFormatter;
|
21
|
+
}
|
22
|
+
|
23
|
+
public SkipColumnSetter newSkipColumnSetter()
|
24
|
+
{
|
25
|
+
return new SkipColumnSetter(batch, pageReader);
|
26
|
+
}
|
27
|
+
|
28
|
+
public ColumnSetter newColumnSetter(JdbcColumn column)
|
29
|
+
{
|
30
|
+
switch(column.getSqlType()) {
|
31
|
+
//// TODO
|
32
|
+
// setByte
|
33
|
+
//case Types.TINYINT:
|
34
|
+
// return new ByteColumnSetter(batch, pageReader, column);
|
35
|
+
|
36
|
+
//// TODO
|
37
|
+
//// setShort
|
38
|
+
//case Types.SMALLINT:
|
39
|
+
// return new ShortColumnSetter(batch, pageReader, column);
|
40
|
+
|
41
|
+
//// TODO
|
42
|
+
//// setInt
|
43
|
+
//case Types.INTEGER:
|
44
|
+
// return new IntColumnSetter(batch, pageReader, column);
|
45
|
+
|
46
|
+
// setLong
|
47
|
+
case Types.BIGINT:
|
48
|
+
return new LongColumnSetter(batch, pageReader, column);
|
49
|
+
|
50
|
+
// setDouble
|
51
|
+
case Types.DOUBLE:
|
52
|
+
case Types.FLOAT:
|
53
|
+
return new DoubleColumnSetter(batch, pageReader, column);
|
54
|
+
|
55
|
+
// TODO
|
56
|
+
//// setFloat
|
57
|
+
//case Types.REAL:
|
58
|
+
// return new FloatColumnSetter(batch, pageReader, column);
|
59
|
+
|
60
|
+
// setBool
|
61
|
+
case Types.BOOLEAN:
|
62
|
+
case Types.BIT: // JDBC BIT is boolean, unlike SQL-92
|
63
|
+
return new BooleanColumnSetter(batch, pageReader, column);
|
64
|
+
|
65
|
+
// setString, Clob
|
66
|
+
case Types.CHAR:
|
67
|
+
case Types.VARCHAR:
|
68
|
+
case Types.LONGVARCHAR:
|
69
|
+
case Types.CLOB:
|
70
|
+
return new StringColumnSetter(batch, pageReader, column, timestampFormatter);
|
71
|
+
|
72
|
+
// TODO
|
73
|
+
//// setNString, NClob
|
74
|
+
//case Types.NCHAR:
|
75
|
+
//case Types.NVARCHAR:
|
76
|
+
//case Types.LONGNVARCHAR:
|
77
|
+
// return new NStringColumnSetter(batch, pageReader, column);
|
78
|
+
|
79
|
+
// TODO
|
80
|
+
//// setBytes Blob
|
81
|
+
//case Types.BINARY:
|
82
|
+
//case Types.VARBINARY:
|
83
|
+
//case Types.LONGVARBINARY:
|
84
|
+
//case Types.BLOB:
|
85
|
+
// return new BytesColumnSetter(batch, pageReader, column);
|
86
|
+
|
87
|
+
// Time
|
88
|
+
//case Types.DATE:
|
89
|
+
// return new SqlDateColumnSetter(batch, pageReader, column); // TODO
|
90
|
+
//case Types.TIME:
|
91
|
+
// return new SqlTimeColumnSetter(batch, pageReader, column); // TODO
|
92
|
+
case Types.TIMESTAMP:
|
93
|
+
return new SqlTimestampColumnSetter(batch, pageReader, column);
|
94
|
+
|
95
|
+
// Null
|
96
|
+
case Types.NULL:
|
97
|
+
return new NullColumnSetter(batch, pageReader, column);
|
98
|
+
|
99
|
+
// TODO
|
100
|
+
//// BigDecimal
|
101
|
+
//case Types.NUMERIC:
|
102
|
+
//case Types.DECIMAL:
|
103
|
+
// return new BigDecimalColumnSetter(batch, pageReader, column);
|
104
|
+
|
105
|
+
// others
|
106
|
+
case Types.ARRAY: // array
|
107
|
+
case Types.STRUCT: // map
|
108
|
+
case Types.REF:
|
109
|
+
case Types.DATALINK:
|
110
|
+
case Types.SQLXML: // XML
|
111
|
+
case Types.ROWID:
|
112
|
+
case Types.DISTINCT:
|
113
|
+
case Types.JAVA_OBJECT:
|
114
|
+
case Types.OTHER:
|
115
|
+
default:
|
116
|
+
throw unsupportedOperationException(column);
|
117
|
+
}
|
118
|
+
}
|
119
|
+
|
120
|
+
//private static String[] UNSUPPORTED = new String[] {
|
121
|
+
// "ARRAY",
|
122
|
+
// "STRUCT",
|
123
|
+
// "REF",
|
124
|
+
// "DATALINK",
|
125
|
+
// "SQLXML",
|
126
|
+
// "ROWID",
|
127
|
+
// "DISTINCT",
|
128
|
+
// "OTHER",
|
129
|
+
//};
|
130
|
+
|
131
|
+
private static UnsupportedOperationException unsupportedOperationException(JdbcColumn column)
|
132
|
+
{
|
133
|
+
throw new UnsupportedOperationException(
|
134
|
+
String.format("Unsupported type %s (sqlType=%d, size=%d, scale=%d)",
|
135
|
+
column.getTypeName(), column.getSqlType(), column.getSizeTypeParameter(), column.getScaleTypeParameter()));
|
136
|
+
}
|
137
|
+
}
|
@@ -0,0 +1,51 @@
|
|
1
|
+
package org.embulk.output.jdbc.setter;
|
2
|
+
|
3
|
+
import java.io.IOException;
|
4
|
+
import java.sql.SQLException;
|
5
|
+
import org.embulk.spi.ColumnVisitor;
|
6
|
+
import org.embulk.spi.PageReader;
|
7
|
+
import org.embulk.spi.time.Timestamp;
|
8
|
+
import org.embulk.output.jdbc.JdbcColumn;
|
9
|
+
import org.embulk.output.jdbc.BatchInsert;
|
10
|
+
|
11
|
+
public class DoubleColumnSetter
|
12
|
+
extends ColumnSetter
|
13
|
+
{
|
14
|
+
public DoubleColumnSetter(BatchInsert batch, PageReader pageReader,
|
15
|
+
JdbcColumn column)
|
16
|
+
{
|
17
|
+
super(batch, pageReader, column);
|
18
|
+
}
|
19
|
+
|
20
|
+
protected void booleanValue(boolean v) throws IOException, SQLException
|
21
|
+
{
|
22
|
+
batch.setDouble(v ? 1.0 : 0.0);
|
23
|
+
}
|
24
|
+
|
25
|
+
protected void longValue(long v) throws IOException, SQLException
|
26
|
+
{
|
27
|
+
batch.setDouble((double) v);
|
28
|
+
}
|
29
|
+
|
30
|
+
protected void doubleValue(double v) throws IOException, SQLException
|
31
|
+
{
|
32
|
+
batch.setDouble(v);
|
33
|
+
}
|
34
|
+
|
35
|
+
protected void stringValue(String v) throws IOException, SQLException
|
36
|
+
{
|
37
|
+
double dv;
|
38
|
+
try {
|
39
|
+
dv = Double.parseDouble(v);
|
40
|
+
} catch (NumberFormatException e) {
|
41
|
+
nullValue();
|
42
|
+
return;
|
43
|
+
}
|
44
|
+
batch.setDouble(dv);
|
45
|
+
}
|
46
|
+
|
47
|
+
protected void timestampValue(Timestamp v) throws IOException, SQLException
|
48
|
+
{
|
49
|
+
nullValue();
|
50
|
+
}
|
51
|
+
}
|
@@ -0,0 +1,62 @@
|
|
1
|
+
package org.embulk.output.jdbc.setter;
|
2
|
+
|
3
|
+
import java.io.IOException;
|
4
|
+
import java.sql.SQLException;
|
5
|
+
import java.math.RoundingMode;
|
6
|
+
import com.google.common.math.DoubleMath;
|
7
|
+
import org.embulk.spi.ColumnVisitor;
|
8
|
+
import org.embulk.spi.PageReader;
|
9
|
+
import org.embulk.spi.time.Timestamp;
|
10
|
+
import org.embulk.output.jdbc.JdbcColumn;
|
11
|
+
import org.embulk.output.jdbc.BatchInsert;
|
12
|
+
|
13
|
+
public class LongColumnSetter
|
14
|
+
extends ColumnSetter
|
15
|
+
{
|
16
|
+
public LongColumnSetter(BatchInsert batch, PageReader pageReader,
|
17
|
+
JdbcColumn column)
|
18
|
+
{
|
19
|
+
super(batch, pageReader, column);
|
20
|
+
}
|
21
|
+
|
22
|
+
protected void booleanValue(boolean v) throws IOException, SQLException
|
23
|
+
{
|
24
|
+
batch.setLong(v ? 1L : 0L);
|
25
|
+
}
|
26
|
+
|
27
|
+
protected void longValue(long v) throws IOException, SQLException
|
28
|
+
{
|
29
|
+
batch.setLong(v);
|
30
|
+
}
|
31
|
+
|
32
|
+
protected void doubleValue(double v) throws IOException, SQLException
|
33
|
+
{
|
34
|
+
long lv;
|
35
|
+
try {
|
36
|
+
// TODO configurable rounding mode
|
37
|
+
lv = DoubleMath.roundToLong(v, RoundingMode.HALF_UP);
|
38
|
+
} catch (ArithmeticException ex) {
|
39
|
+
// NaN / Infinite / -Infinite
|
40
|
+
nullValue();
|
41
|
+
return;
|
42
|
+
}
|
43
|
+
batch.setLong(lv);
|
44
|
+
}
|
45
|
+
|
46
|
+
protected void stringValue(String v) throws IOException, SQLException
|
47
|
+
{
|
48
|
+
long lv;
|
49
|
+
try {
|
50
|
+
lv = Long.parseLong(v);
|
51
|
+
} catch (NumberFormatException e) {
|
52
|
+
nullValue();
|
53
|
+
return;
|
54
|
+
}
|
55
|
+
batch.setLong(lv);
|
56
|
+
}
|
57
|
+
|
58
|
+
protected void timestampValue(Timestamp v) throws IOException, SQLException
|
59
|
+
{
|
60
|
+
nullValue();
|
61
|
+
}
|
62
|
+
}
|
@@ -0,0 +1,43 @@
|
|
1
|
+
package org.embulk.output.jdbc.setter;
|
2
|
+
|
3
|
+
import java.io.IOException;
|
4
|
+
import java.sql.SQLException;
|
5
|
+
import org.embulk.spi.PageReader;
|
6
|
+
import org.embulk.spi.time.Timestamp;
|
7
|
+
import org.embulk.output.jdbc.JdbcColumn;
|
8
|
+
import org.embulk.output.jdbc.BatchInsert;
|
9
|
+
|
10
|
+
public class NullColumnSetter
|
11
|
+
extends ColumnSetter
|
12
|
+
{
|
13
|
+
public NullColumnSetter(BatchInsert batch, PageReader pageReader,
|
14
|
+
JdbcColumn column)
|
15
|
+
{
|
16
|
+
super(batch, pageReader, column);
|
17
|
+
}
|
18
|
+
|
19
|
+
protected void booleanValue(boolean v) throws IOException, SQLException
|
20
|
+
{
|
21
|
+
nullValue();
|
22
|
+
}
|
23
|
+
|
24
|
+
protected void longValue(long v) throws IOException, SQLException
|
25
|
+
{
|
26
|
+
nullValue();
|
27
|
+
}
|
28
|
+
|
29
|
+
protected void doubleValue(double v) throws IOException, SQLException
|
30
|
+
{
|
31
|
+
nullValue();
|
32
|
+
}
|
33
|
+
|
34
|
+
protected void stringValue(String v) throws IOException, SQLException
|
35
|
+
{
|
36
|
+
nullValue();
|
37
|
+
}
|
38
|
+
|
39
|
+
protected void timestampValue(Timestamp v) throws IOException, SQLException
|
40
|
+
{
|
41
|
+
nullValue();
|
42
|
+
}
|
43
|
+
}
|