embulk-output-jdbc 0.8.2 → 0.8.3
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +2 -1
- data/classpath/embulk-output-jdbc-0.8.3.jar +0 -0
- data/src/main/java/org/embulk/output/jdbc/AbstractJdbcOutputConnector.java +24 -0
- data/src/main/java/org/embulk/output/jdbc/AbstractJdbcOutputPlugin.java +73 -43
- data/src/main/java/org/embulk/output/jdbc/JdbcOutputConnection.java +17 -0
- data/src/main/java/org/embulk/output/jdbc/MemoryRecord.java +63 -0
- data/src/main/java/org/embulk/output/jdbc/PageReaderRecord.java +96 -0
- data/src/main/java/org/embulk/output/jdbc/Record.java +23 -0
- data/src/main/java/org/embulk/output/jdbc/StandardBatchInsert.java +15 -11
- data/src/main/java/org/embulk/output/jdbc/TransactionIsolation.java +66 -0
- data/src/main/java/org/embulk/output/jdbc/setter/ColumnSetterVisitor.java +17 -16
- metadata +8 -3
- data/classpath/embulk-output-jdbc-0.8.2.jar +0 -0
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 1c01d9d1c8f2babb4d908929c0118a5a9c28d87f
|
4
|
+
data.tar.gz: c16e74184b0f5a59b8cac366bcfca99e5a38cb1c
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 5a3b33623d041ced79d8c4cb885ddbe8505da46395cb1953523874e58b4eb8a630eed4e9ca8a6c16eb4051bc44dd2c973dbb6cad3f6023daebddf8892eabaffa
|
7
|
+
data.tar.gz: 3df9712d68feca663e6bcbf053c8856ee2dc8779a80515da63457040a7bf0261d1a018e50eac461d10dd0fe4ba408c8e20bd58a4bfefbc6d076f7926f187d79f
|
data/README.md
CHANGED
@@ -19,8 +19,9 @@ Generic JDBC output plugin for Embulk loads records to a database using a JDBC d
|
|
19
19
|
- **table**: destination table name (string, required)
|
20
20
|
- **create_table_constraint**: table constraint added to `CREATE TABLE` statement, like `CREATE TABLE <table_name> (<column1> <type1>, <column2> <type2>, ..., <create_table_constraint>) <create_table_option>`.
|
21
21
|
- **create_table_option**: table option added to `CREATE TABLE` statement, like `CREATE TABLE <table_name> (<column1> <type1>, <column2> <type2>, ..., <create_table_constraint>) <create_table_option>`.
|
22
|
+
- **transaction_isolation**: transaction isolation level for each connection ("read_uncommitted", "read_committed", "repeatable_read" or "serializable"). if not specified, database default value will be used.
|
22
23
|
- **options**: extra JDBC properties (hash, default: {})
|
23
|
-
- **retry_limit**: max retry count for database operations (integer, default: 12)
|
24
|
+
- **retry_limit**: max retry count for database operations (integer, default: 12). When intermediate table to create already created by another process, this plugin will retry with another table name to avoid collision.
|
24
25
|
- **retry_wait**: initial retry wait time in milliseconds (integer, default: 1000 (1 second))
|
25
26
|
- **max_retry_wait**: upper limit of retry wait, which will be doubled at every retry (integer, default: 1800000 (30 minutes))
|
26
27
|
- **mode**: "insert", "insert_direct", "truncate_insert", or "replace". See below (string, required)
|
Binary file
|
@@ -0,0 +1,24 @@
|
|
1
|
+
package org.embulk.output.jdbc;
|
2
|
+
|
3
|
+
import java.sql.SQLException;
|
4
|
+
|
5
|
+
import com.google.common.base.Optional;
|
6
|
+
|
7
|
+
public abstract class AbstractJdbcOutputConnector implements JdbcOutputConnector
|
8
|
+
{
|
9
|
+
private final Optional<TransactionIsolation> transactionIsolation;
|
10
|
+
|
11
|
+
public AbstractJdbcOutputConnector(Optional<TransactionIsolation> transactionIsolation)
|
12
|
+
{
|
13
|
+
this.transactionIsolation = transactionIsolation;
|
14
|
+
}
|
15
|
+
|
16
|
+
public JdbcOutputConnection connect(boolean autoCommit) throws SQLException
|
17
|
+
{
|
18
|
+
JdbcOutputConnection connection = connect();
|
19
|
+
connection.initialize(autoCommit, transactionIsolation);
|
20
|
+
return connection;
|
21
|
+
}
|
22
|
+
|
23
|
+
protected abstract JdbcOutputConnection connect() throws SQLException;
|
24
|
+
}
|
@@ -128,6 +128,11 @@ public abstract class AbstractJdbcOutputPlugin
|
|
128
128
|
@ConfigDefault("null")
|
129
129
|
public Optional<String> getAfterLoad();
|
130
130
|
|
131
|
+
@Config("transaction_isolation")
|
132
|
+
@ConfigDefault("null")
|
133
|
+
public Optional<TransactionIsolation> getTransactionIsolation();
|
134
|
+
public void setTransactionIsolation(Optional<TransactionIsolation> transactionIsolation);
|
135
|
+
|
131
136
|
public void setActualTable(TableIdentifier actualTable);
|
132
137
|
public TableIdentifier getActualTable();
|
133
138
|
|
@@ -1070,25 +1075,27 @@ public abstract class AbstractJdbcOutputPlugin
|
|
1070
1075
|
implements TransactionalPageOutput
|
1071
1076
|
{
|
1072
1077
|
protected final List<Column> columns;
|
1078
|
+
protected final List<ColumnSetter> columnSetters;
|
1073
1079
|
protected final List<ColumnSetterVisitor> columnVisitors;
|
1074
|
-
private final
|
1080
|
+
private final PageReaderRecord pageReader;
|
1075
1081
|
private final BatchInsert batch;
|
1076
1082
|
private final int batchSize;
|
1077
1083
|
private final int forceBatchFlushSize;
|
1078
1084
|
private final PluginTask task;
|
1079
1085
|
|
1080
|
-
public PluginPageOutput(
|
1086
|
+
public PluginPageOutput(PageReader pageReader,
|
1081
1087
|
BatchInsert batch, List<ColumnSetter> columnSetters,
|
1082
1088
|
int batchSize, PluginTask task)
|
1083
1089
|
{
|
1084
|
-
this.pageReader = pageReader;
|
1090
|
+
this.pageReader = new PageReaderRecord(pageReader);
|
1085
1091
|
this.batch = batch;
|
1086
1092
|
this.columns = pageReader.getSchema().getColumns();
|
1093
|
+
this.columnSetters = columnSetters;
|
1087
1094
|
this.columnVisitors = ImmutableList.copyOf(Lists.transform(
|
1088
1095
|
columnSetters, new Function<ColumnSetter, ColumnSetterVisitor>() {
|
1089
1096
|
public ColumnSetterVisitor apply(ColumnSetter setter)
|
1090
1097
|
{
|
1091
|
-
return new ColumnSetterVisitor(pageReader, setter);
|
1098
|
+
return new ColumnSetterVisitor(PluginPageOutput.this.pageReader, setter);
|
1092
1099
|
}
|
1093
1100
|
}));
|
1094
1101
|
this.batchSize = batchSize;
|
@@ -1103,49 +1110,57 @@ public abstract class AbstractJdbcOutputPlugin
|
|
1103
1110
|
pageReader.setPage(page);
|
1104
1111
|
while (pageReader.nextRecord()) {
|
1105
1112
|
if (batch.getBatchWeight() > forceBatchFlushSize) {
|
1106
|
-
|
1107
|
-
@Override
|
1108
|
-
public void run() throws SQLException {
|
1109
|
-
try {
|
1110
|
-
batch.flush();
|
1111
|
-
} catch (IOException ex) {
|
1112
|
-
throw new RuntimeException(ex);
|
1113
|
-
}
|
1114
|
-
}
|
1115
|
-
});
|
1113
|
+
flush();
|
1116
1114
|
}
|
1117
1115
|
handleColumnsSetters();
|
1118
1116
|
batch.add();
|
1119
1117
|
}
|
1120
1118
|
if (batch.getBatchWeight() > batchSize) {
|
1121
|
-
|
1122
|
-
@Override
|
1123
|
-
public void run() throws SQLException {
|
1124
|
-
try {
|
1125
|
-
batch.flush();
|
1126
|
-
} catch (IOException ex) {
|
1127
|
-
throw new RuntimeException(ex);
|
1128
|
-
}
|
1129
|
-
}
|
1130
|
-
});
|
1119
|
+
flush();
|
1131
1120
|
}
|
1132
1121
|
} catch (IOException | SQLException | InterruptedException ex) {
|
1133
1122
|
throw new RuntimeException(ex);
|
1134
1123
|
}
|
1135
1124
|
}
|
1136
1125
|
|
1126
|
+
private void flush() throws SQLException, InterruptedException
|
1127
|
+
{
|
1128
|
+
withRetry(task, new IdempotentSqlRunnable() {
|
1129
|
+
private boolean first = true;
|
1130
|
+
|
1131
|
+
@Override
|
1132
|
+
public void run() throws IOException, SQLException {
|
1133
|
+
try {
|
1134
|
+
if (!first) {
|
1135
|
+
retryColumnsSetters();
|
1136
|
+
}
|
1137
|
+
|
1138
|
+
batch.flush();
|
1139
|
+
|
1140
|
+
} catch (IOException | SQLException ex) {
|
1141
|
+
if (!first && !isRetryableException(ex)) {
|
1142
|
+
logger.error("Retry failed : ", ex);
|
1143
|
+
}
|
1144
|
+
throw ex;
|
1145
|
+
} finally {
|
1146
|
+
first = false;
|
1147
|
+
}
|
1148
|
+
}
|
1149
|
+
});
|
1150
|
+
|
1151
|
+
pageReader.clearReadRecords();
|
1152
|
+
}
|
1153
|
+
|
1137
1154
|
@Override
|
1138
1155
|
public void finish()
|
1139
1156
|
{
|
1140
1157
|
try {
|
1158
|
+
flush();
|
1159
|
+
|
1141
1160
|
withRetry(task, new IdempotentSqlRunnable() {
|
1142
1161
|
@Override
|
1143
|
-
public void run() throws SQLException {
|
1144
|
-
|
1145
|
-
batch.finish();
|
1146
|
-
} catch (IOException ex) {
|
1147
|
-
throw new RuntimeException(ex);
|
1148
|
-
}
|
1162
|
+
public void run() throws IOException, SQLException {
|
1163
|
+
batch.finish();
|
1149
1164
|
}
|
1150
1165
|
});
|
1151
1166
|
} catch (InterruptedException | SQLException ex) {
|
@@ -1181,12 +1196,30 @@ public abstract class AbstractJdbcOutputPlugin
|
|
1181
1196
|
columns.get(i).visit(columnVisitors.get(i));
|
1182
1197
|
}
|
1183
1198
|
}
|
1199
|
+
|
1200
|
+
protected void retryColumnsSetters() throws IOException, SQLException
|
1201
|
+
{
|
1202
|
+
int size = columnVisitors.size();
|
1203
|
+
for (Record record : pageReader.getReadRecords()) {
|
1204
|
+
for (int i = 0; i < size; i++) {
|
1205
|
+
ColumnSetterVisitor columnVisitor = new ColumnSetterVisitor(record, columnSetters.get(i));
|
1206
|
+
columns.get(i).visit(columnVisitor);
|
1207
|
+
}
|
1208
|
+
batch.add();
|
1209
|
+
}
|
1210
|
+
}
|
1184
1211
|
}
|
1185
1212
|
|
1186
|
-
protected boolean isRetryableException(
|
1213
|
+
protected boolean isRetryableException(Exception exception)
|
1187
1214
|
{
|
1188
|
-
|
1215
|
+
if (exception instanceof SQLException) {
|
1216
|
+
SQLException ex = (SQLException)exception;
|
1217
|
+
return isRetryableException(ex.getSQLState(), ex.getErrorCode());
|
1218
|
+
} else {
|
1219
|
+
return false;
|
1220
|
+
}
|
1189
1221
|
}
|
1222
|
+
|
1190
1223
|
protected boolean isRetryableException(String sqlState, int errorCode)
|
1191
1224
|
{
|
1192
1225
|
return false;
|
@@ -1195,7 +1228,7 @@ public abstract class AbstractJdbcOutputPlugin
|
|
1195
1228
|
|
1196
1229
|
public static interface IdempotentSqlRunnable
|
1197
1230
|
{
|
1198
|
-
public void run() throws SQLException;
|
1231
|
+
public void run() throws IOException, SQLException;
|
1199
1232
|
}
|
1200
1233
|
|
1201
1234
|
protected void withRetry(PluginTask task, IdempotentSqlRunnable op)
|
@@ -1269,17 +1302,13 @@ public abstract class AbstractJdbcOutputPlugin
|
|
1269
1302
|
}
|
1270
1303
|
}
|
1271
1304
|
|
1272
|
-
public boolean isRetryableException(Exception exception)
|
1273
|
-
|
1274
|
-
|
1275
|
-
|
1276
|
-
return AbstractJdbcOutputPlugin.this.isRetryableException(ex);
|
1277
|
-
} else {
|
1278
|
-
return false;
|
1279
|
-
}
|
1305
|
+
public boolean isRetryableException(Exception exception)
|
1306
|
+
{
|
1307
|
+
return AbstractJdbcOutputPlugin.this.isRetryableException(exception);
|
1280
1308
|
}
|
1281
1309
|
|
1282
|
-
private String buildExceptionMessage(Throwable ex)
|
1310
|
+
private String buildExceptionMessage(Throwable ex)
|
1311
|
+
{
|
1283
1312
|
StringBuilder sb = new StringBuilder();
|
1284
1313
|
sb.append(ex.getMessage());
|
1285
1314
|
if (ex.getCause() != null) {
|
@@ -1288,7 +1317,8 @@ public abstract class AbstractJdbcOutputPlugin
|
|
1288
1317
|
return sb.toString();
|
1289
1318
|
}
|
1290
1319
|
|
1291
|
-
private void buildExceptionMessageCont(StringBuilder sb, Throwable ex, String lastMessage)
|
1320
|
+
private void buildExceptionMessageCont(StringBuilder sb, Throwable ex, String lastMessage)
|
1321
|
+
{
|
1292
1322
|
if (!lastMessage.equals(ex.getMessage())) {
|
1293
1323
|
// suppress same messages
|
1294
1324
|
sb.append(" < ");
|
@@ -38,6 +38,23 @@ public class JdbcOutputConnection
|
|
38
38
|
}
|
39
39
|
}
|
40
40
|
|
41
|
+
public void initialize(boolean autoCommit, Optional<TransactionIsolation> transactionIsolation)
|
42
|
+
throws SQLException
|
43
|
+
{
|
44
|
+
connection.setAutoCommit(autoCommit);
|
45
|
+
|
46
|
+
if (transactionIsolation.isPresent()) {
|
47
|
+
connection.setTransactionIsolation(transactionIsolation.get().toInt());
|
48
|
+
}
|
49
|
+
|
50
|
+
try {
|
51
|
+
TransactionIsolation currentTransactionIsolation = TransactionIsolation.fromInt(connection.getTransactionIsolation());
|
52
|
+
logger.info("TransactionIsolation={}", currentTransactionIsolation.toString());
|
53
|
+
} catch (IllegalArgumentException e) {
|
54
|
+
logger.info("TransactionIsolation=unknown");
|
55
|
+
}
|
56
|
+
}
|
57
|
+
|
41
58
|
@Override
|
42
59
|
public void close() throws SQLException
|
43
60
|
{
|
@@ -0,0 +1,63 @@
|
|
1
|
+
package org.embulk.output.jdbc;
|
2
|
+
|
3
|
+
import org.embulk.spi.Column;
|
4
|
+
import org.embulk.spi.time.Timestamp;
|
5
|
+
import org.msgpack.value.Value;
|
6
|
+
|
7
|
+
|
8
|
+
public class MemoryRecord implements Record
|
9
|
+
{
|
10
|
+
private final Object[] values;
|
11
|
+
|
12
|
+
public MemoryRecord(int columnCount)
|
13
|
+
{
|
14
|
+
values = new Object[columnCount];
|
15
|
+
}
|
16
|
+
|
17
|
+
|
18
|
+
public boolean isNull(Column column)
|
19
|
+
{
|
20
|
+
return getValue(column) == null;
|
21
|
+
}
|
22
|
+
|
23
|
+
public boolean getBoolean(Column column)
|
24
|
+
{
|
25
|
+
return (Boolean)getValue(column);
|
26
|
+
}
|
27
|
+
|
28
|
+
public long getLong(Column column)
|
29
|
+
{
|
30
|
+
return (Long)getValue(column);
|
31
|
+
}
|
32
|
+
|
33
|
+
public double getDouble(Column column)
|
34
|
+
{
|
35
|
+
return (Double)getValue(column);
|
36
|
+
}
|
37
|
+
|
38
|
+
public String getString(Column column)
|
39
|
+
{
|
40
|
+
return (String)getValue(column);
|
41
|
+
}
|
42
|
+
|
43
|
+
public Timestamp getTimestamp(Column column)
|
44
|
+
{
|
45
|
+
return (Timestamp)getValue(column);
|
46
|
+
}
|
47
|
+
|
48
|
+
public Value getJson(Column column)
|
49
|
+
{
|
50
|
+
return (Value)getValue(column);
|
51
|
+
}
|
52
|
+
|
53
|
+
private Object getValue(Column column)
|
54
|
+
{
|
55
|
+
return values[column.getIndex()];
|
56
|
+
}
|
57
|
+
|
58
|
+
public void setValue(Column column, Object value)
|
59
|
+
{
|
60
|
+
values[column.getIndex()] = value;
|
61
|
+
}
|
62
|
+
}
|
63
|
+
|
@@ -0,0 +1,96 @@
|
|
1
|
+
package org.embulk.output.jdbc;
|
2
|
+
|
3
|
+
import java.util.ArrayList;
|
4
|
+
import java.util.List;
|
5
|
+
|
6
|
+
import org.embulk.spi.Column;
|
7
|
+
import org.embulk.spi.Page;
|
8
|
+
import org.embulk.spi.PageReader;
|
9
|
+
import org.embulk.spi.time.Timestamp;
|
10
|
+
import org.msgpack.value.Value;
|
11
|
+
|
12
|
+
|
13
|
+
/**
|
14
|
+
* Record read by PageReader.
|
15
|
+
* The class will save read records for retry.
|
16
|
+
*/
|
17
|
+
public class PageReaderRecord implements Record
|
18
|
+
{
|
19
|
+
private final PageReader pageReader;
|
20
|
+
private final List<MemoryRecord> readRecords;
|
21
|
+
private MemoryRecord lastRecord;
|
22
|
+
|
23
|
+
public PageReaderRecord(PageReader pageReader)
|
24
|
+
{
|
25
|
+
this.pageReader = pageReader;
|
26
|
+
readRecords = new ArrayList<MemoryRecord>();
|
27
|
+
}
|
28
|
+
|
29
|
+
public void setPage(Page page)
|
30
|
+
{
|
31
|
+
pageReader.setPage(page);
|
32
|
+
}
|
33
|
+
|
34
|
+
public boolean nextRecord()
|
35
|
+
{
|
36
|
+
lastRecord = null; // lastRecord will be created in next `save` method execution.
|
37
|
+
return pageReader.nextRecord();
|
38
|
+
}
|
39
|
+
|
40
|
+
public boolean isNull(Column column)
|
41
|
+
{
|
42
|
+
return pageReader.isNull(column);
|
43
|
+
}
|
44
|
+
|
45
|
+
public boolean getBoolean(Column column)
|
46
|
+
{
|
47
|
+
return save(column, pageReader.getBoolean(column));
|
48
|
+
}
|
49
|
+
|
50
|
+
public long getLong(Column column)
|
51
|
+
{
|
52
|
+
return save(column, pageReader.getLong(column));
|
53
|
+
}
|
54
|
+
|
55
|
+
public double getDouble(Column column)
|
56
|
+
{
|
57
|
+
return save(column, pageReader.getDouble(column));
|
58
|
+
}
|
59
|
+
|
60
|
+
public String getString(Column column)
|
61
|
+
{
|
62
|
+
return save(column, pageReader.getString(column));
|
63
|
+
}
|
64
|
+
|
65
|
+
public Timestamp getTimestamp(Column column)
|
66
|
+
{
|
67
|
+
return save(column, pageReader.getTimestamp(column));
|
68
|
+
}
|
69
|
+
|
70
|
+
public Value getJson(Column column)
|
71
|
+
{
|
72
|
+
return save(column, pageReader.getJson(column));
|
73
|
+
}
|
74
|
+
|
75
|
+
public List<? extends Record> getReadRecords()
|
76
|
+
{
|
77
|
+
return readRecords;
|
78
|
+
}
|
79
|
+
|
80
|
+
public void clearReadRecords()
|
81
|
+
{
|
82
|
+
readRecords.clear();
|
83
|
+
lastRecord = null;
|
84
|
+
}
|
85
|
+
|
86
|
+
private <T> T save(Column column, T value)
|
87
|
+
{
|
88
|
+
if (lastRecord == null) {
|
89
|
+
lastRecord = new MemoryRecord(pageReader.getSchema().getColumnCount());
|
90
|
+
readRecords.add(lastRecord);
|
91
|
+
}
|
92
|
+
lastRecord.setValue(column, value);
|
93
|
+
return value;
|
94
|
+
}
|
95
|
+
}
|
96
|
+
|
@@ -0,0 +1,23 @@
|
|
1
|
+
package org.embulk.output.jdbc;
|
2
|
+
|
3
|
+
import org.embulk.spi.Column;
|
4
|
+
import org.embulk.spi.time.Timestamp;
|
5
|
+
import org.msgpack.value.Value;
|
6
|
+
|
7
|
+
public interface Record
|
8
|
+
{
|
9
|
+
boolean isNull(Column column);
|
10
|
+
|
11
|
+
boolean getBoolean(Column column);
|
12
|
+
|
13
|
+
long getLong(Column column);
|
14
|
+
|
15
|
+
double getDouble(Column column);
|
16
|
+
|
17
|
+
String getString(Column column);
|
18
|
+
|
19
|
+
Timestamp getTimestamp(Column column);
|
20
|
+
|
21
|
+
Value getJson(Column column);
|
22
|
+
}
|
23
|
+
|
@@ -70,23 +70,27 @@ public class StandardBatchInsert
|
|
70
70
|
|
71
71
|
public void flush() throws IOException, SQLException
|
72
72
|
{
|
73
|
+
if (batchWeight == 0) return;
|
74
|
+
|
73
75
|
logger.info(String.format("Loading %,d rows", batchRows));
|
74
76
|
long startTime = System.currentTimeMillis();
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
|
77
|
+
try {
|
78
|
+
batch.executeBatch(); // here can't use returned value because MySQL Connector/J returns SUCCESS_NO_INFO as a batch result
|
79
|
+
double seconds = (System.currentTimeMillis() - startTime) / 1000.0;
|
80
|
+
|
81
|
+
totalRows += batchRows;
|
82
|
+
logger.info(String.format("> %.2f seconds (loaded %,d rows in total)", seconds, totalRows));
|
83
|
+
|
84
|
+
} finally {
|
85
|
+
// clear for retry
|
86
|
+
batch.clearBatch();
|
87
|
+
batchRows = 0;
|
88
|
+
batchWeight = 0;
|
89
|
+
}
|
83
90
|
}
|
84
91
|
|
85
92
|
public void finish() throws IOException, SQLException
|
86
93
|
{
|
87
|
-
if (getBatchWeight() != 0) {
|
88
|
-
flush();
|
89
|
-
}
|
90
94
|
}
|
91
95
|
|
92
96
|
public void setNull(int sqlType) throws IOException, SQLException
|
@@ -0,0 +1,66 @@
|
|
1
|
+
package org.embulk.output.jdbc;
|
2
|
+
|
3
|
+
import java.sql.Connection;
|
4
|
+
import java.util.Locale;
|
5
|
+
|
6
|
+
import org.embulk.config.ConfigException;
|
7
|
+
|
8
|
+
import com.fasterxml.jackson.annotation.JsonCreator;
|
9
|
+
import com.fasterxml.jackson.annotation.JsonValue;
|
10
|
+
|
11
|
+
public enum TransactionIsolation {
|
12
|
+
READ_UNCOMMITTED {
|
13
|
+
@Override
|
14
|
+
public int toInt() {
|
15
|
+
return Connection.TRANSACTION_READ_UNCOMMITTED;
|
16
|
+
}
|
17
|
+
},
|
18
|
+
READ_COMMITTED {
|
19
|
+
@Override
|
20
|
+
public int toInt() {
|
21
|
+
return Connection.TRANSACTION_READ_COMMITTED;
|
22
|
+
}
|
23
|
+
},
|
24
|
+
REPEATABLE_READ {
|
25
|
+
@Override
|
26
|
+
public int toInt() {
|
27
|
+
return Connection.TRANSACTION_REPEATABLE_READ;
|
28
|
+
}
|
29
|
+
},
|
30
|
+
SERIALIZABLE {
|
31
|
+
@Override
|
32
|
+
public int toInt() {
|
33
|
+
return Connection.TRANSACTION_SERIALIZABLE;
|
34
|
+
}
|
35
|
+
};
|
36
|
+
|
37
|
+
@JsonValue
|
38
|
+
@Override
|
39
|
+
public String toString()
|
40
|
+
{
|
41
|
+
return name().toLowerCase(Locale.ENGLISH);
|
42
|
+
}
|
43
|
+
|
44
|
+
public abstract int toInt();
|
45
|
+
|
46
|
+
@JsonCreator
|
47
|
+
public static TransactionIsolation fromString(String value)
|
48
|
+
{
|
49
|
+
for (TransactionIsolation ti : values()) {
|
50
|
+
if (ti.toString().equals(value)) {
|
51
|
+
return ti;
|
52
|
+
}
|
53
|
+
}
|
54
|
+
throw new ConfigException(String.format("Unknown transaction_isolation '%s'.", value));
|
55
|
+
}
|
56
|
+
|
57
|
+
public static TransactionIsolation fromInt(int value)
|
58
|
+
{
|
59
|
+
for (TransactionIsolation ti : values()) {
|
60
|
+
if (ti.toInt() == value) {
|
61
|
+
return ti;
|
62
|
+
}
|
63
|
+
}
|
64
|
+
throw new IllegalArgumentException(String.format("Unknown transaction_isolation '%d'.", value));
|
65
|
+
}
|
66
|
+
}
|
@@ -2,19 +2,20 @@ package org.embulk.output.jdbc.setter;
|
|
2
2
|
|
3
3
|
import java.io.IOException;
|
4
4
|
import java.sql.SQLException;
|
5
|
+
|
6
|
+
import org.embulk.output.jdbc.Record;
|
5
7
|
import org.embulk.spi.Column;
|
6
8
|
import org.embulk.spi.ColumnVisitor;
|
7
|
-
import org.embulk.spi.PageReader;
|
8
9
|
|
9
10
|
public class ColumnSetterVisitor
|
10
11
|
implements ColumnVisitor
|
11
12
|
{
|
12
|
-
private final
|
13
|
+
private final Record record;
|
13
14
|
private final ColumnSetter setter;
|
14
15
|
|
15
|
-
public ColumnSetterVisitor(
|
16
|
+
public ColumnSetterVisitor(Record record, ColumnSetter setter)
|
16
17
|
{
|
17
|
-
this.
|
18
|
+
this.record = record;
|
18
19
|
this.setter = setter;
|
19
20
|
}
|
20
21
|
|
@@ -22,10 +23,10 @@ public class ColumnSetterVisitor
|
|
22
23
|
public void booleanColumn(Column column)
|
23
24
|
{
|
24
25
|
try {
|
25
|
-
if (
|
26
|
+
if (record.isNull(column)) {
|
26
27
|
setter.nullValue();
|
27
28
|
} else {
|
28
|
-
setter.booleanValue(
|
29
|
+
setter.booleanValue(record.getBoolean(column));
|
29
30
|
}
|
30
31
|
} catch (IOException | SQLException ex) {
|
31
32
|
// TODO exception class
|
@@ -37,10 +38,10 @@ public class ColumnSetterVisitor
|
|
37
38
|
public void longColumn(Column column)
|
38
39
|
{
|
39
40
|
try {
|
40
|
-
if (
|
41
|
+
if (record.isNull(column)) {
|
41
42
|
setter.nullValue();
|
42
43
|
} else {
|
43
|
-
setter.longValue(
|
44
|
+
setter.longValue(record.getLong(column));
|
44
45
|
}
|
45
46
|
} catch (IOException | SQLException ex) {
|
46
47
|
// TODO exception class
|
@@ -52,10 +53,10 @@ public class ColumnSetterVisitor
|
|
52
53
|
public void doubleColumn(Column column)
|
53
54
|
{
|
54
55
|
try {
|
55
|
-
if (
|
56
|
+
if (record.isNull(column)) {
|
56
57
|
setter.nullValue();
|
57
58
|
} else {
|
58
|
-
setter.doubleValue(
|
59
|
+
setter.doubleValue(record.getDouble(column));
|
59
60
|
}
|
60
61
|
} catch (IOException | SQLException ex) {
|
61
62
|
// TODO exception class
|
@@ -67,10 +68,10 @@ public class ColumnSetterVisitor
|
|
67
68
|
public void stringColumn(Column column)
|
68
69
|
{
|
69
70
|
try {
|
70
|
-
if (
|
71
|
+
if (record.isNull(column)) {
|
71
72
|
setter.nullValue();
|
72
73
|
} else {
|
73
|
-
setter.stringValue(
|
74
|
+
setter.stringValue(record.getString(column));
|
74
75
|
}
|
75
76
|
} catch (IOException | SQLException ex) {
|
76
77
|
// TODO exception class
|
@@ -82,10 +83,10 @@ public class ColumnSetterVisitor
|
|
82
83
|
public void jsonColumn(Column column)
|
83
84
|
{
|
84
85
|
try {
|
85
|
-
if (
|
86
|
+
if (record.isNull(column)) {
|
86
87
|
setter.nullValue();
|
87
88
|
} else {
|
88
|
-
setter.jsonValue(
|
89
|
+
setter.jsonValue(record.getJson(column));
|
89
90
|
}
|
90
91
|
} catch (IOException | SQLException ex) {
|
91
92
|
// TODO exception class
|
@@ -97,10 +98,10 @@ public class ColumnSetterVisitor
|
|
97
98
|
public void timestampColumn(Column column)
|
98
99
|
{
|
99
100
|
try {
|
100
|
-
if (
|
101
|
+
if (record.isNull(column)) {
|
101
102
|
setter.nullValue();
|
102
103
|
} else {
|
103
|
-
setter.timestampValue(
|
104
|
+
setter.timestampValue(record.getTimestamp(column));
|
104
105
|
}
|
105
106
|
} catch (IOException | SQLException ex) {
|
106
107
|
// TODO exception class
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: embulk-output-jdbc
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.8.
|
4
|
+
version: 0.8.3
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Sadayuki Furuhashi
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2019-
|
11
|
+
date: 2019-05-07 00:00:00.000000000 Z
|
12
12
|
dependencies: []
|
13
13
|
description: Inserts or updates records to a table.
|
14
14
|
email:
|
@@ -19,9 +19,10 @@ extra_rdoc_files: []
|
|
19
19
|
files:
|
20
20
|
- README.md
|
21
21
|
- build.gradle
|
22
|
-
- classpath/embulk-output-jdbc-0.8.
|
22
|
+
- classpath/embulk-output-jdbc-0.8.3.jar
|
23
23
|
- lib/embulk/output/jdbc.rb
|
24
24
|
- src/main/java/org/embulk/output/JdbcOutputPlugin.java
|
25
|
+
- src/main/java/org/embulk/output/jdbc/AbstractJdbcOutputConnector.java
|
25
26
|
- src/main/java/org/embulk/output/jdbc/AbstractJdbcOutputPlugin.java
|
26
27
|
- src/main/java/org/embulk/output/jdbc/BatchInsert.java
|
27
28
|
- src/main/java/org/embulk/output/jdbc/JdbcColumn.java
|
@@ -30,13 +31,17 @@ files:
|
|
30
31
|
- src/main/java/org/embulk/output/jdbc/JdbcOutputConnector.java
|
31
32
|
- src/main/java/org/embulk/output/jdbc/JdbcSchema.java
|
32
33
|
- src/main/java/org/embulk/output/jdbc/JdbcUtils.java
|
34
|
+
- src/main/java/org/embulk/output/jdbc/MemoryRecord.java
|
33
35
|
- src/main/java/org/embulk/output/jdbc/MergeConfig.java
|
36
|
+
- src/main/java/org/embulk/output/jdbc/PageReaderRecord.java
|
37
|
+
- src/main/java/org/embulk/output/jdbc/Record.java
|
34
38
|
- src/main/java/org/embulk/output/jdbc/Ssl.java
|
35
39
|
- src/main/java/org/embulk/output/jdbc/StandardBatchInsert.java
|
36
40
|
- src/main/java/org/embulk/output/jdbc/TableIdentifier.java
|
37
41
|
- src/main/java/org/embulk/output/jdbc/TimestampFormat.java
|
38
42
|
- src/main/java/org/embulk/output/jdbc/ToString.java
|
39
43
|
- src/main/java/org/embulk/output/jdbc/ToStringMap.java
|
44
|
+
- src/main/java/org/embulk/output/jdbc/TransactionIsolation.java
|
40
45
|
- src/main/java/org/embulk/output/jdbc/setter/BigDecimalColumnSetter.java
|
41
46
|
- src/main/java/org/embulk/output/jdbc/setter/BooleanColumnSetter.java
|
42
47
|
- src/main/java/org/embulk/output/jdbc/setter/ByteColumnSetter.java
|
Binary file
|