embulk-output-oracle 0.4.1 → 0.4.2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (60) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +160 -160
  3. data/build.gradle +6 -6
  4. data/classpath/embulk-output-jdbc-0.4.2.jar +0 -0
  5. data/classpath/{embulk-output-oracle-0.4.1.jar → embulk-output-oracle-0.4.2.jar} +0 -0
  6. data/lib/embulk/output/oracle.rb +3 -3
  7. data/src/main/cpp/common/dir-path-load.cpp +424 -424
  8. data/src/main/cpp/common/dir-path-load.h +36 -36
  9. data/src/main/cpp/common/embulk-output-oracle.cpp +196 -196
  10. data/src/main/cpp/common/org_embulk_output_oracle_oci_OCI.h +77 -77
  11. data/src/main/cpp/linux/build.sh +21 -21
  12. data/src/main/cpp/win/build.bat +31 -31
  13. data/src/main/cpp/win/dllmain.cpp +25 -25
  14. data/src/main/cpp/win/embulk-output-oracle.sln +39 -39
  15. data/src/main/cpp/win/embulk-output-oracle.vcxproj +175 -175
  16. data/src/main/java/org/embulk/output/OracleOutputPlugin.java +151 -153
  17. data/src/main/java/org/embulk/output/oracle/DirectBatchInsert.java +290 -290
  18. data/src/main/java/org/embulk/output/oracle/InsertMethod.java +8 -8
  19. data/src/main/java/org/embulk/output/oracle/OracleCharset.java +32 -32
  20. data/src/main/java/org/embulk/output/oracle/OracleOutputConnection.java +179 -165
  21. data/src/main/java/org/embulk/output/oracle/OracleOutputConnector.java +49 -49
  22. data/src/main/java/org/embulk/output/oracle/TimestampFormat.java +37 -37
  23. data/src/main/java/org/embulk/output/oracle/oci/ColumnDefinition.java +26 -26
  24. data/src/main/java/org/embulk/output/oracle/oci/OCI.java +139 -139
  25. data/src/main/java/org/embulk/output/oracle/oci/OCIManager.java +64 -64
  26. data/src/main/java/org/embulk/output/oracle/oci/OCIWrapper.java +96 -96
  27. data/src/main/java/org/embulk/output/oracle/oci/RowBuffer.java +105 -105
  28. data/src/main/java/org/embulk/output/oracle/oci/TableDefinition.java +24 -24
  29. data/src/test/cpp/common/embulk-output-oracle-test.cpp +69 -69
  30. data/src/test/cpp/linux/build.sh +19 -19
  31. data/src/test/cpp/win/build.bat +28 -28
  32. data/src/test/cpp/win/embulk-output-oracle-test.vcxproj +154 -154
  33. data/src/test/java/org/embulk/input/filesplit/LocalFileSplitInputPlugin.java +185 -187
  34. data/src/test/java/org/embulk/input/filesplit/PartialFile.java +49 -49
  35. data/src/test/java/org/embulk/input/filesplit/PartialFileInputStream.java +154 -154
  36. data/src/test/java/org/embulk/output/oracle/OracleOutputPluginTest.java +50 -25
  37. data/src/test/java/org/embulk/output/oracle/OracleOutputPluginTestImpl.java +548 -540
  38. data/src/test/java/org/embulk/output/oracle/TimestampFormatTest.java +57 -57
  39. data/src/test/java/org/embulk/output/tester/EmbulkPluginTester.java +79 -0
  40. data/src/test/resources/data/test1/test1.csv +3 -3
  41. data/src/test/resources/dummy.txt +1 -0
  42. data/src/test/resources/yml/test-insert-direct-direct-method.yml +26 -26
  43. data/src/test/resources/yml/test-insert-direct-empty.yml +25 -25
  44. data/src/test/resources/yml/test-insert-direct-oci-method-split.yml +28 -28
  45. data/src/test/resources/yml/test-insert-direct-oci-method.yml +28 -28
  46. data/src/test/resources/yml/test-insert-direct.yml +25 -25
  47. data/src/test/resources/yml/test-insert-empty.yml +27 -27
  48. data/src/test/resources/yml/test-insert.yml +25 -27
  49. data/src/test/resources/yml/test-replace-empty.yml +31 -31
  50. data/src/test/resources/yml/test-replace-long-name-multibyte.yml +31 -31
  51. data/src/test/resources/yml/test-replace-long-name.yml +31 -31
  52. data/src/test/resources/yml/test-replace.yml +31 -31
  53. data/src/test/resources/yml/test-string-timestamp.yml +28 -28
  54. data/src/test/resources/yml/test-url.yml +24 -24
  55. metadata +6 -8
  56. data/classpath/embulk-output-jdbc-0.4.1.jar +0 -0
  57. data/lib/embulk/linux_x64/libembulk-output-oracle.so +0 -0
  58. data/src/test/java/org/embulk/output/oracle/ChildFirstClassLoader.java +0 -42
  59. data/src/test/java/org/embulk/output/oracle/EmbulkPluginTester.java +0 -124
  60. data/src/test/java/org/embulk/output/oracle/EmptyConfigSource.java +0 -105
@@ -1,8 +1,8 @@
1
- package org.embulk.output.oracle;
2
-
3
- public enum InsertMethod
4
- {
5
- normal,
6
- direct,
7
- oci;
8
- }
1
+ package org.embulk.output.oracle;
2
+
3
+ public enum InsertMethod
4
+ {
5
+ normal,
6
+ direct,
7
+ oci;
8
+ }
@@ -1,32 +1,32 @@
1
- package org.embulk.output.oracle;
2
-
3
- import java.nio.charset.Charset;
4
-
5
- public class OracleCharset
6
- {
7
- private final String name;
8
- private final short id;
9
- private final Charset javaCharset;
10
-
11
- public OracleCharset(String name, short id, Charset javaCharset)
12
- {
13
- this.name = name;
14
- this.id = id;
15
- this.javaCharset = javaCharset;
16
- }
17
-
18
- public String getName()
19
- {
20
- return name;
21
- }
22
-
23
- public short getId()
24
- {
25
- return id;
26
- }
27
-
28
- public Charset getJavaCharset()
29
- {
30
- return javaCharset;
31
- }
32
- }
1
+ package org.embulk.output.oracle;
2
+
3
+ import java.nio.charset.Charset;
4
+
5
+ public class OracleCharset
6
+ {
7
+ private final String name;
8
+ private final short id;
9
+ private final Charset javaCharset;
10
+
11
+ public OracleCharset(String name, short id, Charset javaCharset)
12
+ {
13
+ this.name = name;
14
+ this.id = id;
15
+ this.javaCharset = javaCharset;
16
+ }
17
+
18
+ public String getName()
19
+ {
20
+ return name;
21
+ }
22
+
23
+ public short getId()
24
+ {
25
+ return id;
26
+ }
27
+
28
+ public Charset getJavaCharset()
29
+ {
30
+ return javaCharset;
31
+ }
32
+ }
@@ -1,165 +1,179 @@
1
- package org.embulk.output.oracle;
2
-
3
- import java.nio.charset.Charset;
4
- import java.sql.Connection;
5
- import java.sql.PreparedStatement;
6
- import java.sql.ResultSet;
7
- import java.sql.SQLException;
8
- import java.sql.Statement;
9
- import java.util.HashMap;
10
- import java.util.Map;
11
-
12
- import org.embulk.output.jdbc.JdbcOutputConnection;
13
- import org.embulk.output.jdbc.JdbcColumn;
14
- import org.embulk.output.jdbc.JdbcSchema;
15
-
16
- public class OracleOutputConnection
17
- extends JdbcOutputConnection
18
- {
19
- private static final Map<String, String> CHARSET_NAMES = new HashMap<String, String>();
20
- static {
21
- CHARSET_NAMES.put("JA16SJIS", "MS932");
22
- CHARSET_NAMES.put("JA16SJISTILDE", "MS932");
23
- CHARSET_NAMES.put("JA16EUC", "EUC-JP");
24
- CHARSET_NAMES.put("JA16EUCTILDE", "EUC-JP");
25
- CHARSET_NAMES.put("AL32UTF8", "UTF-8");
26
- CHARSET_NAMES.put("UTF8", "UTF-8");
27
- CHARSET_NAMES.put("AL16UTF16", "UTF-16");
28
- }
29
-
30
- private final boolean direct;
31
- private OracleCharset charset;
32
-
33
- public OracleOutputConnection(Connection connection, boolean autoCommit, boolean direct)
34
- throws SQLException
35
- {
36
- super(connection, getSchema(connection));
37
- connection.setAutoCommit(autoCommit);
38
-
39
- this.direct = direct;
40
- }
41
-
42
- @Override
43
- protected String buildColumnTypeName(JdbcColumn c)
44
- {
45
- switch(c.getSimpleTypeName()) {
46
- case "BIGINT":
47
- return "NUMBER(19,0)";
48
- default:
49
- return super.buildColumnTypeName(c);
50
- }
51
- }
52
-
53
- @Override
54
- protected void setSearchPath(String schema) throws SQLException {
55
- // NOP
56
- }
57
-
58
- @Override
59
- public void dropTableIfExists(String tableName) throws SQLException
60
- {
61
- if (tableExists(tableName)) {
62
- dropTable(tableName);
63
- }
64
- }
65
-
66
- @Override
67
- protected void dropTableIfExists(Statement stmt, String tableName) throws SQLException {
68
- if (tableExists(tableName)) {
69
- dropTable(stmt, tableName);
70
- }
71
- }
72
-
73
- @Override
74
- public void createTableIfNotExists(String tableName, JdbcSchema schema) throws SQLException
75
- {
76
- if (!tableExists(tableName)) {
77
- createTable(tableName, schema);
78
- }
79
- }
80
-
81
- public void createTable(String tableName, JdbcSchema schema) throws SQLException
82
- {
83
- Statement stmt = connection.createStatement();
84
- try {
85
- String sql = buildCreateTableSql(tableName, schema);
86
- executeUpdate(stmt, sql);
87
- commitIfNecessary(connection);
88
- } catch (SQLException ex) {
89
- throw safeRollback(connection, ex);
90
- } finally {
91
- stmt.close();
92
- }
93
- }
94
-
95
- protected String buildCreateTableSql(String name, JdbcSchema schema)
96
- {
97
- StringBuilder sb = new StringBuilder();
98
-
99
- sb.append("CREATE TABLE ");
100
- quoteIdentifierString(sb, name);
101
- sb.append(buildCreateTableSchemaSql(schema));
102
- return sb.toString();
103
- }
104
-
105
- private static String getSchema(Connection connection) throws SQLException
106
- {
107
- // Because old Oracle JDBC drivers don't support Connection#getSchema method.
108
- String sql = "SELECT SYS_CONTEXT('USERENV', 'CURRENT_SCHEMA') FROM DUAL";
109
- try (Statement statement = connection.createStatement()) {
110
- try (ResultSet resultSet = statement.executeQuery(sql)) {
111
- if (resultSet.next()) {
112
- return resultSet.getString(1);
113
- }
114
- throw new SQLException(String.format("Cannot get schema becase \"%s\" didn't return any value.", sql));
115
- }
116
- }
117
- }
118
-
119
- @Override
120
- protected String buildPreparedInsertSql(String toTable, JdbcSchema toTableSchema) throws SQLException
121
- {
122
- String sql = super.buildPreparedInsertSql(toTable, toTableSchema);
123
- if (direct) {
124
- sql = sql.replaceAll("^INSERT ", "INSERT /*+ APPEND_VALUES */ ");
125
- }
126
- return sql;
127
- }
128
-
129
- @Override
130
- public Charset getTableNameCharset() throws SQLException
131
- {
132
- return getOracleCharset().getJavaCharset();
133
- }
134
-
135
- public synchronized OracleCharset getOracleCharset() throws SQLException
136
- {
137
- if (charset == null) {
138
- String charsetName = "UTF8";
139
- try (Statement statement = connection.createStatement()) {
140
- try (ResultSet resultSet = statement.executeQuery("SELECT VALUE FROM NLS_DATABASE_PARAMETERS WHERE PARAMETER='NLS_CHARACTERSET'")) {
141
- if (resultSet.next()) {
142
- String nlsCharacterSet = resultSet.getString(1);
143
- if (CHARSET_NAMES.containsKey(nlsCharacterSet)) {
144
- charsetName = nlsCharacterSet;
145
- }
146
- }
147
- }
148
- }
149
-
150
- try (PreparedStatement statement = connection.prepareStatement("SELECT NLS_CHARSET_ID(?) FROM DUAL")) {
151
- statement.setString(1, charsetName);
152
- try (ResultSet resultSet = statement.executeQuery()) {
153
- if (!resultSet.next()) {
154
- throw new SQLException("Unknown NLS_CHARACTERSET : " + charsetName);
155
- }
156
-
157
- charset = new OracleCharset(charsetName,
158
- resultSet.getShort(1),
159
- Charset.forName(CHARSET_NAMES.get(charsetName)));
160
- }
161
- }
162
- }
163
- return charset;
164
- }
165
- }
1
+ package org.embulk.output.oracle;
2
+
3
+ import java.nio.charset.Charset;
4
+ import java.sql.Connection;
5
+ import java.sql.PreparedStatement;
6
+ import java.sql.ResultSet;
7
+ import java.sql.SQLException;
8
+ import java.sql.Statement;
9
+ import java.util.Arrays;
10
+ import java.util.HashMap;
11
+ import java.util.Map;
12
+
13
+ import org.embulk.output.jdbc.JdbcOutputConnection;
14
+ import org.embulk.output.jdbc.JdbcColumn;
15
+ import org.embulk.output.jdbc.JdbcSchema;
16
+
17
+ public class OracleOutputConnection
18
+ extends JdbcOutputConnection
19
+ {
20
+ private static final Map<String, String> CHARSET_NAMES = new HashMap<String, String>();
21
+ static {
22
+ CHARSET_NAMES.put("JA16SJIS", "MS932");
23
+ CHARSET_NAMES.put("JA16SJISTILDE", "MS932");
24
+ CHARSET_NAMES.put("JA16EUC", "EUC-JP");
25
+ CHARSET_NAMES.put("JA16EUCTILDE", "EUC-JP");
26
+ CHARSET_NAMES.put("AL32UTF8", "UTF-8");
27
+ CHARSET_NAMES.put("UTF8", "UTF-8");
28
+ CHARSET_NAMES.put("AL16UTF16", "UTF-16");
29
+ }
30
+
31
+ private final boolean direct;
32
+ private OracleCharset charset;
33
+
34
+ public OracleOutputConnection(Connection connection, boolean autoCommit, boolean direct)
35
+ throws SQLException
36
+ {
37
+ super(connection, getSchema(connection));
38
+ connection.setAutoCommit(autoCommit);
39
+
40
+ this.direct = direct;
41
+ }
42
+
43
+ @Override
44
+ protected String buildColumnTypeName(JdbcColumn c)
45
+ {
46
+ switch(c.getSimpleTypeName()) {
47
+ case "BIGINT":
48
+ return "NUMBER(19,0)";
49
+ default:
50
+ return super.buildColumnTypeName(c);
51
+ }
52
+ }
53
+
54
+ @Override
55
+ protected void setSearchPath(String schema) throws SQLException {
56
+ // NOP
57
+ }
58
+
59
+ @Override
60
+ public void dropTableIfExists(String tableName) throws SQLException
61
+ {
62
+ if (tableExists(tableName)) {
63
+ dropTable(tableName);
64
+ }
65
+ }
66
+
67
+ @Override
68
+ protected void dropTableIfExists(Statement stmt, String tableName) throws SQLException {
69
+ if (tableExists(tableName)) {
70
+ dropTable(stmt, tableName);
71
+ }
72
+ }
73
+
74
+ @Override
75
+ public void createTableIfNotExists(String tableName, JdbcSchema schema) throws SQLException
76
+ {
77
+ if (!tableExists(tableName)) {
78
+ createTable(tableName, schema);
79
+ }
80
+ }
81
+
82
+ public void createTable(String tableName, JdbcSchema schema) throws SQLException
83
+ {
84
+ Statement stmt = connection.createStatement();
85
+ try {
86
+ String sql = buildCreateTableSql(tableName, schema);
87
+ executeUpdate(stmt, sql);
88
+ commitIfNecessary(connection);
89
+ } catch (SQLException ex) {
90
+ throw safeRollback(connection, ex);
91
+ } finally {
92
+ stmt.close();
93
+ }
94
+ }
95
+
96
+ protected String buildCreateTableSql(String name, JdbcSchema schema)
97
+ {
98
+ StringBuilder sb = new StringBuilder();
99
+
100
+ sb.append("CREATE TABLE ");
101
+ quoteIdentifierString(sb, name);
102
+ sb.append(buildCreateTableSchemaSql(schema));
103
+ return sb.toString();
104
+ }
105
+
106
+ private static String getSchema(Connection connection) throws SQLException
107
+ {
108
+ // Because old Oracle JDBC drivers don't support Connection#getSchema method.
109
+ String sql = "SELECT SYS_CONTEXT('USERENV', 'CURRENT_SCHEMA') FROM DUAL";
110
+ try (Statement statement = connection.createStatement()) {
111
+ try (ResultSet resultSet = statement.executeQuery(sql)) {
112
+ if (resultSet.next()) {
113
+ return resultSet.getString(1);
114
+ }
115
+ throw new SQLException(String.format("Cannot get schema becase \"%s\" didn't return any value.", sql));
116
+ }
117
+ }
118
+ }
119
+
120
+ @Override
121
+ protected String buildPreparedInsertSql(String toTable, JdbcSchema toTableSchema) throws SQLException
122
+ {
123
+ String sql = super.buildPreparedInsertSql(toTable, toTableSchema);
124
+ if (direct) {
125
+ sql = sql.replaceAll("^INSERT ", "INSERT /*+ APPEND_VALUES */ ");
126
+ }
127
+ return sql;
128
+ }
129
+
130
+ @Override
131
+ public Charset getTableNameCharset() throws SQLException
132
+ {
133
+ return getOracleCharset().getJavaCharset();
134
+ }
135
+
136
+ public synchronized OracleCharset getOracleCharset() throws SQLException
137
+ {
138
+ if (charset == null) {
139
+ String charsetName = "UTF8";
140
+ try (Statement statement = connection.createStatement()) {
141
+ try (ResultSet resultSet = statement.executeQuery("SELECT VALUE FROM NLS_DATABASE_PARAMETERS WHERE PARAMETER='NLS_CHARACTERSET'")) {
142
+ if (resultSet.next()) {
143
+ String nlsCharacterSet = resultSet.getString(1);
144
+ if (CHARSET_NAMES.containsKey(nlsCharacterSet)) {
145
+ charsetName = nlsCharacterSet;
146
+ }
147
+ }
148
+ }
149
+ }
150
+
151
+ try (PreparedStatement statement = connection.prepareStatement("SELECT NLS_CHARSET_ID(?) FROM DUAL")) {
152
+ statement.setString(1, charsetName);
153
+ try (ResultSet resultSet = statement.executeQuery()) {
154
+ if (!resultSet.next()) {
155
+ throw new SQLException("Unknown NLS_CHARACTERSET : " + charsetName);
156
+ }
157
+
158
+ charset = new OracleCharset(charsetName,
159
+ resultSet.getShort(1),
160
+ Charset.forName(CHARSET_NAMES.get(charsetName)));
161
+ }
162
+ }
163
+ }
164
+ return charset;
165
+ }
166
+
167
+ private static final String[] STANDARD_SIZE_TYPE_NAMES = {
168
+ "VARCHAR2", "NVARCHAR2",
169
+ };
170
+
171
+ @Override
172
+ protected ColumnDeclareType getColumnDeclareType(String convertedTypeName, JdbcColumn col)
173
+ {
174
+ if (Arrays.asList(STANDARD_SIZE_TYPE_NAMES).contains(convertedTypeName)) {
175
+ return ColumnDeclareType.SIZE;
176
+ }
177
+ return super.getColumnDeclareType(convertedTypeName, col);
178
+ }
179
+ }
@@ -1,49 +1,49 @@
1
- package org.embulk.output.oracle;
2
-
3
- import java.sql.Connection;
4
- import java.sql.DriverManager;
5
- import java.sql.SQLException;
6
- import java.util.Properties;
7
-
8
- import org.embulk.output.jdbc.JdbcOutputConnector;
9
-
10
- public class OracleOutputConnector
11
- implements JdbcOutputConnector
12
- {
13
- private final String url;
14
- private final Properties properties;
15
- private final boolean direct;
16
-
17
- public OracleOutputConnector(String url, Properties properties, boolean direct)
18
- {
19
- try {
20
- Class.forName("oracle.jdbc.OracleDriver");
21
- } catch (Exception ex) {
22
- throw new RuntimeException(ex);
23
- }
24
- this.url = url;
25
- this.properties = properties;
26
- this.direct = direct;
27
- }
28
-
29
- @Override
30
- public OracleOutputConnection connect(boolean autoCommit) throws SQLException
31
- {
32
- Connection c = DriverManager.getConnection(url, properties);
33
- if (c == null) {
34
- // driver.connect returns null when url is "jdbc:mysql://...".
35
- throw new SQLException("Invalid url : " + url);
36
- }
37
-
38
- try {
39
- OracleOutputConnection con = new OracleOutputConnection(c, autoCommit, direct);
40
- c = null;
41
- return con;
42
-
43
- } finally {
44
- if (c != null) {
45
- c.close();
46
- }
47
- }
48
- }
49
- }
1
+ package org.embulk.output.oracle;
2
+
3
+ import java.sql.Connection;
4
+ import java.sql.DriverManager;
5
+ import java.sql.SQLException;
6
+ import java.util.Properties;
7
+
8
+ import org.embulk.output.jdbc.JdbcOutputConnector;
9
+
10
+ public class OracleOutputConnector
11
+ implements JdbcOutputConnector
12
+ {
13
+ private final String url;
14
+ private final Properties properties;
15
+ private final boolean direct;
16
+
17
+ public OracleOutputConnector(String url, Properties properties, boolean direct)
18
+ {
19
+ try {
20
+ Class.forName("oracle.jdbc.OracleDriver");
21
+ } catch (Exception ex) {
22
+ throw new RuntimeException(ex);
23
+ }
24
+ this.url = url;
25
+ this.properties = properties;
26
+ this.direct = direct;
27
+ }
28
+
29
+ @Override
30
+ public OracleOutputConnection connect(boolean autoCommit) throws SQLException
31
+ {
32
+ Connection c = DriverManager.getConnection(url, properties);
33
+ if (c == null) {
34
+ // driver.connect returns null when url is "jdbc:mysql://...".
35
+ throw new SQLException("Invalid url : " + url);
36
+ }
37
+
38
+ try {
39
+ OracleOutputConnection con = new OracleOutputConnection(c, autoCommit, direct);
40
+ c = null;
41
+ return con;
42
+
43
+ } finally {
44
+ if (c != null) {
45
+ c.close();
46
+ }
47
+ }
48
+ }
49
+ }