embulk-output-jdbc 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
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
+ }