embulk-output-oracle 0.4.0 → 0.4.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.
Files changed (56) 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.0.jar → embulk-output-jdbc-0.4.1.jar} +0 -0
  5. data/classpath/{embulk-output-oracle-0.4.0.jar → embulk-output-oracle-0.4.1.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 +153 -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 +165 -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 +187 -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/ChildFirstClassLoader.java +42 -42
  37. data/src/test/java/org/embulk/output/oracle/EmbulkPluginTester.java +124 -120
  38. data/src/test/java/org/embulk/output/oracle/EmptyConfigSource.java +105 -100
  39. data/src/test/java/org/embulk/output/oracle/OracleOutputPluginTest.java +38 -14
  40. data/src/test/java/org/embulk/output/oracle/OracleOutputPluginTestImpl.java +540 -484
  41. data/src/test/java/org/embulk/output/oracle/TimestampFormatTest.java +57 -57
  42. data/src/test/resources/data/test1/test1.csv +3 -3
  43. data/src/test/resources/yml/test-insert-direct-direct-method.yml +26 -0
  44. data/src/test/resources/yml/test-insert-direct-empty.yml +25 -0
  45. data/src/test/resources/yml/{test-insert-oci-split.yml → test-insert-direct-oci-method-split.yml} +28 -28
  46. data/src/test/resources/yml/{test-insert-oci.yml → test-insert-direct-oci-method.yml} +28 -28
  47. data/src/test/resources/yml/test-insert-direct.yml +25 -26
  48. data/src/test/resources/yml/test-insert-empty.yml +27 -0
  49. data/src/test/resources/yml/test-insert.yml +27 -25
  50. data/src/test/resources/yml/test-replace-empty.yml +31 -0
  51. data/src/test/resources/yml/test-replace-long-name-multibyte.yml +31 -31
  52. data/src/test/resources/yml/test-replace-long-name.yml +31 -31
  53. data/src/test/resources/yml/test-replace.yml +31 -31
  54. data/src/test/resources/yml/test-string-timestamp.yml +28 -28
  55. data/src/test/resources/yml/test-url.yml +24 -24
  56. metadata +10 -6
@@ -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,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.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.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,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
+ }