embulk-output-jdbc 0.6.1 → 0.6.2

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 55c72f27b523c6e9e8a9f4bdcc6e34238fc2ab93
4
- data.tar.gz: 1d6350d92b143a0423c2b5de300853b2f92ca9e1
3
+ metadata.gz: 050247b8f08b7c7d9c34d2e0c36a4cf9dcfadc18
4
+ data.tar.gz: 19caf0641d799f247059ac7d5e3247e9895f4a02
5
5
  SHA512:
6
- metadata.gz: d625cc29b72e815c187745ee8553761bf3e27408c98c3ce69cb7539810ad5b32dc390e3e6557cd65954c0102cbb02569b1031f85d4c6ebd50d85d27abb32ed86
7
- data.tar.gz: f8adc582282ef5f15e71401da3650162cf965dd7b7ae38145b7139dfa8dcbfd49e241eb45acec9a43a122ce45371127934bed643f4edc891bf8af4c5bdcf9da0
6
+ metadata.gz: 2ea08bdeefad0859f036b475c0e13ea6c803c5d0c14a8ee8368ce912a6d0c743ba16fd460eb9ff6642f3ebb54cbaab798b1c52f757d4da77efd6034a4c5de9e0
7
+ data.tar.gz: 04c12e62081dc8938a57d7a1e12574235a1fb67eb6042a19408baaa2a6883e7400542a6909761b5d64b219bb214bed056de342409dd3b1bebb5c310ff9efeb9b
@@ -1,6 +1,5 @@
1
1
  package org.embulk.output;
2
2
 
3
- import java.util.List;
4
3
  import java.util.Properties;
5
4
  import java.sql.Driver;
6
5
  import java.io.IOException;
@@ -13,11 +12,7 @@ import com.google.common.collect.ImmutableSet;
13
12
 
14
13
  import org.embulk.config.Config;
15
14
  import org.embulk.config.ConfigDefault;
16
- import org.embulk.output.jdbc.AbstractJdbcOutputPlugin;
17
- import org.embulk.output.jdbc.BatchInsert;
18
- import org.embulk.output.jdbc.StandardBatchInsert;
19
- import org.embulk.output.jdbc.JdbcOutputConnector;
20
- import org.embulk.output.jdbc.JdbcOutputConnection;
15
+ import org.embulk.output.jdbc.*;
21
16
 
22
17
  public class JdbcOutputPlugin
23
18
  extends AbstractJdbcOutputPlugin
@@ -132,8 +127,8 @@ public class JdbcOutputPlugin
132
127
  }
133
128
 
134
129
  @Override
135
- protected BatchInsert newBatchInsert(PluginTask task, Optional<List<String>> mergeKeys) throws IOException, SQLException
130
+ protected BatchInsert newBatchInsert(PluginTask task, Optional<MergeConfig> mergeConfig) throws IOException, SQLException
136
131
  {
137
- return new StandardBatchInsert(getConnector(task, true), mergeKeys);
132
+ return new StandardBatchInsert(getConnector(task, true), mergeConfig);
138
133
  }
139
134
  }
@@ -14,6 +14,7 @@ import java.sql.ResultSet;
14
14
  import java.sql.DatabaseMetaData;
15
15
  import java.sql.SQLException;
16
16
 
17
+ import org.embulk.spi.util.RetryExecutor;
17
18
  import org.slf4j.Logger;
18
19
  import org.joda.time.DateTimeZone;
19
20
 
@@ -91,6 +92,22 @@ public abstract class AbstractJdbcOutputPlugin
91
92
  @ConfigDefault("\"UTC\"")
92
93
  public DateTimeZone getDefaultTimeZone();
93
94
 
95
+ @Config("retry_limit")
96
+ @ConfigDefault("12")
97
+ public int getRetryLimit();
98
+
99
+ @Config("retry_wait")
100
+ @ConfigDefault("1000")
101
+ public int getRetryWait();
102
+
103
+ @Config("max_retry_wait")
104
+ @ConfigDefault("1800000") // 30 * 60 * 1000
105
+ public int getMaxRetryWait();
106
+
107
+ @Config("merge_rule")
108
+ @ConfigDefault("null")
109
+ public Optional<List<String>> getMergeRule();
110
+
94
111
  public void setActualTable(String actualTable);
95
112
  public String getActualTable();
96
113
 
@@ -213,7 +230,7 @@ public abstract class AbstractJdbcOutputPlugin
213
230
 
214
231
  protected abstract JdbcOutputConnector getConnector(PluginTask task, boolean retryableMetadataOperation);
215
232
 
216
- protected abstract BatchInsert newBatchInsert(PluginTask task, Optional<List<String>> mergeKeys) throws IOException, SQLException;
233
+ protected abstract BatchInsert newBatchInsert(PluginTask task, Optional<MergeConfig> mergeConfig) throws IOException, SQLException;
217
234
 
218
235
  protected JdbcOutputConnection newConnection(PluginTask task, boolean retryableMetadataOperation,
219
236
  boolean autoCommit) throws SQLException
@@ -357,7 +374,7 @@ public abstract class AbstractJdbcOutputPlugin
357
374
  final Schema schema, final int taskCount)
358
375
  {
359
376
  try {
360
- withRetry(new IdempotentSqlRunnable() { // no intermediate data if isDirectModify == true
377
+ withRetry(task, new IdempotentSqlRunnable() { // no intermediate data if isDirectModify == true
361
378
  public void run() throws SQLException
362
379
  {
363
380
  JdbcOutputConnection con = newConnection(task, true, false);
@@ -379,7 +396,7 @@ public abstract class AbstractJdbcOutputPlugin
379
396
  {
380
397
  if (!task.getMode().isDirectModify()) { // no intermediate data if isDirectModify == true
381
398
  try {
382
- withRetry(new IdempotentSqlRunnable() {
399
+ withRetry(task, new IdempotentSqlRunnable() {
383
400
  public void run() throws SQLException
384
401
  {
385
402
  JdbcOutputConnection con = newConnection(task, false, false);
@@ -405,7 +422,7 @@ public abstract class AbstractJdbcOutputPlugin
405
422
 
406
423
  if (!task.getMode().isDirectModify()) { // no intermediate data if isDirectModify == true
407
424
  try {
408
- withRetry(new IdempotentSqlRunnable() {
425
+ withRetry(task, new IdempotentSqlRunnable() {
409
426
  public void run() throws SQLException
410
427
  {
411
428
  JdbcOutputConnection con = newConnection(task, true, true);
@@ -682,7 +699,7 @@ public abstract class AbstractJdbcOutputPlugin
682
699
  if (task.getNewTableSchema().isPresent()) {
683
700
  con.createTableIfNotExists(task.getActualTable(), task.getNewTableSchema().get());
684
701
  }
685
- con.collectMerge(task.getIntermediateTables().get(), schema, task.getActualTable(), task.getMergeKeys().get());
702
+ con.collectMerge(task.getIntermediateTables().get(), schema, task.getActualTable(), new MergeConfig(task.getMergeKeys().get(), task.getMergeRule()));
686
703
  break;
687
704
 
688
705
  case REPLACE:
@@ -829,10 +846,11 @@ public abstract class AbstractJdbcOutputPlugin
829
846
  // instantiate BatchInsert without table name
830
847
  BatchInsert batch = null;
831
848
  try {
832
- batch = newBatchInsert(task,
833
- task.getMode() == Mode.MERGE_DIRECT ?
834
- task.getMergeKeys() :
835
- Optional.<List<String>>absent());
849
+ Optional<MergeConfig> config = Optional.absent();
850
+ if (task.getMode() == Mode.MERGE_DIRECT) {
851
+ config = Optional.of(new MergeConfig(task.getMergeKeys().get(), task.getMergeRule()));
852
+ }
853
+ batch = newBatchInsert(task, config);
836
854
  } catch (IOException | SQLException ex) {
837
855
  throw new RuntimeException(ex);
838
856
  }
@@ -861,7 +879,7 @@ public abstract class AbstractJdbcOutputPlugin
861
879
  }
862
880
  batch.prepare(destTable, insertIntoSchema);
863
881
 
864
- PluginPageOutput output = new PluginPageOutput(reader, batch, columnSetters, task.getBatchSize());
882
+ PluginPageOutput output = new PluginPageOutput(reader, batch, columnSetters, task.getBatchSize(), task);
865
883
  batch = null;
866
884
  return output;
867
885
 
@@ -879,7 +897,7 @@ public abstract class AbstractJdbcOutputPlugin
879
897
  }
880
898
  }
881
899
 
882
- public static class PluginPageOutput
900
+ public class PluginPageOutput
883
901
  implements TransactionalPageOutput
884
902
  {
885
903
  protected final List<Column> columns;
@@ -888,10 +906,11 @@ public abstract class AbstractJdbcOutputPlugin
888
906
  private final BatchInsert batch;
889
907
  private final int batchSize;
890
908
  private final int forceBatchFlushSize;
909
+ private final PluginTask task;
891
910
 
892
911
  public PluginPageOutput(final PageReader pageReader,
893
912
  BatchInsert batch, List<ColumnSetter> columnSetters,
894
- int batchSize)
913
+ int batchSize, PluginTask task)
895
914
  {
896
915
  this.pageReader = pageReader;
897
916
  this.batch = batch;
@@ -904,6 +923,7 @@ public abstract class AbstractJdbcOutputPlugin
904
923
  }
905
924
  }));
906
925
  this.batchSize = batchSize;
926
+ this.task = task;
907
927
  this.forceBatchFlushSize = batchSize * 2;
908
928
  }
909
929
 
@@ -914,15 +934,33 @@ public abstract class AbstractJdbcOutputPlugin
914
934
  pageReader.setPage(page);
915
935
  while (pageReader.nextRecord()) {
916
936
  if (batch.getBatchWeight() > forceBatchFlushSize) {
917
- batch.flush();
937
+ withRetry(task, new IdempotentSqlRunnable() {
938
+ @Override
939
+ public void run() throws SQLException {
940
+ try {
941
+ batch.flush();
942
+ } catch (IOException ex) {
943
+ throw new RuntimeException(ex);
944
+ }
945
+ }
946
+ });
918
947
  }
919
948
  handleColumnsSetters();
920
949
  batch.add();
921
950
  }
922
951
  if (batch.getBatchWeight() > batchSize) {
923
- batch.flush();
952
+ withRetry(task, new IdempotentSqlRunnable() {
953
+ @Override
954
+ public void run() throws SQLException {
955
+ try {
956
+ batch.flush();
957
+ } catch (IOException ex) {
958
+ throw new RuntimeException(ex);
959
+ }
960
+ }
961
+ });
924
962
  }
925
- } catch (IOException | SQLException ex) {
963
+ } catch (IOException | SQLException | InterruptedException ex) {
926
964
  throw new RuntimeException(ex);
927
965
  }
928
966
  }
@@ -931,8 +969,17 @@ public abstract class AbstractJdbcOutputPlugin
931
969
  public void finish()
932
970
  {
933
971
  try {
934
- batch.finish();
935
- } catch (IOException | SQLException ex) {
972
+ withRetry(task, new IdempotentSqlRunnable() {
973
+ @Override
974
+ public void run() throws SQLException {
975
+ try {
976
+ batch.finish();
977
+ } catch (IOException ex) {
978
+ throw new RuntimeException(ex);
979
+ }
980
+ }
981
+ });
982
+ } catch (InterruptedException | SQLException ex) {
936
983
  throw new RuntimeException(ex);
937
984
  }
938
985
  }
@@ -967,73 +1014,33 @@ public abstract class AbstractJdbcOutputPlugin
967
1014
  }
968
1015
  }
969
1016
 
1017
+ protected boolean isRetryableException(SQLException exception)
1018
+ {
1019
+ return isRetryableException(exception.getSQLState(), exception.getErrorCode());
1020
+ }
1021
+ protected boolean isRetryableException(String sqlState, int errorCode)
1022
+ {
1023
+ return false;
1024
+ }
1025
+
1026
+
970
1027
  public static interface IdempotentSqlRunnable
971
1028
  {
972
1029
  public void run() throws SQLException;
973
1030
  }
974
1031
 
975
- protected void withRetry(IdempotentSqlRunnable op)
1032
+ protected void withRetry(PluginTask task, IdempotentSqlRunnable op)
976
1033
  throws SQLException, InterruptedException
977
1034
  {
978
- withRetry(op, "Operation failed");
1035
+ withRetry(task, op, "Operation failed");
979
1036
  }
980
1037
 
981
- protected void withRetry(final IdempotentSqlRunnable op, final String errorMessage)
1038
+ protected void withRetry(PluginTask task, final IdempotentSqlRunnable op, final String errorMessage)
982
1039
  throws SQLException, InterruptedException
983
1040
  {
984
1041
  try {
985
- retryExecutor()
986
- .withRetryLimit(12)
987
- .withInitialRetryWait(1000)
988
- .withMaxRetryWait(30 * 60 * 1000)
989
- .runInterruptible(new Retryable<Void>() {
990
- public Void call() throws Exception
991
- {
992
- op.run();
993
- return null;
994
- }
995
-
996
- public void onRetry(Exception exception, int retryCount, int retryLimit, int retryWait)
997
- {
998
- if (exception instanceof SQLException) {
999
- SQLException ex = (SQLException) exception;
1000
- String sqlState = ex.getSQLState();
1001
- int errorCode = ex.getErrorCode();
1002
- logger.warn("{} ({}:{}), retrying {}/{} after {} seconds. Message: {}",
1003
- errorMessage, errorCode, sqlState, retryCount, retryLimit, retryWait/1000,
1004
- buildExceptionMessage(exception));
1005
- } else {
1006
- logger.warn("{}, retrying {}/{} after {} seconds. Message: {}",
1007
- errorMessage, retryCount, retryLimit, retryWait/1000,
1008
- buildExceptionMessage(exception));
1009
- }
1010
- if (retryCount % 3 == 0) {
1011
- logger.info("Error details:", exception);
1012
- }
1013
- }
1014
-
1015
- public void onGiveup(Exception firstException, Exception lastException)
1016
- {
1017
- if (firstException instanceof SQLException) {
1018
- SQLException ex = (SQLException) firstException;
1019
- String sqlState = ex.getSQLState();
1020
- int errorCode = ex.getErrorCode();
1021
- logger.error("{} ({}:{})", errorMessage, errorCode, sqlState);
1022
- }
1023
- }
1024
-
1025
- public boolean isRetryableException(Exception exception)
1026
- {
1027
- //if (exception instanceof SQLException) {
1028
- // SQLException ex = (SQLException) exception;
1029
- // String sqlState = ex.getSQLState();
1030
- // int errorCode = ex.getErrorCode();
1031
- // return isRetryableSQLException(ex);
1032
- //}
1033
- return false; // TODO
1034
- }
1035
- });
1036
-
1042
+ buildRetryExecutor(task)
1043
+ .runInterruptible(new RetryableSQLExecution(op, errorMessage));
1037
1044
  } catch (ExecutionException ex) {
1038
1045
  Throwable cause = ex.getCause();
1039
1046
  Throwables.propagateIfInstanceOf(cause, SQLException.class);
@@ -1041,24 +1048,87 @@ public abstract class AbstractJdbcOutputPlugin
1041
1048
  }
1042
1049
  }
1043
1050
 
1044
- private String buildExceptionMessage(Throwable ex) {
1045
- StringBuilder sb = new StringBuilder();
1046
- sb.append(ex.getMessage());
1047
- if (ex.getCause() != null) {
1048
- buildExceptionMessageCont(sb, ex.getCause(), ex.getMessage());
1049
- }
1050
- return sb.toString();
1051
+ private static RetryExecutor buildRetryExecutor(PluginTask task) {
1052
+ return retryExecutor()
1053
+ .withRetryLimit(task.getRetryLimit())
1054
+ .withInitialRetryWait(task.getRetryWait())
1055
+ .withMaxRetryWait(task.getMaxRetryWait());
1051
1056
  }
1052
1057
 
1053
- private void buildExceptionMessageCont(StringBuilder sb, Throwable ex, String lastMessage) {
1054
- if (!lastMessage.equals(ex.getMessage())) {
1055
- // suppress same messages
1056
- sb.append(" < ");
1058
+ class RetryableSQLExecution implements Retryable<Void> {
1059
+ private final String errorMessage;
1060
+ private final IdempotentSqlRunnable op;
1061
+
1062
+ private final Logger logger = Exec.getLogger(this.getClass());
1063
+
1064
+ public RetryableSQLExecution(IdempotentSqlRunnable op, String errorMessage) {
1065
+ this.errorMessage = errorMessage;
1066
+ this.op = op;
1067
+ }
1068
+
1069
+ public Void call() throws Exception {
1070
+ op.run();
1071
+ return null;
1072
+ }
1073
+
1074
+ public void onRetry(Exception exception, int retryCount, int retryLimit, int retryWait)
1075
+ {
1076
+ if (exception instanceof SQLException) {
1077
+ SQLException ex = (SQLException) exception;
1078
+ String sqlState = ex.getSQLState();
1079
+ int errorCode = ex.getErrorCode();
1080
+ logger.warn("{} ({}:{}), retrying {}/{} after {} seconds. Message: {}",
1081
+ errorMessage, errorCode, sqlState, retryCount, retryLimit, retryWait/1000,
1082
+ buildExceptionMessage(exception));
1083
+ } else {
1084
+ logger.warn("{}, retrying {}/{} after {} seconds. Message: {}",
1085
+ errorMessage, retryCount, retryLimit, retryWait/1000,
1086
+ buildExceptionMessage(exception));
1087
+ }
1088
+ if (retryCount % 3 == 0) {
1089
+ logger.info("Error details:", exception);
1090
+ }
1091
+ }
1092
+
1093
+ public void onGiveup(Exception firstException, Exception lastException)
1094
+ {
1095
+ if (firstException instanceof SQLException) {
1096
+ SQLException ex = (SQLException) firstException;
1097
+ String sqlState = ex.getSQLState();
1098
+ int errorCode = ex.getErrorCode();
1099
+ logger.error("{} ({}:{})", errorMessage, errorCode, sqlState);
1100
+ }
1101
+ }
1102
+
1103
+ public boolean isRetryableException(Exception exception) {
1104
+ if (exception instanceof SQLException) {
1105
+ SQLException ex = (SQLException)exception;
1106
+
1107
+ return AbstractJdbcOutputPlugin.this.isRetryableException(ex);
1108
+ } else {
1109
+ return false;
1110
+ }
1111
+ }
1112
+
1113
+ private String buildExceptionMessage(Throwable ex) {
1114
+ StringBuilder sb = new StringBuilder();
1057
1115
  sb.append(ex.getMessage());
1116
+ if (ex.getCause() != null) {
1117
+ buildExceptionMessageCont(sb, ex.getCause(), ex.getMessage());
1118
+ }
1119
+ return sb.toString();
1058
1120
  }
1059
- if (ex.getCause() == null) {
1060
- return;
1121
+
1122
+ private void buildExceptionMessageCont(StringBuilder sb, Throwable ex, String lastMessage) {
1123
+ if (!lastMessage.equals(ex.getMessage())) {
1124
+ // suppress same messages
1125
+ sb.append(" < ");
1126
+ sb.append(ex.getMessage());
1127
+ }
1128
+ if (ex.getCause() == null) {
1129
+ return;
1130
+ }
1131
+ buildExceptionMessageCont(sb, ex.getCause(), ex.getMessage());
1061
1132
  }
1062
- buildExceptionMessageCont(sb, ex.getCause(), ex.getMessage());
1063
1133
  }
1064
1134
  }
@@ -9,6 +9,7 @@ import java.sql.PreparedStatement;
9
9
  import java.sql.ResultSet;
10
10
  import java.sql.SQLException;
11
11
  import java.sql.Statement;
12
+
12
13
  import org.slf4j.Logger;
13
14
  import com.google.common.base.Optional;
14
15
  import org.embulk.spi.Exec;
@@ -240,11 +241,11 @@ public class JdbcOutputConnection
240
241
  return ColumnDeclareType.SIMPLE;
241
242
  }
242
243
 
243
- public PreparedStatement prepareBatchInsertStatement(String toTable, JdbcSchema toTableSchema, Optional<List<String>> mergeKeys) throws SQLException
244
+ public PreparedStatement prepareBatchInsertStatement(String toTable, JdbcSchema toTableSchema, Optional<MergeConfig> mergeConfig) throws SQLException
244
245
  {
245
246
  String sql;
246
- if (mergeKeys.isPresent()) {
247
- sql = buildPreparedMergeSql(toTable, toTableSchema, mergeKeys.get());
247
+ if (mergeConfig.isPresent()) {
248
+ sql = buildPreparedMergeSql(toTable, toTableSchema, mergeConfig.get());
248
249
  } else {
249
250
  sql = buildPreparedInsertSql(toTable, toTableSchema);
250
251
  }
@@ -274,7 +275,7 @@ public class JdbcOutputConnection
274
275
  return sb.toString();
275
276
  }
276
277
 
277
- protected String buildPreparedMergeSql(String toTable, JdbcSchema toTableSchema, List<String> mergeKeys) throws SQLException
278
+ protected String buildPreparedMergeSql(String toTable, JdbcSchema toTableSchema, MergeConfig mergeConfig) throws SQLException
278
279
  {
279
280
  throw new UnsupportedOperationException("not implemented");
280
281
  }
@@ -334,11 +335,11 @@ public class JdbcOutputConnection
334
335
  return sb.toString();
335
336
  }
336
337
 
337
- protected void collectMerge(List<String> fromTables, JdbcSchema schema, String toTable, List<String> mergeKeys) throws SQLException
338
+ protected void collectMerge(List<String> fromTables, JdbcSchema schema, String toTable, MergeConfig mergeConfig) throws SQLException
338
339
  {
339
340
  Statement stmt = connection.createStatement();
340
341
  try {
341
- String sql = buildCollectMergeSql(fromTables, schema, toTable, mergeKeys);
342
+ String sql = buildCollectMergeSql(fromTables, schema, toTable, mergeConfig);
342
343
  executeUpdate(stmt, sql);
343
344
  commitIfNecessary(connection);
344
345
  } catch (SQLException ex) {
@@ -348,7 +349,7 @@ public class JdbcOutputConnection
348
349
  }
349
350
  }
350
351
 
351
- protected String buildCollectMergeSql(List<String> fromTables, JdbcSchema schema, String toTable, List<String> mergeKeys) throws SQLException
352
+ protected String buildCollectMergeSql(List<String> fromTables, JdbcSchema schema, String toTable, MergeConfig mergeConfig) throws SQLException
352
353
  {
353
354
  throw new UnsupportedOperationException("not implemented");
354
355
  }
@@ -0,0 +1,23 @@
1
+ package org.embulk.output.jdbc;
2
+
3
+ import com.google.common.base.Optional;
4
+
5
+ import java.util.List;
6
+
7
+ public class MergeConfig {
8
+ private final List<String> mergeKeys;
9
+ private final Optional<List<String>> mergeRule;
10
+
11
+ public MergeConfig(List<String> mergeKeys, Optional<List<String>> mergeRule) {
12
+ this.mergeKeys = mergeKeys;
13
+ this.mergeRule = mergeRule;
14
+ }
15
+
16
+ public List<String> getMergeKeys() {
17
+ return mergeKeys;
18
+ }
19
+
20
+ public Optional<List<String>> getMergeRule() {
21
+ return mergeRule;
22
+ }
23
+ }
@@ -19,7 +19,7 @@ public class StandardBatchInsert
19
19
  private final Logger logger = Exec.getLogger(StandardBatchInsert.class);
20
20
 
21
21
  private final JdbcOutputConnector connector;
22
- private final Optional<List<String>> mergeKeys;
22
+ private final Optional<MergeConfig> mergeConfig;
23
23
 
24
24
  private JdbcOutputConnection connection;
25
25
  private PreparedStatement batch;
@@ -28,10 +28,10 @@ public class StandardBatchInsert
28
28
  private int batchRows;
29
29
  private long totalRows;
30
30
 
31
- public StandardBatchInsert(JdbcOutputConnector connector, Optional<List<String>> mergeKeys) throws IOException, SQLException
31
+ public StandardBatchInsert(JdbcOutputConnector connector, Optional<MergeConfig> mergeConfig) throws IOException, SQLException
32
32
  {
33
33
  this.connector = connector;
34
- this.mergeKeys = mergeKeys;
34
+ this.mergeConfig = mergeConfig;
35
35
  }
36
36
 
37
37
  public void prepare(String loadTable, JdbcSchema insertSchema) throws SQLException
@@ -46,7 +46,7 @@ public class StandardBatchInsert
46
46
 
47
47
  protected PreparedStatement prepareStatement(String loadTable, JdbcSchema insertSchema) throws SQLException
48
48
  {
49
- return connection.prepareBatchInsertStatement(loadTable, insertSchema, mergeKeys);
49
+ return connection.prepareBatchInsertStatement(loadTable, insertSchema, mergeConfig);
50
50
  }
51
51
 
52
52
  public int getBatchWeight()
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.6.1
4
+ version: 0.6.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Sadayuki Furuhashi
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2016-06-23 00:00:00.000000000 Z
11
+ date: 2016-08-10 00:00:00.000000000 Z
12
12
  dependencies: []
13
13
  description: Inserts or updates records to a table.
14
14
  email:
@@ -28,6 +28,7 @@ files:
28
28
  - src/main/java/org/embulk/output/jdbc/JdbcOutputConnector.java
29
29
  - src/main/java/org/embulk/output/jdbc/JdbcSchema.java
30
30
  - src/main/java/org/embulk/output/jdbc/JdbcUtils.java
31
+ - src/main/java/org/embulk/output/jdbc/MergeConfig.java
31
32
  - src/main/java/org/embulk/output/jdbc/StandardBatchInsert.java
32
33
  - src/main/java/org/embulk/output/jdbc/TimestampFormat.java
33
34
  - src/main/java/org/embulk/output/jdbc/ToString.java
@@ -58,7 +59,7 @@ files:
58
59
  - src/test/java/org/embulk/output/TestJdbcOutputPlugin.java
59
60
  - src/test/java/org/embulk/output/TimestampFormatTest.java
60
61
  - src/test/java/org/embulk/output/tester/EmbulkPluginTester.java
61
- - classpath/embulk-output-jdbc-0.6.1.jar
62
+ - classpath/embulk-output-jdbc-0.6.2.jar
62
63
  homepage: https://github.com/embulk/embulk-output-jdbc
63
64
  licenses:
64
65
  - Apache 2.0
Binary file