/**
* Licensed to JumpMind Inc under one or more contributor
* license agreements. See the NOTICE file distributed
* with this work for additional information regarding
* copyright ownership. JumpMind Inc licenses this file
* to you under the GNU General Public License, version 3.0 (GPLv3)
* (the "License"); you may not use this file except in compliance
* with the License.
*
* You should have received a copy of the GNU General Public License,
* version 3.0 (GPLv3) along with this library; if not, see
* <http://www.gnu.org/licenses/>.
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
package org.jumpmind.symmetric.db.informix;
import org.jumpmind.db.platform.IDatabasePlatform;
import org.jumpmind.db.sql.ISqlTransaction;
import org.jumpmind.db.util.BinaryEncoding;
import org.jumpmind.symmetric.db.AbstractSymmetricDialect;
import org.jumpmind.symmetric.db.ISymmetricDialect;
import org.jumpmind.symmetric.model.Trigger;
import org.jumpmind.symmetric.service.IParameterService;
public class InformixSymmetricDialect extends AbstractSymmetricDialect implements ISymmetricDialect {
static final String SQL_DROP_FUNCTION = "drop function $(defaultSchema).$(functionName)";
static final String SQL_FUNCTION_INSTALLED = "select count(*) from sysprocedures where procname = '$(functionName)' and owner = (select trim(user) from sysmaster:sysdual)" ;
public InformixSymmetricDialect(IParameterService parameterService, IDatabasePlatform platform) {
super(parameterService, platform);
this.triggerTemplate = new InformixTriggerTemplate(this);
}
@Override
protected boolean doesTriggerExistOnPlatform(String catalog, String schema, String tableName,
String triggerName) {
return platform.getSqlTemplate().queryForInt(
"select count(*) from systriggers where lower(trigname) = ?",
new Object[] { triggerName.toLowerCase() }) > 0;
}
public void disableSyncTriggers(ISqlTransaction transaction, String nodeId) {
transaction.prepareAndExecute("select " + parameterService.getTablePrefix() + "_triggers_set_disabled('t'), "
+ parameterService.getTablePrefix() + "_node_set_disabled(?) from sysmaster:sysdual",
new Object[] { nodeId });
}
public void enableSyncTriggers(ISqlTransaction transaction) {
transaction.prepareAndExecute("select " + parameterService.getTablePrefix() + "_triggers_set_disabled('f'), "
+ parameterService.getTablePrefix() + "_node_set_disabled(null) from sysmaster:sysdual");
}
public String getSyncTriggersExpression() {
return "not $(defaultSchema)" + parameterService.getTablePrefix() + "_triggers_disabled()";
}
@Override
public void createRequiredDatabaseObjects() {
String triggersDisabled = this.parameterService.getTablePrefix() + "_" + "triggers_disabled";
if (!installed(SQL_FUNCTION_INSTALLED, triggersDisabled)) {
String sql = "create function $(defaultSchema).$(functionName)() returning boolean; " +
" define global symmetric_triggers_disabled boolean default 'f'; " +
" return symmetric_triggers_disabled; " +
" end function; ";
install(sql, triggersDisabled);
}
String triggersSetDisabled = this.parameterService.getTablePrefix() + "_" + "triggers_set_disabled";
if (!installed(SQL_FUNCTION_INSTALLED, triggersSetDisabled)) {
String sql = "create function $(defaultSchema).$(functionName)(is_disabled boolean) returning boolean; " +
" define global symmetric_triggers_disabled boolean default 'f'; " +
" let symmetric_triggers_disabled = is_disabled; " +
" return symmetric_triggers_disabled; " +
" end function; ";
install(sql, triggersSetDisabled);
}
String nodeDisabled = this.parameterService.getTablePrefix() + "_" + "node_disabled";
if (!installed(SQL_FUNCTION_INSTALLED, nodeDisabled)) {
String sql = "create function $(defaultSchema).$(functionName)() returning varchar(50); " +
" define global symmetric_node_disabled varchar(50) default null; " +
" return symmetric_node_disabled; " +
" end function; ";
install(sql, nodeDisabled);
}
String nodeSetDisabled = this.parameterService.getTablePrefix() + "_" + "node_set_disabled";
if (!installed(SQL_FUNCTION_INSTALLED, nodeSetDisabled)) {
String sql = "create function $(defaultSchema).$(functionName)(node_id varchar(50)) returning integer; " +
" define global symmetric_node_disabled varchar(50) default null; " +
" let symmetric_node_disabled = node_id; " +
" return 1; " +
" end function; ";
install(sql, nodeSetDisabled);
}
}
@Override
public void dropRequiredDatabaseObjects() {
String triggersDisabled = this.parameterService.getTablePrefix() + "_" + "triggers_disabled";
if (installed(SQL_FUNCTION_INSTALLED, triggersDisabled)) {
uninstall(SQL_DROP_FUNCTION, triggersDisabled);
}
String triggersSetDisabled = this.parameterService.getTablePrefix() + "_" + "triggers_set_disabled";
if (installed(SQL_FUNCTION_INSTALLED, triggersSetDisabled)) {
uninstall(SQL_DROP_FUNCTION, triggersSetDisabled);
}
String nodeDisabled = this.parameterService.getTablePrefix() + "_" + "node_disabled";
if (installed(SQL_FUNCTION_INSTALLED, nodeDisabled)) {
uninstall(SQL_DROP_FUNCTION, nodeDisabled);
}
String nodeSetDisabled = this.parameterService.getTablePrefix() + "_" + "node_set_disabled";
if (installed(SQL_FUNCTION_INSTALLED, nodeSetDisabled)) {
uninstall(SQL_DROP_FUNCTION, nodeSetDisabled);
}
}
@Override
public boolean supportsTransactionId() {
// TODO: write a user-defined routine in C that calls
// mi_get_transaction_id()
return false;
}
@Override
public boolean isTransactionIdOverrideSupported() {
return false;
}
@Override
public String getTransactionTriggerExpression(String defaultCatalog, String defaultSchema,
Trigger trigger) {
return "null";
}
@Override
public boolean isBlobSyncSupported() {
return false;
}
@Override
public boolean isClobSyncSupported() {
return false;
}
public void cleanDatabase() {
}
@Override
public BinaryEncoding getBinaryEncoding() {
return BinaryEncoding.BASE64;
}
}