embulk-output-oracle 0.4.5 → 0.5.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (51) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +0 -50
  3. data/build.gradle +1 -0
  4. data/classpath/embulk-output-jdbc-0.5.0.jar +0 -0
  5. data/classpath/embulk-output-oracle-0.5.0.jar +0 -0
  6. data/src/main/java/org/embulk/output/oracle/DirectBatchInsert.java +16 -14
  7. data/src/main/java/org/embulk/output/oracle/OracleOutputConnection.java +5 -5
  8. data/src/main/java/org/embulk/output/oracle/oci/ColumnDefinition.java +39 -15
  9. data/src/main/java/org/embulk/output/oracle/oci/OCI.java +125 -133
  10. data/src/main/java/org/embulk/output/oracle/oci/OCIWrapper.java +403 -33
  11. data/src/main/java/org/embulk/output/oracle/oci/RowBuffer.java +39 -40
  12. data/src/main/java/org/embulk/output/oracle/oci/TableDefinition.java +17 -3
  13. data/src/test/java/org/embulk/output/oracle/OracleOutputPluginTest.java +2 -2
  14. data/src/test/java/org/embulk/output/oracle/OracleOutputPluginTestImpl.java +38 -143
  15. data/src/test/resources/{data → oracle/data}/test1/test1.csv +0 -0
  16. data/src/test/resources/{yml → oracle/yml}/test-insert-direct-direct-method.yml +1 -1
  17. data/src/test/resources/{yml → oracle/yml}/test-insert-direct-empty.yml +1 -1
  18. data/src/test/resources/{yml → oracle/yml}/test-insert-direct-oci-method-split.yml +1 -1
  19. data/src/test/resources/{yml → oracle/yml}/test-insert-direct-oci-method.yml +1 -1
  20. data/src/test/resources/{yml → oracle/yml}/test-insert-direct.yml +1 -1
  21. data/src/test/resources/{yml → oracle/yml}/test-insert-empty.yml +1 -1
  22. data/src/test/resources/{yml → oracle/yml}/test-insert.yml +1 -1
  23. data/src/test/resources/{yml → oracle/yml}/test-replace-empty.yml +1 -1
  24. data/src/test/resources/{yml → oracle/yml}/test-replace-long-name-multibyte.yml +1 -1
  25. data/src/test/resources/{yml → oracle/yml}/test-replace-long-name.yml +1 -1
  26. data/src/test/resources/{yml → oracle/yml}/test-replace-oci-method.yml +1 -1
  27. data/src/test/resources/{yml → oracle/yml}/test-replace.yml +1 -1
  28. data/src/test/resources/{yml → oracle/yml}/test-string-timestamp.yml +1 -1
  29. data/src/test/resources/{yml → oracle/yml}/test-truncate-insert-oci-method.yml +1 -1
  30. data/src/test/resources/{yml → oracle/yml}/test-truncate-insert.yml +1 -1
  31. data/src/test/resources/{yml → oracle/yml}/test-url.yml +1 -1
  32. metadata +21 -38
  33. data/classpath/embulk-output-jdbc-0.4.5.jar +0 -0
  34. data/classpath/embulk-output-oracle-0.4.5.jar +0 -0
  35. data/lib/embulk/linux_x64/libembulk-output-oracle.so +0 -0
  36. data/lib/embulk/win_x64/embulk-output-oracle.dll +0 -0
  37. data/src/main/cpp/common/dir-path-load.cpp +0 -425
  38. data/src/main/cpp/common/dir-path-load.h +0 -37
  39. data/src/main/cpp/common/embulk-output-oracle.cpp +0 -195
  40. data/src/main/cpp/common/org_embulk_output_oracle_oci_OCI.h +0 -77
  41. data/src/main/cpp/linux/build.sh +0 -21
  42. data/src/main/cpp/win/build.bat +0 -32
  43. data/src/main/cpp/win/dllmain.cpp +0 -25
  44. data/src/main/cpp/win/embulk-output-oracle.sln +0 -39
  45. data/src/main/cpp/win/embulk-output-oracle.vcxproj +0 -176
  46. data/src/test/cpp/common/embulk-output-oracle-test.cpp +0 -69
  47. data/src/test/cpp/linux/build.sh +0 -19
  48. data/src/test/cpp/win/build.bat +0 -29
  49. data/src/test/cpp/win/embulk-output-oracle-test.vcxproj +0 -155
  50. data/src/test/java/org/embulk/output/tester/EmbulkPluginTester.java +0 -79
  51. 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
- }