embulk-output-oracle 0.2.4 → 0.3.0

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 (55) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +155 -110
  3. data/build.gradle +6 -6
  4. data/classpath/embulk-output-jdbc-0.3.0.jar +0 -0
  5. data/classpath/embulk-output-oracle-0.3.0.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 +22 -66
  17. data/src/main/java/org/embulk/output/oracle/DirectBatchInsert.java +289 -289
  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 -19
  20. data/src/main/java/org/embulk/output/oracle/OracleOutputConnection.java +165 -134
  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 +99 -99
  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 +120 -120
  38. data/src/test/java/org/embulk/output/oracle/EmptyConfigSource.java +100 -100
  39. data/src/test/java/org/embulk/output/oracle/OracleOutputPluginTest.java +172 -161
  40. data/src/test/java/org/embulk/output/oracle/OracleOutputPluginTestImpl.java +445 -413
  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.yml +26 -26
  44. data/src/test/resources/yml/test-insert-oci-split.yml +26 -26
  45. data/src/test/resources/yml/test-insert-oci.yml +26 -26
  46. data/src/test/resources/yml/test-insert.yml +25 -25
  47. data/src/test/resources/yml/test-replace-long-name-multibyte.yml +25 -0
  48. data/src/test/resources/yml/test-replace-long-name.yml +25 -25
  49. data/src/test/resources/yml/test-replace.yml +25 -25
  50. data/src/test/resources/yml/test-string-timestamp.yml +25 -0
  51. data/src/test/resources/yml/test-url.yml +24 -24
  52. metadata +6 -5
  53. data/classpath/embulk-output-jdbc-0.2.4.jar +0 -0
  54. data/classpath/embulk-output-oracle-0.2.4.jar +0 -0
  55. data/src/main/java/org/embulk/output/oracle/setter/OracleColumnSetterFactory.java +0 -31
@@ -1,134 +1,165 @@
1
- package org.embulk.output.oracle;
2
-
3
-
4
- import java.nio.charset.Charset;
5
- import java.sql.Connection;
6
- import java.sql.PreparedStatement;
7
- import java.sql.ResultSet;
8
- import java.sql.SQLException;
9
- import java.sql.Statement;
10
- import java.util.HashMap;
11
- import java.util.Map;
12
-
13
- import org.embulk.output.jdbc.JdbcOutputConnection;
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", "Shift_JIS");
22
- CHARSET_NAMES.put("JA16SJISTILDE", "Shift_JIS");
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
-
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 convertTypeName(String typeName)
44
- {
45
- switch(typeName) {
46
- case "BIGINT":
47
- return "NUMBER(19,0)";
48
- default:
49
- return typeName;
50
- }
51
- }
52
-
53
- @Override
54
- protected void setSearchPath(String schema) throws SQLException {
55
- // NOP
56
- }
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
- private static String getSchema(Connection connection) throws SQLException
83
- {
84
- // Because old Oracle JDBC drivers don't support Connection#getSchema method.
85
- String sql = "SELECT SYS_CONTEXT('USERENV', 'CURRENT_SCHEMA') FROM DUAL";
86
- try (Statement statement = connection.createStatement()) {
87
- try (ResultSet resultSet = statement.executeQuery(sql)) {
88
- if (resultSet.next()) {
89
- return resultSet.getString(1);
90
- }
91
- throw new SQLException(String.format("Cannot get schema becase \"%s\" didn't return any value.", sql));
92
- }
93
- }
94
- }
95
-
96
- @Override
97
- protected String buildPrepareInsertSql(String toTable, JdbcSchema toTableSchema) throws SQLException
98
- {
99
- String sql = super.buildPrepareInsertSql(toTable, toTableSchema);
100
- if (direct) {
101
- sql = sql.replaceAll("^INSERT ", "INSERT /*+ APPEND_VALUES */ ");
102
- }
103
- return sql;
104
- }
105
-
106
- public OracleCharset getCharset() throws SQLException
107
- {
108
- String charsetName = "UTF8";
109
- try (Statement statement = connection.createStatement()) {
110
- try (ResultSet resultSet = statement.executeQuery("SELECT VALUE FROM NLS_DATABASE_PARAMETERS WHERE PARAMETER='NLS_CHARACTERSET'")) {
111
- if (resultSet.next()) {
112
- String nlsCharacterSet = resultSet.getString(1);
113
- if (CHARSET_NAMES.containsKey(nlsCharacterSet)) {
114
- charsetName = nlsCharacterSet;
115
- }
116
- }
117
- }
118
- }
119
-
120
- try (PreparedStatement statement = connection.prepareStatement("SELECT NLS_CHARSET_ID(?) FROM DUAL")) {
121
- statement.setString(1, charsetName);
122
- try (ResultSet resultSet = statement.executeQuery()) {
123
- if (!resultSet.next()) {
124
- throw new SQLException("Unknown NLS_CHARACTERSET : " + charsetName);
125
- }
126
-
127
- return new OracleCharset(charsetName,
128
- resultSet.getShort(1),
129
- Charset.forName(CHARSET_NAMES.get(charsetName)));
130
- }
131
- }
132
- }
133
-
134
- }
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", "Shift_JIS");
22
+ CHARSET_NAMES.put("JA16SJISTILDE", "Shift_JIS");
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
+ }
@@ -1,37 +1,37 @@
1
- package org.embulk.output.oracle;
2
-
3
- import java.sql.Timestamp;
4
- import java.text.FieldPosition;
5
- import java.text.SimpleDateFormat;
6
- import java.util.Date;
7
-
8
-
9
- public class TimestampFormat extends SimpleDateFormat
10
- {
11
-
12
- private final int scale;
13
-
14
- public TimestampFormat(String pattern, int scale)
15
- {
16
- super(pattern);
17
-
18
- this.scale = scale;
19
- }
20
-
21
- @Override
22
- public StringBuffer format(Date date, StringBuffer toAppendTo, FieldPosition pos)
23
- {
24
- StringBuffer buffer = super.format(date, toAppendTo, pos);
25
- if (scale > 0) {
26
- buffer.append('.');
27
- String nanos = Integer.toString(((Timestamp)date).getNanos());
28
- int zeros = Math.min(scale, 9 - nanos.length());
29
- for (int i = 0; i < zeros; i++) {
30
- buffer.append('0');
31
- }
32
- buffer.append(nanos.substring(0, scale - zeros));
33
- }
34
- return buffer;
35
- }
36
-
37
- }
1
+ package org.embulk.output.oracle;
2
+
3
+ import java.sql.Timestamp;
4
+ import java.text.FieldPosition;
5
+ import java.text.SimpleDateFormat;
6
+ import java.util.Date;
7
+
8
+
9
+ public class TimestampFormat extends SimpleDateFormat
10
+ {
11
+
12
+ private final int scale;
13
+
14
+ public TimestampFormat(String pattern, int scale)
15
+ {
16
+ super(pattern);
17
+
18
+ this.scale = scale;
19
+ }
20
+
21
+ @Override
22
+ public StringBuffer format(Date date, StringBuffer toAppendTo, FieldPosition pos)
23
+ {
24
+ StringBuffer buffer = super.format(date, toAppendTo, pos);
25
+ if (scale > 0) {
26
+ buffer.append('.');
27
+ String nanos = Integer.toString(((Timestamp)date).getNanos());
28
+ int zeros = Math.min(scale, 9 - nanos.length());
29
+ for (int i = 0; i < zeros; i++) {
30
+ buffer.append('0');
31
+ }
32
+ buffer.append(nanos.substring(0, scale - zeros));
33
+ }
34
+ return buffer;
35
+ }
36
+
37
+ }
@@ -1,26 +1,26 @@
1
- package org.embulk.output.oracle.oci;
2
-
3
- public class ColumnDefinition
4
- {
5
- public static int SQLT_CHR = 1;
6
- public static int SQLT_INT = 3;
7
-
8
- public final String columnName;
9
- public final int columnType;
10
- public final int columnSize;
11
- public final String columnDateFormat;
12
-
13
-
14
- public ColumnDefinition(String columnName, int columnType, int columnSize, String columnDateFormat)
15
- {
16
- this.columnName = columnName;
17
- this.columnType = columnType;
18
- this.columnSize = columnSize;
19
- this.columnDateFormat = columnDateFormat;
20
- }
21
-
22
- public ColumnDefinition(String columnName, int columnType, int columnSize)
23
- {
24
- this(columnName, columnType, columnSize, null);
25
- }
26
- }
1
+ package org.embulk.output.oracle.oci;
2
+
3
+ public class ColumnDefinition
4
+ {
5
+ public static int SQLT_CHR = 1;
6
+ public static int SQLT_INT = 3;
7
+
8
+ public final String columnName;
9
+ public final int columnType;
10
+ public final int columnSize;
11
+ public final String columnDateFormat;
12
+
13
+
14
+ public ColumnDefinition(String columnName, int columnType, int columnSize, String columnDateFormat)
15
+ {
16
+ this.columnName = columnName;
17
+ this.columnType = columnType;
18
+ this.columnSize = columnSize;
19
+ this.columnDateFormat = columnDateFormat;
20
+ }
21
+
22
+ public ColumnDefinition(String columnName, int columnType, int columnSize)
23
+ {
24
+ this(columnName, columnType, columnSize, null);
25
+ }
26
+ }