// Sequences, index source, trigger source, constraint syntax
/*
* DBeaver - Universal Database Manager
* Copyright (C) 2010-2017 Serge Rider (serge@jkiss.org)
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* 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.jkiss.dbeaver.ext.informix;
import org.jkiss.dbeaver.Log;
import org.jkiss.dbeaver.DBException;
import org.jkiss.dbeaver.ext.generic.model.GenericDataSource;
import org.jkiss.dbeaver.ext.generic.model.GenericProcedure;
import org.jkiss.dbeaver.ext.generic.model.GenericTable;
import org.jkiss.dbeaver.ext.generic.model.GenericTrigger;
import org.jkiss.dbeaver.model.DBUtils;
import org.jkiss.dbeaver.model.exec.jdbc.JDBCPreparedStatement;
import org.jkiss.dbeaver.model.exec.jdbc.JDBCResultSet;
import org.jkiss.dbeaver.model.exec.jdbc.JDBCSession;
import org.jkiss.dbeaver.model.runtime.DBRProgressMonitor;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
/**
* Informix utils
*/
public class InformixUtils {
static final Log log = Log.getLog(InformixUtils.class);
private static List<String> getSource(DBRProgressMonitor monitor,
String sqlStatement, String dbObjectName,
GenericDataSource datasource) throws DBException {
try (JDBCSession session = DBUtils.openMetaSession(monitor, datasource, "Load source code")) {
try (JDBCPreparedStatement dbStat = session.prepareStatement(sqlStatement)) {
List<String> result = new ArrayList<>();
try (JDBCResultSet dbResult = dbStat.executeQuery()) {
while (dbResult.nextRow())
result.add(dbResult.getString(1));
}
return result;
}
} catch (SQLException e) {
throw new DBException("Can't read source code of '" + dbObjectName + "'", e);
} catch (Exception e) {
log.debug(e);
return null;
}
}
private static String ListToString(List<String> value, String delimiter) {
StringBuilder sbResult = new StringBuilder();
for (String o : value) {
sbResult.append(o.trim());
if (delimiter != null && !delimiter.isEmpty())
sbResult.append(delimiter);
}
return sbResult.toString();
}
public static String getProcedureSource(DBRProgressMonitor monitor, GenericProcedure procedure) throws DBException {
String sqlProcedure = String.format("select b.data "
+ "from sysprocbody b "
+ "join sysprocedures p on b.procid=p.procid "
+ "where datakey='T' and p.procname = '%s'"
+ "order by b.procid, b.seqno", procedure.getName());
return ListToString(
getSource(monitor, sqlProcedure, procedure.getName(),
procedure.getDataSource()), null);
}
public static String getViewSource(DBRProgressMonitor monitor,
GenericTable view) throws DBException {
String sqlView = String.format("select v.viewtext "
+ "from informix.sysviews v "
+ "join systables s on s.tabid = v.tabid "
+ "where s.tabname = '%s'", view.getName());
return ListToString(
getSource(monitor, sqlView, view.getName(),
view.getDataSource()), null);
}
// Triggers, Sequences?
public static String getTriggerDDL(DBRProgressMonitor monitor,
GenericTable table) throws DBException {
String sqlTrigger = String
.format("select tb.data " + "from systables ta "
+ "join systriggers tr on tr.tabid = ta.tabid "
+ "join systrigbody tb on tb.trigid = tr.trigid "
+ "where ta.tabname = '%s' and ta.tabtype='T' "
+ "and tb.datakey IN ('A', 'D') "
+ "order by tr.trigname, datakey desc, seqno ",
table.getName());
return ListToString(
getSource(monitor, sqlTrigger, table.getName(),
table.getDataSource()), "\n");
// systriggers.event:
// D = Delete trigger, I = Insert, U = Update trigger,S = Select,
// d = INSTEAD OF Delete, i = INSTEAD OF Insert,u = INSTEAD OF Update
}
public static String getTriggerDDL(DBRProgressMonitor monitor, GenericTrigger trigger) throws DBException {
assert trigger.getTable() != null;
String sqlTrigger = String
.format("select tb.data from systables ta "
+ "join systriggers tr on tr.tabid = ta.tabid "
+ "join systrigbody tb on tb.trigid = tr.trigid "
+ "where ta.tabname = '%s' and ta.tabtype='T' "
+ "and tb.datakey IN ('A', 'D') "
+ "and tr.trigname = '%s'"
+ "order by tr.trigname, datakey desc, seqno ",
trigger.getTable().getName(),
trigger.getName());
return ListToString(
getSource(monitor, sqlTrigger, trigger.getName(), trigger.getDataSource()), "\n");
}
}