embulk-output-sqlserver 0.5.0 → 0.5.1
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.
- 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
|