embulk-output-oracle 0.4.5 → 0.5.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.
- checksums.yaml +4 -4
- data/README.md +0 -50
- data/build.gradle +1 -0
- data/classpath/embulk-output-jdbc-0.5.0.jar +0 -0
- data/classpath/embulk-output-oracle-0.5.0.jar +0 -0
- data/src/main/java/org/embulk/output/oracle/DirectBatchInsert.java +16 -14
- data/src/main/java/org/embulk/output/oracle/OracleOutputConnection.java +5 -5
- data/src/main/java/org/embulk/output/oracle/oci/ColumnDefinition.java +39 -15
- data/src/main/java/org/embulk/output/oracle/oci/OCI.java +125 -133
- data/src/main/java/org/embulk/output/oracle/oci/OCIWrapper.java +403 -33
- data/src/main/java/org/embulk/output/oracle/oci/RowBuffer.java +39 -40
- data/src/main/java/org/embulk/output/oracle/oci/TableDefinition.java +17 -3
- data/src/test/java/org/embulk/output/oracle/OracleOutputPluginTest.java +2 -2
- data/src/test/java/org/embulk/output/oracle/OracleOutputPluginTestImpl.java +38 -143
- data/src/test/resources/{data → oracle/data}/test1/test1.csv +0 -0
- data/src/test/resources/{yml → oracle/yml}/test-insert-direct-direct-method.yml +1 -1
- data/src/test/resources/{yml → oracle/yml}/test-insert-direct-empty.yml +1 -1
- data/src/test/resources/{yml → oracle/yml}/test-insert-direct-oci-method-split.yml +1 -1
- data/src/test/resources/{yml → oracle/yml}/test-insert-direct-oci-method.yml +1 -1
- data/src/test/resources/{yml → oracle/yml}/test-insert-direct.yml +1 -1
- data/src/test/resources/{yml → oracle/yml}/test-insert-empty.yml +1 -1
- data/src/test/resources/{yml → oracle/yml}/test-insert.yml +1 -1
- data/src/test/resources/{yml → oracle/yml}/test-replace-empty.yml +1 -1
- data/src/test/resources/{yml → oracle/yml}/test-replace-long-name-multibyte.yml +1 -1
- data/src/test/resources/{yml → oracle/yml}/test-replace-long-name.yml +1 -1
- data/src/test/resources/{yml → oracle/yml}/test-replace-oci-method.yml +1 -1
- data/src/test/resources/{yml → oracle/yml}/test-replace.yml +1 -1
- data/src/test/resources/{yml → oracle/yml}/test-string-timestamp.yml +1 -1
- data/src/test/resources/{yml → oracle/yml}/test-truncate-insert-oci-method.yml +1 -1
- data/src/test/resources/{yml → oracle/yml}/test-truncate-insert.yml +1 -1
- data/src/test/resources/{yml → oracle/yml}/test-url.yml +1 -1
- metadata +21 -38
- data/classpath/embulk-output-jdbc-0.4.5.jar +0 -0
- data/classpath/embulk-output-oracle-0.4.5.jar +0 -0
- data/lib/embulk/linux_x64/libembulk-output-oracle.so +0 -0
- data/lib/embulk/win_x64/embulk-output-oracle.dll +0 -0
- data/src/main/cpp/common/dir-path-load.cpp +0 -425
- data/src/main/cpp/common/dir-path-load.h +0 -37
- data/src/main/cpp/common/embulk-output-oracle.cpp +0 -195
- data/src/main/cpp/common/org_embulk_output_oracle_oci_OCI.h +0 -77
- data/src/main/cpp/linux/build.sh +0 -21
- data/src/main/cpp/win/build.bat +0 -32
- data/src/main/cpp/win/dllmain.cpp +0 -25
- data/src/main/cpp/win/embulk-output-oracle.sln +0 -39
- data/src/main/cpp/win/embulk-output-oracle.vcxproj +0 -176
- data/src/test/cpp/common/embulk-output-oracle-test.cpp +0 -69
- data/src/test/cpp/linux/build.sh +0 -19
- data/src/test/cpp/win/build.bat +0 -29
- data/src/test/cpp/win/embulk-output-oracle-test.vcxproj +0 -155
- data/src/test/java/org/embulk/output/tester/EmbulkPluginTester.java +0 -79
- data/src/test/resources/dummy.txt +0 -1
@@ -1,425 +0,0 @@
|
|
1
|
-
#include <string.h>
|
2
|
-
#include <stdio.h>
|
3
|
-
#include <malloc.h>
|
4
|
-
#include "dir-path-load.h"
|
5
|
-
|
6
|
-
#pragma warning (disable: 4996)
|
7
|
-
|
8
|
-
|
9
|
-
static int check(EMBULK_OUTPUT_ORACLE_OCI_CONTEXT *context, const char* message, sword result)
|
10
|
-
{
|
11
|
-
strcpy(context->message, "");
|
12
|
-
|
13
|
-
if (result == OCI_ERROR) {
|
14
|
-
sprintf(context->message, "OCI : %s failed.", message);
|
15
|
-
sb4 errCode;
|
16
|
-
OraText text[512];
|
17
|
-
if (OCIErrorGet(context->err, 1, NULL, &errCode, text, sizeof(text) / sizeof(OraText), OCI_HTYPE_ERROR) != OCI_SUCCESS) {
|
18
|
-
strcat(context->message, " OCIErrorGet failed.");
|
19
|
-
} else {
|
20
|
-
strcat(context->message, " ");
|
21
|
-
strncat(context->message, (const char*)text, sizeof(context->message) - strlen(context->message) - 1);
|
22
|
-
}
|
23
|
-
return OCI_ERROR;
|
24
|
-
}
|
25
|
-
|
26
|
-
if (result == OCI_INVALID_HANDLE) {
|
27
|
-
sprintf(context->message, "OCI : %s failed : invalid handle.", message);
|
28
|
-
return OCI_ERROR;
|
29
|
-
}
|
30
|
-
|
31
|
-
if (result == OCI_NO_DATA) {
|
32
|
-
sprintf(context->message, "OCI : %s failed : no data.", message);
|
33
|
-
return OCI_ERROR;
|
34
|
-
}
|
35
|
-
|
36
|
-
if (result != OCI_SUCCESS) {
|
37
|
-
sprintf(context->message, "OCI : %s failed : %d.", message, result);
|
38
|
-
return OCI_ERROR;
|
39
|
-
}
|
40
|
-
|
41
|
-
return OCI_SUCCESS;
|
42
|
-
}
|
43
|
-
|
44
|
-
void embulk_output_oracle_freeDirPathHandles(EMBULK_OUTPUT_ORACLE_OCI_CONTEXT *context)
|
45
|
-
{
|
46
|
-
if (context->csv != NULL) fclose(context->csv);
|
47
|
-
if (context->buffer != NULL) free(context->buffer);
|
48
|
-
if (context->dpstr != NULL) OCIHandleFree(context->dpstr, OCI_HTYPE_DIRPATH_STREAM);
|
49
|
-
if (context->dpca != NULL) OCIHandleFree(context->dpca, OCI_HTYPE_DIRPATH_COLUMN_ARRAY);
|
50
|
-
if (context->dp != NULL) OCIHandleFree(context->dp, OCI_HTYPE_DIRPATH_CTX);
|
51
|
-
if (context->svc != NULL) OCIHandleFree(context->svc, OCI_HTYPE_SVCCTX);
|
52
|
-
if (context->err != NULL) OCIHandleFree(context->err, OCI_HTYPE_ERROR);
|
53
|
-
if (context->env != NULL) OCIHandleFree(context->env, OCI_HTYPE_ENV);
|
54
|
-
}
|
55
|
-
|
56
|
-
int embulk_output_oracle_prepareDirPathCtx(EMBULK_OUTPUT_ORACLE_OCI_CONTEXT *context, const char *dbName, const char *userName, const char *password)
|
57
|
-
{
|
58
|
-
if (check(context, "OCIEnvCreate", OCIEnvCreate(&context->env,
|
59
|
-
OCI_THREADED|OCI_OBJECT,
|
60
|
-
(void *)0,
|
61
|
-
0,
|
62
|
-
0,
|
63
|
-
0,
|
64
|
-
(size_t)0,
|
65
|
-
(void **)0))) {
|
66
|
-
return OCI_ERROR;
|
67
|
-
}
|
68
|
-
|
69
|
-
// error handle
|
70
|
-
if (check(context, "OCIHandleAlloc(OCI_HTYPE_ERROR)", OCIHandleAlloc(
|
71
|
-
context->env,
|
72
|
-
(void **)&context->err,
|
73
|
-
OCI_HTYPE_ERROR,
|
74
|
-
(size_t)0,
|
75
|
-
(void **)0))) {
|
76
|
-
return OCI_ERROR;
|
77
|
-
}
|
78
|
-
|
79
|
-
// service context
|
80
|
-
if (check(context, "OCIHandleAlloc(OCI_HTYPE_SVCCTX)", OCIHandleAlloc(
|
81
|
-
context->env,
|
82
|
-
(void **)&context->svc,
|
83
|
-
OCI_HTYPE_SVCCTX,
|
84
|
-
(size_t)0,
|
85
|
-
(void **)0))) {
|
86
|
-
return OCI_ERROR;
|
87
|
-
}
|
88
|
-
|
89
|
-
// logon
|
90
|
-
if (check(context, "OCILogon", OCILogon(context->env,
|
91
|
-
context->err,
|
92
|
-
&context->svc,
|
93
|
-
(const OraText*)userName,
|
94
|
-
(ub4)strlen(userName),
|
95
|
-
(const OraText*)password,
|
96
|
-
(ub4)strlen(password),
|
97
|
-
(const OraText*)dbName, // dbName should be defined in 'tnsnames.ora' or a form of "host:port/db"
|
98
|
-
(ub4)strlen(dbName)))) {
|
99
|
-
return OCI_ERROR;
|
100
|
-
}
|
101
|
-
|
102
|
-
// direct path context
|
103
|
-
if (check(context, "OCIHandleAlloc(OCI_HTYPE_DIRPATH_CTX)", OCIHandleAlloc(
|
104
|
-
context->env,
|
105
|
-
(void **)&context->dp,
|
106
|
-
OCI_HTYPE_DIRPATH_CTX,
|
107
|
-
(size_t)0,
|
108
|
-
(void **)0))) {
|
109
|
-
return OCI_ERROR;
|
110
|
-
}
|
111
|
-
|
112
|
-
return OCI_SUCCESS;
|
113
|
-
}
|
114
|
-
|
115
|
-
static int isValid(EMBULK_OUTPUT_ORACLE_OCI_COL_DEF &colDef) {
|
116
|
-
return colDef.type != 0;
|
117
|
-
}
|
118
|
-
|
119
|
-
int embulk_output_oracle_prepareDirPathStream(EMBULK_OUTPUT_ORACLE_OCI_CONTEXT *context, const char *tableName, EMBULK_OUTPUT_ORACLE_OCI_COL_DEF *colDefs) {
|
120
|
-
// load table name
|
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
|
-
return OCI_ERROR;
|
123
|
-
}
|
124
|
-
|
125
|
-
ub2 cols;
|
126
|
-
for (cols = 0; isValid(colDefs[cols]); cols++) ;
|
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))) {
|
128
|
-
return OCI_ERROR;
|
129
|
-
}
|
130
|
-
|
131
|
-
OCIParam *columns;
|
132
|
-
if (check(context, "OCIAttrGet(OCI_ATTR_LIST_COLUMNS)", OCIAttrGet(context->dp, OCI_HTYPE_DIRPATH_CTX, &columns, (ub4*)0, OCI_ATTR_LIST_COLUMNS, context->err))) {
|
133
|
-
return OCI_ERROR;
|
134
|
-
}
|
135
|
-
|
136
|
-
for (int i = 0; i < cols; i++) {
|
137
|
-
EMBULK_OUTPUT_ORACLE_OCI_COL_DEF &colDef = colDefs[i];
|
138
|
-
OCIParam *column;
|
139
|
-
if (check(context, "OCIParamGet(OCI_DTYPE_PARAM)", OCIParamGet(columns, OCI_DTYPE_PARAM, context->err, (void**)&column, i + 1))) {
|
140
|
-
return OCI_ERROR;
|
141
|
-
}
|
142
|
-
if (check(context, "OCIAttrSet(OCI_ATTR_NAME)", OCIAttrSet(column, OCI_DTYPE_PARAM, (void*)colDef.name, (ub4)strlen(colDef.name), OCI_ATTR_NAME, context->err))) {
|
143
|
-
return OCI_ERROR;
|
144
|
-
}
|
145
|
-
if (check(context, "OCIAttrSet(OCI_ATTR_DATA_TYPE)", OCIAttrSet(column, OCI_DTYPE_PARAM, &colDef.type, sizeof(ub4), OCI_ATTR_DATA_TYPE, context->err))) {
|
146
|
-
return OCI_ERROR;
|
147
|
-
}
|
148
|
-
if (check(context, "OCIAttrSet(OCI_ATTR_DATA_SIZE)", OCIAttrSet(column, OCI_DTYPE_PARAM, &colDef.size, sizeof(ub4), OCI_ATTR_DATA_SIZE, context->err))) {
|
149
|
-
return OCI_ERROR;
|
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
|
-
}
|
155
|
-
/*
|
156
|
-
if (check(context, "OCIAttrSet(OCI_ATTR_PRECISION)", OCIAttrSet(column, OCI_DTYPE_PARAM, &colDefs[i].precision, sizeof(ub4), OCI_ATTR_PRECISION, context->err))) {
|
157
|
-
return OCI_ERROR;
|
158
|
-
}
|
159
|
-
if (check(context, "OCIAttrSet(OCI_ATTR_SCALE)", OCIAttrSet(column, OCI_DTYPE_PARAM, &colDefs[i].scale, sizeof(ub4), OCI_ATTR_SCALE, context->err))) {
|
160
|
-
return OCI_ERROR;
|
161
|
-
}
|
162
|
-
*/
|
163
|
-
if (colDef.dateFormat != NULL) {
|
164
|
-
if (check(context, "OCIAttrSet(OCI_ATTR_DATEFORMAT)", OCIAttrSet(column, OCI_DTYPE_PARAM, (void*)colDef.dateFormat, (ub4)strlen(colDef.dateFormat), OCI_ATTR_DATEFORMAT, context->err))) {
|
165
|
-
return OCI_ERROR;
|
166
|
-
}
|
167
|
-
}
|
168
|
-
|
169
|
-
if (check(context, "OCIDescriptorFree(OCI_DTYPE_PARAM)", OCIDescriptorFree(column, OCI_DTYPE_PARAM))) {
|
170
|
-
return OCI_ERROR;
|
171
|
-
}
|
172
|
-
}
|
173
|
-
|
174
|
-
if (check(context, "OCIDirPathPrepare", OCIDirPathPrepare(context->dp, context->svc, context->err))) {
|
175
|
-
return OCI_ERROR;
|
176
|
-
}
|
177
|
-
|
178
|
-
// direct path column array
|
179
|
-
if (check(context, "OCIHandleAlloc(OCI_HTYPE_DIRPATH_COLUMN_ARRAY)", OCIHandleAlloc(
|
180
|
-
context->dp,
|
181
|
-
(void **)&context->dpca,
|
182
|
-
OCI_HTYPE_DIRPATH_COLUMN_ARRAY,
|
183
|
-
(size_t)0,
|
184
|
-
(void **)0))) {
|
185
|
-
return OCI_ERROR;
|
186
|
-
}
|
187
|
-
|
188
|
-
// direct path stream
|
189
|
-
if (check(context, "OCIHandleAlloc(OCI_HTYPE_DIRPATH_STREAM)", OCIHandleAlloc(
|
190
|
-
context->dp,
|
191
|
-
(void **)&context->dpstr,
|
192
|
-
OCI_HTYPE_DIRPATH_STREAM,
|
193
|
-
(size_t)0,
|
194
|
-
(void **)0))) {
|
195
|
-
return OCI_ERROR;
|
196
|
-
}
|
197
|
-
|
198
|
-
return OCI_SUCCESS;
|
199
|
-
}
|
200
|
-
|
201
|
-
static void intToSqlInt(int n, char* buffer)
|
202
|
-
{
|
203
|
-
buffer[0] = n & 0xFF;
|
204
|
-
buffer[1] = (n >> 8) & 0xFF;
|
205
|
-
buffer[2] = (n >> 16) & 0xFF;
|
206
|
-
buffer[3] = (n >> 24) & 0xFF;
|
207
|
-
}
|
208
|
-
|
209
|
-
static int strToSqlInt(const char *s, int size, char* buffer)
|
210
|
-
{
|
211
|
-
int n = 0;
|
212
|
-
for (int i = 0; i < size; i++) {
|
213
|
-
if (s[i] < '0' || s[i] > '9') {
|
214
|
-
return OCI_ERROR;
|
215
|
-
}
|
216
|
-
n = n * 10 + s[i] - '0';
|
217
|
-
}
|
218
|
-
|
219
|
-
intToSqlInt(n, buffer);
|
220
|
-
|
221
|
-
return OCI_SUCCESS;
|
222
|
-
}
|
223
|
-
|
224
|
-
static int loadRows(EMBULK_OUTPUT_ORACLE_OCI_CONTEXT *context, ub4 rowCount)
|
225
|
-
{
|
226
|
-
for (ub4 offset = 0; offset < rowCount;) {
|
227
|
-
if (check(context, "OCIDirPathStreamReset", OCIDirPathStreamReset(context->dpstr, context->err))) {
|
228
|
-
return OCI_ERROR;
|
229
|
-
}
|
230
|
-
|
231
|
-
sword result = OCIDirPathColArrayToStream(context->dpca, context->dp, context->dpstr, context->err, rowCount, offset);
|
232
|
-
if (result != OCI_SUCCESS && result != OCI_CONTINUE) {
|
233
|
-
check(context, "OCIDirPathColArrayToStream", result);
|
234
|
-
return OCI_ERROR;
|
235
|
-
}
|
236
|
-
|
237
|
-
if (check(context, "OCIDirPathLoadStream", OCIDirPathLoadStream(context->dp, context->dpstr, context->err))) {
|
238
|
-
return OCI_ERROR;
|
239
|
-
}
|
240
|
-
|
241
|
-
if (result == OCI_SUCCESS) {
|
242
|
-
offset = rowCount;
|
243
|
-
} else {
|
244
|
-
ub4 temp;
|
245
|
-
if (check(context, "OCIAttrGet(OCI_ATTR_ROW_COUNT)", OCIAttrGet(context->dpca, OCI_HTYPE_DIRPATH_COLUMN_ARRAY, &temp, 0, OCI_ATTR_ROW_COUNT, context->err))) {
|
246
|
-
return OCI_ERROR;
|
247
|
-
}
|
248
|
-
offset += temp;
|
249
|
-
}
|
250
|
-
}
|
251
|
-
|
252
|
-
return OCI_SUCCESS;
|
253
|
-
}
|
254
|
-
|
255
|
-
|
256
|
-
int embulk_output_oracle_loadBuffer(EMBULK_OUTPUT_ORACLE_OCI_CONTEXT *context, EMBULK_OUTPUT_ORACLE_OCI_COL_DEF *colDefs, const char *buffer, int rowCount)
|
257
|
-
{
|
258
|
-
ub4 maxRowCount = 0;
|
259
|
-
if (check(context, "OCIAttrGet(OCI_ATTR_NUM_ROWS)", OCIAttrGet(context->dpca, OCI_HTYPE_DIRPATH_COLUMN_ARRAY, &maxRowCount, 0, OCI_ATTR_NUM_ROWS, context->err))) {
|
260
|
-
return OCI_ERROR;
|
261
|
-
}
|
262
|
-
|
263
|
-
int rowSize = 0;
|
264
|
-
for (int col = 0; isValid(colDefs[col]); col++) {
|
265
|
-
rowSize += colDefs[col].size;
|
266
|
-
}
|
267
|
-
const char *current = buffer;
|
268
|
-
|
269
|
-
int colArrayRowCount = 0;
|
270
|
-
for (int row = 0; row < rowCount; row++) {
|
271
|
-
for (int col = 0; isValid(colDefs[col]); col++) {
|
272
|
-
ub4 size = colDefs[col].size;
|
273
|
-
if (colDefs[col].type == SQLT_CHR) {
|
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;
|
278
|
-
}
|
279
|
-
|
280
|
-
if (check(context, "OCIDirPathColArrayEntrySet", OCIDirPathColArrayEntrySet(context->dpca, context->err, colArrayRowCount, col, (ub1*)current, size, OCI_DIRPATH_COL_COMPLETE))) {
|
281
|
-
return OCI_ERROR;
|
282
|
-
}
|
283
|
-
current += colDefs[col].size;
|
284
|
-
}
|
285
|
-
|
286
|
-
colArrayRowCount++;
|
287
|
-
if (colArrayRowCount == maxRowCount) {
|
288
|
-
if (loadRows(context, colArrayRowCount)) {
|
289
|
-
return OCI_ERROR;
|
290
|
-
}
|
291
|
-
|
292
|
-
colArrayRowCount = 0;
|
293
|
-
}
|
294
|
-
}
|
295
|
-
|
296
|
-
if (colArrayRowCount > 0) {
|
297
|
-
if (loadRows(context, colArrayRowCount)) {
|
298
|
-
return OCI_ERROR;
|
299
|
-
}
|
300
|
-
}
|
301
|
-
|
302
|
-
return OCI_SUCCESS;
|
303
|
-
}
|
304
|
-
|
305
|
-
|
306
|
-
int embulk_output_oracle_loadCSV(EMBULK_OUTPUT_ORACLE_OCI_CONTEXT *context, EMBULK_OUTPUT_ORACLE_OCI_COL_DEF *colDefs, const char *csvFileName)
|
307
|
-
{
|
308
|
-
printf("load csv file \"%s\".\r\n", csvFileName);
|
309
|
-
if ((context->csv = fopen(csvFileName, "r")) == NULL) {
|
310
|
-
printf("Cannot open file.");
|
311
|
-
return OCI_ERROR;
|
312
|
-
}
|
313
|
-
|
314
|
-
ub4 maxRowCount = 0;
|
315
|
-
if (check(context, "OCIAttrGet(OCI_ATTR_NUM_ROWS)", OCIAttrGet(context->dpca, OCI_HTYPE_DIRPATH_COLUMN_ARRAY, &maxRowCount, 0, OCI_ATTR_NUM_ROWS, context->err))) {
|
316
|
-
return OCI_ERROR;
|
317
|
-
}
|
318
|
-
|
319
|
-
int rowSize = 0;
|
320
|
-
for (int i = 0; isValid(colDefs[i]); i++) {
|
321
|
-
rowSize += colDefs[i].size;
|
322
|
-
}
|
323
|
-
|
324
|
-
// + 1 for '\0'
|
325
|
-
if ((context->buffer = (char*)malloc(rowSize * maxRowCount + 1)) == NULL) {
|
326
|
-
printf("Cannot alloc memory.");
|
327
|
-
return OCI_ERROR;
|
328
|
-
}
|
329
|
-
char *current = context->buffer;
|
330
|
-
|
331
|
-
// TODO: support a line over 1,000 bytes
|
332
|
-
char line[1000];
|
333
|
-
int row = 0;
|
334
|
-
while (fgets(line, sizeof(line), context->csv) != NULL) {
|
335
|
-
size_t len = strlen(line);
|
336
|
-
int col = 0;
|
337
|
-
for (const char *p = line; p < line + len;) {
|
338
|
-
const char *comma = strchr(p, ',');
|
339
|
-
const char *next;
|
340
|
-
ub4 size;
|
341
|
-
if (comma != NULL) {
|
342
|
-
size = (ub4)(comma - p);
|
343
|
-
next = comma + 1;
|
344
|
-
} else {
|
345
|
-
size = (ub4)(line + len - p);
|
346
|
-
if (size > 0 && p[size - 1] == '\n') size--;
|
347
|
-
if (size > 0 && p[size - 1] == '\r') size--;
|
348
|
-
next = line + len;
|
349
|
-
}
|
350
|
-
|
351
|
-
if (colDefs[col].type == SQLT_INT) {
|
352
|
-
if (strToSqlInt(p, size, current)) {
|
353
|
-
printf("Not a number : \"%s\"\r\n", p);
|
354
|
-
return OCI_ERROR;
|
355
|
-
}
|
356
|
-
size = colDefs[col].size;
|
357
|
-
} else if (colDefs[col].type == SQLT_CHR) {
|
358
|
-
strncpy(current, p, size);
|
359
|
-
} else {
|
360
|
-
printf("Unsupported type : %d\r\n", colDefs[col].type);
|
361
|
-
return OCI_ERROR;
|
362
|
-
}
|
363
|
-
|
364
|
-
if (check(context, "OCIDirPathColArrayEntrySet", OCIDirPathColArrayEntrySet(context->dpca, context->err, row, col, (ub1*)current, size, OCI_DIRPATH_COL_COMPLETE))) {
|
365
|
-
return OCI_ERROR;
|
366
|
-
}
|
367
|
-
|
368
|
-
p = next;
|
369
|
-
current += size;
|
370
|
-
col++;
|
371
|
-
}
|
372
|
-
|
373
|
-
row++;
|
374
|
-
if (row == maxRowCount) {
|
375
|
-
printf("Load %d rows.\r\n", row);
|
376
|
-
if (loadRows(context, row)) {
|
377
|
-
return OCI_ERROR;
|
378
|
-
}
|
379
|
-
|
380
|
-
current = context->buffer;
|
381
|
-
row = 0;
|
382
|
-
}
|
383
|
-
}
|
384
|
-
|
385
|
-
if (row > 0) {
|
386
|
-
printf("Load %d rows.\r\n", row);
|
387
|
-
if (loadRows(context, row)) {
|
388
|
-
return OCI_ERROR;
|
389
|
-
}
|
390
|
-
}
|
391
|
-
|
392
|
-
free(context->buffer);
|
393
|
-
context->buffer = NULL;
|
394
|
-
|
395
|
-
fclose(context->csv);
|
396
|
-
context->csv = NULL;
|
397
|
-
|
398
|
-
return OCI_SUCCESS;
|
399
|
-
}
|
400
|
-
|
401
|
-
int embulk_output_oracle_commitDirPath(EMBULK_OUTPUT_ORACLE_OCI_CONTEXT *context)
|
402
|
-
{
|
403
|
-
if (check(context, "OCIDirPathFinish", OCIDirPathFinish(context->dp, context->err))) {
|
404
|
-
return OCI_ERROR;
|
405
|
-
}
|
406
|
-
|
407
|
-
if (check(context, "OCILogoff", OCILogoff(context->svc, context->err))) {
|
408
|
-
return OCI_ERROR;
|
409
|
-
}
|
410
|
-
|
411
|
-
return OCI_SUCCESS;
|
412
|
-
}
|
413
|
-
|
414
|
-
int embulk_output_oracle_rollbackDirPath(EMBULK_OUTPUT_ORACLE_OCI_CONTEXT *context)
|
415
|
-
{
|
416
|
-
if (check(context, "OCIDirPathAbort", OCIDirPathAbort(context->dp, context->err))) {
|
417
|
-
return OCI_ERROR;
|
418
|
-
}
|
419
|
-
|
420
|
-
if (check(context, "OCILogoff", OCILogoff(context->svc, context->err))) {
|
421
|
-
return OCI_ERROR;
|
422
|
-
}
|
423
|
-
|
424
|
-
return OCI_SUCCESS;
|
425
|
-
}
|
@@ -1,37 +0,0 @@
|
|
1
|
-
#include <oci.h>
|
2
|
-
|
3
|
-
|
4
|
-
typedef struct _EMBULK_OUTPUT_ORACLE_OCI_CONTEXT {
|
5
|
-
OCIEnv *env;
|
6
|
-
OCIDirPathCtx *dp;
|
7
|
-
OCISvcCtx *svc;
|
8
|
-
OCIError *err;
|
9
|
-
OCIDirPathColArray *dpca;
|
10
|
-
OCIDirPathStream *dpstr;
|
11
|
-
char *buffer;
|
12
|
-
FILE *csv;
|
13
|
-
char message[512];
|
14
|
-
} EMBULK_OUTPUT_ORACLE_OCI_CONTEXT;
|
15
|
-
|
16
|
-
typedef struct _EMBULK_OUTPUT_ORACLE_OCI_COL_DEF {
|
17
|
-
const char *name;
|
18
|
-
ub4 type;
|
19
|
-
ub4 size;
|
20
|
-
ub2 charsetId;
|
21
|
-
const char *dateFormat;
|
22
|
-
} EMBULK_OUTPUT_ORACLE_OCI_COL_DEF;
|
23
|
-
|
24
|
-
|
25
|
-
int embulk_output_oracle_prepareDirPathCtx(EMBULK_OUTPUT_ORACLE_OCI_CONTEXT *context, const char *dbName, const char *userName, const char *password);
|
26
|
-
|
27
|
-
int embulk_output_oracle_prepareDirPathStream(EMBULK_OUTPUT_ORACLE_OCI_CONTEXT *context, const char *tableName, EMBULK_OUTPUT_ORACLE_OCI_COL_DEF *colDefs);
|
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);
|
30
|
-
|
31
|
-
int embulk_output_oracle_loadCSV(EMBULK_OUTPUT_ORACLE_OCI_CONTEXT *context, EMBULK_OUTPUT_ORACLE_OCI_COL_DEF *colDefs, const char *csvFileName);
|
32
|
-
|
33
|
-
int embulk_output_oracle_commitDirPath(EMBULK_OUTPUT_ORACLE_OCI_CONTEXT *context);
|
34
|
-
|
35
|
-
int embulk_output_oracle_rollbackDirPath(EMBULK_OUTPUT_ORACLE_OCI_CONTEXT *context);
|
36
|
-
|
37
|
-
void embulk_output_oracle_freeDirPathHandles(EMBULK_OUTPUT_ORACLE_OCI_CONTEXT *context);
|
@@ -1,195 +0,0 @@
|
|
1
|
-
#include "org_embulk_output_oracle_oci_OCI.h"
|
2
|
-
#include "dir-path-load.h"
|
3
|
-
|
4
|
-
|
5
|
-
static EMBULK_OUTPUT_ORACLE_OCI_CONTEXT *toContext(JNIEnv *env, jbyteArray addrs)
|
6
|
-
{
|
7
|
-
EMBULK_OUTPUT_ORACLE_OCI_CONTEXT *context;
|
8
|
-
env->GetByteArrayRegion(addrs, 0, sizeof(context), (jbyte*)&context);
|
9
|
-
return context;
|
10
|
-
}
|
11
|
-
|
12
|
-
static EMBULK_OUTPUT_ORACLE_OCI_COL_DEF *toColDefs(JNIEnv *env, jbyteArray addrs)
|
13
|
-
{
|
14
|
-
EMBULK_OUTPUT_ORACLE_OCI_COL_DEF *colDefs;
|
15
|
-
env->GetByteArrayRegion(addrs, sizeof(EMBULK_OUTPUT_ORACLE_OCI_CONTEXT*), sizeof(colDefs), (jbyte*)&colDefs);
|
16
|
-
return colDefs;
|
17
|
-
}
|
18
|
-
|
19
|
-
JNIEXPORT jbyteArray JNICALL Java_org_embulk_output_oracle_oci_OCI_createContext
|
20
|
-
(JNIEnv *env, jobject)
|
21
|
-
{
|
22
|
-
EMBULK_OUTPUT_ORACLE_OCI_CONTEXT *context = new EMBULK_OUTPUT_ORACLE_OCI_CONTEXT();
|
23
|
-
jbyteArray addrs = env->NewByteArray(sizeof(EMBULK_OUTPUT_ORACLE_OCI_CONTEXT*) + sizeof(EMBULK_OUTPUT_ORACLE_OCI_COL_DEF*));
|
24
|
-
env->SetByteArrayRegion(addrs, 0, sizeof(EMBULK_OUTPUT_ORACLE_OCI_CONTEXT*), (jbyte*)&context);
|
25
|
-
return addrs;
|
26
|
-
}
|
27
|
-
|
28
|
-
|
29
|
-
JNIEXPORT jbyteArray JNICALL Java_org_embulk_output_oracle_oci_OCI_getLasetMessage
|
30
|
-
(JNIEnv *env, jobject, jbyteArray addrs)
|
31
|
-
{
|
32
|
-
EMBULK_OUTPUT_ORACLE_OCI_CONTEXT *context = toContext(env, addrs);
|
33
|
-
jbyteArray message = env->NewByteArray(sizeof(context->message));
|
34
|
-
env->SetByteArrayRegion(message, 0, sizeof(context->message), (jbyte*)context->message);
|
35
|
-
return message;
|
36
|
-
}
|
37
|
-
|
38
|
-
|
39
|
-
JNIEXPORT jboolean JNICALL Java_org_embulk_output_oracle_oci_OCI_open
|
40
|
-
(JNIEnv *env, jobject, jbyteArray addrs, jstring dbNameString, jstring userNameString, jstring passwordString)
|
41
|
-
{
|
42
|
-
EMBULK_OUTPUT_ORACLE_OCI_CONTEXT *context = toContext(env, addrs);
|
43
|
-
|
44
|
-
const char *dbName = env->GetStringUTFChars(dbNameString, NULL);
|
45
|
-
const char *userName = env->GetStringUTFChars(userNameString, NULL);
|
46
|
-
const char *password = env->GetStringUTFChars(passwordString, NULL);
|
47
|
-
|
48
|
-
int result = embulk_output_oracle_prepareDirPathCtx(context, dbName, userName, password);
|
49
|
-
|
50
|
-
env->ReleaseStringUTFChars(dbNameString, dbName);
|
51
|
-
env->ReleaseStringUTFChars(userNameString, userName);
|
52
|
-
env->ReleaseStringUTFChars(passwordString, password);
|
53
|
-
|
54
|
-
if (result != OCI_SUCCESS) {
|
55
|
-
return JNI_FALSE;
|
56
|
-
}
|
57
|
-
|
58
|
-
return JNI_TRUE;
|
59
|
-
}
|
60
|
-
|
61
|
-
|
62
|
-
JNIEXPORT jboolean JNICALL Java_org_embulk_output_oracle_oci_OCI_prepareLoad
|
63
|
-
(JNIEnv *env, jobject, jbyteArray addrs, jobject table)
|
64
|
-
{
|
65
|
-
EMBULK_OUTPUT_ORACLE_OCI_CONTEXT *context = toContext(env, addrs);
|
66
|
-
|
67
|
-
jclass tableClass = env->FindClass("Lorg/embulk/output/oracle/oci/TableDefinition;");
|
68
|
-
jfieldID tableNameFieldID = env->GetFieldID(tableClass, "tableName", "Ljava/lang/String;");
|
69
|
-
jstring tableNameString = (jstring)env->GetObjectField(table, tableNameFieldID);
|
70
|
-
const char *tableName = env->GetStringUTFChars(tableNameString, NULL);
|
71
|
-
|
72
|
-
jfieldID columnsFieldID = env->GetFieldID(tableClass, "columns", "[Lorg/embulk/output/oracle/oci/ColumnDefinition;");
|
73
|
-
jobjectArray columnArray = (jobjectArray)env->GetObjectField(table, columnsFieldID);
|
74
|
-
int columnCount = env->GetArrayLength(columnArray);
|
75
|
-
|
76
|
-
jclass columnClass = env->FindClass("Lorg/embulk/output/oracle/oci/ColumnDefinition;");
|
77
|
-
jfieldID columnNameFieldID = env->GetFieldID(columnClass, "columnName", "Ljava/lang/String;");
|
78
|
-
jfieldID columnTypeFieldID = env->GetFieldID(columnClass, "columnType", "I");
|
79
|
-
jfieldID columnSizeFieldID = env->GetFieldID(columnClass, "columnSize", "I");
|
80
|
-
jfieldID charsetIdFieldID = env->GetFieldID(columnClass, "charsetId", "S");
|
81
|
-
jfieldID columnDateFormatID = env->GetFieldID(columnClass, "columnDateFormat", "Ljava/lang/String;");
|
82
|
-
|
83
|
-
EMBULK_OUTPUT_ORACLE_OCI_COL_DEF *colDefs = new EMBULK_OUTPUT_ORACLE_OCI_COL_DEF[columnCount + 1];
|
84
|
-
for (int i = 0; i < columnCount; i++) {
|
85
|
-
EMBULK_OUTPUT_ORACLE_OCI_COL_DEF &colDef = colDefs[i];
|
86
|
-
|
87
|
-
jobject column = env->GetObjectArrayElement(columnArray, i);
|
88
|
-
jstring columnName = (jstring)env->GetObjectField(column, columnNameFieldID);
|
89
|
-
colDefs[i].name = env->GetStringUTFChars(columnName, NULL);
|
90
|
-
colDefs[i].type = env->GetIntField(column, columnTypeFieldID);
|
91
|
-
colDefs[i].size = env->GetIntField(column, columnSizeFieldID);
|
92
|
-
colDefs[i].charsetId = env->GetShortField(column, charsetIdFieldID);
|
93
|
-
|
94
|
-
jstring columnDateFormat = (jstring)env->GetObjectField(column, columnDateFormatID);
|
95
|
-
if (columnDateFormat != NULL) {
|
96
|
-
colDef.dateFormat = env->GetStringUTFChars(columnDateFormat, NULL);
|
97
|
-
} else {
|
98
|
-
colDef.dateFormat = NULL;
|
99
|
-
}
|
100
|
-
|
101
|
-
}
|
102
|
-
|
103
|
-
colDefs[columnCount].name = NULL;
|
104
|
-
colDefs[columnCount].type = 0;
|
105
|
-
colDefs[columnCount].size = 0;
|
106
|
-
colDefs[columnCount].dateFormat = NULL;
|
107
|
-
|
108
|
-
int result = embulk_output_oracle_prepareDirPathStream(context, tableName, colDefs);
|
109
|
-
|
110
|
-
for (int i = 0; i < columnCount; i++) {
|
111
|
-
EMBULK_OUTPUT_ORACLE_OCI_COL_DEF &colDef = colDefs[i];
|
112
|
-
jobject column = env->GetObjectArrayElement(columnArray, i);
|
113
|
-
|
114
|
-
jstring columnName = (jstring)env->GetObjectField(column, columnNameFieldID);
|
115
|
-
env->ReleaseStringUTFChars(columnName, colDef.name);
|
116
|
-
colDef.name = NULL;
|
117
|
-
|
118
|
-
if (colDef.dateFormat != NULL) {
|
119
|
-
jstring columnDateFormat = (jstring)env->GetObjectField(column, columnDateFormatID);
|
120
|
-
env->ReleaseStringUTFChars(columnDateFormat, colDef.dateFormat);
|
121
|
-
colDef.dateFormat = NULL;
|
122
|
-
}
|
123
|
-
}
|
124
|
-
|
125
|
-
env->SetByteArrayRegion(addrs, sizeof(EMBULK_OUTPUT_ORACLE_OCI_CONTEXT*), sizeof(colDefs), (jbyte*)&colDefs);
|
126
|
-
|
127
|
-
env->ReleaseStringUTFChars(tableNameString, tableName);
|
128
|
-
|
129
|
-
if (result != OCI_SUCCESS) {
|
130
|
-
return JNI_FALSE;
|
131
|
-
}
|
132
|
-
|
133
|
-
return JNI_TRUE;
|
134
|
-
}
|
135
|
-
|
136
|
-
|
137
|
-
JNIEXPORT jboolean JNICALL Java_org_embulk_output_oracle_oci_OCI_loadBuffer
|
138
|
-
(JNIEnv *env, jobject, jbyteArray addrs, jbyteArray buffer, jint rowCount)
|
139
|
-
{
|
140
|
-
EMBULK_OUTPUT_ORACLE_OCI_CONTEXT *context = toContext(env, addrs);
|
141
|
-
EMBULK_OUTPUT_ORACLE_OCI_COL_DEF *colDefs = toColDefs(env, addrs);
|
142
|
-
|
143
|
-
jbyte *bytes = env->GetByteArrayElements(buffer, NULL);
|
144
|
-
|
145
|
-
int result = embulk_output_oracle_loadBuffer(context, colDefs, (const char*)bytes, rowCount);
|
146
|
-
|
147
|
-
env->ReleaseByteArrayElements(buffer, bytes, JNI_ABORT);
|
148
|
-
|
149
|
-
if (result != OCI_SUCCESS) {
|
150
|
-
return JNI_FALSE;
|
151
|
-
}
|
152
|
-
|
153
|
-
return JNI_TRUE;
|
154
|
-
}
|
155
|
-
|
156
|
-
|
157
|
-
JNIEXPORT jboolean JNICALL Java_org_embulk_output_oracle_oci_OCI_commit
|
158
|
-
(JNIEnv *env, jobject, jbyteArray addrs)
|
159
|
-
{
|
160
|
-
EMBULK_OUTPUT_ORACLE_OCI_CONTEXT *context = toContext(env, addrs);
|
161
|
-
if (embulk_output_oracle_commitDirPath(context) !=OCI_SUCCESS) {
|
162
|
-
return JNI_FALSE;
|
163
|
-
}
|
164
|
-
|
165
|
-
return JNI_TRUE;
|
166
|
-
}
|
167
|
-
|
168
|
-
|
169
|
-
JNIEXPORT jboolean JNICALL Java_org_embulk_output_oracle_oci_OCI_rollback
|
170
|
-
(JNIEnv *env, jobject, jbyteArray addrs)
|
171
|
-
{
|
172
|
-
EMBULK_OUTPUT_ORACLE_OCI_CONTEXT *context = toContext(env, addrs);
|
173
|
-
if (embulk_output_oracle_rollbackDirPath(context) !=OCI_SUCCESS) {
|
174
|
-
return JNI_FALSE;
|
175
|
-
}
|
176
|
-
|
177
|
-
return JNI_TRUE;
|
178
|
-
}
|
179
|
-
|
180
|
-
|
181
|
-
JNIEXPORT void JNICALL Java_org_embulk_output_oracle_oci_OCI_close
|
182
|
-
(JNIEnv *env, jobject, jbyteArray addrs)
|
183
|
-
{
|
184
|
-
EMBULK_OUTPUT_ORACLE_OCI_CONTEXT *context = toContext(env, addrs);
|
185
|
-
if (context != NULL) {
|
186
|
-
embulk_output_oracle_freeDirPathHandles(context);
|
187
|
-
delete context;
|
188
|
-
}
|
189
|
-
|
190
|
-
EMBULK_OUTPUT_ORACLE_OCI_COL_DEF *colDefs = toColDefs(env, addrs);
|
191
|
-
if (colDefs != NULL) {
|
192
|
-
delete[] colDefs;
|
193
|
-
}
|
194
|
-
|
195
|
-
}
|