embulk-output-jdbc 0.6.0 → 0.6.1

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: b64b96b50afcce28b0a42fa8e189999b09dd62e8
4
- data.tar.gz: 328a0050e7219d5bf18ee11e54b9d213ca83f309
3
+ metadata.gz: 55c72f27b523c6e9e8a9f4bdcc6e34238fc2ab93
4
+ data.tar.gz: 1d6350d92b143a0423c2b5de300853b2f92ca9e1
5
5
  SHA512:
6
- metadata.gz: 380ed9ccf535efa6cd30e737b69a16d5295072c39123e701baa52fd9ab82d655ac45a6b955c985006241a1c3717587d6e77f7797ecde853bc2635ca4afd16cff
7
- data.tar.gz: 80da943fa0f1db2eb216327dfffec579c5f936be58153c1ca2fee19176517f0b384ff084449fb23a5bfe7d678c9c45f229a0d9bc009b3deda42271939853c518
6
+ metadata.gz: d625cc29b72e815c187745ee8553761bf3e27408c98c3ce69cb7539810ad5b32dc390e3e6557cd65954c0102cbb02569b1031f85d4c6ebd50d85d27abb32ed86
7
+ data.tar.gz: f8adc582282ef5f15e71401da3650162cf965dd7b7ae38145b7139dfa8dcbfd49e241eb45acec9a43a122ce45371127934bed643f4edc891bf8af4c5bdcf9da0
@@ -91,6 +91,9 @@ public abstract class AbstractJdbcOutputPlugin
91
91
  @ConfigDefault("\"UTC\"")
92
92
  public DateTimeZone getDefaultTimeZone();
93
93
 
94
+ public void setActualTable(String actualTable);
95
+ public String getActualTable();
96
+
94
97
  public void setMergeKeys(Optional<List<String>> keys);
95
98
 
96
99
  public void setFeatures(Features features);
@@ -423,16 +426,37 @@ public abstract class AbstractJdbcOutputPlugin
423
426
  PluginTask task, final Schema schema, int taskCount) throws SQLException
424
427
  {
425
428
  if (schema.getColumnCount() == 0) {
426
- throw new ConfigException("task count == 0 is not supported");
429
+ throw new ConfigException("No column.");
427
430
  }
428
431
 
429
432
  Mode mode = task.getMode();
430
433
  logger.info("Using {} mode", mode);
431
434
 
435
+ if (con.tableExists(task.getTable())) {
436
+ task.setActualTable(task.getTable());
437
+ } else {
438
+ String upperTable = task.getTable().toUpperCase();
439
+ String lowerTable = task.getTable().toLowerCase();
440
+ if (con.tableExists(upperTable)) {
441
+ if (con.tableExists(lowerTable)) {
442
+ throw new ConfigException(String.format("Cannot specify table '%s' because both '%s' and '%s' exist.",
443
+ task.getTable(), upperTable, lowerTable));
444
+ } else {
445
+ task.setActualTable(upperTable);
446
+ }
447
+ } else {
448
+ if (con.tableExists(lowerTable)) {
449
+ task.setActualTable(lowerTable);
450
+ } else {
451
+ task.setActualTable(task.getTable());
452
+ }
453
+ }
454
+ }
455
+
432
456
  Optional<JdbcSchema> initialTargetTableSchema =
433
457
  mode.ignoreTargetTableSchema() ?
434
458
  Optional.<JdbcSchema>absent() :
435
- newJdbcSchemaFromTableIfExists(con, task.getTable());
459
+ newJdbcSchemaFromTableIfExists(con, task.getActualTable());
436
460
 
437
461
  // TODO get CREATE TABLE statement from task if set
438
462
  JdbcSchema newTableSchema = applyColumnOptionsToNewTableSchema(
@@ -449,13 +473,13 @@ public abstract class AbstractJdbcOutputPlugin
449
473
  // direct modify mode doesn't need intermediate tables.
450
474
  ImmutableList.Builder<String> intermTableNames = ImmutableList.builder();
451
475
  if (mode.tempTablePerTask()) {
452
- String namePrefix = generateIntermediateTableNamePrefix(task.getTable(), con, 3,
476
+ String namePrefix = generateIntermediateTableNamePrefix(task.getActualTable(), con, 3,
453
477
  task.getFeatures().getMaxTableNameLength(), task.getFeatures().getTableNameLengthSemantics());
454
478
  for (int i=0; i < taskCount; i++) {
455
479
  intermTableNames.add(namePrefix + String.format("%03d", i));
456
480
  }
457
481
  } else {
458
- String name = generateIntermediateTableNamePrefix(task.getTable(), con, 0,
482
+ String name = generateIntermediateTableNamePrefix(task.getActualTable(), con, 0,
459
483
  task.getFeatures().getMaxTableNameLength(), task.getFeatures().getTableNameLengthSemantics());
460
484
  intermTableNames.add(name);
461
485
  }
@@ -483,8 +507,8 @@ public abstract class AbstractJdbcOutputPlugin
483
507
  } else {
484
508
  // also create the target table if not exists
485
509
  // CREATE TABLE IF NOT EXISTS xyz
486
- con.createTableIfNotExists(task.getTable(), newTableSchema);
487
- targetTableSchema = newJdbcSchemaFromTableIfExists(con, task.getTable()).get();
510
+ con.createTableIfNotExists(task.getActualTable(), newTableSchema);
511
+ targetTableSchema = newJdbcSchemaFromTableIfExists(con, task.getActualTable()).get();
488
512
  task.setNewTableSchema(Optional.<JdbcSchema>absent());
489
513
  }
490
514
  task.setTargetTableSchema(matchSchemaByColumnNames(schema, targetTableSchema));
@@ -574,7 +598,7 @@ public abstract class AbstractJdbcOutputPlugin
574
598
  return new JdbcSchema(Lists.transform(schema.getColumns(), new Function<JdbcColumn, JdbcColumn>() {
575
599
  public JdbcColumn apply(JdbcColumn c)
576
600
  {
577
- JdbcColumnOption option = columnOptionOf(columnOptions, c);
601
+ JdbcColumnOption option = columnOptionOf(columnOptions, c.getName());
578
602
  if (option.getType().isPresent()) {
579
603
  return JdbcColumn.newTypeDeclaredColumn(
580
604
  c.getName(), Types.OTHER, // sqlType, isNotNull, and isUniqueKey are ignored
@@ -590,23 +614,22 @@ public abstract class AbstractJdbcOutputPlugin
590
614
  Map<String, JdbcColumnOption> columnOptions)
591
615
  {
592
616
  ImmutableList.Builder<ColumnSetter> builder = ImmutableList.builder();
593
- int schemaColumnIndex = 0;
594
- for (JdbcColumn targetColumn : targetTableSchema.getColumns()) {
617
+ for (int schemaColumnIndex = 0; schemaColumnIndex < targetTableSchema.getCount(); schemaColumnIndex++) {
618
+ JdbcColumn targetColumn = targetTableSchema.getColumn(schemaColumnIndex);
619
+ Column inputColumn = inputValueSchema.getColumn(schemaColumnIndex);
595
620
  if (targetColumn.isSkipColumn()) {
596
621
  builder.add(factory.newSkipColumnSetter());
597
622
  } else {
598
- //String columnOptionKey = inputValueSchema.getColumn(schemaColumnIndex).getName();
599
- JdbcColumnOption option = columnOptionOf(columnOptions, targetColumn);
623
+ JdbcColumnOption option = columnOptionOf(columnOptions, inputColumn.getName());
600
624
  builder.add(factory.newColumnSetter(targetColumn, option));
601
- schemaColumnIndex++;
602
625
  }
603
626
  }
604
627
  return builder.build();
605
628
  }
606
629
 
607
- private static JdbcColumnOption columnOptionOf(Map<String, JdbcColumnOption> columnOptions, JdbcColumn targetColumn)
630
+ private static JdbcColumnOption columnOptionOf(Map<String, JdbcColumnOption> columnOptions, String columnName)
608
631
  {
609
- return Optional.fromNullable(columnOptions.get(targetColumn.getName())).or(
632
+ return Optional.fromNullable(columnOptions.get(columnName)).or(
610
633
  // default column option
611
634
  new Supplier<JdbcColumnOption>()
612
635
  {
@@ -641,30 +664,30 @@ public abstract class AbstractJdbcOutputPlugin
641
664
  case INSERT:
642
665
  // aggregate insert into target
643
666
  if (task.getNewTableSchema().isPresent()) {
644
- con.createTableIfNotExists(task.getTable(), task.getNewTableSchema().get());
667
+ con.createTableIfNotExists(task.getActualTable(), task.getNewTableSchema().get());
645
668
  }
646
- con.collectInsert(task.getIntermediateTables().get(), schema, task.getTable(), false);
669
+ con.collectInsert(task.getIntermediateTables().get(), schema, task.getActualTable(), false);
647
670
  break;
648
671
 
649
672
  case TRUNCATE_INSERT:
650
673
  // truncate & aggregate insert into target
651
674
  if (task.getNewTableSchema().isPresent()) {
652
- con.createTableIfNotExists(task.getTable(), task.getNewTableSchema().get());
675
+ con.createTableIfNotExists(task.getActualTable(), task.getNewTableSchema().get());
653
676
  }
654
- con.collectInsert(task.getIntermediateTables().get(), schema, task.getTable(), true);
677
+ con.collectInsert(task.getIntermediateTables().get(), schema, task.getActualTable(), true);
655
678
  break;
656
679
 
657
680
  case MERGE:
658
681
  // aggregate merge into target
659
682
  if (task.getNewTableSchema().isPresent()) {
660
- con.createTableIfNotExists(task.getTable(), task.getNewTableSchema().get());
683
+ con.createTableIfNotExists(task.getActualTable(), task.getNewTableSchema().get());
661
684
  }
662
- con.collectMerge(task.getIntermediateTables().get(), schema, task.getTable(), task.getMergeKeys().get());
685
+ con.collectMerge(task.getIntermediateTables().get(), schema, task.getActualTable(), task.getMergeKeys().get());
663
686
  break;
664
687
 
665
688
  case REPLACE:
666
689
  // swap table
667
- con.replaceTable(task.getIntermediateTables().get().get(0), schema, task.getTable());
690
+ con.replaceTable(task.getIntermediateTables().get().get(0), schema, task.getActualTable());
668
691
  break;
669
692
  }
670
693
  }
@@ -823,13 +846,16 @@ public abstract class AbstractJdbcOutputPlugin
823
846
  task.getTargetTableSchema(), schema,
824
847
  task.getColumnOptions());
825
848
  JdbcSchema insertIntoSchema = filterSkipColumns(task.getTargetTableSchema());
849
+ if (insertIntoSchema.getCount() == 0) {
850
+ throw new SQLException("No column to insert.");
851
+ }
826
852
 
827
853
  // configure BatchInsert -> an intermediate table (!isDirectModify) or the target table (isDirectModify)
828
854
  String destTable;
829
855
  if (mode.tempTablePerTask()) {
830
856
  destTable = task.getIntermediateTables().get().get(taskIndex);
831
857
  } else if (mode.isDirectModify()) {
832
- destTable = task.getTable();
858
+ destTable = task.getActualTable();
833
859
  } else {
834
860
  destTable = task.getIntermediateTables().get().get(0);
835
861
  }
@@ -37,7 +37,9 @@ public class JdbcOutputConnection
37
37
  @Override
38
38
  public void close() throws SQLException
39
39
  {
40
- connection.close();
40
+ if (!connection.isClosed()) {
41
+ connection.close();
42
+ }
41
43
  }
42
44
 
43
45
  public String getSchemaName()
@@ -1,6 +1,9 @@
1
1
  package org.embulk.output.jdbc;
2
2
 
3
3
  import java.util.List;
4
+
5
+ import org.embulk.config.ConfigException;
6
+
4
7
  import com.google.common.base.Optional;
5
8
  import com.google.common.collect.ImmutableList;
6
9
  import com.fasterxml.jackson.annotation.JsonCreator;
@@ -24,11 +27,27 @@ public class JdbcSchema
24
27
 
25
28
  public Optional<JdbcColumn> findColumn(String name)
26
29
  {
30
+ // because both upper case column and lower case column may exist, search twice
27
31
  for (JdbcColumn column : columns) {
28
32
  if (column.getName().equals(name)) {
29
33
  return Optional.of(column);
30
34
  }
31
35
  }
36
+
37
+ JdbcColumn foundColumn = null;
38
+ for (JdbcColumn column : columns) {
39
+ if (column.getName().equalsIgnoreCase(name)) {
40
+ if (foundColumn != null) {
41
+ throw new ConfigException(String.format("Cannot specify column '%s' because both '%s' and '%s' exist.",
42
+ name, foundColumn.getName(), column.getName()));
43
+ }
44
+ foundColumn = column;
45
+ }
46
+ }
47
+
48
+ if (foundColumn != null) {
49
+ return Optional.of(foundColumn);
50
+ }
32
51
  return Optional.absent();
33
52
  }
34
53
 
@@ -64,7 +64,7 @@ public class StandardBatchInsert
64
64
 
65
65
  public void close() throws IOException, SQLException
66
66
  {
67
- // caller should close the connection
67
+ connection.close();
68
68
  }
69
69
 
70
70
  public void flush() throws IOException, SQLException
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.0
4
+ version: 0.6.1
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-04-26 00:00:00.000000000 Z
11
+ date: 2016-06-23 00:00:00.000000000 Z
12
12
  dependencies: []
13
13
  description: Inserts or updates records to a table.
14
14
  email:
@@ -58,7 +58,7 @@ files:
58
58
  - src/test/java/org/embulk/output/TestJdbcOutputPlugin.java
59
59
  - src/test/java/org/embulk/output/TimestampFormatTest.java
60
60
  - src/test/java/org/embulk/output/tester/EmbulkPluginTester.java
61
- - classpath/embulk-output-jdbc-0.6.0.jar
61
+ - classpath/embulk-output-jdbc-0.6.1.jar
62
62
  homepage: https://github.com/embulk/embulk-output-jdbc
63
63
  licenses:
64
64
  - Apache 2.0
Binary file