embulk-output-oracle 0.4.3 → 0.4.4

Sign up to get free protection for your applications and to get access to all the features.
Files changed (36) hide show
  1. checksums.yaml +4 -4
  2. data/classpath/{embulk-output-jdbc-0.4.3.jar → embulk-output-jdbc-0.4.4.jar} +0 -0
  3. data/classpath/embulk-output-oracle-0.4.4.jar +0 -0
  4. data/lib/embulk/linux_x64/libembulk-output-oracle.so +0 -0
  5. data/lib/embulk/win_x64/embulk-output-oracle.dll +0 -0
  6. data/src/main/cpp/common/dir-path-load.cpp +9 -8
  7. data/src/main/cpp/common/dir-path-load.h +2 -1
  8. data/src/main/cpp/common/embulk-output-oracle.cpp +3 -4
  9. data/src/main/java/org/embulk/output/OracleOutputPlugin.java +6 -4
  10. data/src/main/java/org/embulk/output/oracle/DirectBatchInsert.java +25 -13
  11. data/src/main/java/org/embulk/output/oracle/OracleOutputConnection.java +36 -20
  12. data/src/main/java/org/embulk/output/oracle/oci/ColumnDefinition.java +5 -3
  13. data/src/main/java/org/embulk/output/oracle/oci/RowBuffer.java +26 -6
  14. data/src/main/java/org/embulk/output/oracle/oci/TableDefinition.java +3 -5
  15. data/src/test/cpp/common/embulk-output-oracle-test.cpp +16 -16
  16. data/src/test/java/org/embulk/output/oracle/OracleOutputPluginTest.java +32 -16
  17. data/src/test/java/org/embulk/output/oracle/OracleOutputPluginTestImpl.java +52 -17
  18. data/src/test/resources/data/test1/test1.csv +3 -3
  19. data/src/test/resources/yml/test-insert-direct-direct-method.yml +1 -0
  20. data/src/test/resources/yml/test-insert-direct-empty.yml +1 -0
  21. data/src/test/resources/yml/test-insert-direct-oci-method-split.yml +1 -0
  22. data/src/test/resources/yml/test-insert-direct-oci-method.yml +1 -0
  23. data/src/test/resources/yml/test-insert-direct.yml +1 -0
  24. data/src/test/resources/yml/test-insert-empty.yml +1 -0
  25. data/src/test/resources/yml/test-insert.yml +1 -0
  26. data/src/test/resources/yml/test-replace-empty.yml +3 -1
  27. data/src/test/resources/yml/test-replace-long-name-multibyte.yml +3 -1
  28. data/src/test/resources/yml/test-replace-long-name.yml +3 -1
  29. data/src/test/resources/yml/test-replace-oci-method.yml +34 -0
  30. data/src/test/resources/yml/test-replace.yml +3 -1
  31. data/src/test/resources/yml/test-string-timestamp.yml +1 -0
  32. data/src/test/resources/yml/test-truncate-insert-oci-method.yml +27 -0
  33. data/src/test/resources/yml/test-truncate-insert.yml +1 -0
  34. data/src/test/resources/yml/test-url.yml +1 -0
  35. metadata +7 -4
  36. data/classpath/embulk-output-oracle-0.4.3.jar +0 -0
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: f90682291054c54ff4e0f63ab186669c440fd6a6
4
- data.tar.gz: 96d29462e71befb92de6c15ad57d90e18a9cce30
3
+ metadata.gz: aa5b04399c3ef5c8d91fbeae867f7ce998de9714
4
+ data.tar.gz: 5fa9f26c1e0207984c7c10beec13a70dbbf47bdc
5
5
  SHA512:
6
- metadata.gz: ea6510701f23a9239704394579198f2e610c1164177c2f40d24251b430a4cf0a47e2c898cde16672de95c589ef38602c00d2faef1f5ddd6bb5bfc84a35967927
7
- data.tar.gz: 28c048cde2c7f6d71125cc1c7a691df00f7d704c36e42cbead22f1c76708f94e88e46005cf2435329c0e38b8c45d73e0e9d45a7e79965e5bec302e7afefd41a8
6
+ metadata.gz: d1d8a0476e7d93df373da20b8031180271513808226763ed0dcc6de141ab117bee4d9f8938f0f44d248117e8c26c609c47483830c6c6856c42848dd99a411f1b
7
+ data.tar.gz: de40bade7f6474acb7456cc016fe1ae4bd514c9d8700171cf9907e9fd119fe66b032b9cf35990a8d59574a4ce6e76de8e81e291112e03fab11c6c0394f4f7dd1
@@ -116,18 +116,12 @@ static int isValid(EMBULK_OUTPUT_ORACLE_OCI_COL_DEF &colDef) {
116
116
  return colDef.type != 0;
117
117
  }
118
118
 
119
- int embulk_output_oracle_prepareDirPathStream(EMBULK_OUTPUT_ORACLE_OCI_CONTEXT *context, const char *tableName, short charsetId, EMBULK_OUTPUT_ORACLE_OCI_COL_DEF *colDefs) {
119
+ int embulk_output_oracle_prepareDirPathStream(EMBULK_OUTPUT_ORACLE_OCI_CONTEXT *context, const char *tableName, EMBULK_OUTPUT_ORACLE_OCI_COL_DEF *colDefs) {
120
120
  // load table name
121
121
  if (check(context, "OCIAttrSet(OCI_ATTR_NAME)", OCIAttrSet(context->dp, OCI_HTYPE_DIRPATH_CTX, (void*)tableName, (ub4)strlen(tableName), OCI_ATTR_NAME, context->err))) {
122
122
  return OCI_ERROR;
123
123
  }
124
124
 
125
- // need to set charset explicitly because database charset is not set by default.
126
- ub2 tempCharsetId = charsetId;
127
- if (check(context, "OCIAttrSet(OCI_ATTR_CHARSET_ID)", OCIAttrSet(context->dp, OCI_HTYPE_DIRPATH_CTX, (void*)&tempCharsetId, sizeof(ub2), OCI_ATTR_CHARSET_ID, context->err))) {
128
- return OCI_ERROR;
129
- }
130
-
131
125
  ub2 cols;
132
126
  for (cols = 0; isValid(colDefs[cols]); cols++) ;
133
127
  if (check(context, "OCIAttrSet(OCI_ATTR_NUM_COLS)", OCIAttrSet(context->dp, OCI_HTYPE_DIRPATH_CTX, &cols, sizeof(ub2), OCI_ATTR_NUM_COLS, context->err))) {
@@ -154,6 +148,10 @@ int embulk_output_oracle_prepareDirPathStream(EMBULK_OUTPUT_ORACLE_OCI_CONTEXT *
154
148
  if (check(context, "OCIAttrSet(OCI_ATTR_DATA_SIZE)", OCIAttrSet(column, OCI_DTYPE_PARAM, &colDef.size, sizeof(ub4), OCI_ATTR_DATA_SIZE, context->err))) {
155
149
  return OCI_ERROR;
156
150
  }
151
+ // need to set charset explicitly because database charset is not set by default.
152
+ if (check(context, "OCIAttrSet(OCI_ATTR_CHARSET_ID)", OCIAttrSet(column, OCI_DTYPE_PARAM, &colDef.charsetId, sizeof(ub2), OCI_ATTR_CHARSET_ID, context->err))) {
153
+ return OCI_ERROR;
154
+ }
157
155
  /*
158
156
  if (check(context, "OCIAttrSet(OCI_ATTR_PRECISION)", OCIAttrSet(column, OCI_DTYPE_PARAM, &colDefs[i].precision, sizeof(ub4), OCI_ATTR_PRECISION, context->err))) {
159
157
  return OCI_ERROR;
@@ -273,7 +271,10 @@ int embulk_output_oracle_loadBuffer(EMBULK_OUTPUT_ORACLE_OCI_CONTEXT *context, E
273
271
  for (int col = 0; isValid(colDefs[col]); col++) {
274
272
  ub4 size = colDefs[col].size;
275
273
  if (colDefs[col].type == SQLT_CHR) {
276
- size = (ub4)strnlen(current, size);
274
+ // cannot use strnlen for calulating length of string because UTF-16 string may contain '\0'.
275
+ unsigned char size1 = *current++;
276
+ unsigned char size2 = *current++;
277
+ size = size1 + size2 * 256;
277
278
  }
278
279
 
279
280
  if (check(context, "OCIDirPathColArrayEntrySet", OCIDirPathColArrayEntrySet(context->dpca, context->err, colArrayRowCount, col, (ub1*)current, size, OCI_DIRPATH_COL_COMPLETE))) {
@@ -17,13 +17,14 @@ typedef struct _EMBULK_OUTPUT_ORACLE_OCI_COL_DEF {
17
17
  const char *name;
18
18
  ub4 type;
19
19
  ub4 size;
20
+ ub2 charsetId;
20
21
  const char *dateFormat;
21
22
  } EMBULK_OUTPUT_ORACLE_OCI_COL_DEF;
22
23
 
23
24
 
24
25
  int embulk_output_oracle_prepareDirPathCtx(EMBULK_OUTPUT_ORACLE_OCI_CONTEXT *context, const char *dbName, const char *userName, const char *password);
25
26
 
26
- int embulk_output_oracle_prepareDirPathStream(EMBULK_OUTPUT_ORACLE_OCI_CONTEXT *context, const char *tableName, short charsetId, EMBULK_OUTPUT_ORACLE_OCI_COL_DEF *colDefs);
27
+ int embulk_output_oracle_prepareDirPathStream(EMBULK_OUTPUT_ORACLE_OCI_CONTEXT *context, const char *tableName, EMBULK_OUTPUT_ORACLE_OCI_COL_DEF *colDefs);
27
28
 
28
29
  int embulk_output_oracle_loadBuffer(EMBULK_OUTPUT_ORACLE_OCI_CONTEXT *context, EMBULK_OUTPUT_ORACLE_OCI_COL_DEF *colDefs, const char *buffer, int rowCount);
29
30
 
@@ -69,9 +69,6 @@ JNIEXPORT jboolean JNICALL Java_org_embulk_output_oracle_oci_OCI_prepareLoad
69
69
  jstring tableNameString = (jstring)env->GetObjectField(table, tableNameFieldID);
70
70
  const char *tableName = env->GetStringUTFChars(tableNameString, NULL);
71
71
 
72
- jfieldID charsetIdFieldID = env->GetFieldID(tableClass, "charsetId", "S");
73
- short charsetId = env->GetShortField(table, charsetIdFieldID);
74
-
75
72
  jfieldID columnsFieldID = env->GetFieldID(tableClass, "columns", "[Lorg/embulk/output/oracle/oci/ColumnDefinition;");
76
73
  jobjectArray columnArray = (jobjectArray)env->GetObjectField(table, columnsFieldID);
77
74
  int columnCount = env->GetArrayLength(columnArray);
@@ -80,6 +77,7 @@ JNIEXPORT jboolean JNICALL Java_org_embulk_output_oracle_oci_OCI_prepareLoad
80
77
  jfieldID columnNameFieldID = env->GetFieldID(columnClass, "columnName", "Ljava/lang/String;");
81
78
  jfieldID columnTypeFieldID = env->GetFieldID(columnClass, "columnType", "I");
82
79
  jfieldID columnSizeFieldID = env->GetFieldID(columnClass, "columnSize", "I");
80
+ jfieldID charsetIdFieldID = env->GetFieldID(columnClass, "charsetId", "S");
83
81
  jfieldID columnDateFormatID = env->GetFieldID(columnClass, "columnDateFormat", "Ljava/lang/String;");
84
82
 
85
83
  EMBULK_OUTPUT_ORACLE_OCI_COL_DEF *colDefs = new EMBULK_OUTPUT_ORACLE_OCI_COL_DEF[columnCount + 1];
@@ -91,6 +89,7 @@ JNIEXPORT jboolean JNICALL Java_org_embulk_output_oracle_oci_OCI_prepareLoad
91
89
  colDefs[i].name = env->GetStringUTFChars(columnName, NULL);
92
90
  colDefs[i].type = env->GetIntField(column, columnTypeFieldID);
93
91
  colDefs[i].size = env->GetIntField(column, columnSizeFieldID);
92
+ colDefs[i].charsetId = env->GetShortField(column, charsetIdFieldID);
94
93
 
95
94
  jstring columnDateFormat = (jstring)env->GetObjectField(column, columnDateFormatID);
96
95
  if (columnDateFormat != NULL) {
@@ -106,7 +105,7 @@ JNIEXPORT jboolean JNICALL Java_org_embulk_output_oracle_oci_OCI_prepareLoad
106
105
  colDefs[columnCount].size = 0;
107
106
  colDefs[columnCount].dateFormat = NULL;
108
107
 
109
- int result = embulk_output_oracle_prepareDirPathStream(context, tableName, charsetId, colDefs);
108
+ int result = embulk_output_oracle_prepareDirPathStream(context, tableName, colDefs);
110
109
 
111
110
  for (int i = 0; i < columnCount; i++) {
112
111
  EMBULK_OUTPUT_ORACLE_OCI_COL_DEF &colDef = colDefs[i];
@@ -10,7 +10,6 @@ import org.embulk.config.Config;
10
10
  import org.embulk.config.ConfigDefault;
11
11
  import org.embulk.output.jdbc.AbstractJdbcOutputPlugin;
12
12
  import org.embulk.output.jdbc.BatchInsert;
13
- import org.embulk.output.jdbc.JdbcOutputConnection;
14
13
  import org.embulk.output.jdbc.JdbcOutputConnector;
15
14
  import org.embulk.output.jdbc.StandardBatchInsert;
16
15
  import org.embulk.output.oracle.DirectBatchInsert;
@@ -132,9 +131,11 @@ public class OracleOutputPlugin
132
131
  JdbcOutputConnector connector = getConnector(task, true);
133
132
 
134
133
  if (oracleTask.getInsertMethod() == InsertMethod.oci) {
135
- OracleCharset charset;
136
- try (JdbcOutputConnection connection = connector.connect(true)) {
137
- charset = ((OracleOutputConnection)connection).getOracleCharset();
134
+ OracleCharset charset;
135
+ OracleCharset nationalCharset;
136
+ try (OracleOutputConnection connection = (OracleOutputConnection)connector.connect(true)) {
137
+ charset = connection.getOracleCharset();
138
+ nationalCharset = connection.getOracleNationalCharset();
138
139
  }
139
140
 
140
141
  return new DirectBatchInsert(
@@ -143,6 +144,7 @@ public class OracleOutputPlugin
143
144
  oracleTask.getPassword(),
144
145
  oracleTask.getTable(),
145
146
  charset,
147
+ nationalCharset,
146
148
  oracleTask.getBatchSize());
147
149
  }
148
150
 
@@ -28,12 +28,12 @@ public class DirectBatchInsert implements BatchInsert
28
28
 
29
29
  private final Logger logger = Exec.getLogger(DirectBatchInsert.class);
30
30
 
31
- private final List<String> ociKey;
31
+ private List<String> ociKey;
32
32
  private final String database;
33
33
  private final String user;
34
34
  private final String password;
35
- private final String table;
36
35
  private final OracleCharset charset;
36
+ private final OracleCharset nationalCharset;
37
37
  private final int batchSize;
38
38
  private RowBuffer buffer;
39
39
  private long totalRows;
@@ -43,16 +43,15 @@ public class DirectBatchInsert implements BatchInsert
43
43
  private DateFormat[] formats;
44
44
 
45
45
 
46
- public DirectBatchInsert(String database, String user, String password, String table, OracleCharset charset, int batchSize)
46
+ public DirectBatchInsert(String database, String user, String password, String table,
47
+ OracleCharset charset, OracleCharset nationalCharset, int batchSize)
47
48
  {
48
49
  this.database = database;
49
50
  this.user = user;
50
51
  this.password = password;
51
- this.table = table;
52
52
  this.charset = charset;
53
+ this.nationalCharset = nationalCharset;
53
54
  this.batchSize = batchSize;
54
-
55
- ociKey = Arrays.asList(database, user, table);
56
55
  }
57
56
 
58
57
  @Override
@@ -68,8 +67,8 @@ public class DirectBatchInsert implements BatchInsert
68
67
  * int -> NUMBER
69
68
  * long -> NUMBER
70
69
  * BigDecimal -> NUMBER
71
- * String -> CHAR,VARCHAR,LONGVARCHAR,CLOB,NCHAR,NVARCHAR,NCLOB,NUMBER
72
- * NString -> unused
70
+ * String -> CHAR,VARCHAR,LONGVARCHAR,CLOB,NUMBER
71
+ * NString -> NCHAR,NVARCHAR,LONGNVARCHAR,NCLOB
73
72
  * bytes -> unused
74
73
  * SqlDate -> unused
75
74
  * SqlTime -> unused
@@ -87,10 +86,20 @@ public class DirectBatchInsert implements BatchInsert
87
86
  case Types.VARCHAR:
88
87
  case Types.LONGVARCHAR:
89
88
  case Types.CLOB:
90
- // TODO: CHAR(n CHAR)
91
89
  columns.add(new ColumnDefinition(insertColumn.getName(),
92
90
  ColumnDefinition.SQLT_CHR,
93
- insertColumn.getSizeTypeParameter()));
91
+ insertColumn.getDataLength(),
92
+ charset.getId()));
93
+ break;
94
+
95
+ case Types.NCHAR:
96
+ case Types.NVARCHAR:
97
+ case Types.LONGNVARCHAR:
98
+ case Types.NCLOB:
99
+ columns.add(new ColumnDefinition(insertColumn.getName(),
100
+ ColumnDefinition.SQLT_CHR,
101
+ insertColumn.getDataLength(),
102
+ nationalCharset.getId()));
94
103
  break;
95
104
 
96
105
  case Types.DECIMAL:
@@ -102,7 +111,8 @@ public class DirectBatchInsert implements BatchInsert
102
111
  }
103
112
  columns.add(new ColumnDefinition(insertColumn.getName(),
104
113
  ColumnDefinition.SQLT_CHR,
105
- size));
114
+ size,
115
+ charset.getId()));
106
116
  break;
107
117
 
108
118
  case Types.DATE:
@@ -122,6 +132,7 @@ public class DirectBatchInsert implements BatchInsert
122
132
  columns.add(new ColumnDefinition(insertColumn.getName(),
123
133
  ColumnDefinition.SQLT_CHR,
124
134
  javaFormat.format(dummy).length(),
135
+ charset.getId(),
125
136
  oracleFormat));
126
137
  break;
127
138
 
@@ -136,7 +147,8 @@ public class DirectBatchInsert implements BatchInsert
136
147
  rowSize += column.columnSize;
137
148
  }
138
149
 
139
- TableDefinition tableDefinition = new TableDefinition(table, charset.getId(), columns);
150
+ TableDefinition tableDefinition = new TableDefinition("\"" + loadTable + "\"", columns);
151
+ ociKey = Arrays.asList(database, user, loadTable);
140
152
  ociManager.open(ociKey, database, user, password, tableDefinition);
141
153
 
142
154
  buffer = new RowBuffer(tableDefinition, Math.max(batchSize / rowSize, 8), charset.getJavaCharset());
@@ -257,7 +269,7 @@ public class DirectBatchInsert implements BatchInsert
257
269
  @Override
258
270
  public void setNString(String v) throws IOException, SQLException
259
271
  {
260
- throw new SQLException("Unsupported");
272
+ buffer.addValue(v, nationalCharset.getJavaCharset());
261
273
  }
262
274
 
263
275
  @Override
@@ -25,11 +25,12 @@ public class OracleOutputConnection
25
25
  CHARSET_NAMES.put("JA16EUCTILDE", "EUC-JP");
26
26
  CHARSET_NAMES.put("AL32UTF8", "UTF-8");
27
27
  CHARSET_NAMES.put("UTF8", "UTF-8");
28
- CHARSET_NAMES.put("AL16UTF16", "UTF-16");
28
+ CHARSET_NAMES.put("AL16UTF16", "UTF-16BE");
29
29
  }
30
30
 
31
31
  private final boolean direct;
32
32
  private OracleCharset charset;
33
+ private OracleCharset nationalCharset;
33
34
 
34
35
  public OracleOutputConnection(Connection connection, boolean autoCommit, boolean direct)
35
36
  throws SQLException
@@ -136,34 +137,49 @@ public class OracleOutputConnection
136
137
  public synchronized OracleCharset getOracleCharset() throws SQLException
137
138
  {
138
139
  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
- }
140
+ charset = getOracleCharset("NLS_CHARACTERSET", "UTF8");
141
+ }
142
+ return charset;
143
+ }
144
+
145
+ public synchronized OracleCharset getOracleNationalCharset() throws SQLException
146
+ {
147
+ if (nationalCharset == null) {
148
+ nationalCharset = getOracleCharset("NLS_NCHAR_CHARACTERSET", "AL16UTF16");
149
+ }
150
+ return nationalCharset;
151
+ }
152
+
153
+ private OracleCharset getOracleCharset(String parameterName, String defaultCharsetName) throws SQLException
154
+ {
155
+ String charsetName = defaultCharsetName;
156
+ try (PreparedStatement statement = connection.prepareStatement("SELECT VALUE FROM NLS_DATABASE_PARAMETERS WHERE PARAMETER=?")) {
157
+ statement.setString(1, parameterName);
158
+ try (ResultSet resultSet = statement.executeQuery()) {
159
+ if (resultSet.next()) {
160
+ String nlsCharacterSet = resultSet.getString(1);
161
+ if (CHARSET_NAMES.containsKey(nlsCharacterSet)) {
162
+ charsetName = nlsCharacterSet;
147
163
  }
148
164
  }
149
165
  }
166
+ }
150
167
 
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)));
168
+ try (PreparedStatement statement = connection.prepareStatement("SELECT NLS_CHARSET_ID(?) FROM DUAL")) {
169
+ statement.setString(1, charsetName);
170
+ try (ResultSet resultSet = statement.executeQuery()) {
171
+ if (!resultSet.next()) {
172
+ throw new SQLException("Unknown " + parameterName + " : " + charsetName);
161
173
  }
174
+
175
+ return new OracleCharset(charsetName,
176
+ resultSet.getShort(1),
177
+ Charset.forName(CHARSET_NAMES.get(charsetName)));
162
178
  }
163
179
  }
164
- return charset;
165
180
  }
166
181
 
182
+
167
183
  private static final String[] STANDARD_SIZE_TYPE_NAMES = {
168
184
  "VARCHAR2", "NVARCHAR2",
169
185
  };
@@ -8,19 +8,21 @@ public class ColumnDefinition
8
8
  public final String columnName;
9
9
  public final int columnType;
10
10
  public final int columnSize;
11
+ public final short charsetId;
11
12
  public final String columnDateFormat;
12
13
 
13
14
 
14
- public ColumnDefinition(String columnName, int columnType, int columnSize, String columnDateFormat)
15
+ public ColumnDefinition(String columnName, int columnType, int columnSize, short charsetId, String columnDateFormat)
15
16
  {
16
17
  this.columnName = columnName;
17
18
  this.columnType = columnType;
18
19
  this.columnSize = columnSize;
20
+ this.charsetId = charsetId;
19
21
  this.columnDateFormat = columnDateFormat;
20
22
  }
21
23
 
22
- public ColumnDefinition(String columnName, int columnType, int columnSize)
24
+ public ColumnDefinition(String columnName, int columnType, int columnSize, short charsetId)
23
25
  {
24
- this(columnName, columnType, columnSize, null);
26
+ this(columnName, columnType, columnSize, charsetId, null);
25
27
  }
26
28
  }
@@ -3,6 +3,7 @@ package org.embulk.output.oracle.oci;
3
3
  import java.math.BigDecimal;
4
4
  import java.nio.ByteBuffer;
5
5
  import java.nio.charset.Charset;
6
+ import java.sql.SQLException;
6
7
 
7
8
 
8
9
  public class RowBuffer
@@ -23,6 +24,10 @@ public class RowBuffer
23
24
 
24
25
  int rowSize = 0;
25
26
  for (ColumnDefinition column : table.columns) {
27
+ if (column.columnType == ColumnDefinition.SQLT_CHR) {
28
+ // for length of string
29
+ rowSize += 2;
30
+ }
26
31
  rowSize += column.columnSize;
27
32
  }
28
33
 
@@ -43,7 +48,12 @@ public class RowBuffer
43
48
  next();
44
49
  }
45
50
 
46
- public void addValue(String value)
51
+ public void addValue(String value) throws SQLException
52
+ {
53
+ addValue(value, charset);
54
+ }
55
+
56
+ public void addValue(String value, Charset charset) throws SQLException
47
57
  {
48
58
  if (isFull()) {
49
59
  throw new IllegalStateException();
@@ -51,23 +61,33 @@ public class RowBuffer
51
61
 
52
62
  ByteBuffer bytes = charset.encode(value);
53
63
  int length = bytes.remaining();
54
- // TODO:warning or error if truncated
55
- bytes.get(buffer, currentPosition, length);
56
- if (length < table.columns[currentColumn].columnSize) {
57
- buffer[currentPosition + length] = 0;
64
+ if (length > 65535) {
65
+ throw new SQLException(String.format("byte count of string is too large (max : 65535, actual : %d).", length));
66
+ }
67
+ if (length > table.columns[currentColumn].columnSize) {
68
+ throw new SQLException(String.format("byte count of string is too large for column \"%s\" (max : %d, actual : %d).",
69
+ table.columns[currentColumn].columnName, table.columns[currentColumn].columnSize, length));
58
70
  }
59
71
 
72
+ buffer[currentPosition] = (byte)length;
73
+ buffer[currentPosition + 1] = (byte)(length >> 8);
74
+ bytes.get(buffer, currentPosition + 2, length);
75
+
60
76
  next();
61
77
  }
62
78
 
63
- public void addValue(BigDecimal value)
79
+ public void addValue(BigDecimal value) throws SQLException
64
80
  {
65
81
  addValue(value.toPlainString());
66
82
  }
67
83
 
68
84
  private void next()
69
85
  {
86
+ if (table.columns[currentColumn].columnType == ColumnDefinition.SQLT_CHR) {
87
+ currentPosition += 2;
88
+ }
70
89
  currentPosition += table.columns[currentColumn].columnSize;
90
+
71
91
  currentColumn++;
72
92
  if (currentColumn == table.columns.length) {
73
93
  currentColumn = 0;
@@ -6,19 +6,17 @@ public class TableDefinition
6
6
  {
7
7
 
8
8
  public final String tableName;
9
- public final short charsetId;
10
9
  public final ColumnDefinition[] columns;
11
10
 
12
11
 
13
- public TableDefinition(String tableName, short charsetId, ColumnDefinition... columns)
12
+ public TableDefinition(String tableName, ColumnDefinition... columns)
14
13
  {
15
14
  this.tableName = tableName;
16
- this.charsetId = charsetId;
17
15
  this.columns = columns;
18
16
  }
19
17
 
20
- public TableDefinition(String tableName, short charsetId, List<ColumnDefinition> columns)
18
+ public TableDefinition(String tableName, List<ColumnDefinition> columns)
21
19
  {
22
- this(tableName, charsetId, columns.toArray(new ColumnDefinition[columns.size()]));
20
+ this(tableName, columns.toArray(new ColumnDefinition[columns.size()]));
23
21
  }
24
22
  }
@@ -10,23 +10,23 @@ static int test(EMBULK_OUTPUT_ORACLE_OCI_CONTEXT *context, const char *db, const
10
10
  }
11
11
 
12
12
  EMBULK_OUTPUT_ORACLE_OCI_COL_DEF colDefs[] = {
13
- {"ID", SQLT_INT, 4},
14
- //{"ID", SQLT_CHR, 8},
15
- {"NUM", SQLT_INT, 4},
16
- //{"NUM", SQLT_CHR, 12},
17
- {"VALUE1", SQLT_CHR, 60},
18
- {"VALUE2", SQLT_CHR, 60},
19
- {"VALUE3", SQLT_CHR, 60},
20
- {"VALUE4", SQLT_CHR, 60},
21
- {"VALUE5", SQLT_CHR, 60},
22
- {"VALUE6", SQLT_CHR, 60},
23
- {"VALUE7", SQLT_CHR, 60},
24
- {"VALUE8", SQLT_CHR, 60},
25
- {"VALUE9", SQLT_CHR, 60},
26
- {"VALUE10", SQLT_CHR, 60},
27
- {NULL, 0, 0}
13
+ {"ID", SQLT_INT, 4, 832},
14
+ //{"ID", SQLT_CHR, 8, 832},
15
+ {"NUM", SQLT_INT, 4, 832},
16
+ //{"NUM", SQLT_CHR, 12, 832},
17
+ {"VALUE1", SQLT_CHR, 60, 832},
18
+ {"VALUE2", SQLT_CHR, 60, 832},
19
+ {"VALUE3", SQLT_CHR, 60, 832},
20
+ {"VALUE4", SQLT_CHR, 60, 832},
21
+ {"VALUE5", SQLT_CHR, 60, 832},
22
+ {"VALUE6", SQLT_CHR, 60, 832},
23
+ {"VALUE7", SQLT_CHR, 60, 832},
24
+ {"VALUE8", SQLT_CHR, 60, 832},
25
+ {"VALUE9", SQLT_CHR, 60, 832},
26
+ {"VALUE10", SQLT_CHR, 60, 832},
27
+ {NULL, 0, 0, 832}
28
28
  };
29
- if (embulk_output_oracle_prepareDirPathStream(context, "EXAMPLE", 832, colDefs)) {
29
+ if (embulk_output_oracle_prepareDirPathStream(context, "EXAMPLE", colDefs)) {
30
30
  return OCI_ERROR;
31
31
  }
32
32
 
@@ -131,7 +131,12 @@ public class OracleOutputPluginTest
131
131
  @Test
132
132
  public void testInsert() throws Exception
133
133
  {
134
- invoke("testInsert");
134
+ // cannot test with Oracle 11g JDBC driver for Oracle 12c,
135
+ // because the driver returns sqlType=1111 for NCHAR/NVARCHAR2,
136
+ // and ColumnSetterFactory#newCoalesceColumnSetter throws Exception.
137
+ // even if setting {value_type: string} for NCHAR/NVARCHAR2,
138
+ // PreparedStatement#setNull(parameterIndex, sqlType=1111) throws Exception.
139
+ invoke(test12c, "testInsert");
135
140
  }
136
141
 
137
142
  @Test
@@ -143,13 +148,19 @@ public class OracleOutputPluginTest
143
148
  @Test
144
149
  public void testInsertEmpty() throws Exception
145
150
  {
146
- invoke("testInsertEmpty");
151
+ invoke(test12c, "testInsertEmpty");
147
152
  }
148
153
 
149
154
  @Test
150
155
  public void testTruncateInsert() throws Exception
151
156
  {
152
- invoke("testTruncateInsert");
157
+ invoke(test12c, "testTruncateInsert");
158
+ }
159
+
160
+ @Test
161
+ public void testTruncateInsertOCIMethod() throws Exception
162
+ {
163
+ invoke(test12c, "testTruncateInsertOCIMethod");
153
164
  }
154
165
 
155
166
  @Test
@@ -161,7 +172,7 @@ public class OracleOutputPluginTest
161
172
  @Test
162
173
  public void testInsertDirect() throws Exception
163
174
  {
164
- invoke("testInsertDirect");
175
+ invoke(test12c, "testInsertDirect");
165
176
  }
166
177
 
167
178
  @Test
@@ -173,67 +184,72 @@ public class OracleOutputPluginTest
173
184
  @Test
174
185
  public void testInsertDirectEmpty() throws Exception
175
186
  {
176
- invoke("testInsertDirectEmpty");
187
+ invoke(test12c, "testInsertDirectEmpty");
177
188
  }
178
189
 
179
190
  @Test
180
191
  public void testInsertDirectDirectMethod() throws Exception
181
192
  {
182
- // ArrayIndexOutOfBoundsException thrown if using 12c driver.
183
- invoke(test11g, "testInsertDirectDirectMethod");
193
+ invoke(test12c, "testInsertDirectDirectMethod");
184
194
  }
185
195
 
186
196
  @Test
187
197
  public void testInsertDirectOCIMethod() throws Exception
188
198
  {
189
- invoke("testInsertDirectOCIMethod");
199
+ invoke(test12c, "testInsertDirectOCIMethod");
190
200
  }
191
201
 
192
202
  @Test
193
203
  public void testInsertDirectOCIMethodSplit() throws Exception
194
204
  {
195
- invoke("testInsertDirectOCIMethodSplit");
205
+ invoke(test12c, "testInsertDirectOCIMethodSplit");
196
206
  }
197
207
 
198
208
  @Test
199
209
  public void testUrl() throws Exception
200
210
  {
201
- invoke("testUrl");
211
+ invoke(test12c, "testUrl");
202
212
  }
203
213
 
204
214
  @Test
205
215
  public void testReplace() throws Exception
206
216
  {
207
- invoke("testReplace");
217
+ invoke(test12c, "testReplace");
218
+ }
219
+
220
+ @Test
221
+ public void testReplaceOCIMethod() throws Exception
222
+ {
223
+ invoke(test12c, "testReplaceOCIMethod");
208
224
  }
209
225
 
210
226
  @Test
211
227
  public void testReplaceEmpty() throws Exception
212
228
  {
213
- invoke("testReplaceEmpty");
229
+ invoke(test12c, "testReplaceEmpty");
214
230
  }
215
231
 
216
232
  @Test
217
233
  public void testReplaceLongName() throws Exception
218
234
  {
219
- invoke("testReplaceLongName");
235
+ invoke(test12c, "testReplaceLongName");
220
236
  }
221
237
 
222
238
  @Test
223
239
  public void testReplaceLongNameMultibyte() throws Exception
224
240
  {
225
- invoke("testReplaceLongNameMultibyte");
241
+ invoke(test12c, "testReplaceLongNameMultibyte");
226
242
  }
227
243
 
228
244
  @Test
229
245
  public void testReplaceCreate() throws Exception
230
246
  {
231
- invoke("testReplaceCreate");
247
+ invoke(test12c, "testReplaceCreate");
232
248
  }
233
249
 
234
250
  @Test
235
251
  public void testStringTimestamp() throws Exception
236
252
  {
237
- invoke("testStringTimestamp");
253
+ invoke(test12c, "testStringTimestamp");
238
254
  }
239
255
  }
@@ -65,8 +65,8 @@ public class OracleOutputPluginTestImpl
65
65
 
66
66
  } catch (SQLException e) {
67
67
  System.err.println(e);
68
- //throw new RuntimeException("You should prepare a schema on Oracle (database = 'TESTDB', user = 'TEST_USER', password = 'test_pw', charset = UTF-8).");
69
- System.err.println("Warning: prepare a schema on Oracle (database = 'TESTDB', user = 'TEST_USER', password = 'test_pw', charset = UTF-8).");
68
+ //throw new RuntimeException("You should prepare a schema on Oracle 12c (database = 'TESTDB', user = 'TEST_USER', password = 'test_pw', charset = UTF-8).");
69
+ System.err.println("Warning: prepare a schema on Oracle 12c (database = 'TESTDB', user = 'TEST_USER', password = 'test_pw', charset = UTF-8).");
70
70
  // for example
71
71
  // CREATE USER EMBULK_USER IDENTIFIED BY "embulk_pw";
72
72
  // GRANT DBA TO EMBULK_USER;
@@ -125,6 +125,19 @@ public class OracleOutputPluginTestImpl
125
125
  assertTable(table);
126
126
  }
127
127
 
128
+ public void testTruncateInsertOCIMethod() throws Exception
129
+ {
130
+ String table = "TEST1";
131
+
132
+ dropTable(table);
133
+ createTable(table);
134
+ insertRecord(table);
135
+
136
+ run("/yml/test-truncate-insert-oci-method.yml");
137
+
138
+ assertTable(table);
139
+ }
140
+
128
141
  public void testTruncateInsertCreate() throws Exception
129
142
  {
130
143
  String table = "TEST1";
@@ -233,6 +246,18 @@ public class OracleOutputPluginTestImpl
233
246
  assertGeneratedTable2(table);
234
247
  }
235
248
 
249
+ public void testReplaceOCIMethod() throws Exception
250
+ {
251
+ String table = "TEST1";
252
+
253
+ dropTable(table);
254
+ createTable(table);
255
+
256
+ run("/yml/test-replace-oci-method.yml");
257
+
258
+ assertGeneratedTable2(table);
259
+ }
260
+
236
261
  public void testReplaceEmpty() throws Exception
237
262
  {
238
263
  String table = "TEST1";
@@ -300,8 +325,9 @@ public class OracleOutputPluginTestImpl
300
325
  {
301
326
  String sql = String.format("CREATE TABLE %s ("
302
327
  + "ID CHAR(4),"
303
- + "VARCHAR2_ITEM VARCHAR2(40),"
304
- + "INTEGER_ITEM NUMBER(4,0),"
328
+ + "VARCHAR2_ITEM VARCHAR2(6),"
329
+ + "NVARCHAR2_ITEM NVARCHAR2(6),"
330
+ + "INTEGER_ITEM NUMBER(4,0),"
305
331
  + "NUMBER_ITEM NUMBER(10,2),"
306
332
  + "DATE_ITEM DATE,"
307
333
  + "TIMESTAMP_ITEM TIMESTAMP,"
@@ -311,7 +337,7 @@ public class OracleOutputPluginTestImpl
311
337
 
312
338
  private void insertRecord(String table) throws SQLException
313
339
  {
314
- executeSQL(String.format("INSERT INTO %s VALUES('9999', NULL, NULL, NULL, NULL, NULL)", table));
340
+ executeSQL(String.format("INSERT INTO %s VALUES('9999', NULL, NULL, NULL, NULL, NULL, NULL)", table));
315
341
  }
316
342
 
317
343
  private void assertTable(String table) throws Exception
@@ -322,9 +348,9 @@ public class OracleOutputPluginTestImpl
322
348
  List<List<Object>> rows = select(table);
323
349
 
324
350
  /*
325
- A001,ABCDE,0,123.45,2015/03/05,2015/03/05 12:34:56
326
- A002,あいうえお,-9999,-99999999.99,2015/03/06,2015/03/06 23:59:59
327
- A003,,,,,
351
+ A001,ABCDE,abcde,,0,123.45,2015/03/05,2015/03/05 12:34:56
352
+ A002,AB,abcdef,-9999,-99999999.99,2015/03/06,2015/03/06 23:59:59
353
+ A003,,,,,,
328
354
  */
329
355
 
330
356
  assertEquals(3, rows.size());
@@ -333,6 +359,7 @@ public class OracleOutputPluginTestImpl
333
359
  Iterator<Object> i2 = i1.next().iterator();
334
360
  assertEquals("A001", i2.next());
335
361
  assertEquals("ABCDE", i2.next());
362
+ assertEquals("abcde", i2.next());
336
363
  assertEquals(new BigDecimal("0"), i2.next());
337
364
  assertEquals(new BigDecimal("123.45"), i2.next());
338
365
  assertEquals(toTimestamp("2015/03/05 00:00:00", timeZone), i2.next());
@@ -341,7 +368,8 @@ public class OracleOutputPluginTestImpl
341
368
  {
342
369
  Iterator<Object> i2 = i1.next().iterator();
343
370
  assertEquals("A002", i2.next());
344
- assertEquals("あいうえお", i2.next());
371
+ assertEquals("AB", i2.next());
372
+ assertEquals("abcdef", i2.next());
345
373
  assertEquals(new BigDecimal("-9999"), i2.next());
346
374
  assertEquals(new BigDecimal("-99999999.99"), i2.next());
347
375
  assertEquals(toTimestamp("2015/03/06 00:00:00", timeZone), i2.next());
@@ -355,6 +383,7 @@ public class OracleOutputPluginTestImpl
355
383
  assertEquals(null, i2.next());
356
384
  assertEquals(null, i2.next());
357
385
  assertEquals(null, i2.next());
386
+ assertEquals(null, i2.next());
358
387
  }
359
388
  }
360
389
 
@@ -372,9 +401,9 @@ public class OracleOutputPluginTestImpl
372
401
  List<List<Object>> rows = select(table);
373
402
 
374
403
  /*
375
- A001,ABCDE,0,123.45,2015/03/05,2015/03/05 12:34:56
376
- A002,あいうえお,-9999,-99999999.99,2015/03/06,2015/03/06 23:59:59
377
- A003,,,,,
404
+ A001,ABCDE,abcde,0,123.45,2015/03/05,2015/03/05 12:34:56
405
+ A002,AB,abcdef,-9999,-99999999.99,2015/03/06,2015/03/06 23:59:59
406
+ A003,,,,,,
378
407
  */
379
408
 
380
409
  assertEquals(3, rows.size());
@@ -383,6 +412,7 @@ public class OracleOutputPluginTestImpl
383
412
  Iterator<Object> i2 = i1.next().iterator();
384
413
  assertEquals("A001", i2.next());
385
414
  assertEquals("ABCDE", i2.next());
415
+ assertEquals("abcde", i2.next());
386
416
  assertEquals(new BigDecimal("0"), i2.next());
387
417
  assertEquals("123.45", i2.next());
388
418
  assertEquals(toOracleTimestamp("2015/03/05 00:00:00", timeZone), i2.next());
@@ -391,7 +421,8 @@ public class OracleOutputPluginTestImpl
391
421
  {
392
422
  Iterator<Object> i2 = i1.next().iterator();
393
423
  assertEquals("A002", i2.next());
394
- assertEquals("あいうえお", i2.next());
424
+ assertEquals("AB", i2.next());
425
+ assertEquals("abcdef", i2.next());
395
426
  assertEquals(new BigDecimal("-9999"), i2.next());
396
427
  assertEquals("-99999999.99", i2.next());
397
428
  assertEquals(toOracleTimestamp("2015/03/06 00:00:00", timeZone), i2.next());
@@ -405,6 +436,7 @@ public class OracleOutputPluginTestImpl
405
436
  assertEquals(null, i2.next());
406
437
  assertEquals(null, i2.next());
407
438
  assertEquals(null, i2.next());
439
+ assertEquals(null, i2.next());
408
440
  }
409
441
  }
410
442
 
@@ -416,9 +448,9 @@ public class OracleOutputPluginTestImpl
416
448
  List<List<Object>> rows = select(table);
417
449
 
418
450
  /*
419
- A001,ABCDE,0,123.45,2015/03/05,2015/03/05 12:34:56
420
- A002,あいうえお,-9999,-99999999.99,2015/03/06,2015/03/06 23:59:59
421
- A003,,,,,
451
+ A001,ABCDE,abcde,0,123.45,2015/03/05,2015/03/05 12:34:56
452
+ A002,AB,abcdef,-9999,-99999999.99,2015/03/06,2015/03/06 23:59:59
453
+ A003,,,,,,
422
454
  */
423
455
 
424
456
  assertEquals(3, rows.size());
@@ -427,6 +459,7 @@ public class OracleOutputPluginTestImpl
427
459
  Iterator<Object> i2 = i1.next().iterator();
428
460
  assertEquals("A001", i2.next());
429
461
  assertEquals("ABCDE", i2.next());
462
+ assertEquals("abcde", i2.next());
430
463
  assertEquals(new BigDecimal("0"), i2.next());
431
464
  assertEquals(new BigDecimal("123.45"), i2.next());
432
465
  assertEquals(toTimestamp("2015/03/05 00:00:00", timeZone), i2.next());
@@ -435,7 +468,8 @@ public class OracleOutputPluginTestImpl
435
468
  {
436
469
  Iterator<Object> i2 = i1.next().iterator();
437
470
  assertEquals("A002", i2.next());
438
- assertEquals("あいうえお", i2.next());
471
+ assertEquals("AB", i2.next());
472
+ assertEquals("abcdef", i2.next());
439
473
  assertEquals(new BigDecimal("-9999"), i2.next());
440
474
  assertEquals(new BigDecimal("-99999999.99"), i2.next());
441
475
  assertEquals(toTimestamp("2015/03/06 00:00:00", timeZone), i2.next());
@@ -449,6 +483,7 @@ public class OracleOutputPluginTestImpl
449
483
  assertEquals(null, i2.next());
450
484
  assertEquals(null, i2.next());
451
485
  assertEquals(null, i2.next());
486
+ assertEquals(null, i2.next());
452
487
  }
453
488
  }
454
489
 
@@ -1,3 +1,3 @@
1
- A001,ABCDE,0,123.45,2015/03/05,2015/03/05 12:34:56
2
- A002,あいうえお,-9999,-99999999.99,2015/03/06,2015/03/06 23:59:59
3
- A003,,,,,
1
+ A001,ABCDE,abcde,0,123.45,2015/03/05,2015/03/05 12:34:56
2
+ A002,AB,abcdef,-9999,-99999999.99,2015/03/06,2015/03/06 23:59:59
3
+ A003,,,,,,
@@ -10,6 +10,7 @@ in:
10
10
  columns:
11
11
  - {name: ID, type: string}
12
12
  - {name: VARCHAR2_ITEM, type: string}
13
+ - {name: NVARCHAR2_ITEM, type: string}
13
14
  - {name: INTEGER_ITEM, type: long}
14
15
  - {name: NUMBER_ITEM, type: string}
15
16
  - {name: DATE_ITEM, type: timestamp, format: '%Y/%m/%d'}
@@ -10,6 +10,7 @@ in:
10
10
  columns:
11
11
  - {name: ID, type: string}
12
12
  - {name: VARCHAR2_ITEM, type: string}
13
+ - {name: NVARCHAR2_ITEM, type: string}
13
14
  - {name: INTEGER_ITEM, type: long}
14
15
  - {name: NUMBER_ITEM, type: string}
15
16
  - {name: DATE_ITEM, type: timestamp, format: '%Y/%m/%d'}
@@ -10,6 +10,7 @@ in:
10
10
  columns:
11
11
  - {name: ID, type: string}
12
12
  - {name: VARCHAR2_ITEM, type: string}
13
+ - {name: NVARCHAR2_ITEM, type: string}
13
14
  - {name: INTEGER_ITEM, type: long}
14
15
  - {name: NUMBER_ITEM, type: string}
15
16
  - {name: DATE_ITEM, type: timestamp, format: '%Y/%m/%d'}
@@ -10,6 +10,7 @@ in:
10
10
  columns:
11
11
  - {name: ID, type: string}
12
12
  - {name: VARCHAR2_ITEM, type: string}
13
+ - {name: NVARCHAR2_ITEM, type: string}
13
14
  - {name: INTEGER_ITEM, type: long}
14
15
  - {name: NUMBER_ITEM, type: string}
15
16
  - {name: DATE_ITEM, type: timestamp, format: '%Y/%m/%d'}
@@ -10,6 +10,7 @@ in:
10
10
  columns:
11
11
  - {name: ID, type: string}
12
12
  - {name: VARCHAR2_ITEM, type: string}
13
+ - {name: NVARCHAR2_ITEM, type: string}
13
14
  - {name: INTEGER_ITEM, type: long}
14
15
  - {name: NUMBER_ITEM, type: string}
15
16
  - {name: DATE_ITEM, type: timestamp, format: '%Y/%m/%d'}
@@ -10,6 +10,7 @@ in:
10
10
  columns:
11
11
  - {name: ID, type: string}
12
12
  - {name: VARCHAR2_ITEM, type: string}
13
+ - {name: NVARCHAR2_ITEM, type: string}
13
14
  - {name: INTEGER_ITEM, type: long}
14
15
  - {name: NUMBER_ITEM, type: string}
15
16
  - {name: DATE_ITEM, type: timestamp, format: '%Y/%m/%d'}
@@ -10,6 +10,7 @@ in:
10
10
  columns:
11
11
  - {name: ID, type: string}
12
12
  - {name: VARCHAR2_ITEM, type: string}
13
+ - {name: NVARCHAR2_ITEM, type: string}
13
14
  - {name: INTEGER_ITEM, type: long}
14
15
  - {name: NUMBER_ITEM, type: string}
15
16
  - {name: DATE_ITEM, type: timestamp, format: '%Y/%m/%d'}
@@ -10,6 +10,7 @@ in:
10
10
  columns:
11
11
  - {name: ID, type: string}
12
12
  - {name: VARCHAR2_ITEM, type: string}
13
+ - {name: NVARCHAR2_ITEM, type: string}
13
14
  - {name: INTEGER_ITEM, type: long}
14
15
  - {name: NUMBER_ITEM, type: string}
15
16
  - {name: DATE_ITEM, type: timestamp, format: '%Y/%m/%d'}
@@ -23,7 +24,8 @@ out:
23
24
  table: TEST1
24
25
  mode: replace
25
26
  column_options:
26
- VARCHAR2_ITEM: {type: 'VARCHAR2(40)'}
27
+ VARCHAR2_ITEM: {type: 'VARCHAR2(6)'}
28
+ NVARCHAR2_ITEM: {type: 'NVARCHAR2(6)'}
27
29
  INTEGER_ITEM: {type: 'NUMBER(4,0)'}
28
30
  NUMBER_ITEM: {type: 'NUMBER(10,2)'}
29
31
  DATE_ITEM: {type: 'DATE'}
@@ -10,6 +10,7 @@ in:
10
10
  columns:
11
11
  - {name: ID, type: string}
12
12
  - {name: VARCHAR2_ITEM, type: string}
13
+ - {name: NVARCHAR2_ITEM, type: string}
13
14
  - {name: INTEGER_ITEM, type: long}
14
15
  - {name: NUMBER_ITEM, type: string}
15
16
  - {name: DATE_ITEM, type: timestamp, format: '%Y/%m/%d'}
@@ -23,7 +24,8 @@ out:
23
24
  table: TEST123456789012345678
24
25
  mode: replace
25
26
  column_options:
26
- VARCHAR2_ITEM: {type: 'VARCHAR2(40)'}
27
+ VARCHAR2_ITEM: {type: 'VARCHAR2(6)'}
28
+ NVARCHAR2_ITEM: {type: 'NVARCHAR2(6)'}
27
29
  INTEGER_ITEM: {type: 'NUMBER(4,0)'}
28
30
  NUMBER_ITEM: {type: 'NUMBER(10,2)'}
29
31
  DATE_ITEM: {type: 'DATE'}
@@ -10,6 +10,7 @@ in:
10
10
  columns:
11
11
  - {name: ID, type: string}
12
12
  - {name: VARCHAR2_ITEM, type: string}
13
+ - {name: NVARCHAR2_ITEM, type: string}
13
14
  - {name: INTEGER_ITEM, type: long}
14
15
  - {name: NUMBER_ITEM, type: string}
15
16
  - {name: DATE_ITEM, type: timestamp, format: '%Y/%m/%d'}
@@ -23,7 +24,8 @@ out:
23
24
  table: TEST12345678901234567890123456
24
25
  mode: replace
25
26
  column_options:
26
- VARCHAR2_ITEM: {type: 'VARCHAR2(40)'}
27
+ VARCHAR2_ITEM: {type: 'VARCHAR2(6)'}
28
+ NVARCHAR2_ITEM: {type: 'NVARCHAR2(6)'}
27
29
  INTEGER_ITEM: {type: 'NUMBER(4,0)'}
28
30
  NUMBER_ITEM: {type: 'NUMBER(10,2)'}
29
31
  DATE_ITEM: {type: 'DATE'}
@@ -0,0 +1,34 @@
1
+ in:
2
+ type: file
3
+ path_prefix: '/data/test1/test1.csv'
4
+ parser:
5
+ charset: UTF-8
6
+ newline: CRLF
7
+ type: csv
8
+ delimiter: ','
9
+ quote: ''
10
+ columns:
11
+ - {name: ID, type: string}
12
+ - {name: VARCHAR2_ITEM, type: string}
13
+ - {name: NVARCHAR2_ITEM, type: string}
14
+ - {name: INTEGER_ITEM, type: long}
15
+ - {name: NUMBER_ITEM, type: string}
16
+ - {name: DATE_ITEM, type: timestamp, format: '%Y/%m/%d'}
17
+ - {name: TIMESTAMP_ITEM, type: timestamp, format: '%Y/%m/%d %H:%M:%S'}
18
+ out:
19
+ type: oracle
20
+ host: localhost
21
+ database: TESTDB
22
+ user: TEST_USER
23
+ password: test_pw
24
+ table: TEST1
25
+ mode: replace
26
+ insert_method: oci
27
+ column_options:
28
+ VARCHAR2_ITEM: {type: 'VARCHAR2(6)'}
29
+ NVARCHAR2_ITEM: {type: 'NVARCHAR2(6)'}
30
+ INTEGER_ITEM: {type: 'NUMBER(4,0)'}
31
+ NUMBER_ITEM: {type: 'NUMBER(10,2)'}
32
+ DATE_ITEM: {type: 'DATE'}
33
+ TIMESTAMP_ITEM: {type: 'TIMESTAMP'}
34
+ #driver_path: driver/ojdbc7.jar
@@ -10,6 +10,7 @@ in:
10
10
  columns:
11
11
  - {name: ID, type: string}
12
12
  - {name: VARCHAR2_ITEM, type: string}
13
+ - {name: NVARCHAR2_ITEM, type: string}
13
14
  - {name: INTEGER_ITEM, type: long}
14
15
  - {name: NUMBER_ITEM, type: string}
15
16
  - {name: DATE_ITEM, type: timestamp, format: '%Y/%m/%d'}
@@ -23,7 +24,8 @@ out:
23
24
  table: TEST1
24
25
  mode: replace
25
26
  column_options:
26
- VARCHAR2_ITEM: {type: 'VARCHAR2(40)'}
27
+ VARCHAR2_ITEM: {type: 'VARCHAR2(6)'}
28
+ NVARCHAR2_ITEM: {type: 'NVARCHAR2(6)'}
27
29
  INTEGER_ITEM: {type: 'NUMBER(4,0)'}
28
30
  NUMBER_ITEM: {type: 'NUMBER(10,2)'}
29
31
  DATE_ITEM: {type: 'DATE'}
@@ -10,6 +10,7 @@ in:
10
10
  columns:
11
11
  - {name: ID, type: string}
12
12
  - {name: VARCHAR2_ITEM, type: string}
13
+ - {name: NVARCHAR2_ITEM, type: string}
13
14
  - {name: INTEGER_ITEM, type: long}
14
15
  - {name: NUMBER_ITEM, type: string}
15
16
  - {name: DATE_ITEM, type: string}
@@ -0,0 +1,27 @@
1
+ in:
2
+ type: file
3
+ path_prefix: '/data/test1/test1.csv'
4
+ parser:
5
+ charset: UTF-8
6
+ newline: CRLF
7
+ type: csv
8
+ delimiter: ','
9
+ quote: ''
10
+ columns:
11
+ - {name: ID, type: string}
12
+ - {name: VARCHAR2_ITEM, type: string}
13
+ - {name: NVARCHAR2_ITEM, type: string}
14
+ - {name: INTEGER_ITEM, type: long}
15
+ - {name: NUMBER_ITEM, type: string}
16
+ - {name: DATE_ITEM, type: timestamp, format: '%Y/%m/%d'}
17
+ - {name: TIMESTAMP_ITEM, type: timestamp, format: '%Y/%m/%d %H:%M:%S'}
18
+ out:
19
+ type: oracle
20
+ host: localhost
21
+ database: TESTDB
22
+ user: TEST_USER
23
+ password: test_pw
24
+ table: TEST1
25
+ mode: truncate_insert
26
+ insert_method: oci
27
+ #driver_path: driver/ojdbc7.jar
@@ -10,6 +10,7 @@ in:
10
10
  columns:
11
11
  - {name: ID, type: string}
12
12
  - {name: VARCHAR2_ITEM, type: string}
13
+ - {name: NVARCHAR2_ITEM, type: string}
13
14
  - {name: INTEGER_ITEM, type: long}
14
15
  - {name: NUMBER_ITEM, type: string}
15
16
  - {name: DATE_ITEM, type: timestamp, format: '%Y/%m/%d'}
@@ -10,6 +10,7 @@ in:
10
10
  columns:
11
11
  - {name: ID, type: string}
12
12
  - {name: VARCHAR2_ITEM, type: string}
13
+ - {name: NVARCHAR2_ITEM, type: string}
13
14
  - {name: INTEGER_ITEM, type: long}
14
15
  - {name: NUMBER_ITEM, type: string}
15
16
  - {name: DATE_ITEM, type: timestamp, format: '%Y/%m/%d'}
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: embulk-output-oracle
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.4.3
4
+ version: 0.4.4
5
5
  platform: ruby
6
6
  authors:
7
7
  - Sadayuki Furuhashi
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2015-12-17 00:00:00.000000000 Z
11
+ date: 2016-01-04 00:00:00.000000000 Z
12
12
  dependencies: []
13
13
  description: Inserts or updates records to a table.
14
14
  email:
@@ -19,6 +19,7 @@ extra_rdoc_files: []
19
19
  files:
20
20
  - README.md
21
21
  - build.gradle
22
+ - lib/embulk/linux_x64/libembulk-output-oracle.so
22
23
  - lib/embulk/output/oracle.rb
23
24
  - lib/embulk/win_x64/embulk-output-oracle.dll
24
25
  - src/main/cpp/common/dir-path-load.cpp
@@ -66,12 +67,14 @@ files:
66
67
  - src/test/resources/yml/test-replace-empty.yml
67
68
  - src/test/resources/yml/test-replace-long-name-multibyte.yml
68
69
  - src/test/resources/yml/test-replace-long-name.yml
70
+ - src/test/resources/yml/test-replace-oci-method.yml
69
71
  - src/test/resources/yml/test-replace.yml
70
72
  - src/test/resources/yml/test-string-timestamp.yml
73
+ - src/test/resources/yml/test-truncate-insert-oci-method.yml
71
74
  - src/test/resources/yml/test-truncate-insert.yml
72
75
  - src/test/resources/yml/test-url.yml
73
- - classpath/embulk-output-jdbc-0.4.3.jar
74
- - classpath/embulk-output-oracle-0.4.3.jar
76
+ - classpath/embulk-output-jdbc-0.4.4.jar
77
+ - classpath/embulk-output-oracle-0.4.4.jar
75
78
  homepage: https://github.com/embulk/embulk-output-jdbc
76
79
  licenses:
77
80
  - Apache 2.0