embulk-output-oracle 0.2.4 → 0.3.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (55) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +155 -110
  3. data/build.gradle +6 -6
  4. data/classpath/embulk-output-jdbc-0.3.0.jar +0 -0
  5. data/classpath/embulk-output-oracle-0.3.0.jar +0 -0
  6. data/lib/embulk/output/oracle.rb +3 -3
  7. data/src/main/cpp/common/dir-path-load.cpp +424 -424
  8. data/src/main/cpp/common/dir-path-load.h +36 -36
  9. data/src/main/cpp/common/embulk-output-oracle.cpp +196 -196
  10. data/src/main/cpp/common/org_embulk_output_oracle_oci_OCI.h +77 -77
  11. data/src/main/cpp/linux/build.sh +21 -21
  12. data/src/main/cpp/win/build.bat +31 -31
  13. data/src/main/cpp/win/dllmain.cpp +25 -25
  14. data/src/main/cpp/win/embulk-output-oracle.sln +39 -39
  15. data/src/main/cpp/win/embulk-output-oracle.vcxproj +175 -175
  16. data/src/main/java/org/embulk/output/OracleOutputPlugin.java +22 -66
  17. data/src/main/java/org/embulk/output/oracle/DirectBatchInsert.java +289 -289
  18. data/src/main/java/org/embulk/output/oracle/InsertMethod.java +8 -8
  19. data/src/main/java/org/embulk/output/oracle/OracleCharset.java +32 -19
  20. data/src/main/java/org/embulk/output/oracle/OracleOutputConnection.java +165 -134
  21. data/src/main/java/org/embulk/output/oracle/OracleOutputConnector.java +49 -49
  22. data/src/main/java/org/embulk/output/oracle/TimestampFormat.java +37 -37
  23. data/src/main/java/org/embulk/output/oracle/oci/ColumnDefinition.java +26 -26
  24. data/src/main/java/org/embulk/output/oracle/oci/OCI.java +139 -139
  25. data/src/main/java/org/embulk/output/oracle/oci/OCIManager.java +64 -64
  26. data/src/main/java/org/embulk/output/oracle/oci/OCIWrapper.java +96 -96
  27. data/src/main/java/org/embulk/output/oracle/oci/RowBuffer.java +99 -99
  28. data/src/main/java/org/embulk/output/oracle/oci/TableDefinition.java +24 -24
  29. data/src/test/cpp/common/embulk-output-oracle-test.cpp +69 -69
  30. data/src/test/cpp/linux/build.sh +19 -19
  31. data/src/test/cpp/win/build.bat +28 -28
  32. data/src/test/cpp/win/embulk-output-oracle-test.vcxproj +154 -154
  33. data/src/test/java/org/embulk/input/filesplit/LocalFileSplitInputPlugin.java +187 -187
  34. data/src/test/java/org/embulk/input/filesplit/PartialFile.java +49 -49
  35. data/src/test/java/org/embulk/input/filesplit/PartialFileInputStream.java +154 -154
  36. data/src/test/java/org/embulk/output/oracle/ChildFirstClassLoader.java +42 -42
  37. data/src/test/java/org/embulk/output/oracle/EmbulkPluginTester.java +120 -120
  38. data/src/test/java/org/embulk/output/oracle/EmptyConfigSource.java +100 -100
  39. data/src/test/java/org/embulk/output/oracle/OracleOutputPluginTest.java +172 -161
  40. data/src/test/java/org/embulk/output/oracle/OracleOutputPluginTestImpl.java +445 -413
  41. data/src/test/java/org/embulk/output/oracle/TimestampFormatTest.java +57 -57
  42. data/src/test/resources/data/test1/test1.csv +3 -3
  43. data/src/test/resources/yml/test-insert-direct.yml +26 -26
  44. data/src/test/resources/yml/test-insert-oci-split.yml +26 -26
  45. data/src/test/resources/yml/test-insert-oci.yml +26 -26
  46. data/src/test/resources/yml/test-insert.yml +25 -25
  47. data/src/test/resources/yml/test-replace-long-name-multibyte.yml +25 -0
  48. data/src/test/resources/yml/test-replace-long-name.yml +25 -25
  49. data/src/test/resources/yml/test-replace.yml +25 -25
  50. data/src/test/resources/yml/test-string-timestamp.yml +25 -0
  51. data/src/test/resources/yml/test-url.yml +24 -24
  52. metadata +6 -5
  53. data/classpath/embulk-output-jdbc-0.2.4.jar +0 -0
  54. data/classpath/embulk-output-oracle-0.2.4.jar +0 -0
  55. data/src/main/java/org/embulk/output/oracle/setter/OracleColumnSetterFactory.java +0 -31
@@ -1,139 +1,139 @@
1
- package org.embulk.output.oracle.oci;
2
-
3
- import java.io.File;
4
- import java.io.IOException;
5
- import java.net.MalformedURLException;
6
- import java.net.URISyntaxException;
7
- import java.net.URL;
8
-
9
- import org.embulk.spi.Exec;
10
- import org.slf4j.Logger;
11
-
12
- import com.google.common.io.Files;
13
-
14
-
15
- public class OCI
16
- {
17
- private static final Logger logger = Exec.getLogger(OCI.class);
18
-
19
- private static final String PLUGIN_NAME = "embulk-output-oracle";
20
-
21
- static {
22
- try {
23
- loadLibrary();
24
- } catch (URISyntaxException | IOException e) {
25
- throw new RuntimeException(e);
26
- }
27
- }
28
-
29
- public native byte[] createContext();
30
-
31
- public native byte[] getLasetMessage(byte[] context);
32
-
33
- public native boolean open(byte[] context, String dbName, String userName, String password);
34
-
35
- public native boolean prepareLoad(byte[] context, TableDefinition tableDefinition);
36
-
37
- public native boolean loadBuffer(byte[] context, byte[] buffer, int rowCount);
38
-
39
- public native boolean commit(byte[] context);
40
-
41
- public native boolean rollback(byte[] context);
42
-
43
- public native void close(byte[] context);
44
-
45
- private static void loadLibrary() throws URISyntaxException, IOException
46
- {
47
- loadLibrary(getPluginRoot());
48
- }
49
-
50
- private static File getPluginRoot() throws MalformedURLException, URISyntaxException
51
- {
52
- URL url = OCI.class.getResource("/" + OCI.class.getName().replace('.', '/') + ".class");
53
- if (url.toString().startsWith("jar:")) {
54
- url = new URL(url.toString().replaceAll("^jar:", "").replaceAll("![^!]*$", ""));
55
- }
56
-
57
- File folder = new File(url.toURI()).getParentFile();
58
- for (;; folder = folder.getParentFile()) {
59
- if (folder == null) {
60
- String message = String.format("OCI : %s folder not found.", PLUGIN_NAME);
61
- throw new RuntimeException(message);
62
- }
63
-
64
- if (folder.getName().startsWith(PLUGIN_NAME)) {
65
- return folder;
66
- }
67
- }
68
- }
69
-
70
- private static void loadLibrary(File folder) throws IOException
71
- {
72
- File lib = new File(new File(folder, "lib"), "embulk");
73
-
74
- String osName = System.getProperty("os.name");
75
- String osArch = System.getProperty("os.arch");
76
-
77
- String libraryName = System.mapLibraryName(PLUGIN_NAME);
78
- File libFolder = null;
79
-
80
- if (osName.startsWith("Windows")) {
81
- if (osArch.endsWith("64")) {
82
- libFolder = new File(lib, "win_x64");
83
- } else if (osArch.equals("x86")) {
84
- libFolder = new File(lib, "win_x86");
85
- }
86
- } else if (osName.equals("Linux")) {
87
- if (osArch.endsWith("64")) {
88
- libFolder = new File(lib, "linux_x64");
89
- } else if (osArch.equals("x86")) {
90
- libFolder = new File(lib, "linux_x86");
91
- }
92
- }
93
-
94
- if (libFolder == null) {
95
- logger.error(String.format("OCI : library \"%s\" for %s %s doesn't exist in lib folder.", libraryName, osName, osArch));
96
- return;
97
- }
98
-
99
- File libFile = new File(libFolder, libraryName);
100
- if (!libFile.exists()) {
101
- logger.error(String.format("OCI : library \"%s\" doesn't exist.", libFile.getAbsolutePath()));
102
- return;
103
- }
104
-
105
- logger.info(String.format("OCI : load library \"%s\".", libFile.getAbsolutePath()));
106
-
107
- File tempFolder = new File(lib, "temp");
108
- tempFolder.mkdirs();
109
-
110
- long currentTime = System.currentTimeMillis();
111
- File[] files = tempFolder.listFiles();
112
- if (files != null) {
113
- for (File file : files) {
114
- // delete old temporary files.
115
- // if another plugin is using a file, it cannot be deleted.
116
- // don't delete a recent file because another plugin may intend to use it.
117
- if (file.isFile() && file.getName().startsWith(PLUGIN_NAME) && file.lastModified() < currentTime - 60000) {
118
- file.delete();
119
- }
120
- }
121
- }
122
-
123
- String extension = libraryName.replaceAll("^[^\\.]*", "");
124
- for (int i = 0; i < 10; i++) {
125
- File tempLibFile = new File(tempFolder, PLUGIN_NAME + "-" + currentTime + "-" + i + extension);
126
- if (tempLibFile.createNewFile()) {
127
- // copy and load the library because different plugins cannot load the same library.
128
- logger.info(String.format("OCI : create temporary library \"%s\".", tempLibFile.getAbsolutePath()));
129
- Files.copy(libFile, tempLibFile);
130
- System.load(tempLibFile.getAbsolutePath());
131
- tempLibFile.deleteOnExit();
132
- // but may not be deleted because loaded as a library.
133
- return;
134
- }
135
- }
136
-
137
- logger.error("OCI : cannot create temporary library.");
138
- }
139
- }
1
+ package org.embulk.output.oracle.oci;
2
+
3
+ import java.io.File;
4
+ import java.io.IOException;
5
+ import java.net.MalformedURLException;
6
+ import java.net.URISyntaxException;
7
+ import java.net.URL;
8
+
9
+ import org.embulk.spi.Exec;
10
+ import org.slf4j.Logger;
11
+
12
+ import com.google.common.io.Files;
13
+
14
+
15
+ public class OCI
16
+ {
17
+ private static final Logger logger = Exec.getLogger(OCI.class);
18
+
19
+ private static final String PLUGIN_NAME = "embulk-output-oracle";
20
+
21
+ static {
22
+ try {
23
+ loadLibrary();
24
+ } catch (URISyntaxException | IOException e) {
25
+ throw new RuntimeException(e);
26
+ }
27
+ }
28
+
29
+ public native byte[] createContext();
30
+
31
+ public native byte[] getLasetMessage(byte[] context);
32
+
33
+ public native boolean open(byte[] context, String dbName, String userName, String password);
34
+
35
+ public native boolean prepareLoad(byte[] context, TableDefinition tableDefinition);
36
+
37
+ public native boolean loadBuffer(byte[] context, byte[] buffer, int rowCount);
38
+
39
+ public native boolean commit(byte[] context);
40
+
41
+ public native boolean rollback(byte[] context);
42
+
43
+ public native void close(byte[] context);
44
+
45
+ private static void loadLibrary() throws URISyntaxException, IOException
46
+ {
47
+ loadLibrary(getPluginRoot());
48
+ }
49
+
50
+ private static File getPluginRoot() throws MalformedURLException, URISyntaxException
51
+ {
52
+ URL url = OCI.class.getResource("/" + OCI.class.getName().replace('.', '/') + ".class");
53
+ if (url.toString().startsWith("jar:")) {
54
+ url = new URL(url.toString().replaceAll("^jar:", "").replaceAll("![^!]*$", ""));
55
+ }
56
+
57
+ File folder = new File(url.toURI()).getParentFile();
58
+ for (;; folder = folder.getParentFile()) {
59
+ if (folder == null) {
60
+ String message = String.format("OCI : %s folder not found.", PLUGIN_NAME);
61
+ throw new RuntimeException(message);
62
+ }
63
+
64
+ if (folder.getName().startsWith(PLUGIN_NAME)) {
65
+ return folder;
66
+ }
67
+ }
68
+ }
69
+
70
+ private static void loadLibrary(File folder) throws IOException
71
+ {
72
+ File lib = new File(new File(folder, "lib"), "embulk");
73
+
74
+ String osName = System.getProperty("os.name");
75
+ String osArch = System.getProperty("os.arch");
76
+
77
+ String libraryName = System.mapLibraryName(PLUGIN_NAME);
78
+ File libFolder = null;
79
+
80
+ if (osName.startsWith("Windows")) {
81
+ if (osArch.endsWith("64")) {
82
+ libFolder = new File(lib, "win_x64");
83
+ } else if (osArch.equals("x86")) {
84
+ libFolder = new File(lib, "win_x86");
85
+ }
86
+ } else if (osName.equals("Linux")) {
87
+ if (osArch.endsWith("64")) {
88
+ libFolder = new File(lib, "linux_x64");
89
+ } else if (osArch.equals("x86")) {
90
+ libFolder = new File(lib, "linux_x86");
91
+ }
92
+ }
93
+
94
+ if (libFolder == null) {
95
+ logger.error(String.format("OCI : library \"%s\" for %s %s doesn't exist in lib folder.", libraryName, osName, osArch));
96
+ return;
97
+ }
98
+
99
+ File libFile = new File(libFolder, libraryName);
100
+ if (!libFile.exists()) {
101
+ logger.error(String.format("OCI : library \"%s\" doesn't exist.", libFile.getAbsolutePath()));
102
+ return;
103
+ }
104
+
105
+ logger.info(String.format("OCI : load library \"%s\".", libFile.getAbsolutePath()));
106
+
107
+ File tempFolder = new File(lib, "temp");
108
+ tempFolder.mkdirs();
109
+
110
+ long currentTime = System.currentTimeMillis();
111
+ File[] files = tempFolder.listFiles();
112
+ if (files != null) {
113
+ for (File file : files) {
114
+ // delete old temporary files.
115
+ // if another plugin is using a file, it cannot be deleted.
116
+ // don't delete a recent file because another plugin may intend to use it.
117
+ if (file.isFile() && file.getName().startsWith(PLUGIN_NAME) && file.lastModified() < currentTime - 60000) {
118
+ file.delete();
119
+ }
120
+ }
121
+ }
122
+
123
+ String extension = libraryName.replaceAll("^[^\\.]*", "");
124
+ for (int i = 0; i < 10; i++) {
125
+ File tempLibFile = new File(tempFolder, PLUGIN_NAME + "-" + currentTime + "-" + i + extension);
126
+ if (tempLibFile.createNewFile()) {
127
+ // copy and load the library because different plugins cannot load the same library.
128
+ logger.info(String.format("OCI : create temporary library \"%s\".", tempLibFile.getAbsolutePath()));
129
+ Files.copy(libFile, tempLibFile);
130
+ System.load(tempLibFile.getAbsolutePath());
131
+ tempLibFile.deleteOnExit();
132
+ // but may not be deleted because loaded as a library.
133
+ return;
134
+ }
135
+ }
136
+
137
+ logger.error("OCI : cannot create temporary library.");
138
+ }
139
+ }
@@ -1,64 +1,64 @@
1
- package org.embulk.output.oracle.oci;
2
-
3
- import java.sql.SQLException;
4
- import java.util.HashMap;
5
- import java.util.Map;
6
-
7
- import org.embulk.spi.Exec;
8
- import org.slf4j.Logger;
9
-
10
- public class OCIManager
11
- {
12
- private static class OCIWrapperAndCounter {
13
- public OCIWrapper oci;
14
- public int counter;
15
- }
16
-
17
-
18
- private final Logger logger = Exec.getLogger(getClass());
19
-
20
- private Map<Object, OCIWrapperAndCounter> ociAndCounters = new HashMap<Object, OCIWrapperAndCounter>();
21
-
22
-
23
- public OCIWrapper open(Object key, String dbName, String userName, String password, TableDefinition tableDefinition) throws SQLException
24
- {
25
- synchronized(ociAndCounters) {
26
- OCIWrapperAndCounter ociAndCounter;
27
- if (ociAndCounters.containsKey(key)) {
28
- ociAndCounter = ociAndCounters.get(key);
29
- } else {
30
- logger.info(String.format("OCI : open for %s.", key));
31
- ociAndCounter = new OCIWrapperAndCounter();
32
- ociAndCounter.oci = new OCIWrapper();
33
- ociAndCounter.oci.open(dbName, userName, password);
34
- ociAndCounter.oci.prepareLoad(tableDefinition);
35
- ociAndCounters.put(key, ociAndCounter);
36
- }
37
- ociAndCounter.counter++;
38
- return ociAndCounter.oci;
39
- }
40
- }
41
-
42
- public OCIWrapper get(Object key)
43
- {
44
- synchronized(ociAndCounters) {
45
- return ociAndCounters.get(key).oci;
46
- }
47
- }
48
-
49
- public void close(Object key) throws SQLException
50
- {
51
- synchronized(ociAndCounters) {
52
- OCIWrapperAndCounter ociAndCounter = ociAndCounters.get(key);
53
- if (ociAndCounter != null) {
54
- ociAndCounter.counter--;
55
- if (ociAndCounter.counter == 0) {
56
- logger.info(String.format("OCI : close for %s.", key));
57
- ociAndCounter.oci.close();
58
- ociAndCounters.remove(key);
59
- }
60
- }
61
- }
62
- }
63
-
64
- }
1
+ package org.embulk.output.oracle.oci;
2
+
3
+ import java.sql.SQLException;
4
+ import java.util.HashMap;
5
+ import java.util.Map;
6
+
7
+ import org.embulk.spi.Exec;
8
+ import org.slf4j.Logger;
9
+
10
+ public class OCIManager
11
+ {
12
+ private static class OCIWrapperAndCounter {
13
+ public OCIWrapper oci;
14
+ public int counter;
15
+ }
16
+
17
+
18
+ private final Logger logger = Exec.getLogger(getClass());
19
+
20
+ private Map<Object, OCIWrapperAndCounter> ociAndCounters = new HashMap<Object, OCIWrapperAndCounter>();
21
+
22
+
23
+ public OCIWrapper open(Object key, String dbName, String userName, String password, TableDefinition tableDefinition) throws SQLException
24
+ {
25
+ synchronized(ociAndCounters) {
26
+ OCIWrapperAndCounter ociAndCounter;
27
+ if (ociAndCounters.containsKey(key)) {
28
+ ociAndCounter = ociAndCounters.get(key);
29
+ } else {
30
+ logger.info(String.format("OCI : open for %s.", key));
31
+ ociAndCounter = new OCIWrapperAndCounter();
32
+ ociAndCounter.oci = new OCIWrapper();
33
+ ociAndCounter.oci.open(dbName, userName, password);
34
+ ociAndCounter.oci.prepareLoad(tableDefinition);
35
+ ociAndCounters.put(key, ociAndCounter);
36
+ }
37
+ ociAndCounter.counter++;
38
+ return ociAndCounter.oci;
39
+ }
40
+ }
41
+
42
+ public OCIWrapper get(Object key)
43
+ {
44
+ synchronized(ociAndCounters) {
45
+ return ociAndCounters.get(key).oci;
46
+ }
47
+ }
48
+
49
+ public void close(Object key) throws SQLException
50
+ {
51
+ synchronized(ociAndCounters) {
52
+ OCIWrapperAndCounter ociAndCounter = ociAndCounters.get(key);
53
+ if (ociAndCounter != null) {
54
+ ociAndCounter.counter--;
55
+ if (ociAndCounter.counter == 0) {
56
+ logger.info(String.format("OCI : close for %s.", key));
57
+ ociAndCounter.oci.close();
58
+ ociAndCounters.remove(key);
59
+ }
60
+ }
61
+ }
62
+ }
63
+
64
+ }
@@ -1,96 +1,96 @@
1
- package org.embulk.output.oracle.oci;
2
-
3
- import java.nio.charset.Charset;
4
- import java.sql.SQLException;
5
-
6
- import org.embulk.spi.Exec;
7
- import org.slf4j.Logger;
8
-
9
-
10
- public class OCIWrapper implements AutoCloseable
11
- {
12
- private final Logger logger = Exec.getLogger(getClass());
13
-
14
- private final OCI oci = new OCI();
15
- // used for messages
16
- private final Charset defaultCharset;
17
- private byte[] context;
18
- private boolean errorOccured;
19
- private boolean committedOrRollbacked;
20
-
21
-
22
- public OCIWrapper()
23
- {
24
- // enable to change default encoding for test
25
- defaultCharset = Charset.forName(System.getProperty("file.encoding"));
26
- context = oci.createContext();
27
- }
28
-
29
- public void open(String dbName, String userName, String password) throws SQLException
30
- {
31
- if (!oci.open(context, dbName, userName, password)) {
32
- throwException();
33
- }
34
- }
35
-
36
- public void prepareLoad(TableDefinition tableDefinition) throws SQLException
37
- {
38
- if (!oci.prepareLoad(context, tableDefinition)) {
39
- throwException();
40
- }
41
- }
42
-
43
- public void loadBuffer(byte[] buffer, int rowCount) throws SQLException
44
- {
45
- if (!oci.loadBuffer(context, buffer, rowCount)) {
46
- throwException();
47
- }
48
- }
49
-
50
- public void commit() throws SQLException
51
- {
52
- committedOrRollbacked = true;
53
- logger.info("OCI : start to commit.");
54
- if (!oci.commit(context)) {
55
- throwException();
56
- }
57
- }
58
-
59
- public void rollback() throws SQLException
60
- {
61
- committedOrRollbacked = true;
62
- logger.info("OCI : start to rollback.");
63
- if (!oci.rollback(context)) {
64
- throwException();
65
- }
66
- }
67
-
68
- private void throwException() throws SQLException
69
- {
70
- errorOccured = true;
71
- String message = new String(oci.getLasetMessage(context), defaultCharset);
72
- logger.error(message);
73
- throw new SQLException(message);
74
- }
75
-
76
-
77
- @Override
78
- public void close() throws SQLException
79
- {
80
- if (context != null) {
81
- try {
82
- if (!committedOrRollbacked) {
83
- if (errorOccured) {
84
- rollback();
85
- } else {
86
- commit();
87
- }
88
- }
89
- } finally {
90
- oci.close(context);
91
- context = null;
92
- }
93
- }
94
- }
95
-
96
- }
1
+ package org.embulk.output.oracle.oci;
2
+
3
+ import java.nio.charset.Charset;
4
+ import java.sql.SQLException;
5
+
6
+ import org.embulk.spi.Exec;
7
+ import org.slf4j.Logger;
8
+
9
+
10
+ public class OCIWrapper implements AutoCloseable
11
+ {
12
+ private final Logger logger = Exec.getLogger(getClass());
13
+
14
+ private final OCI oci = new OCI();
15
+ // used for messages
16
+ private final Charset defaultCharset;
17
+ private byte[] context;
18
+ private boolean errorOccured;
19
+ private boolean committedOrRollbacked;
20
+
21
+
22
+ public OCIWrapper()
23
+ {
24
+ // enable to change default encoding for test
25
+ defaultCharset = Charset.forName(System.getProperty("file.encoding"));
26
+ context = oci.createContext();
27
+ }
28
+
29
+ public void open(String dbName, String userName, String password) throws SQLException
30
+ {
31
+ if (!oci.open(context, dbName, userName, password)) {
32
+ throwException();
33
+ }
34
+ }
35
+
36
+ public void prepareLoad(TableDefinition tableDefinition) throws SQLException
37
+ {
38
+ if (!oci.prepareLoad(context, tableDefinition)) {
39
+ throwException();
40
+ }
41
+ }
42
+
43
+ public void loadBuffer(byte[] buffer, int rowCount) throws SQLException
44
+ {
45
+ if (!oci.loadBuffer(context, buffer, rowCount)) {
46
+ throwException();
47
+ }
48
+ }
49
+
50
+ public void commit() throws SQLException
51
+ {
52
+ committedOrRollbacked = true;
53
+ logger.info("OCI : start to commit.");
54
+ if (!oci.commit(context)) {
55
+ throwException();
56
+ }
57
+ }
58
+
59
+ public void rollback() throws SQLException
60
+ {
61
+ committedOrRollbacked = true;
62
+ logger.info("OCI : start to rollback.");
63
+ if (!oci.rollback(context)) {
64
+ throwException();
65
+ }
66
+ }
67
+
68
+ private void throwException() throws SQLException
69
+ {
70
+ errorOccured = true;
71
+ String message = new String(oci.getLasetMessage(context), defaultCharset);
72
+ logger.error(message);
73
+ throw new SQLException(message);
74
+ }
75
+
76
+
77
+ @Override
78
+ public void close() throws SQLException
79
+ {
80
+ if (context != null) {
81
+ try {
82
+ if (!committedOrRollbacked) {
83
+ if (errorOccured) {
84
+ rollback();
85
+ } else {
86
+ commit();
87
+ }
88
+ }
89
+ } finally {
90
+ oci.close(context);
91
+ context = null;
92
+ }
93
+ }
94
+ }
95
+
96
+ }