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.
Files changed (25) hide show
  1. checksums.yaml +7 -0
  2. data/build.gradle +2 -0
  3. data/classpath/embulk-output-jdbc-0.1.0.jar +0 -0
  4. data/lib/embulk/output/jdbc.rb +3 -0
  5. data/src/main/java/org/embulk/output/JdbcOutputPlugin.java +104 -0
  6. data/src/main/java/org/embulk/output/jdbc/AbstractJdbcOutputPlugin.java +701 -0
  7. data/src/main/java/org/embulk/output/jdbc/BatchInsert.java +54 -0
  8. data/src/main/java/org/embulk/output/jdbc/JdbcColumn.java +71 -0
  9. data/src/main/java/org/embulk/output/jdbc/JdbcOutputConnection.java +423 -0
  10. data/src/main/java/org/embulk/output/jdbc/JdbcOutputConnector.java +8 -0
  11. data/src/main/java/org/embulk/output/jdbc/JdbcSchema.java +37 -0
  12. data/src/main/java/org/embulk/output/jdbc/JdbcUtils.java +155 -0
  13. data/src/main/java/org/embulk/output/jdbc/RetryExecutor.java +105 -0
  14. data/src/main/java/org/embulk/output/jdbc/StandardBatchInsert.java +180 -0
  15. data/src/main/java/org/embulk/output/jdbc/setter/BooleanColumnSetter.java +52 -0
  16. data/src/main/java/org/embulk/output/jdbc/setter/ColumnSetter.java +121 -0
  17. data/src/main/java/org/embulk/output/jdbc/setter/ColumnSetterFactory.java +137 -0
  18. data/src/main/java/org/embulk/output/jdbc/setter/DoubleColumnSetter.java +51 -0
  19. data/src/main/java/org/embulk/output/jdbc/setter/LongColumnSetter.java +62 -0
  20. data/src/main/java/org/embulk/output/jdbc/setter/NullColumnSetter.java +43 -0
  21. data/src/main/java/org/embulk/output/jdbc/setter/SkipColumnSetter.java +35 -0
  22. data/src/main/java/org/embulk/output/jdbc/setter/SqlTimestampColumnSetter.java +48 -0
  23. data/src/main/java/org/embulk/output/jdbc/setter/StringColumnSetter.java +48 -0
  24. data/src/test/java/org/embulk/output/TestJdbcOutputPlugin.java +5 -0
  25. 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
+ }