embulk-output-sqlserver 0.8.0 → 0.8.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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: d8eb048f302970ac3e0c9361d1eb2e489f9be73f
4
- data.tar.gz: 9f23d5b8eaeb9b7d372b2f8ec193d9008fa768e2
3
+ metadata.gz: 64f02cdd0fc14b4644e8dfc1dbdce80a286b80ee
4
+ data.tar.gz: f286424dbcbb308fc98ff2996ecaab4c32f3bdf5
5
5
  SHA512:
6
- metadata.gz: 6f815371db4df43dd637bf8691fd92f3c23ccf8a07c9f737e94fa34eaabe44a1c053d3e0b78ddcf694a19cf743f9427d0ebdb3636cb5bd676792dee3bc2d722e
7
- data.tar.gz: 3fd2806f6b4ea2025a3ee7393407cb8425c74e2758f71440735f816e2bb983f3b7a428303b8faf95d69ec5603b7e2021831d2b0398764353c8f3c32a929c75a6
6
+ metadata.gz: e40b2bf9a2ca5e076cb3f2054bebb39fded85da86196a9627fac8870adc0ff64e8ec90f5d23d1685a9319f0a535b51c02ef4b13784bbd7747c4e93894fb82590
7
+ data.tar.gz: 5379f7fc7836540a50544d7e1c905346bc1fa2d84a737dd3ef7e1ff5fe2779e886514dd64ccee92645571b9868b84eb4a77b45ffcc9e90c5db6e4352ce906a07
data/README.md CHANGED
@@ -26,12 +26,12 @@ embulk "-J-Djava.library.path=C:\drivers" run input-sqlserver.yml
26
26
  - **temp_schema**: schema name for intermediate tables. by default, intermediate tables will be created in the same schema as destination table. (string, optional)
27
27
  - **url**: URL of the JDBC connection (string, optional)
28
28
  - **table**: destination table name (string, required)
29
- - **create_table_constraint** table constraint added to `CREATE TABLE` statement, like `CREATE TABLE <table_name> (<column1> <type1>, <column2> <type2>, ..., <create_table_constraint>) <create_table_option>`.
30
- - **create_table_option** table option added to `CREATE TABLE` statement, like `CREATE TABLE <table_name> (<column1> <type1>, <column2> <type2>, ..., <create_table_constraint>) <create_table_option>`.
29
+ - **create_table_constraint**: table constraint added to `CREATE TABLE` statement, like `CREATE TABLE <table_name> (<column1> <type1>, <column2> <type2>, ..., <create_table_constraint>) <create_table_option>`.
30
+ - **create_table_option**: table option added to `CREATE TABLE` statement, like `CREATE TABLE <table_name> (<column1> <type1>, <column2> <type2>, ..., <create_table_constraint>) <create_table_option>`.
31
31
  - **options**: extra connection properties (hash, default: {})
32
- - **retry_limit** max retry count for database operations (integer, default: 12)
33
- - **retry_wait** initial retry wait time in milliseconds (integer, default: 1000 (1 second))
34
- - **max_retry_wait** upper limit of retry wait, which will be doubled at every retry (integer, default: 1800000 (30 minutes))
32
+ - **retry_limit**: max retry count for database operations (integer, default: 12)
33
+ - **retry_wait**: initial retry wait time in milliseconds (integer, default: 1000 (1 second))
34
+ - **max_retry_wait**: upper limit of retry wait, which will be doubled at every retry (integer, default: 1800000 (30 minutes))
35
35
  - **mode**: "insert", "insert_direct", "truncate_insert" , "replace" or "merge". See below. (string, required)
36
36
  - **merge_keys**: key column names for merging records in merge mode (string array, required in merge mode if table doesn't have primary key)
37
37
  - **merge_rule**: list of column assignments for updating existing records used in merge mode, for example `foo = T.foo + S.foo` (`T` means target table and `S` means source table). (string array, default: always overwrites with new values)
@@ -25,6 +25,8 @@ public interface NativeClient
25
25
  Pointer pTerm, int cbTerm,
26
26
  int eDataType, int idxServerCol);
27
27
 
28
+ short bcp_collen(Pointer hdbc, int cbData, int idxServerCol);
29
+
28
30
  short bcp_sendrow(Pointer hdbc);
29
31
 
30
32
  int bcp_batch(Pointer hdbc);
@@ -21,6 +21,8 @@ import com.google.common.base.Optional;
21
21
 
22
22
  public class NativeClientWrapper
23
23
  {
24
+ private static int MAX_COLUMN_SIZE_FOR_BCP_BIND = 7999;
25
+
24
26
  private static ODBC odbc;
25
27
  private static NativeClient client;
26
28
 
@@ -206,11 +208,19 @@ public class NativeClientWrapper
206
208
  odbcHandle,
207
209
  pointer,
208
210
  0,
209
- size,
211
+ Math.min(size, MAX_COLUMN_SIZE_FOR_BCP_BIND),
210
212
  null,
211
213
  0,
212
214
  NativeClient.SQLCHARACTER,
213
215
  columnIndex));
216
+
217
+ if (size > MAX_COLUMN_SIZE_FOR_BCP_BIND) {
218
+ checkBCPResult("bcp_collen", client.bcp_collen(
219
+ odbcHandle,
220
+ size,
221
+ columnIndex));
222
+ }
223
+
214
224
  return (int)pointer.size();
215
225
  }
216
226
 
@@ -8,10 +8,15 @@ import static org.junit.Assert.assertThat;
8
8
  import java.io.File;
9
9
  import java.net.URISyntaxException;
10
10
  import java.net.URL;
11
+ import java.nio.charset.Charset;
11
12
  import java.nio.file.FileSystems;
13
+ import java.nio.file.Files;
12
14
  import java.nio.file.Path;
15
+ import java.sql.Connection;
16
+ import java.sql.ResultSet;
17
+ import java.sql.Statement;
18
+ import java.util.List;
13
19
 
14
- import org.embulk.config.ConfigDiff;
15
20
  import org.embulk.config.ConfigSource;
16
21
  import org.embulk.output.SQLServerOutputPlugin;
17
22
  import org.embulk.spi.OutputPlugin;
@@ -21,6 +26,7 @@ import org.junit.Before;
21
26
  import org.junit.Rule;
22
27
  import org.junit.Test;
23
28
 
29
+ import com.google.common.collect.ImmutableList;
24
30
  import com.google.common.io.Resources;
25
31
 
26
32
  public class NativeTest
@@ -249,6 +255,59 @@ public class NativeTest
249
255
  //assertThat(result1.getConfigDiff(), is((ConfigDiff) loadYamlResource(embulk, "test_expected.diff")));
250
256
  }
251
257
 
258
+ @Test
259
+ public void testHuge() throws Exception
260
+ {
261
+ Path in1 = toPath("test_huge.csv");
262
+
263
+ // create input data dynamically because it is huge.
264
+
265
+ ImmutableList.Builder<String[]> recordsBuilder = ImmutableList.builder();
266
+ recordsBuilder.add(new String[]{"a", "X", "あ"});
267
+ recordsBuilder.add(new String[]{"b", createString(9000), createString(10000) + "い"});
268
+ recordsBuilder.add(new String[]{"c", createString(20000), createString(30000) + "う"});
269
+ List<String[]> records = recordsBuilder.build();
270
+
271
+ ImmutableList.Builder<String> linesBuilder = ImmutableList.builder();
272
+ linesBuilder.add("ITEM1:long,ITEM2:string,ITEM3:string,ITEM4:string");
273
+ for (int i = 0; i < records.size(); i++) {
274
+ String[] record = records.get(i);
275
+ linesBuilder.add((i + 1) + "," + record[0] + "," + record[1] + "," + record[2]);
276
+ }
277
+
278
+ Charset charset = Charset.forName("UTF8");
279
+ Files.write(in1, linesBuilder.build(), charset);
280
+
281
+ TestingEmbulk.RunResult result1 = embulk.runOutput(baseConfig.merge(loadYamlResource(embulk, "test_huge.yml")), in1);
282
+ //assertThat(result1.getConfigDiff(), is((ConfigDiff) loadYamlResource(embulk, "test_expected.diff")));
283
+
284
+ try (Connection conn = SQLServerTests.connect()) {
285
+ try (Statement statement = conn.createStatement()) {
286
+ try (ResultSet rs = statement.executeQuery("SELECT * FROM TEST_HUGE ORDER BY ITEM1")) {
287
+ int recordIndex = 0;
288
+ while (rs.next()) {
289
+ assertThat(rs.getInt(1), is(recordIndex + 1));
290
+ assertThat(rs.getString(2), is(records.get(recordIndex)[0]));
291
+ assertThat(rs.getString(3), is(records.get(recordIndex)[1]));
292
+ assertThat(rs.getString(4), is(records.get(recordIndex)[2]));
293
+ recordIndex++;
294
+ }
295
+
296
+ assertThat(recordIndex, is(records.size()));
297
+ }
298
+ }
299
+ }
300
+ }
301
+
302
+ private String createString(int size)
303
+ {
304
+ char[] chars = new char[size];
305
+ for (int i = 0; i < size; i++) {
306
+ chars[i] = (char)('A' + i % 26);
307
+ }
308
+ return new String(chars);
309
+ }
310
+
252
311
  private Path toPath(String fileName) throws URISyntaxException
253
312
  {
254
313
  URL url = Resources.getResource(BASIC_RESOURCE_PATH + fileName);
@@ -6,6 +6,9 @@ import java.io.IOException;
6
6
  import java.nio.charset.Charset;
7
7
  import java.nio.file.Files;
8
8
  import java.nio.file.Path;
9
+ import java.sql.Connection;
10
+ import java.sql.DriverManager;
11
+ import java.sql.SQLException;
9
12
  import java.util.Collections;
10
13
  import java.util.List;
11
14
 
@@ -24,6 +27,21 @@ public class SQLServerTests
24
27
  return EmbulkTests.config("EMBULK_OUTPUT_SQLSERVER_TEST_CONFIG");
25
28
  }
26
29
 
30
+ public static Connection connect() throws SQLException
31
+ {
32
+ ConfigSource config = baseConfig();
33
+
34
+ String user = config.get(String.class, "user");
35
+ String password = config.get(String.class, "password");
36
+ String host = config.get(String.class, "host");
37
+ Integer port = config.get(Integer.class, "port");
38
+ String database = config.get(String.class, "database");
39
+
40
+ String url = String.format("jdbc:jtds:sqlserver://%s:%d/%s", host, port, database);
41
+
42
+ return DriverManager.getConnection(url, user, password);
43
+ }
44
+
27
45
  public static void execute(String sql, String... options)
28
46
  {
29
47
  ConfigSource config = baseConfig();
@@ -158,3 +158,12 @@ CREATE TABLE TEST_TIME (
158
158
  VALUE TIME,
159
159
  PRIMARY KEY (ID)
160
160
  );
161
+
162
+ DROP TABLE TEST_HUGE;
163
+ CREATE TABLE TEST_HUGE (
164
+ ITEM1 INT,
165
+ ITEM2 VARCHAR(4),
166
+ ITEM3 TEXT,
167
+ ITEM4 NTEXT,
168
+ PRIMARY KEY(ITEM1)
169
+ );
@@ -0,0 +1,3 @@
1
+ table: TEST_HUGE
2
+ mode: insert_direct
3
+ 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.8.0
4
+ version: 0.8.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: 2017-12-26 00:00:00.000000000 Z
11
+ date: 2018-11-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.8.0.jar
23
- - classpath/embulk-output-sqlserver-0.8.0.jar
22
+ - classpath/embulk-output-jdbc-0.8.1.jar
23
+ - classpath/embulk-output-sqlserver-0.8.1.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
@@ -79,6 +79,8 @@ files:
79
79
  - src/test/resources/org/embulk/output/sqlserver/test/expect/native/test_float_null.csv
80
80
  - src/test/resources/org/embulk/output/sqlserver/test/expect/native/test_float_null.yml
81
81
  - src/test/resources/org/embulk/output/sqlserver/test/expect/native/test_float_null_expected.csv
82
+ - src/test/resources/org/embulk/output/sqlserver/test/expect/native/test_huge.csv
83
+ - src/test/resources/org/embulk/output/sqlserver/test/expect/native/test_huge.yml
82
84
  - src/test/resources/org/embulk/output/sqlserver/test/expect/native/test_int_null.yml
83
85
  - src/test/resources/org/embulk/output/sqlserver/test/expect/native/test_integer_null.csv
84
86
  - src/test/resources/org/embulk/output/sqlserver/test/expect/native/test_integer_null_expected.csv