embulk-output-oracle 0.2.4 → 0.3.0

Sign up to get free protection for your applications and to get access to all the features.
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
+ }