/
OracleDbDialect.java
145 lines (116 loc) · 4.66 KB
/
OracleDbDialect.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
/*
* SymmetricDS is an open source database synchronization solution.
*
* Copyright (C) Chris Henson <chenson42@users.sourceforge.net>
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 3 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, see
* <http://www.gnu.org/licenses/>.
*/
package org.jumpmind.symmetric.db.oracle;
import java.net.URL;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.jumpmind.symmetric.db.AbstractDbDialect;
import org.jumpmind.symmetric.db.IDbDialect;
import org.jumpmind.symmetric.db.SqlScript;
public class OracleDbDialect extends AbstractDbDialect implements IDbDialect {
static final Log logger = LogFactory.getLog(OracleDbDialect.class);
static final String TRANSACTION_ID_FUNCTION_NAME = "fn_transaction_id";
static final String PACKAGE = "pack_symmetric";
static final String ORACLE_OBJECT_TYPE = "FUNCTION";
static final String SYNC_TRIGGERS_DISABLED_FUNCTION = "fn_trigger_disabled";
@Override
protected void initForSpecificDialect() {
try {
if (!isPackageUpToDate(PACKAGE)) {
logger
.info("Creating package "
+ PACKAGE);
new SqlScript(getSqlScriptUrl(), getPlatform()
.getDataSource(), '/').execute();
}
} catch (Exception ex) {
logger.error("Error while initializing Oracle.", ex);
}
}
private URL getSqlScriptUrl() {
return getClass().getResource("/dialects/oracle.sql");
}
private boolean isPackageUpToDate(String name) throws Exception {
return jdbcTemplate
.queryForInt(
"select count(*) from user_objects where object_name= upper(?) ",
new Object[] { name }) > 0;
}
public boolean isCharSpacePadded() {
return true;
}
public boolean isCharSpaceTrimmed() {
return false;
}
public boolean isEmptyStringNulled() {
return true;
}
public boolean isBlobOverrideToBinary() {
return true;
}
public void removeTrigger(String schemaName, String triggerName) {
schemaName = schemaName == null ? "" : (schemaName + ".");
try {
jdbcTemplate.update("drop trigger " + schemaName + triggerName);
} catch (Exception e) {
logger.warn("Trigger does not exist");
}
}
public void removeTrigger(String schemaName, String triggerName, String tableName) {
removeTrigger(schemaName, triggerName);
}
public String getTransactionTriggerExpression() {
return TRANSACTION_ID_FUNCTION_NAME + "()";
}
public boolean supportsTransactionId() {
return true;
}
public String getSelectLastInsertIdSql(String sequenceName) {
return "select " + sequenceName + ".currval from dual')";
}
@Override
protected boolean doesTriggerExistOnPlatform(String schema, String tableName,
String triggerName) {
return jdbcTemplate
.queryForInt(
"select count(*) from ALL_TRIGGERS where trigger_name like upper(?) and table_name like upper(?)",
new Object[] { triggerName, tableName }) > 0;
}
public boolean supportsMixedCaseNamesInCatalog() {
return false;
}
public void purge() {
jdbcTemplate.update("purge recyclebin");
}
public void disableSyncTriggers() {
jdbcTemplate.update("call pack_symmetric.setValue(1)");
}
public void enableSyncTriggers() {
jdbcTemplate.update("call pack_symmetric.setValue(null)");
}
public String getSyncTriggersExpression() {
return SYNC_TRIGGERS_DISABLED_FUNCTION + "() is null";
}
public String getDefaultSchema() {
return (String) jdbcTemplate.queryForObject(
"SELECT sys_context('USERENV', 'CURRENT_SCHEMA') FROM dual",
String.class);
}
}