embulk-output-sqlserver 0.7.10 → 0.7.11

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 (52) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +16 -0
  3. data/build.gradle +1 -1
  4. data/classpath/{embulk-output-jdbc-0.7.10.jar → embulk-output-jdbc-0.7.11.jar} +0 -0
  5. data/classpath/{embulk-output-sqlserver-0.7.10.jar → embulk-output-sqlserver-0.7.11.jar} +0 -0
  6. data/src/main/java/org/embulk/output/SQLServerOutputPlugin.java +17 -8
  7. data/src/test/java/org/embulk/output/sqlserver/BasicTest.java +200 -0
  8. data/src/test/java/org/embulk/output/sqlserver/SQLServerTests.java +80 -0
  9. data/src/test/resources/org/embulk/output/sqlserver/test/expect/basic/setup.sql +82 -0
  10. data/src/test/resources/org/embulk/output/sqlserver/test/expect/basic/test1.csv +4 -0
  11. data/src/test/resources/org/embulk/output/sqlserver/test/expect/basic/test_expected.diff +2 -0
  12. data/src/test/resources/org/embulk/output/sqlserver/test/expect/basic/test_insert.yml +2 -0
  13. data/src/test/resources/org/embulk/output/sqlserver/test/expect/basic/test_insert_create_expected.csv +3 -0
  14. data/src/test/resources/org/embulk/output/sqlserver/test/expect/basic/test_insert_direct.yml +2 -0
  15. data/src/test/resources/org/embulk/output/sqlserver/test/expect/basic/test_insert_expected.csv +4 -0
  16. data/src/test/resources/org/embulk/output/sqlserver/test/expect/basic/test_merge.csv +5 -0
  17. data/src/test/resources/org/embulk/output/sqlserver/test/expect/basic/test_merge.yml +2 -0
  18. data/src/test/resources/{sqlserver/data/test6/test6.csv → org/embulk/output/sqlserver/test/expect/basic/test_merge_expected.csv} +6 -4
  19. data/src/test/resources/org/embulk/output/sqlserver/test/expect/basic/test_merge_keys.yml +3 -0
  20. data/src/test/resources/org/embulk/output/sqlserver/test/expect/basic/test_merge_rule.yml +3 -0
  21. data/src/test/resources/org/embulk/output/sqlserver/test/expect/basic/test_merge_rule_expected.csv +6 -0
  22. data/src/test/resources/org/embulk/output/sqlserver/test/expect/basic/test_native_insert_direct.yml +3 -0
  23. data/src/test/resources/org/embulk/output/sqlserver/test/expect/basic/test_replace.yml +2 -0
  24. data/src/test/resources/org/embulk/output/sqlserver/test/expect/basic/test_replace_longname.yml +2 -0
  25. data/src/test/resources/org/embulk/output/sqlserver/test/expect/basic/test_string_timestamp.csv +4 -0
  26. data/src/test/resources/org/embulk/output/sqlserver/test/expect/basic/test_string_timestamp.yml +5 -0
  27. data/src/test/resources/org/embulk/output/sqlserver/test/expect/basic/test_string_timestamp_expected.csv +4 -0
  28. data/src/test/resources/org/embulk/output/sqlserver/test/expect/basic/test_truncate_insert.yml +2 -0
  29. data/src/test/resources/org/embulk/output/sqlserver/test/expect/basic/test_truncate_insert_expected.csv +3 -0
  30. metadata +27 -27
  31. data/src/test/java/org/embulk/output/sqlserver/PreciseTime.java +0 -48
  32. data/src/test/java/org/embulk/output/sqlserver/SQLServerOutputPluginTest.java +0 -923
  33. data/src/test/resources/sqlserver/data/test1/test1.csv +0 -3
  34. data/src/test/resources/sqlserver/data/test2/test2.csv +0 -2
  35. data/src/test/resources/sqlserver/data/test3/test3.csv +0 -2
  36. data/src/test/resources/sqlserver/data/test4/test4.csv +0 -2
  37. data/src/test/resources/sqlserver/data/test5/test5.csv +0 -2
  38. data/src/test/resources/sqlserver/yml/test-insert-direct.yml +0 -43
  39. data/src/test/resources/sqlserver/yml/test-insert.yml +0 -43
  40. data/src/test/resources/sqlserver/yml/test-jtds.yml +0 -43
  41. data/src/test/resources/sqlserver/yml/test-merge-keys.yml +0 -23
  42. data/src/test/resources/sqlserver/yml/test-merge-rule.yml +0 -22
  43. data/src/test/resources/sqlserver/yml/test-merge.yml +0 -21
  44. data/src/test/resources/sqlserver/yml/test-native-date.yml +0 -26
  45. data/src/test/resources/sqlserver/yml/test-native-decimal.yml +0 -25
  46. data/src/test/resources/sqlserver/yml/test-native-integer.yml +0 -24
  47. data/src/test/resources/sqlserver/yml/test-native-string.yml +0 -25
  48. data/src/test/resources/sqlserver/yml/test-native.yml +0 -44
  49. data/src/test/resources/sqlserver/yml/test-replace-long-name.yml +0 -43
  50. data/src/test/resources/sqlserver/yml/test-replace.yml +0 -43
  51. data/src/test/resources/sqlserver/yml/test-string-timestamp.yml +0 -46
  52. data/src/test/resources/sqlserver/yml/test-truncate-insert.yml +0 -43
@@ -0,0 +1,4 @@
1
+ ID:string,TINYINT_ITEM:long,SMALLINT_ITEM:long,INT_ITEM:long,BIGINT_ITEM:long,BIT_ITEM:boolean,DECIMAL_ITEM:string,NUMERIC_ITEM:string,SMALLMONEY_ITEM:string,MONEY_ITEM:string,REAL_ITEM:double,FLOAT_ITEM:double,CHAR_ITEM:string,VARCHAR_ITEM:string,TEXT_ITEM:string,NCHAR_ITEM:string,NVARCHAR_ITEM:string,NTEXT_ITEM:string,DATE_ITEM:timestamp,DATETIME_ITEM:timestamp,DATETIME2_ITEM:timestamp,DATETIME2_2_ITEM:timestamp,SMALLDATETIME_ITEM:timestamp,TIME_ITEM:timestamp,TIME_2_ITEM:timestamp
2
+ A001,0,1234,123456,12345678901,0,1.23,3.456,12.34,123.4567,0.1234567,0.12345678901234,a,b,c,A,B,C,2016-1-1 00:00:00.0 +0900,2017-1-1 1:2:3.123 +0900,2018-1-1 1:2:3.1234567 +0900,2019-1-1 1:2:3.12 +0900,2020-1-1 1:2:3.0 +0900,1970-01-01 3:4:5.1234567 +0900,1970-01-01 6:7:8.12 +0900
3
+ A002,255,-32768,-2147483648,-9223372036854775808,1,-9999999999.99,-99.999,-214748.3648,-922337203685477.5808,-9999000000,-999999999999000000,あい,あいうえ,あいうえお,かき,かきくけ,かきくけこ,2016-12-31 00:00:00.0 +0900,2017-12-31 23:59:59.997 +0900,2018-12-31 23:59:59.9999999 +0900,2019-12-31 23:59:59.99 +0900,2020-12-31 23:59:59.0 +0900,1970-01-01 23:59:59.9999999 +0900,1970-01-01 23:59:59.99 +0900
4
+ A003,,,,,,,,,,,,,,,,,,,,,,,,
@@ -0,0 +1,3 @@
1
+ A001,0,1234,123456,12345678901,0,1.23,3.456,12.34,123.4567,0.1234567,0.12345678901234,a,b,c,A,B,C,2015-12-31 15:00:00.0000000,2016-12-31 16:02:03.1230000,2017-12-31 16:02:03.1234560,2018-12-31 16:02:03.1200000,2019-12-31 16:02:03.0000000,1969-12-31 18:04:05.1234560,1969-12-31 21:07:08.1200000
2
+ A002,255,-32768,-2147483648,-9223372036854775808,1,-9999999999.99,-99.999,-214748.3648,-922337203685477.5808,-9999000000.0,-9.9999999999900006E+17,あい,あいうえ,あいうえお,かき,かきくけ,かきくけこ,2016-12-30 15:00:00.0000000,2017-12-31 14:59:59.9970000,2018-12-31 14:59:59.9999990,2019-12-31 14:59:59.9900000,2020-12-31 14:59:59.0000000,1970-01-01 14:59:59.9999990,1970-01-01 14:59:59.9900000
3
+ A003,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL
@@ -0,0 +1,2 @@
1
+ table: TEST1
2
+ mode: insert_direct
@@ -0,0 +1,4 @@
1
+ 9999,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL
2
+ A001,0,1234,123456,12345678901,0,1.23,3.456,12.3400,123.4567,0.1234567,0.12345678901234,a ,b,c,A ,B,C,2015-12-31,2016-12-31 16:02:03.123,2017-12-31 16:02:03.1234560,2018-12-31 16:02:03.12,2019-12-31 16:02:00,18:04:05.1234560,21:07:08.12
3
+ A002,255,-32768,-2147483648,-9223372036854775808,1,-9999999999.99,-99.999,-214748.3648,-922337203685477.5808,-9.9989996E+9,-9.9999999999900006E+17,あい,あいうえ,あいうえお,かき ,かきくけ,かきくけこ,2016-12-30,2017-12-31 14:59:59.997,2018-12-31 14:59:59.9999990,2019-12-31 14:59:59.99,2020-12-31 15:00:00,14:59:59.9999990,14:59:59.99
4
+ A003,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL
@@ -0,0 +1,5 @@
1
+ ITEM1:long,ITEM2:long,ITEM3:string
2
+ 10,21,aa
3
+ 11,10,bb
4
+ 12,20,cc
5
+ 10,22,dd
@@ -0,0 +1,2 @@
1
+ table: TEST_MERGE1
2
+ mode: merge
@@ -1,4 +1,6 @@
1
- 10,21,aa
2
- 11,10,bb
3
- 12,20,cc
4
- 10,22,dd
1
+ 10,20,A
2
+ 10,21,aa
3
+ 10,22,dd
4
+ 11,10,bb
5
+ 11,20,C
6
+ 12,20,cc
@@ -0,0 +1,3 @@
1
+ table: TEST_MERGE2
2
+ mode: merge
3
+ merge_keys: [ITEM1,ITEM2]
@@ -0,0 +1,3 @@
1
+ table: TEST_MERGE1
2
+ mode: merge
3
+ merge_rule: ["ITEM3 = T.ITEM3 + S.ITEM3"]
@@ -0,0 +1,6 @@
1
+ 10,20,A
2
+ 10,21,Baa
3
+ 10,22,dd
4
+ 11,10,bb
5
+ 11,20,C
6
+ 12,20,cc
@@ -0,0 +1,3 @@
1
+ table: TEST1
2
+ mode: insert_direct
3
+ insert_method: native
@@ -0,0 +1,2 @@
1
+ table: TEST___A123456789B123456789C123456789D123456789E123456789F123456789G123456789H123456789I123456789J123456789K123456789L123456789
2
+ mode: replace
@@ -0,0 +1,4 @@
1
+ ID:string,TINYINT_ITEM:long,SMALLINT_ITEM:long,INT_ITEM:long,BIGINT_ITEM:long,BIT_ITEM:boolean,DECIMAL_ITEM:string,NUMERIC_ITEM:string,SMALLMONEY_ITEM:string,MONEY_ITEM:string,REAL_ITEM:double,FLOAT_ITEM:double,CHAR_ITEM:string,VARCHAR_ITEM:string,TEXT_ITEM:string,NCHAR_ITEM:string,NVARCHAR_ITEM:string,NTEXT_ITEM:string,DATE_ITEM:timestamp,DATETIME_ITEM:timestamp,DATETIME2_ITEM:string,DATETIME2_2_ITEM:timestamp,SMALLDATETIME_ITEM:timestamp,TIME_ITEM:string,TIME_2_ITEM:timestamp
2
+ A001,0,1234,123456,12345678901,0,1.23,3.456,12.34,123.4567,0.1234567,0.12345678901234,a,b,c,A,B,C,2016-1-1 00:00:00.0 +0900,2017-1-1 1:2:3.123 +0900,2018/1/1 1:2:3.1234567,2019-1-1 1:2:3.12 +0900,2020-1-1 1:2:3.0 +0900,3:4:5.1234567,1970-01-01 6:7:8.12 +0900
3
+ A002,255,-32768,-2147483648,-9223372036854775808,1,-9999999999.99,-99.999,-214748.3648,-922337203685477.5808,-9999000000,-999999999999000000,あい,あいうえ,あいうえお,かき,かきくけ,かきくけこ,2016-12-31 00:00:00.0 +0900,2017-12-31 23:59:59.997 +0900,2018/12/31 23:59:59.9999999,2019-12-31 23:59:59.99 +0900,2020-12-31 23:59:59.0 +0900,23:59:59.9999999,1970-01-01 23:59:59.99 +0900
4
+ A003,,,,,,,,,,,,,,,,,,,,,,,,
@@ -0,0 +1,5 @@
1
+ table: TEST1
2
+ mode: insert_direct
3
+ column_options:
4
+ DATETIME2_ITEM: {value_type: pass}
5
+ TIME_ITEM: {value_type: pass}
@@ -0,0 +1,4 @@
1
+ 9999,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL
2
+ A001,0,1234,123456,12345678901,0,1.23,3.456,12.3400,123.4567,0.1234567,0.12345678901234,a ,b,c,A ,B,C,2015-12-31,2016-12-31 16:02:03.123,2018-01-01 01:02:03.1234567,2018-12-31 16:02:03.12,2019-12-31 16:02:00,03:04:05.1234567,21:07:08.12
3
+ A002,255,-32768,-2147483648,-9223372036854775808,1,-9999999999.99,-99.999,-214748.3648,-922337203685477.5808,-9.9989996E+9,-9.9999999999900006E+17,あい,あいうえ,あいうえお,かき ,かきくけ,かきくけこ,2016-12-30,2017-12-31 14:59:59.997,2018-12-31 23:59:59.9999999,2019-12-31 14:59:59.99,2020-12-31 15:00:00,23:59:59.9999999,14:59:59.99
4
+ A003,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL
@@ -0,0 +1,2 @@
1
+ table: TEST1
2
+ mode: truncate_insert
@@ -0,0 +1,3 @@
1
+ A001,0,1234,123456,12345678901,0,1.23,3.456,12.3400,123.4567,0.1234567,0.12345678901234,a ,b,c,A ,B,C,2015-12-31,2016-12-31 16:02:03.123,2017-12-31 16:02:03.1234560,2018-12-31 16:02:03.12,2019-12-31 16:02:00,18:04:05.1234560,21:07:08.12
2
+ A002,255,-32768,-2147483648,-9223372036854775808,1,-9999999999.99,-99.999,-214748.3648,-922337203685477.5808,-9.9989996E+9,-9.9999999999900006E+17,あい,あいうえ,あいうえお,かき ,かきくけ,かきくけこ,2016-12-30,2017-12-31 14:59:59.997,2018-12-31 14:59:59.9999990,2019-12-31 14:59:59.99,2020-12-31 15:00:00,14:59:59.9999990,14:59:59.99
3
+ A003,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: embulk-output-sqlserver
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.7.10
4
+ version: 0.7.11
5
5
  platform: ruby
6
6
  authors:
7
7
  - Sadayuki Furuhashi
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2017-07-14 00:00:00.000000000 Z
11
+ date: 2017-08-16 00:00:00.000000000 Z
12
12
  dependencies: []
13
13
  description: Inserts or updates records to a table.
14
14
  email:
@@ -19,8 +19,8 @@ extra_rdoc_files: []
19
19
  files:
20
20
  - README.md
21
21
  - build.gradle
22
- - classpath/embulk-output-jdbc-0.7.10.jar
23
- - classpath/embulk-output-sqlserver-0.7.10.jar
22
+ - classpath/embulk-output-jdbc-0.7.11.jar
23
+ - classpath/embulk-output-sqlserver-0.7.11.jar
24
24
  - classpath/jtds-1.3.1.jar
25
25
  - lib/embulk/output/sqlserver.rb
26
26
  - src/main/java/org/embulk/output/SQLServerOutputPlugin.java
@@ -35,29 +35,29 @@ files:
35
35
  - src/main/java/org/embulk/output/sqlserver/setter/SQLServerByteColumnSetter.java
36
36
  - src/main/java/org/embulk/output/sqlserver/setter/SQLServerColumnSetterFactory.java
37
37
  - src/main/java/org/embulk/output/sqlserver/setter/SQLServerSqlTimeColumnSetter.java
38
- - src/test/java/org/embulk/output/sqlserver/PreciseTime.java
39
- - src/test/java/org/embulk/output/sqlserver/SQLServerOutputPluginTest.java
40
- - src/test/resources/sqlserver/data/test1/test1.csv
41
- - src/test/resources/sqlserver/data/test2/test2.csv
42
- - src/test/resources/sqlserver/data/test3/test3.csv
43
- - src/test/resources/sqlserver/data/test4/test4.csv
44
- - src/test/resources/sqlserver/data/test5/test5.csv
45
- - src/test/resources/sqlserver/data/test6/test6.csv
46
- - src/test/resources/sqlserver/yml/test-insert-direct.yml
47
- - src/test/resources/sqlserver/yml/test-insert.yml
48
- - src/test/resources/sqlserver/yml/test-jtds.yml
49
- - src/test/resources/sqlserver/yml/test-merge-keys.yml
50
- - src/test/resources/sqlserver/yml/test-merge-rule.yml
51
- - src/test/resources/sqlserver/yml/test-merge.yml
52
- - src/test/resources/sqlserver/yml/test-native-date.yml
53
- - src/test/resources/sqlserver/yml/test-native-decimal.yml
54
- - src/test/resources/sqlserver/yml/test-native-integer.yml
55
- - src/test/resources/sqlserver/yml/test-native-string.yml
56
- - src/test/resources/sqlserver/yml/test-native.yml
57
- - src/test/resources/sqlserver/yml/test-replace-long-name.yml
58
- - src/test/resources/sqlserver/yml/test-replace.yml
59
- - src/test/resources/sqlserver/yml/test-string-timestamp.yml
60
- - src/test/resources/sqlserver/yml/test-truncate-insert.yml
38
+ - src/test/java/org/embulk/output/sqlserver/BasicTest.java
39
+ - src/test/java/org/embulk/output/sqlserver/SQLServerTests.java
40
+ - src/test/resources/org/embulk/output/sqlserver/test/expect/basic/setup.sql
41
+ - src/test/resources/org/embulk/output/sqlserver/test/expect/basic/test1.csv
42
+ - src/test/resources/org/embulk/output/sqlserver/test/expect/basic/test_expected.diff
43
+ - src/test/resources/org/embulk/output/sqlserver/test/expect/basic/test_insert.yml
44
+ - src/test/resources/org/embulk/output/sqlserver/test/expect/basic/test_insert_create_expected.csv
45
+ - src/test/resources/org/embulk/output/sqlserver/test/expect/basic/test_insert_direct.yml
46
+ - src/test/resources/org/embulk/output/sqlserver/test/expect/basic/test_insert_expected.csv
47
+ - src/test/resources/org/embulk/output/sqlserver/test/expect/basic/test_merge.csv
48
+ - src/test/resources/org/embulk/output/sqlserver/test/expect/basic/test_merge.yml
49
+ - src/test/resources/org/embulk/output/sqlserver/test/expect/basic/test_merge_expected.csv
50
+ - src/test/resources/org/embulk/output/sqlserver/test/expect/basic/test_merge_keys.yml
51
+ - src/test/resources/org/embulk/output/sqlserver/test/expect/basic/test_merge_rule.yml
52
+ - src/test/resources/org/embulk/output/sqlserver/test/expect/basic/test_merge_rule_expected.csv
53
+ - src/test/resources/org/embulk/output/sqlserver/test/expect/basic/test_native_insert_direct.yml
54
+ - src/test/resources/org/embulk/output/sqlserver/test/expect/basic/test_replace.yml
55
+ - src/test/resources/org/embulk/output/sqlserver/test/expect/basic/test_replace_longname.yml
56
+ - src/test/resources/org/embulk/output/sqlserver/test/expect/basic/test_string_timestamp.csv
57
+ - src/test/resources/org/embulk/output/sqlserver/test/expect/basic/test_string_timestamp.yml
58
+ - src/test/resources/org/embulk/output/sqlserver/test/expect/basic/test_string_timestamp_expected.csv
59
+ - src/test/resources/org/embulk/output/sqlserver/test/expect/basic/test_truncate_insert.yml
60
+ - src/test/resources/org/embulk/output/sqlserver/test/expect/basic/test_truncate_insert_expected.csv
61
61
  homepage: https://github.com/embulk/embulk-output-jdbc
62
62
  licenses:
63
63
  - Apache 2.0
@@ -1,48 +0,0 @@
1
- package org.embulk.output.sqlserver;
2
-
3
- import java.sql.Time;
4
- import java.sql.Timestamp;
5
-
6
- public class PreciseTime extends Time
7
- {
8
- private final int nanos;
9
-
10
- public PreciseTime(long time, int nanos)
11
- {
12
- super(time);
13
-
14
- this.nanos = nanos;
15
- }
16
-
17
- public PreciseTime(Time time, int nanos)
18
- {
19
- this(time.getTime(), nanos);
20
- }
21
-
22
- public PreciseTime(Timestamp timestamp)
23
- {
24
- this(timestamp.getTime(), timestamp.getNanos());
25
- }
26
-
27
- public int getNanos()
28
- {
29
- return nanos;
30
- }
31
-
32
- @Override
33
- public boolean equals(Object o)
34
- {
35
- if (!(o instanceof PreciseTime)) {
36
- return false;
37
- }
38
-
39
- return toString().equals(o.toString());
40
- }
41
-
42
- @Override
43
- public String toString()
44
- {
45
- return String.format("%s.%09d", super.toString(), nanos);
46
- }
47
-
48
- }
@@ -1,923 +0,0 @@
1
- package org.embulk.output.sqlserver;
2
-
3
- import org.embulk.output.AbstractJdbcOutputPluginTest;
4
- import org.embulk.output.SQLServerOutputPlugin;
5
- import org.embulk.spi.OutputPlugin;
6
- import org.junit.Test;
7
-
8
- import java.math.BigDecimal;
9
- import java.sql.Connection;
10
- import java.sql.DriverManager;
11
- import java.sql.ResultSet;
12
- import java.sql.SQLException;
13
- import java.sql.Timestamp;
14
- import java.text.DateFormat;
15
- import java.text.ParseException;
16
- import java.text.SimpleDateFormat;
17
- import java.util.Date;
18
- import java.util.Iterator;
19
- import java.util.List;
20
-
21
- import static java.util.Locale.ENGLISH;
22
- import static org.junit.Assert.assertEquals;
23
-
24
-
25
- public class SQLServerOutputPluginTest extends AbstractJdbcOutputPluginTest
26
- {
27
- private boolean useJtdsDriver = false;
28
-
29
-
30
- @Override
31
- protected void prepare() throws SQLException {
32
- tester.addPlugin(OutputPlugin.class, "sqlserver", SQLServerOutputPlugin.class);
33
-
34
- try {
35
- Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");
36
- } catch (ClassNotFoundException e) {
37
- System.err.println("Warning: you should put 'sqljdbc41.jar' in 'embulk-output-sqlserver/driver' directory in order to test.");
38
- return;
39
- }
40
-
41
- try {
42
- connect();
43
- enabled = true;
44
- } catch (Throwable t) {
45
- System.out.println(t);
46
- } finally {
47
- if (!enabled) {
48
- System.out.println(String.format(ENGLISH, "Warning: you should prepare database in order to test (server = %s, port = %d, database = %s, user = %s, password = %s).",
49
- getHost(), getPort(), getDatabase(), getUser(), getPassword()));
50
- }
51
- }
52
- }
53
-
54
- @Test
55
- public void testInsertDirect() throws Exception
56
- {
57
- String table = "TEST1";
58
-
59
- dropTable(table);
60
- createTable(table);
61
- insertRecord(table);
62
-
63
- test("/sqlserver/yml/test-insert-direct.yml");
64
-
65
- assertTable(1, table);
66
- }
67
-
68
- @Test
69
- public void testInsertDirectCreate() throws Exception
70
- {
71
- String table = "TEST1";
72
-
73
- dropTable(table);
74
-
75
- test("/sqlserver/yml/test-insert-direct.yml");
76
-
77
- assertGeneratedTable(table);
78
- }
79
-
80
- @Test
81
- public void testInsert() throws Exception
82
- {
83
- String table = "TEST1";
84
-
85
- dropTable(table);
86
- createTable(table);
87
- insertRecord(table);
88
-
89
- test("/sqlserver/yml/test-insert.yml");
90
-
91
- assertTable(1, table);
92
- }
93
-
94
- @Test
95
- public void testInsertCreate() throws Exception
96
- {
97
- String table = "TEST1";
98
-
99
- dropTable(table);
100
-
101
- test("/sqlserver/yml/test-insert.yml");
102
-
103
- assertGeneratedTable(table);
104
- }
105
-
106
- @Test
107
- public void testTruncateInsert() throws Exception
108
- {
109
- String table = "TEST1";
110
-
111
- dropTable(table);
112
- createTable(table);
113
- insertRecord(table);
114
-
115
- test("/sqlserver/yml/test-truncate-insert.yml");
116
-
117
- assertTable(0, table);
118
- }
119
-
120
- @Test
121
- public void testReplace() throws Exception
122
- {
123
- String table = "TEST1";
124
-
125
- dropTable(table);
126
- createTable(table);
127
- insertRecord(table);
128
-
129
- test("/sqlserver/yml/test-replace.yml");
130
-
131
- assertGeneratedTable(table);
132
- }
133
-
134
- @Test
135
- public void testReplaceLongName() throws Exception
136
- {
137
- String table = "TEST___A123456789B123456789C123456789D123456789E123456789F123456789G123456789H123456789I123456789J123456789K123456789L123456789";
138
- assertEquals(127, table.length());
139
-
140
- dropTable(table);
141
- createTable(table);
142
- insertRecord(table);
143
-
144
- test("/sqlserver/yml/test-replace-long-name.yml");
145
-
146
- assertGeneratedTable(table);
147
- }
148
-
149
- @Test
150
- public void testReplaceCreate() throws Exception
151
- {
152
- String table = "TEST1";
153
-
154
- dropTable(table);
155
-
156
- test("/sqlserver/yml/test-replace.yml");
157
-
158
- assertGeneratedTable(table);
159
- }
160
-
161
- @Test
162
- public void testStringToTimestamp() throws Exception
163
- {
164
- String table = "TEST1";
165
-
166
- dropTable(table);
167
- createTable(table);
168
- insertRecord(table);
169
-
170
- test("/sqlserver/yml/test-string-timestamp.yml");
171
-
172
- assertTable(1, table, true);
173
- }
174
-
175
- @Test
176
- public void testNativeString() throws Exception
177
- {
178
- if (!enabled) {
179
- return;
180
- }
181
-
182
- String table = "TEST2";
183
-
184
- dropTable(table);
185
- executeSQL(String.format("CREATE TABLE %S (ITEM1 CHAR(4), ITEM2 VARCHAR(8), ITEM3 TEXT, ITEM4 NCHAR(4), ITEM5 NVARCHAR(8), ITEM6 NTEXT)", table));
186
-
187
- test("/sqlserver/yml/test-native-string.yml");
188
-
189
- List<List<Object>> rows = select(table);
190
- assertEquals(2, rows.size());
191
- {
192
- List<Object> row = rows.get(0);
193
- assertEquals("A001", row.get(0));
194
- assertEquals("TEST", row.get(1));
195
- assertEquals("A", row.get(2));
196
- assertEquals("あいうえ", row.get(3));
197
- assertEquals("あいうえおかきく", row.get(4));
198
- assertEquals("あいうえお", row.get(5));
199
- }
200
- {
201
- List<Object> row = rows.get(1);
202
- assertEquals("A002", row.get(0));
203
- assertEquals(null, row.get(1));
204
- assertEquals(null, row.get(2));
205
- assertEquals(null, row.get(3));
206
- assertEquals(null, row.get(4));
207
- assertEquals(null, row.get(5));
208
- }
209
- }
210
-
211
- @Test
212
- public void testNativeInteger() throws Exception
213
- {
214
- if (!enabled) {
215
- return;
216
- }
217
-
218
- String table = "TEST3";
219
-
220
- dropTable(table);
221
- executeSQL(String.format("CREATE TABLE %S (ITEM1 TINYINT, ITEM2 SMALLINT, ITEM3 INT, ITEM4 BIGINT, ITEM5 BIT)", table));
222
-
223
- test("/sqlserver/yml/test-native-integer.yml");
224
-
225
- List<List<Object>> rows = select(table);
226
- assertEquals(2, rows.size());
227
- {
228
- List<Object> row = rows.get(0);
229
- assertEquals((short)1, row.get(0));
230
- assertEquals((short)1111, row.get(1));
231
- assertEquals(11111111, row.get(2));
232
- assertEquals(111111111111L, row.get(3));
233
- assertEquals(true, row.get(4));
234
- }
235
- {
236
- List<Object> row = rows.get(1);
237
- assertEquals((short)2, row.get(0));
238
- assertEquals(null, row.get(1));
239
- assertEquals(null, row.get(2));
240
- assertEquals(null, row.get(3));
241
- assertEquals(null, row.get(4));
242
- }
243
- }
244
-
245
- @Test
246
- public void testNativeDecimal() throws Exception
247
- {
248
- if (!enabled) {
249
- return;
250
- }
251
-
252
- String table = "TEST4";
253
-
254
- dropTable(table);
255
- executeSQL(String.format("CREATE TABLE %S (ITEM1 DECIMAL(20,2), ITEM2 NUMERIC(20,2), ITEM3 SMALLMONEY, ITEM4 MONEY, ITEM5 REAL, ITEM6 FLOAT)", table));
256
-
257
- test("/sqlserver/yml/test-native-decimal.yml");
258
-
259
- List<List<Object>> rows = select(table);
260
- assertEquals(2, rows.size());
261
- {
262
- List<Object> row = rows.get(0);
263
- assertEquals(new BigDecimal("1.20"), row.get(0));
264
- assertEquals(new BigDecimal("12345678901234567.89"), row.get(1));
265
- assertEquals(new BigDecimal("123.4500"), row.get(2));
266
- assertEquals(new BigDecimal("678.9000"), row.get(3));
267
- assertEquals(0.01234F, row.get(4));
268
- assertEquals(0.05678D, row.get(5));
269
- }
270
- {
271
- List<Object> row = rows.get(1);
272
- assertEquals(new BigDecimal("2.30"), row.get(0));
273
- assertEquals(null, row.get(1));
274
- assertEquals(null, row.get(2));
275
- assertEquals(null, row.get(3));
276
- assertEquals(null, row.get(4));
277
- assertEquals(null, row.get(5));
278
- }
279
- }
280
-
281
- @Test
282
- public void testNativeDate() throws Exception
283
- {
284
- if (!enabled) {
285
- return;
286
- }
287
-
288
- String table = "TEST5";
289
-
290
- dropTable(table);
291
- executeSQL(String.format("CREATE TABLE %S (ITEM1 DATE, ITEM2 SMALLDATETIME, ITEM3 DATETIME, ITEM4 DATETIME2, ITEM5 DATETIME2(2), ITEM6 TIME, ITEM7 TIME(2))", table));
292
-
293
- test("/sqlserver/yml/test-native-date.yml");
294
-
295
- List<List<Object>> rows = select(table);
296
- assertEquals(2, rows.size());
297
- {
298
- List<Object> row = rows.get(0);
299
- assertEquals(createDate("2016/01/23"), row.get(0));
300
- assertEquals(createTimestamp("2016/01/24 11:23:00", 0), row.get(1));
301
- assertEquals(createTimestamp("2016/01/25 11:22:33", 457000000), row.get(2));
302
- // Embulk timestamp doesn't support values under microseconds.
303
- assertEquals(createTimestamp("2016/01/26 11:22:33", 123456000), row.get(3));
304
- assertEquals(createTimestamp("2016/01/27 11:22:33", 890000000), row.get(4));
305
- // Embulk timestamp doesn't support values under microseconds.
306
- assertEquals(createTime("11:22:33", 123456000), row.get(5));
307
- assertEquals(createTime("11:22:33", 890000000), row.get(6));
308
- }
309
- {
310
- List<Object> row = rows.get(1);
311
- assertEquals(null, row.get(0));
312
- assertEquals(null, row.get(1));
313
- assertEquals(null, row.get(2));
314
- assertEquals(null, row.get(3));
315
- assertEquals(null, row.get(4));
316
- assertEquals(null, row.get(5));
317
- assertEquals(null, row.get(6));
318
- }
319
- }
320
-
321
- @Test
322
- public void testNative() throws Exception
323
- {
324
- String table = "TEST1";
325
-
326
- dropTable(table);
327
- createTable(table);
328
- insertRecord(table);
329
-
330
- test("/sqlserver/yml/test-native.yml");
331
-
332
- assertTable(1, table);
333
- }
334
-
335
- @Test
336
- public void testJtds() throws Exception
337
- {
338
- useJtdsDriver = true;
339
- try {
340
- connect();
341
- } catch (Throwable t) {
342
- System.out.println(t);
343
- System.out.println("Warning: jTDS driver can't connect to database.");
344
- System.out.println(String.format(ENGLISH, "(server = %s, port = %d, database = %s, user = %s, password = %s)",
345
- getHost(), getPort(), getDatabase(), getUser(), getPassword()));
346
- return;
347
- }
348
-
349
- try {
350
- String table = "TEST1";
351
- dropTable(table);
352
- createTable(table);
353
- insertRecord(table);
354
- test("/sqlserver/yml/test-jtds.yml");
355
- assertTableJtds(1, table);
356
- } finally {
357
- useJtdsDriver = false;
358
- }
359
- }
360
-
361
- @Test
362
- public void testMerge() throws Exception
363
- {
364
- if (!enabled) {
365
- return;
366
- }
367
-
368
- String table = "TEST6";
369
-
370
- dropTable(table);
371
- executeSQL(String.format("CREATE TABLE %S (ITEM1 INT, ITEM2 INT, ITEM3 VARCHAR(4), PRIMARY KEY(ITEM1, ITEM2))", table));
372
- executeSQL(String.format("INSERT INTO %S VALUES(10, 20, 'A')", table));
373
- executeSQL(String.format("INSERT INTO %S VALUES(10, 21, 'B')", table));
374
- executeSQL(String.format("INSERT INTO %S VALUES(11, 20, 'C')", table));
375
-
376
- test("/sqlserver/yml/test-merge.yml");
377
-
378
- assertMergedTable(table);
379
- }
380
-
381
- @Test
382
- public void testMergeWithKeys() throws Exception
383
- {
384
- if (!enabled) {
385
- return;
386
- }
387
-
388
- String table = "TEST6b";
389
-
390
- dropTable(table);
391
- executeSQL(String.format("CREATE TABLE %S (ITEM1 INT, ITEM2 INT, ITEM3 VARCHAR(4))", table));
392
- executeSQL(String.format("INSERT INTO %S VALUES(10, 20, 'A')", table));
393
- executeSQL(String.format("INSERT INTO %S VALUES(10, 21, 'B')", table));
394
- executeSQL(String.format("INSERT INTO %S VALUES(11, 20, 'C')", table));
395
-
396
- test("/sqlserver/yml/test-merge-keys.yml");
397
-
398
- assertMergedTable(table);
399
- }
400
-
401
- @Test
402
- public void testMergeWithRule() throws Exception
403
- {
404
- if (!enabled) {
405
- return;
406
- }
407
-
408
- String table = "TEST6";
409
-
410
- dropTable(table);
411
- executeSQL(String.format("CREATE TABLE %S (ITEM1 INT, ITEM2 INT, ITEM3 VARCHAR(4), PRIMARY KEY(ITEM1, ITEM2))", table));
412
- executeSQL(String.format("INSERT INTO %S VALUES(10, 20, 'A')", table));
413
- executeSQL(String.format("INSERT INTO %S VALUES(10, 21, 'B')", table));
414
- executeSQL(String.format("INSERT INTO %S VALUES(11, 20, 'C')", table));
415
-
416
- test("/sqlserver/yml/test-merge-rule.yml");
417
-
418
- List<List<Object>> rows = select(table);
419
- assertEquals(6, rows.size());
420
- {
421
- List<Object> row = rows.get(0);
422
- assertEquals(Integer.valueOf(10), row.get(0));
423
- assertEquals(Integer.valueOf(20), row.get(1));
424
- assertEquals("A", row.get(2));
425
- }
426
- {
427
- List<Object> row = rows.get(1);
428
- assertEquals(Integer.valueOf(10), row.get(0));
429
- assertEquals(Integer.valueOf(21), row.get(1));
430
- assertEquals("Baa", row.get(2));
431
- }
432
- {
433
- List<Object> row = rows.get(2);
434
- assertEquals(Integer.valueOf(10), row.get(0));
435
- assertEquals(Integer.valueOf(22), row.get(1));
436
- assertEquals("dd", row.get(2));
437
- }
438
- {
439
- List<Object> row = rows.get(3);
440
- assertEquals(Integer.valueOf(11), row.get(0));
441
- assertEquals(Integer.valueOf(10), row.get(1));
442
- assertEquals("bb", row.get(2));
443
- }
444
- {
445
- List<Object> row = rows.get(4);
446
- assertEquals(Integer.valueOf(11), row.get(0));
447
- assertEquals(Integer.valueOf(20), row.get(1));
448
- assertEquals("C", row.get(2));
449
- }
450
- {
451
- List<Object> row = rows.get(5);
452
- assertEquals(Integer.valueOf(12), row.get(0));
453
- assertEquals(Integer.valueOf(20), row.get(1));
454
- assertEquals("cc", row.get(2));
455
- }
456
- }
457
-
458
- private void assertMergedTable(String table) throws Exception
459
- {
460
- List<List<Object>> rows = select(table);
461
- assertEquals(6, rows.size());
462
- {
463
- List<Object> row = rows.get(0);
464
- assertEquals(Integer.valueOf(10), row.get(0));
465
- assertEquals(Integer.valueOf(20), row.get(1));
466
- assertEquals("A", row.get(2));
467
- }
468
- {
469
- List<Object> row = rows.get(1);
470
- assertEquals(Integer.valueOf(10), row.get(0));
471
- assertEquals(Integer.valueOf(21), row.get(1));
472
- assertEquals("aa", row.get(2));
473
- }
474
- {
475
- List<Object> row = rows.get(2);
476
- assertEquals(Integer.valueOf(10), row.get(0));
477
- assertEquals(Integer.valueOf(22), row.get(1));
478
- assertEquals("dd", row.get(2));
479
- }
480
- {
481
- List<Object> row = rows.get(3);
482
- assertEquals(Integer.valueOf(11), row.get(0));
483
- assertEquals(Integer.valueOf(10), row.get(1));
484
- assertEquals("bb", row.get(2));
485
- }
486
- {
487
- List<Object> row = rows.get(4);
488
- assertEquals(Integer.valueOf(11), row.get(0));
489
- assertEquals(Integer.valueOf(20), row.get(1));
490
- assertEquals("C", row.get(2));
491
- }
492
- {
493
- List<Object> row = rows.get(5);
494
- assertEquals(Integer.valueOf(12), row.get(0));
495
- assertEquals(Integer.valueOf(20), row.get(1));
496
- assertEquals("cc", row.get(2));
497
- }
498
- }
499
-
500
-
501
- private void assertTable(int skip, String table) throws Exception
502
- {
503
- assertTable(skip, table, false);
504
- }
505
-
506
- private void assertTableJtds(int skip, String table) throws Exception
507
- {
508
- List<List<Object>> rows = select(table);
509
- assertEquals(skip + 3, rows.size());
510
- rows = rows.subList(skip, skip + 3);
511
-
512
- Iterator<List<Object>> i1 = rows.iterator();
513
- {
514
- Iterator<Object> i2 = i1.next().iterator();
515
- assertEquals("A001", i2.next());
516
- assertEquals(0, i2.next());
517
- assertEquals(1234, i2.next());
518
- assertEquals(123456, i2.next());
519
- assertEquals(12345678901L, i2.next());
520
- assertEquals(false, i2.next());
521
- assertEquals(new BigDecimal("1.23"), i2.next());
522
- assertEquals(new BigDecimal("3.456"), i2.next());
523
- assertEquals(new BigDecimal("12.3400"), i2.next());
524
- assertEquals(new BigDecimal("123.4567"), i2.next());
525
- assertEquals(Float.valueOf(0.1234567F), i2.next());
526
- assertEquals(Double.valueOf(0.12345678901234D), i2.next());
527
- assertEquals("a ", i2.next());
528
- assertEquals("b", i2.next());
529
- assertEquals("c", i2.next());
530
- assertEquals("A ", i2.next());
531
- assertEquals("B", i2.next());
532
- assertEquals("C", i2.next());
533
- assertEquals("2016-01-01", i2.next());
534
- assertEquals(createTimestamp("2017/01/01 01:02:03", 123000000), i2.next());
535
- // Embulk timestamp doesn't support values under microseconds.
536
- assertEquals("2018-01-01 01:02:03.1234560", i2.next().toString());
537
-
538
- assertEquals(createTimestamp("2019/01/01 01:02:03", 120000000).toString(), i2.next());
539
- assertEquals(createTimestamp("2020/01/01 01:02:00", 0), i2.next());
540
-
541
- // Embulk timestamp doesn't support values under microseconds.
542
- assertEquals("03:04:05.1234560", i2.next().toString());
543
- assertEquals("06:07:08.12", i2.next().toString());
544
- }
545
- {
546
- Iterator<Object> i2 = i1.next().iterator();
547
- assertEquals("A002", i2.next());
548
- assertEquals(255, i2.next());
549
- assertEquals(-32768, i2.next());
550
- assertEquals(-2147483648, i2.next());
551
- assertEquals(-9223372036854775808L, i2.next());
552
- assertEquals(true, i2.next());
553
- assertEquals(new BigDecimal("-9999999999.99"), i2.next());
554
- assertEquals(new BigDecimal("-99.999"), i2.next());
555
- assertEquals(new BigDecimal("-214748.3648"), i2.next());
556
- assertEquals(new BigDecimal("-922337203685477.5808"), i2.next());
557
- assertEquals(Float.valueOf(-9999000000F), i2.next());
558
- assertEquals(Double.valueOf(-999999999999000000D), i2.next());
559
- // char, varchar, text don't be capable on Unicode chars
560
- //assertEquals("あい", i2.next());
561
- i2.next();
562
- //assertEquals("あいうえ", i2.next());
563
- i2.next();
564
- //assertEquals("あいうえお", i2.next());
565
- i2.next();
566
-
567
- // nchar, nvarcar, ntext
568
- assertEquals("かき ", i2.next());
569
- assertEquals("かきくけ", i2.next());
570
- assertEquals("かきくけこ", i2.next());
571
-
572
- assertEquals("2016-12-31", i2.next());
573
- assertEquals(createTimestamp("2017/12/31 23:59:59", 997000000), i2.next());
574
- // Embulk timestamp doesn't support values under microseconds.
575
- assertEquals("2018-12-31 23:59:59.9999990", i2.next().toString());
576
- assertEquals(createTimestamp("2019/12/31 23:59:59", 990000000).toString(), i2.next());
577
- assertEquals(createTimestamp("2021/01/01 00:00:00", 0), i2.next());
578
- // Embulk timestamp doesn't support values under microseconds.
579
- assertEquals("23:59:59.9999990", i2.next().toString());
580
- assertEquals("23:59:59.99", i2.next().toString());
581
- }
582
- {
583
- Iterator<Object> i2 = i1.next().iterator();
584
- assertEquals("A003", i2.next());
585
- assertEquals(null, i2.next());
586
- assertEquals(null, i2.next());
587
- assertEquals(null, i2.next());
588
- assertEquals(null, i2.next());
589
- assertEquals(null, i2.next());
590
- assertEquals(null, i2.next());
591
- assertEquals(null, i2.next());
592
- assertEquals(null, i2.next());
593
- assertEquals(null, i2.next());
594
- assertEquals(null, i2.next());
595
- assertEquals(null, i2.next());
596
- assertEquals(null, i2.next());
597
- assertEquals(null, i2.next());
598
- assertEquals(null, i2.next());
599
- assertEquals(null, i2.next());
600
- assertEquals(null, i2.next());
601
- assertEquals(null, i2.next());
602
- assertEquals(null, i2.next());
603
- assertEquals(null, i2.next());
604
- assertEquals(null, i2.next());
605
- assertEquals(null, i2.next());
606
- assertEquals(null, i2.next());
607
- assertEquals(null, i2.next());
608
- }
609
- }
610
-
611
- private void assertTable(int skip, String table, boolean precise) throws Exception
612
- {
613
- if (!enabled) {
614
- return;
615
- }
616
-
617
- List<List<Object>> rows = select(table);
618
- assertEquals(skip + 3, rows.size());
619
- rows = rows.subList(skip, skip + 3);
620
-
621
- Iterator<List<Object>> i1 = rows.iterator();
622
- {
623
- Iterator<Object> i2 = i1.next().iterator();
624
- assertEquals("A001", i2.next());
625
- assertEquals((short)0, i2.next());
626
- assertEquals((short)1234, i2.next());
627
- assertEquals(123456, i2.next());
628
- assertEquals(12345678901L, i2.next());
629
- assertEquals(false, i2.next());
630
- assertEquals(new BigDecimal("1.23"), i2.next());
631
- assertEquals(new BigDecimal("3.456"), i2.next());
632
- assertEquals(new BigDecimal("12.3400"), i2.next());
633
- assertEquals(new BigDecimal("123.4567"), i2.next());
634
- assertEquals(Float.valueOf(0.1234567F), i2.next());
635
- assertEquals(Double.valueOf(0.12345678901234D), i2.next());
636
- assertEquals("a ", i2.next());
637
- assertEquals("b", i2.next());
638
- assertEquals("c", i2.next());
639
- assertEquals("A ", i2.next());
640
- assertEquals("B", i2.next());
641
- assertEquals("C", i2.next());
642
- assertEquals(createDate("2016/01/01"), i2.next());
643
- assertEquals(createTimestamp("2017/01/01 01:02:03", 123000000), i2.next());
644
- // Embulk timestamp doesn't support values under microseconds.
645
- assertEquals(createTimestamp("2018/01/01 01:02:03", precise? 123456700 : 123456000), i2.next());
646
- assertEquals(createTimestamp("2019/01/01 01:02:03", 120000000), i2.next());
647
- assertEquals(createTimestamp("2020/01/01 01:02:00", 0), i2.next());
648
- // Embulk timestamp doesn't support values under microseconds.
649
- assertEquals(createTime("03:04:05", precise? 123456700 : 123456000), i2.next());
650
- assertEquals(createTime("06:07:08", 120000000), i2.next());
651
- }
652
- {
653
- Iterator<Object> i2 = i1.next().iterator();
654
- assertEquals("A002", i2.next());
655
- assertEquals((short)255, i2.next());
656
- assertEquals((short)-32768, i2.next());
657
- assertEquals(-2147483648, i2.next());
658
- assertEquals(-9223372036854775808L, i2.next());
659
- assertEquals(true, i2.next());
660
- assertEquals(new BigDecimal("-9999999999.99"), i2.next());
661
- assertEquals(new BigDecimal("-99.999"), i2.next());
662
- assertEquals(new BigDecimal("-214748.3648"), i2.next());
663
- assertEquals(new BigDecimal("-922337203685477.5808"), i2.next());
664
- assertEquals(Float.valueOf(-9999000000F), i2.next());
665
- assertEquals(Double.valueOf(-999999999999000000D), i2.next());
666
- assertEquals("あい", i2.next());
667
- assertEquals("あいうえ", i2.next());
668
- assertEquals("あいうえお", i2.next());
669
- assertEquals("かき ", i2.next());
670
- assertEquals("かきくけ", i2.next());
671
- assertEquals("かきくけこ", i2.next());
672
- assertEquals(createDate("2016/12/31"), i2.next());
673
- assertEquals(createTimestamp("2017/12/31 23:59:59", 997000000), i2.next());
674
- // Embulk timestamp doesn't support values under microseconds.
675
- assertEquals(createTimestamp("2018/12/31 23:59:59", precise? 999999900 : 999999000), i2.next());
676
- assertEquals(createTimestamp("2019/12/31 23:59:59", 990000000), i2.next());
677
- assertEquals(createTimestamp("2021/01/01 00:00:00", 0), i2.next());
678
- // Embulk timestamp doesn't support values under microseconds.
679
- assertEquals(createTime("23:59:59", precise? 999999900 : 999999000), i2.next());
680
- assertEquals(createTime("23:59:59", 990000000), i2.next());
681
- }
682
- {
683
- Iterator<Object> i2 = i1.next().iterator();
684
- assertEquals("A003", i2.next());
685
- assertEquals(null, i2.next());
686
- assertEquals(null, i2.next());
687
- assertEquals(null, i2.next());
688
- assertEquals(null, i2.next());
689
- assertEquals(null, i2.next());
690
- assertEquals(null, i2.next());
691
- assertEquals(null, i2.next());
692
- assertEquals(null, i2.next());
693
- assertEquals(null, i2.next());
694
- assertEquals(null, i2.next());
695
- assertEquals(null, i2.next());
696
- assertEquals(null, i2.next());
697
- assertEquals(null, i2.next());
698
- assertEquals(null, i2.next());
699
- assertEquals(null, i2.next());
700
- assertEquals(null, i2.next());
701
- assertEquals(null, i2.next());
702
- assertEquals(null, i2.next());
703
- assertEquals(null, i2.next());
704
- assertEquals(null, i2.next());
705
- assertEquals(null, i2.next());
706
- assertEquals(null, i2.next());
707
- assertEquals(null, i2.next());
708
- }
709
- }
710
-
711
- private void assertGeneratedTable(String table) throws Exception
712
- {
713
- if (!enabled) {
714
- return;
715
- }
716
-
717
- List<List<Object>> rows = select(table);
718
- assertEquals(3, rows.size());
719
-
720
- Iterator<List<Object>> i1 = rows.iterator();
721
- {
722
- Iterator<Object> i2 = i1.next().iterator();
723
- assertEquals("A001", i2.next());
724
- assertEquals(Long.valueOf(0), i2.next());
725
- assertEquals(Long.valueOf(1234), i2.next());
726
- assertEquals(Long.valueOf(123456), i2.next());
727
- assertEquals(Long.valueOf(12345678901L), i2.next());
728
- assertEquals(Boolean.FALSE, i2.next());
729
- assertEquals("1.23", i2.next());
730
- assertEquals("3.456", i2.next());
731
- assertEquals("12.34", i2.next());
732
- assertEquals("123.4567", i2.next());
733
- assertEquals(Double.valueOf(0.1234567D), i2.next());
734
- assertEquals(Double.valueOf(0.12345678901234D), i2.next());
735
- assertEquals("a", i2.next());
736
- assertEquals("b", i2.next());
737
- assertEquals("c", i2.next());
738
- assertEquals("A", i2.next());
739
- assertEquals("B", i2.next());
740
- assertEquals("C", i2.next());
741
- assertEquals(createTimestamp("2016/01/01 00:00:00", 0), i2.next());
742
- assertEquals(createTimestamp("2017/01/01 01:02:03", 123000000), i2.next());
743
- // Embulk timestamp doesn't support values under microseconds.
744
- //assertEquals(createTimestamp("2018/01/01 01:02:03", 123456700), i2.next());
745
- assertEquals(createTimestamp("2018/01/01 01:02:03", 123456000), i2.next());
746
- assertEquals(createTimestamp("2019/01/01 01:02:03", 120000000), i2.next());
747
- assertEquals(createTimestamp("2020/01/01 01:02:03", 0), i2.next());
748
- // Embulk timestamp doesn't support values under microseconds.
749
- //assertEquals(createTime("03:04:05", 123456700), new PreciseTime((Timestamp)i2.next()));
750
- assertEquals(createTime("03:04:05", 123456000), new PreciseTime((Timestamp)i2.next()));
751
- assertEquals(createTime("06:07:08", 120000000), new PreciseTime((Timestamp)i2.next()));
752
- }
753
- {
754
- Iterator<Object> i2 = i1.next().iterator();
755
- assertEquals("A002", i2.next());
756
- assertEquals(Long.valueOf((short)255), i2.next());
757
- assertEquals(Long.valueOf((short)-32768), i2.next());
758
- assertEquals(Long.valueOf(-2147483648), i2.next());
759
- assertEquals(Long.valueOf(-9223372036854775808L), i2.next());
760
- assertEquals(Boolean.TRUE, i2.next());
761
- assertEquals("-9999999999.99", i2.next());
762
- assertEquals("-99.999", i2.next());
763
- assertEquals("-214748.3648", i2.next());
764
- assertEquals("-922337203685477.5808", i2.next());
765
- assertEquals(Double.valueOf(-9999000000D), i2.next());
766
- assertEquals(Double.valueOf(-999999999999000000D), i2.next());
767
- assertEquals("あい", i2.next());
768
- assertEquals("あいうえ", i2.next());
769
- assertEquals("あいうえお", i2.next());
770
- assertEquals("かき", i2.next());
771
- assertEquals("かきくけ", i2.next());
772
- assertEquals("かきくけこ", i2.next());
773
- assertEquals(createTimestamp("2016/12/31 00:00:00", 0), i2.next());
774
- assertEquals(createTimestamp("2017/12/31 23:59:59", 997000000), i2.next());
775
- // Embulk timestamp doesn't support values under microseconds.
776
- //assertEquals(createTimestamp("2018/12/31 23:59:59", 999999900), i2.next());
777
- assertEquals(createTimestamp("2018/12/31 23:59:59", 999999000), i2.next());
778
- assertEquals(createTimestamp("2019/12/31 23:59:59", 990000000), i2.next());
779
- assertEquals(createTimestamp("2020/12/31 23:59:59", 0), i2.next());
780
- // Embulk timestamp doesn't support values under microseconds.
781
- //assertEquals(createTime("23:59:59", 999999900), new PreciseTime((Timestamp)i2.next()));
782
- assertEquals(createTime("23:59:59", 999999000), new PreciseTime((Timestamp)i2.next()));
783
- assertEquals(createTime("23:59:59", 990000000), new PreciseTime((Timestamp)i2.next()));
784
- }
785
- {
786
- Iterator<Object> i2 = i1.next().iterator();
787
- assertEquals("A003", i2.next());
788
- assertEquals(null, i2.next());
789
- assertEquals(null, i2.next());
790
- assertEquals(null, i2.next());
791
- assertEquals(null, i2.next());
792
- assertEquals(null, i2.next());
793
- assertEquals(null, i2.next());
794
- assertEquals(null, i2.next());
795
- assertEquals(null, i2.next());
796
- assertEquals(null, i2.next());
797
- assertEquals(null, i2.next());
798
- assertEquals(null, i2.next());
799
- assertEquals(null, i2.next());
800
- assertEquals(null, i2.next());
801
- assertEquals(null, i2.next());
802
- assertEquals(null, i2.next());
803
- assertEquals(null, i2.next());
804
- assertEquals(null, i2.next());
805
- assertEquals(null, i2.next());
806
- assertEquals(null, i2.next());
807
- assertEquals(null, i2.next());
808
- assertEquals(null, i2.next());
809
- assertEquals(null, i2.next());
810
- assertEquals(null, i2.next());
811
- assertEquals(null, i2.next());
812
- }
813
- }
814
-
815
- @Override
816
- protected Object getValue(ResultSet resultSet, int index) throws SQLException {
817
- if (resultSet.getMetaData().getColumnTypeName(index).equals("time")) {
818
- Timestamp timestamp = resultSet.getTimestamp(index);
819
- if (timestamp == null) {
820
- return null;
821
- }
822
- return new PreciseTime(timestamp);
823
- }
824
- return super.getValue(resultSet, index);
825
- }
826
-
827
- private java.sql.Date createDate(String s) throws ParseException
828
- {
829
- DateFormat format = new SimpleDateFormat("yyyy/MM/dd");
830
- Date date = format.parse(s);
831
- return new java.sql.Date(date.getTime());
832
- }
833
-
834
- private Timestamp createTimestamp(String s, int nanos) throws ParseException
835
- {
836
- DateFormat format = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss");
837
- Date date = format.parse(s);
838
- Timestamp timestamp = new Timestamp(date.getTime());
839
- timestamp.setNanos(nanos);
840
- return timestamp;
841
- }
842
-
843
- private PreciseTime createTime(String s, int nanos) throws ParseException
844
- {
845
- DateFormat format = new SimpleDateFormat("HH:mm:ss");
846
- Date date = format.parse(s);
847
- return new PreciseTime(date.getTime(), nanos);
848
- }
849
-
850
- private void createTable(String table) throws SQLException
851
- {
852
- String sql = String.format("CREATE TABLE %s ("
853
- + "ID CHAR(4),"
854
- + "TINYINT_ITEM TINYINT,"
855
- + "SMALLINT_ITEM SMALLINT,"
856
- + "INT_ITEM INT,"
857
- + "BIGINT_ITEM BIGINT,"
858
- + "BIT_ITEM BIT,"
859
- + "DECIMAL_ITEM DECIMAL(12,2),"
860
- + "NUMERIC_ITEM NUMERIC(5,3),"
861
- + "SMALLMONEY_ITEM SMALLMONEY,"
862
- + "MONEY_ITEM MONEY,"
863
- + "REAL_ITEM REAL,"
864
- + "FLOAT_ITEM FLOAT,"
865
- + "CHAR_ITEM CHAR(4),"
866
- + "VARCHAR_ITEM VARCHAR(8),"
867
- + "TEXT_ITEM TEXT,"
868
- + "NCHAR_ITEM NCHAR(4),"
869
- + "NVARCHAR_ITEM NVARCHAR(8),"
870
- + "NTEXT_ITEM NTEXT,"
871
- + "DATE_ITEM DATE,"
872
- + "DATETIME_ITEM DATETIME,"
873
- + "DATETIME2_ITEM DATETIME2,"
874
- + "DATETIME2_2_ITEM DATETIME2(2),"
875
- + "SMALLDATETIME_ITEM SMALLDATETIME,"
876
- + "TIME_ITEM TIME,"
877
- + "TIME_2_ITEM TIME(2),"
878
- + "PRIMARY KEY (ID))", table);
879
- executeSQL(sql);
880
- }
881
-
882
- private void insertRecord(String table) throws SQLException
883
- {
884
- executeSQL(String.format("INSERT INTO %s VALUES('9999',"
885
- + "NULL,"
886
- + "NULL,"
887
- + "NULL,"
888
- + "NULL,"
889
- + "NULL,"
890
- + "NULL,"
891
- + "NULL,"
892
- + "NULL,"
893
- + "NULL,"
894
- + "NULL,"
895
- + "NULL,"
896
- + "NULL,"
897
- + "NULL,"
898
- + "NULL,"
899
- + "NULL,"
900
- + "NULL,"
901
- + "NULL,"
902
- + "NULL,"
903
- + "NULL,"
904
- + "NULL,"
905
- + "NULL,"
906
- + "NULL,"
907
- + "NULL,"
908
- + "NULL)", table));
909
- }
910
-
911
- @Override
912
- protected Connection connect() throws SQLException
913
- {
914
- String url;
915
- if(useJtdsDriver) {
916
- url = "jdbc:jtds:sqlserver://%s:%d/%s;useLOBs=false";
917
- } else {
918
- url = "jdbc:sqlserver://%s:%d;databasename=%s";
919
- }
920
- return DriverManager.getConnection(String.format(ENGLISH, url, getHost(), getPort(), getDatabase()), getUser(), getPassword());
921
- }
922
-
923
- }