Skip to content

Commit

Permalink
0002683: Add api to get trigger text from ddl utils
Browse files Browse the repository at this point in the history
  • Loading branch information
sunderrd committed Jul 18, 2016
1 parent 0964d47 commit 3f1f39b
Show file tree
Hide file tree
Showing 21 changed files with 1,213 additions and 74 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,7 @@

import org.jumpmind.db.model.Database;
import org.jumpmind.db.model.Table;
import org.jumpmind.db.model.Trigger;

public interface IDdlReader {

Expand All @@ -42,4 +43,8 @@ public interface IDdlReader {

public List<String> getColumnNames(String catalog, String schema, String tableName);

public List<Trigger> getTriggers(String catalog, String schema, String tableName);

public Trigger getTriggerFor(Table table, String name);

}
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@
package org.jumpmind.db.platform.sqlite;

import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
Expand All @@ -35,12 +36,16 @@
import org.jumpmind.db.model.NonUniqueIndex;
import org.jumpmind.db.model.Reference;
import org.jumpmind.db.model.Table;
import org.jumpmind.db.model.Trigger;
import org.jumpmind.db.model.TypeMap;
import org.jumpmind.db.model.UniqueIndex;
import org.jumpmind.db.model.Trigger.TriggerType;
import org.jumpmind.db.platform.IDatabasePlatform;
import org.jumpmind.db.platform.IDdlReader;
import org.jumpmind.db.sql.ISqlRowMapper;
import org.jumpmind.db.sql.Row;
import org.jumpmind.db.sql.SqlConstants;
import org.jumpmind.db.sql.SqlException;
import org.jumpmind.db.sql.mapper.RowMapper;

public class SqliteDdlReader implements IDdlReader {
Expand Down Expand Up @@ -233,7 +238,45 @@ public IndexColumn mapRow(Row row) {
return column;
}
}

public Trigger getTriggerFor(Table table, String triggerName) {
Trigger trigger = null;
List<Trigger> triggers = getTriggers(table.getCatalog(), table.getSchema(), table.getName());
for (Trigger t : triggers) {
if (t.getName().equals(triggerName)) {
trigger = t;
break;
}
}
return trigger;
}


public List<Trigger> getTriggers(final String catalog, final String schema,
final String tableName) throws SqlException {

List<Trigger> triggers = new ArrayList<Trigger>();

String sql = "SELECT "
+ "name AS trigger_name, "
+ "tbl_name AS table_name, "
+ "rootpage, "
+ "sql, "
+ "type AS object_type "
+ "FROM sqlite_master "
+ "WHERE table_name=? AND object_type='trigger';";
triggers = platform.getSqlTemplate().query(sql, new ISqlRowMapper<Trigger>() {
public Trigger mapRow(Row row) {
Trigger trigger = new Trigger();
trigger.setName(row.getString("trigger_name"));
trigger.setTableName(row.getString("table_name"));
trigger.setEnabled(true);
trigger.setSource(row.getString("sql"));
row.remove("sql");
trigger.setMetaData(row);
return trigger;
}
}, tableName.toLowerCase());

return triggers;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -1412,8 +1412,9 @@ public List<String> execute(Connection connection) throws SQLException {

public List<String> getTableNames(final String catalog, final String schema,
final String[] tableTypes) {
JdbcSqlTemplate sqlTemplate = (JdbcSqlTemplate) platform.getSqlTemplate();
return sqlTemplate.execute(new IConnectionCallback<List<String>>() {
long startTime = System.nanoTime();
JdbcSqlTemplate sqlTemplate = (JdbcSqlTemplate) platform.getSqlTemplate();
List<String> list = sqlTemplate.execute(new IConnectionCallback<List<String>>() {
public List<String> execute(Connection connection) throws SQLException {
ArrayList<String> list = new ArrayList<String>();
DatabaseMetaData meta = connection.getMetaData();
Expand All @@ -1430,6 +1431,8 @@ public List<String> execute(Connection connection) throws SQLException {
}
}
});
System.out.println("Elapsed time (old): "+(System.nanoTime()-startTime));
return list;
}

public List<String> getColumnNames(final String catalog, final String schema, final String tableName) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,7 @@
import java.sql.Types;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import java.util.Map;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
Expand All @@ -39,10 +40,16 @@
import org.jumpmind.db.model.IIndex;
import org.jumpmind.db.model.Reference;
import org.jumpmind.db.model.Table;
import org.jumpmind.db.model.Trigger;
import org.jumpmind.db.model.TypeMap;
import org.jumpmind.db.model.Trigger.TriggerType;
import org.jumpmind.db.platform.AbstractJdbcDdlReader;
import org.jumpmind.db.platform.DatabaseMetaDataWrapper;
import org.jumpmind.db.platform.IDatabasePlatform;
import org.jumpmind.db.sql.ISqlRowMapper;
import org.jumpmind.db.sql.JdbcSqlTemplate;
import org.jumpmind.db.sql.Row;
import org.jumpmind.db.sql.SqlException;

/*
* Reads a database model from a Sybase database.
Expand Down Expand Up @@ -249,4 +256,79 @@ protected boolean isInternalPrimaryKeyIndex(Connection connection,
stmt.close();
}
}

@Override
public List<Trigger> getTriggers(final String catalog, final String schema,
final String tableName) throws SqlException {

List<Trigger> triggers = new ArrayList<Trigger>();

log.debug("Reading triggers for: " + tableName);
JdbcSqlTemplate sqlTemplate = (JdbcSqlTemplate) platform
.getSqlTemplate();

String sql = "SELECT "
+ "trig.name AS trigger_name, "
+ "trig.id AS trigger_id, "
+ "tab.name AS table_name, "
+ "tab.id AS table_id, "
+ "db.name AS catalog, "
+ "trig.crdate AS created_on, "
+ "tab.deltrig AS table_delete_trigger_id, "
+ "tab.instrig AS table_insert_trigger_id, "
+ "tab.updtrig AS table_update_trigger_id "
+ "FROM sysobjects AS trig "
+ "INNER JOIN sysobjects AS tab "
+ "ON trig.id = tab.deltrig "
+ "OR trig.id = tab.instrig "
+ "OR trig.id = tab.updtrig "
+ "INNER JOIN master.dbo.sysdatabases AS db "
+ "ON db.dbid = db_id() "
+ "WHERE tab.name = ? AND db.name = ? ";
triggers = sqlTemplate.query(sql, new ISqlRowMapper<Trigger>() {
public Trigger mapRow(Row row) {
Trigger trigger = new Trigger();
trigger.setName(row.getString("trigger_name"));
trigger.setTableName(row.getString("table_name"));
trigger.setCatalogName(row.getString("catalog"));
trigger.setEnabled(true);
trigger.setSource("");
if (row.getString("table_insert_trigger_id")
.equals(row.getString("trigger_id"))) {
trigger.setTriggerType(TriggerType.INSERT);
row.put("trigger_type", "insert");
} else if (row.getString("table_delete_trigger_id")
.equals(row.getString("trigger_id"))) {
trigger.setTriggerType(TriggerType.DELETE);
row.put("trigger_type", "delete");
} else if (row.getString("table_update_trigger_id")
.equals(row.getString("trigger_id"))) {
trigger.setTriggerType(TriggerType.UPDATE);
row.put("trigger_type", "update");
}
row.remove("table_insert_trigger_id");
row.remove("table_delete_trigger_id");
row.remove("table_update_trigger_id");
trigger.setMetaData(row);
return trigger;
}
}, tableName, catalog);


for (final Trigger trigger : triggers) {
int id = (Integer) trigger.getMetaData().get("trigger_id");
String sourceSql = "SELECT text "
+ "FROM syscomments "
+ "WHERE id = ? "
+ "ORDER BY colid ";
sqlTemplate.query(sourceSql, new ISqlRowMapper<Trigger>() {
public Trigger mapRow(Row row) {
trigger.setSource(trigger.getSource()+"\n"+row.getString("text"));
return trigger;
}
}, id);
}

return triggers;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -15,9 +15,14 @@
import org.jumpmind.db.model.Column;
import org.jumpmind.db.model.IIndex;
import org.jumpmind.db.model.Table;
import org.jumpmind.db.model.Trigger;
import org.jumpmind.db.model.Trigger.TriggerType;
import org.jumpmind.db.platform.DatabaseMetaDataWrapper;
import org.jumpmind.db.platform.IDatabasePlatform;
import org.jumpmind.db.sql.ISqlRowMapper;
import org.jumpmind.db.sql.JdbcSqlTemplate;
import org.jumpmind.db.sql.Row;
import org.jumpmind.db.sql.SqlException;

public class Db2As400DdlReader extends Db2DdlReader {

Expand Down Expand Up @@ -153,4 +158,39 @@ private boolean hasColumn(Collection<Column> columns, String targetColumn) {
}
return found;
}

public List<Trigger> getTriggers(final String catalog, final String schema,
final String tableName) throws SqlException {

List<Trigger> triggers = new ArrayList<Trigger>();

log.debug("Reading triggers for: " + tableName);
JdbcSqlTemplate sqlTemplate = (JdbcSqlTemplate) platform
.getSqlTemplate();

String sql = "SELECT "
+ "TIGGER_NAME, "
+ "TRIGGER_SCHEMA, "
+ "EVENT_OBJECT_TABLE as TABLE_NAME, "
+ "ACTION_TIMING as TRIGGER_TIME, "
+ "EVENT_MANIPULATION as TRIGGER_TYPE, "
+ "CREATED, "
+ "ENABLED "
+ "FROM QSYS2.SYSTRIGGERS "
+ "WHERE EVENT_OBJECT_TABLE=? and EVENT_OBJECT_SCHEMA=?";
triggers = sqlTemplate.query(sql, new ISqlRowMapper<Trigger>() {
public Trigger mapRow(Row row) {
Trigger trigger = new Trigger();
trigger.setName(row.getString("TRIGGER_NAME"));
trigger.setSchemaName(row.getString("TRIGGER_SCHEMA"));
trigger.setTableName(row.getString("TABLE_NAME"));
trigger.setEnabled(row.getString("ENABLED").equals("Y"));
trigger.setTriggerType(TriggerType.valueOf(row.getString("TRIGGER_TYPE")));
trigger.setMetaData(row);
return trigger;
}
}, tableName, schema);

return triggers;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,9 @@
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Types;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
Expand All @@ -34,11 +36,16 @@
import org.jumpmind.db.model.ForeignKey;
import org.jumpmind.db.model.IIndex;
import org.jumpmind.db.model.Table;
import org.jumpmind.db.model.Trigger;
import org.jumpmind.db.model.TypeMap;
import org.jumpmind.db.model.Trigger.TriggerType;
import org.jumpmind.db.platform.AbstractJdbcDdlReader;
import org.jumpmind.db.platform.DatabaseMetaDataWrapper;
import org.jumpmind.db.platform.IDatabasePlatform;
import org.jumpmind.db.sql.ISqlRowMapper;
import org.jumpmind.db.sql.JdbcSqlTemplate;
import org.jumpmind.db.sql.Row;
import org.jumpmind.db.sql.SqlException;

/*
* Reads a database model from a Db2 UDB database.
Expand Down Expand Up @@ -232,5 +239,65 @@ protected boolean isInternalForeignKeyIndex(Connection connection,
DatabaseMetaDataWrapper metaData, Table table, ForeignKey fk, IIndex index) throws SQLException {
return fk.getName().equalsIgnoreCase(index.getName());
}

public List<Trigger> getTriggers(final String catalog, final String schema,
final String tableName) throws SqlException {

List<Trigger> triggers = new ArrayList<Trigger>();

log.debug("Reading triggers for: " + tableName);
JdbcSqlTemplate sqlTemplate = (JdbcSqlTemplate) platform
.getSqlTemplate();

String sql = "SELECT "
+ "NAME as TRIGGER_NAME, "
+ "SCHEMA, "
+ "DEFINER, "
+ "TBNAME as TABLE_NAME, "
+ "TBCREATOR as TABLE_CREATOR, "
+ "TRIGEVENT as TRIGGER_TYPE, "
+ "TRIGTIME as TRIGGER_TIME, "
+ "GRANULARITY, "
+ "VALID, "
+ "TEXT, "
+ "ENABLED, "
+ "CREATE_TIME, "
+ "FUNC_PATH as FUNCTION_PATH, "
+ "ALTER_TIME as LAST_ALTERED "
+ "FROM SYSIBM.SYSTRIGGERS "
+ "WHERE TBNAME=? and SCHEMA=?";
triggers = sqlTemplate.query(sql, new ISqlRowMapper<Trigger>() {
public Trigger mapRow(Row row) {
Trigger trigger = new Trigger();
trigger.setName(row.getString("TRIGGER_NAME"));
trigger.setSchemaName(row.getString("SCHEMA"));
trigger.setTableName(row.getString("TABLE_NAME"));
trigger.setEnabled(row.getString("ENABLED").equals("Y"));
trigger.setSource(row.getString("TEXT"));
row.remove("TEXT");
String trigEvent = row.getString("TRIGGER_TYPE");
switch(trigEvent.charAt(0)) {
case('I'): trigEvent = "INSERT"; break;
case('U'): trigEvent = "UPDATE"; break;
case('D'): trigEvent = "DELETE";
}
trigger.setTriggerType(TriggerType.valueOf(trigEvent));
row.replace("TRIGGER_TYPE", trigEvent);
switch(row.getString("TRIGGER_TIME").charAt(0)) {
case ('A'): row.replace("TRIGGER_TIME", "AFTER"); break;
case ('B'): row.replace("TRIGGER_TIME", "BEFORE"); break;
case ('I'): row.replace("TRIGGER_TIME", "INSTEAD OF");
}
if (row.getString("GRANULARITY").equals("S"))
row.replace("GRANULARITY", "ONCE PER STATEMENT");
else if (row.getString("GRANULARITY").equals("R"))
row.replace("GRANULARITY", "ONCE PER ROW");
trigger.setMetaData(row);
return trigger;
}
}, tableName, schema);

return triggers;
}

}
Loading

0 comments on commit 3f1f39b

Please sign in to comment.