embulk-output-sqlserver 0.5.0 → 0.5.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +14 -3
- data/classpath/{embulk-output-jdbc-0.5.0.jar → embulk-output-jdbc-0.5.1.jar} +0 -0
- data/classpath/embulk-output-sqlserver-0.5.1.jar +0 -0
- data/src/main/java/org/embulk/output/SQLServerOutputPlugin.java +22 -4
- data/src/main/java/org/embulk/output/sqlserver/InsertMethod.java +32 -0
- data/src/main/java/org/embulk/output/sqlserver/NativeBatchInsert.java +247 -0
- data/src/main/java/org/embulk/output/sqlserver/SmallDateTimeFormat.java +31 -0
- data/src/main/java/org/embulk/output/sqlserver/nativeclient/NativeClient.java +33 -0
- data/src/main/java/org/embulk/output/sqlserver/nativeclient/NativeClientWrapper.java +442 -0
- data/src/main/java/org/embulk/output/sqlserver/nativeclient/ODBC.java +47 -0
- data/src/test/java/org/embulk/output/sqlserver/SQLServerOutputPluginTest.java +174 -10
- data/src/test/resources/sqlserver/data/test2/test2.csv +2 -0
- data/src/test/resources/sqlserver/data/test3/test3.csv +2 -0
- data/src/test/resources/sqlserver/data/test4/test4.csv +2 -0
- data/src/test/resources/sqlserver/data/test5/test5.csv +2 -0
- data/src/test/resources/sqlserver/yml/test-native-date.yml +26 -0
- data/src/test/resources/sqlserver/yml/test-native-decimal.yml +25 -0
- data/src/test/resources/sqlserver/yml/test-native-integer.yml +24 -0
- data/src/test/resources/sqlserver/yml/test-native-string.yml +25 -0
- data/src/test/resources/sqlserver/yml/test-native.yml +44 -0
- metadata +19 -4
- data/classpath/embulk-output-sqlserver-0.5.0.jar +0 -0
@@ -204,6 +204,170 @@ public class SQLServerOutputPluginTest extends AbstractJdbcOutputPluginTest
|
|
204
204
|
assertTable(1, table, true);
|
205
205
|
}
|
206
206
|
|
207
|
+
@Test
|
208
|
+
public void testNativeString() throws Exception
|
209
|
+
{
|
210
|
+
if (!canTest) {
|
211
|
+
return;
|
212
|
+
}
|
213
|
+
|
214
|
+
String table = "TEST2";
|
215
|
+
|
216
|
+
dropTable(table);
|
217
|
+
executeSQL(String.format("CREATE TABLE %S (ITEM1 CHAR(4), ITEM2 VARCHAR(8), ITEM3 TEXT, ITEM4 NCHAR(4), ITEM5 NVARCHAR(8), ITEM6 NTEXT)", table));
|
218
|
+
|
219
|
+
tester.run(convertYml("/sqlserver/yml/test-native-string.yml"));
|
220
|
+
|
221
|
+
List<List<Object>> rows = select(table);
|
222
|
+
assertEquals(2, rows.size());
|
223
|
+
{
|
224
|
+
List<Object> row = rows.get(0);
|
225
|
+
assertEquals("A001", row.get(0));
|
226
|
+
assertEquals("TEST", row.get(1));
|
227
|
+
assertEquals("A", row.get(2));
|
228
|
+
assertEquals("あいうえ", row.get(3));
|
229
|
+
assertEquals("あいうえおかきく", row.get(4));
|
230
|
+
assertEquals("あいうえお", row.get(5));
|
231
|
+
}
|
232
|
+
{
|
233
|
+
List<Object> row = rows.get(1);
|
234
|
+
assertEquals("A002", row.get(0));
|
235
|
+
assertEquals(null, row.get(1));
|
236
|
+
assertEquals(null, row.get(2));
|
237
|
+
assertEquals(null, row.get(3));
|
238
|
+
assertEquals(null, row.get(4));
|
239
|
+
assertEquals(null, row.get(5));
|
240
|
+
}
|
241
|
+
}
|
242
|
+
|
243
|
+
@Test
|
244
|
+
public void testNativeInteger() throws Exception
|
245
|
+
{
|
246
|
+
if (!canTest) {
|
247
|
+
return;
|
248
|
+
}
|
249
|
+
|
250
|
+
String table = "TEST3";
|
251
|
+
|
252
|
+
dropTable(table);
|
253
|
+
executeSQL(String.format("CREATE TABLE %S (ITEM1 TINYINT, ITEM2 SMALLINT, ITEM3 INT, ITEM4 BIGINT, ITEM5 BIT)", table));
|
254
|
+
|
255
|
+
tester.run(convertYml("/sqlserver/yml/test-native-integer.yml"));
|
256
|
+
|
257
|
+
List<List<Object>> rows = select(table);
|
258
|
+
assertEquals(2, rows.size());
|
259
|
+
{
|
260
|
+
List<Object> row = rows.get(0);
|
261
|
+
assertEquals((short)1, row.get(0));
|
262
|
+
assertEquals((short)1111, row.get(1));
|
263
|
+
assertEquals(11111111, row.get(2));
|
264
|
+
assertEquals(111111111111L, row.get(3));
|
265
|
+
assertEquals(true, row.get(4));
|
266
|
+
}
|
267
|
+
{
|
268
|
+
List<Object> row = rows.get(1);
|
269
|
+
assertEquals((short)2, row.get(0));
|
270
|
+
assertEquals(null, row.get(1));
|
271
|
+
assertEquals(null, row.get(2));
|
272
|
+
assertEquals(null, row.get(3));
|
273
|
+
assertEquals(null, row.get(4));
|
274
|
+
}
|
275
|
+
}
|
276
|
+
|
277
|
+
@Test
|
278
|
+
public void testNativeDecimal() throws Exception
|
279
|
+
{
|
280
|
+
if (!canTest) {
|
281
|
+
return;
|
282
|
+
}
|
283
|
+
|
284
|
+
String table = "TEST4";
|
285
|
+
|
286
|
+
dropTable(table);
|
287
|
+
executeSQL(String.format("CREATE TABLE %S (ITEM1 DECIMAL(20,2), ITEM2 NUMERIC(20,2), ITEM3 SMALLMONEY, ITEM4 MONEY, ITEM5 REAL, ITEM6 FLOAT)", table));
|
288
|
+
|
289
|
+
tester.run(convertYml("/sqlserver/yml/test-native-decimal.yml"));
|
290
|
+
|
291
|
+
List<List<Object>> rows = select(table);
|
292
|
+
assertEquals(2, rows.size());
|
293
|
+
{
|
294
|
+
List<Object> row = rows.get(0);
|
295
|
+
assertEquals(new BigDecimal("1.20"), row.get(0));
|
296
|
+
assertEquals(new BigDecimal("12345678901234567.89"), row.get(1));
|
297
|
+
assertEquals(new BigDecimal("123.4500"), row.get(2));
|
298
|
+
assertEquals(new BigDecimal("678.9000"), row.get(3));
|
299
|
+
assertEquals(0.01234F, row.get(4));
|
300
|
+
assertEquals(0.05678D, row.get(5));
|
301
|
+
}
|
302
|
+
{
|
303
|
+
List<Object> row = rows.get(1);
|
304
|
+
assertEquals(new BigDecimal("2.30"), row.get(0));
|
305
|
+
assertEquals(null, row.get(1));
|
306
|
+
assertEquals(null, row.get(2));
|
307
|
+
assertEquals(null, row.get(3));
|
308
|
+
assertEquals(null, row.get(4));
|
309
|
+
assertEquals(null, row.get(5));
|
310
|
+
}
|
311
|
+
}
|
312
|
+
|
313
|
+
@Test
|
314
|
+
public void testNativeDate() throws Exception
|
315
|
+
{
|
316
|
+
if (!canTest) {
|
317
|
+
return;
|
318
|
+
}
|
319
|
+
|
320
|
+
String table = "TEST5";
|
321
|
+
|
322
|
+
dropTable(table);
|
323
|
+
executeSQL(String.format("CREATE TABLE %S (ITEM1 DATE, ITEM2 SMALLDATETIME, ITEM3 DATETIME, ITEM4 DATETIME2, ITEM5 DATETIME2(2), ITEM6 TIME, ITEM7 TIME(2))", table));
|
324
|
+
|
325
|
+
tester.run(convertYml("/sqlserver/yml/test-native-date.yml"));
|
326
|
+
|
327
|
+
List<List<Object>> rows = select(table);
|
328
|
+
assertEquals(2, rows.size());
|
329
|
+
{
|
330
|
+
List<Object> row = rows.get(0);
|
331
|
+
assertEquals(createDate("2016/01/23"), row.get(0));
|
332
|
+
assertEquals(createTimestamp("2016/01/24 11:23:00", 0), row.get(1));
|
333
|
+
assertEquals(createTimestamp("2016/01/25 11:22:33", 457000000), row.get(2));
|
334
|
+
// Embulk timestamp doesn't support values under microseconds.
|
335
|
+
assertEquals(createTimestamp("2016/01/26 11:22:33", 123456000), row.get(3));
|
336
|
+
assertEquals(createTimestamp("2016/01/27 11:22:33", 890000000), row.get(4));
|
337
|
+
// Embulk timestamp doesn't support values under microseconds.
|
338
|
+
assertEquals(createTime("11:22:33", 123456000), row.get(5));
|
339
|
+
assertEquals(createTime("11:22:33", 890000000), row.get(6));
|
340
|
+
}
|
341
|
+
{
|
342
|
+
List<Object> row = rows.get(1);
|
343
|
+
assertEquals(null, row.get(0));
|
344
|
+
assertEquals(null, row.get(1));
|
345
|
+
assertEquals(null, row.get(2));
|
346
|
+
assertEquals(null, row.get(3));
|
347
|
+
assertEquals(null, row.get(4));
|
348
|
+
assertEquals(null, row.get(5));
|
349
|
+
assertEquals(null, row.get(6));
|
350
|
+
}
|
351
|
+
}
|
352
|
+
|
353
|
+
@Test
|
354
|
+
public void testNative() throws Exception
|
355
|
+
{
|
356
|
+
if (!canTest) {
|
357
|
+
return;
|
358
|
+
}
|
359
|
+
|
360
|
+
String table = "TEST1";
|
361
|
+
|
362
|
+
dropTable(table);
|
363
|
+
createTable(table);
|
364
|
+
insertRecord(table);
|
365
|
+
|
366
|
+
tester.run(convertYml("/sqlserver/yml/test-native.yml"));
|
367
|
+
|
368
|
+
assertTable(1, table);
|
369
|
+
}
|
370
|
+
|
207
371
|
private void assertTable(int skip, String table) throws Exception
|
208
372
|
{
|
209
373
|
assertTable(skip, table, false);
|
@@ -219,11 +383,11 @@ public class SQLServerOutputPluginTest extends AbstractJdbcOutputPluginTest
|
|
219
383
|
{
|
220
384
|
Iterator<Object> i2 = i1.next().iterator();
|
221
385
|
assertEquals("A001", i2.next());
|
222
|
-
assertEquals(
|
223
|
-
assertEquals(
|
224
|
-
assertEquals(
|
225
|
-
assertEquals(
|
226
|
-
assertEquals(
|
386
|
+
assertEquals((short)0, i2.next());
|
387
|
+
assertEquals((short)1234, i2.next());
|
388
|
+
assertEquals(123456, i2.next());
|
389
|
+
assertEquals(12345678901L, i2.next());
|
390
|
+
assertEquals(false, i2.next());
|
227
391
|
assertEquals(new BigDecimal("1.23"), i2.next());
|
228
392
|
assertEquals(new BigDecimal("3.456"), i2.next());
|
229
393
|
assertEquals(new BigDecimal("12.3400"), i2.next());
|
@@ -249,11 +413,11 @@ public class SQLServerOutputPluginTest extends AbstractJdbcOutputPluginTest
|
|
249
413
|
{
|
250
414
|
Iterator<Object> i2 = i1.next().iterator();
|
251
415
|
assertEquals("A002", i2.next());
|
252
|
-
assertEquals(
|
253
|
-
assertEquals(
|
254
|
-
assertEquals(
|
255
|
-
assertEquals(
|
256
|
-
assertEquals(
|
416
|
+
assertEquals((short)255, i2.next());
|
417
|
+
assertEquals((short)-32768, i2.next());
|
418
|
+
assertEquals(-2147483648, i2.next());
|
419
|
+
assertEquals(-9223372036854775808L, i2.next());
|
420
|
+
assertEquals(true, i2.next());
|
257
421
|
assertEquals(new BigDecimal("-9999999999.99"), i2.next());
|
258
422
|
assertEquals(new BigDecimal("-99.999"), i2.next());
|
259
423
|
assertEquals(new BigDecimal("-214748.3648"), i2.next());
|
@@ -0,0 +1,26 @@
|
|
1
|
+
in:
|
2
|
+
type: file
|
3
|
+
path_prefix: '/sqlserver/data/test5/test5.csv'
|
4
|
+
parser:
|
5
|
+
charset: UTF-8
|
6
|
+
newline: CRLF
|
7
|
+
type: csv
|
8
|
+
delimiter: ','
|
9
|
+
quote: ''
|
10
|
+
columns:
|
11
|
+
- {name: ITEM1, type: timestamp, format: '%Y/%m/%d'}
|
12
|
+
- {name: ITEM2, type: timestamp, format: '%Y/%m/%d %H:%M:%S'}
|
13
|
+
- {name: ITEM3, type: timestamp, format: '%Y/%m/%d %H:%M:%S.%N'}
|
14
|
+
- {name: ITEM4, type: timestamp, format: '%Y/%m/%d %H:%M:%S.%N'}
|
15
|
+
- {name: ITEM5, type: timestamp, format: '%Y/%m/%d %H:%M:%S.%N'}
|
16
|
+
- {name: ITEM6, type: timestamp, format: '%H:%M:%S.%N'}
|
17
|
+
- {name: ITEM7, type: timestamp, format: '%H:%M:%S.%N'}
|
18
|
+
out:
|
19
|
+
type: sqlserver
|
20
|
+
host: localhost
|
21
|
+
database: TESTDB
|
22
|
+
user: TEST_USER
|
23
|
+
password: test_pw
|
24
|
+
table: TEST5
|
25
|
+
mode: insert_direct
|
26
|
+
insert_method: native
|
@@ -0,0 +1,25 @@
|
|
1
|
+
in:
|
2
|
+
type: file
|
3
|
+
path_prefix: '/sqlserver/data/test4/test4.csv'
|
4
|
+
parser:
|
5
|
+
charset: UTF-8
|
6
|
+
newline: CRLF
|
7
|
+
type: csv
|
8
|
+
delimiter: ','
|
9
|
+
quote: ''
|
10
|
+
columns:
|
11
|
+
- {name: ITEM1, type: double}
|
12
|
+
- {name: ITEM2, type: string}
|
13
|
+
- {name: ITEM3, type: string}
|
14
|
+
- {name: ITEM4, type: string}
|
15
|
+
- {name: ITEM5, type: double}
|
16
|
+
- {name: ITEM6, type: double}
|
17
|
+
out:
|
18
|
+
type: sqlserver
|
19
|
+
host: localhost
|
20
|
+
database: TESTDB
|
21
|
+
user: TEST_USER
|
22
|
+
password: test_pw
|
23
|
+
table: TEST4
|
24
|
+
mode: insert_direct
|
25
|
+
insert_method: native
|
@@ -0,0 +1,24 @@
|
|
1
|
+
in:
|
2
|
+
type: file
|
3
|
+
path_prefix: '/sqlserver/data/test3/test3.csv'
|
4
|
+
parser:
|
5
|
+
charset: UTF-8
|
6
|
+
newline: CRLF
|
7
|
+
type: csv
|
8
|
+
delimiter: ','
|
9
|
+
quote: ''
|
10
|
+
columns:
|
11
|
+
- {name: ITEM1, type: long}
|
12
|
+
- {name: ITEM2, type: long}
|
13
|
+
- {name: ITEM3, type: long}
|
14
|
+
- {name: ITEM4, type: long}
|
15
|
+
- {name: ITEM5, type: long}
|
16
|
+
out:
|
17
|
+
type: sqlserver
|
18
|
+
host: localhost
|
19
|
+
database: TESTDB
|
20
|
+
user: TEST_USER
|
21
|
+
password: test_pw
|
22
|
+
table: TEST3
|
23
|
+
mode: insert_direct
|
24
|
+
insert_method: native
|
@@ -0,0 +1,25 @@
|
|
1
|
+
in:
|
2
|
+
type: file
|
3
|
+
path_prefix: '/sqlserver/data/test2/test2.csv'
|
4
|
+
parser:
|
5
|
+
charset: UTF-8
|
6
|
+
newline: CRLF
|
7
|
+
type: csv
|
8
|
+
delimiter: ','
|
9
|
+
quote: ''
|
10
|
+
columns:
|
11
|
+
- {name: ITEM1, type: string}
|
12
|
+
- {name: ITEM2, type: string}
|
13
|
+
- {name: ITEM3, type: string}
|
14
|
+
- {name: ITEM4, type: string}
|
15
|
+
- {name: ITEM5, type: string}
|
16
|
+
- {name: ITEM6, type: string}
|
17
|
+
out:
|
18
|
+
type: sqlserver
|
19
|
+
host: localhost
|
20
|
+
database: TESTDB
|
21
|
+
user: TEST_USER
|
22
|
+
password: test_pw
|
23
|
+
table: TEST2
|
24
|
+
mode: insert_direct
|
25
|
+
insert_method: native
|
@@ -0,0 +1,44 @@
|
|
1
|
+
in:
|
2
|
+
type: file
|
3
|
+
path_prefix: '/sqlserver/data/test1/test1.csv'
|
4
|
+
parser:
|
5
|
+
charset: UTF-8
|
6
|
+
newline: CRLF
|
7
|
+
type: csv
|
8
|
+
delimiter: ','
|
9
|
+
quote: ''
|
10
|
+
columns:
|
11
|
+
- {name: ID, type: string}
|
12
|
+
- {name: TINYINT_ITEM, type: long}
|
13
|
+
- {name: SMALLINT_ITEM, type: long}
|
14
|
+
- {name: INT_ITEM, type: long}
|
15
|
+
- {name: BIGINT_ITEM, type: long}
|
16
|
+
- {name: BIT_ITEM, type: boolean}
|
17
|
+
- {name: DECIMAL_ITEM, type: string}
|
18
|
+
- {name: NUMERIC_ITEM, type: string}
|
19
|
+
- {name: SMALLMONEY_ITEM, type: string}
|
20
|
+
- {name: MONEY_ITEM, type: string}
|
21
|
+
- {name: REAL_ITEM, type: double}
|
22
|
+
- {name: FLOAT_ITEM, type: double}
|
23
|
+
- {name: CHAR_ITEM, type: string}
|
24
|
+
- {name: VARCHAR_ITEM, type: string}
|
25
|
+
- {name: TEXT_ITEM, type: string}
|
26
|
+
- {name: NCHAR_ITEM, type: string}
|
27
|
+
- {name: NVARCHAR_ITEM, type: string}
|
28
|
+
- {name: NTEXT_ITEM, type: string}
|
29
|
+
- {name: DATE_ITEM, type: timestamp, format: '%Y/%m/%d'}
|
30
|
+
- {name: DATETIME_ITEM, type: timestamp, format: '%Y/%m/%d %H:%M:%S.%N'}
|
31
|
+
- {name: DATETIME2_ITEM, type: timestamp, format: '%Y/%m/%d %H:%M:%S.%N'}
|
32
|
+
- {name: DATETIME2_2_ITEM, type: timestamp, format: '%Y/%m/%d %H:%M:%S.%N'}
|
33
|
+
- {name: SMALLDATETIME_ITEM, type: timestamp, format: '%Y/%m/%d %H:%M:%S'}
|
34
|
+
- {name: TIME_ITEM, type: timestamp, format: '%H:%M:%S.%N'}
|
35
|
+
- {name: TIME_2_ITEM, type: timestamp, format: '%H:%M:%S.%N'}
|
36
|
+
out:
|
37
|
+
type: sqlserver
|
38
|
+
host: localhost
|
39
|
+
database: TESTDB
|
40
|
+
user: TEST_USER
|
41
|
+
password: test_pw
|
42
|
+
table: TEST1
|
43
|
+
mode: insert_direct
|
44
|
+
insert_method: native
|
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.5.
|
4
|
+
version: 0.5.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-
|
11
|
+
date: 2016-03-29 00:00:00.000000000 Z
|
12
12
|
dependencies: []
|
13
13
|
description: Inserts or updates records to a table.
|
14
14
|
email:
|
@@ -21,22 +21,37 @@ files:
|
|
21
21
|
- build.gradle
|
22
22
|
- lib/embulk/output/sqlserver.rb
|
23
23
|
- src/main/java/org/embulk/output/SQLServerOutputPlugin.java
|
24
|
+
- src/main/java/org/embulk/output/sqlserver/InsertMethod.java
|
25
|
+
- src/main/java/org/embulk/output/sqlserver/NativeBatchInsert.java
|
24
26
|
- src/main/java/org/embulk/output/sqlserver/SQLServerOutputConnection.java
|
25
27
|
- src/main/java/org/embulk/output/sqlserver/SQLServerOutputConnector.java
|
28
|
+
- src/main/java/org/embulk/output/sqlserver/SmallDateTimeFormat.java
|
29
|
+
- src/main/java/org/embulk/output/sqlserver/nativeclient/NativeClient.java
|
30
|
+
- src/main/java/org/embulk/output/sqlserver/nativeclient/NativeClientWrapper.java
|
31
|
+
- src/main/java/org/embulk/output/sqlserver/nativeclient/ODBC.java
|
26
32
|
- src/main/java/org/embulk/output/sqlserver/setter/SQLServerByteColumnSetter.java
|
27
33
|
- src/main/java/org/embulk/output/sqlserver/setter/SQLServerColumnSetterFactory.java
|
28
34
|
- src/main/java/org/embulk/output/sqlserver/setter/SQLServerSqlTimeColumnSetter.java
|
29
35
|
- src/test/java/org/embulk/output/sqlserver/PreciseTime.java
|
30
36
|
- src/test/java/org/embulk/output/sqlserver/SQLServerOutputPluginTest.java
|
31
37
|
- src/test/resources/sqlserver/data/test1/test1.csv
|
38
|
+
- src/test/resources/sqlserver/data/test2/test2.csv
|
39
|
+
- src/test/resources/sqlserver/data/test3/test3.csv
|
40
|
+
- src/test/resources/sqlserver/data/test4/test4.csv
|
41
|
+
- src/test/resources/sqlserver/data/test5/test5.csv
|
32
42
|
- src/test/resources/sqlserver/yml/test-insert-direct.yml
|
33
43
|
- src/test/resources/sqlserver/yml/test-insert.yml
|
44
|
+
- src/test/resources/sqlserver/yml/test-native-date.yml
|
45
|
+
- src/test/resources/sqlserver/yml/test-native-decimal.yml
|
46
|
+
- src/test/resources/sqlserver/yml/test-native-integer.yml
|
47
|
+
- src/test/resources/sqlserver/yml/test-native-string.yml
|
48
|
+
- src/test/resources/sqlserver/yml/test-native.yml
|
34
49
|
- src/test/resources/sqlserver/yml/test-replace-long-name.yml
|
35
50
|
- src/test/resources/sqlserver/yml/test-replace.yml
|
36
51
|
- src/test/resources/sqlserver/yml/test-string-timestamp.yml
|
37
52
|
- src/test/resources/sqlserver/yml/test-truncate-insert.yml
|
38
|
-
- classpath/embulk-output-jdbc-0.5.
|
39
|
-
- classpath/embulk-output-sqlserver-0.5.
|
53
|
+
- classpath/embulk-output-jdbc-0.5.1.jar
|
54
|
+
- classpath/embulk-output-sqlserver-0.5.1.jar
|
40
55
|
homepage: https://github.com/embulk/embulk-output-jdbc
|
41
56
|
licenses:
|
42
57
|
- Apache 2.0
|
Binary file
|