package org.jumpmind.db.platform.db2; import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; import java.util.ArrayList; import java.util.HashSet; import java.util.List; import java.util.Map; import org.apache.commons.lang.StringUtils; import org.jumpmind.db.model.Column; import org.jumpmind.db.model.IIndex; import org.jumpmind.db.model.Table; import org.jumpmind.db.platform.DatabaseMetaDataWrapper; import org.jumpmind.db.platform.IDatabasePlatform; import org.jumpmind.db.sql.JdbcSqlTemplate; public class Db2As400DdlReader extends Db2DdlReader { public Db2As400DdlReader(IDatabasePlatform platform) { super(platform); } @Override public List<String> getSchemaNames(String catalog) { try { return super.getSchemaNames(catalog); } catch (Exception ex) { ArrayList<String> list = new ArrayList<String>(); list.add(platform.getSqlTemplate().queryForObject( "select CURRENT SCHEMA from sysibm.sysdummy1", String.class)); return list; } } protected boolean isInternalPrimaryKeyIndex(Connection connection, DatabaseMetaDataWrapper metaData, Table table, IIndex index) throws SQLException { ResultSet pkData = null; HashSet<String> pkColNames = new HashSet<String>(); try { pkData = metaData.getPrimaryKeys(table.getName()); while (pkData.next()) { Map<String, Object> values = readMetaData(pkData, getColumnsForPK()); pkColNames.add((String) values.get("COLUMN_NAME")); } } finally { if (pkData != null) { pkData.close(); } } boolean indexMatchesPk = true; for (int i = 0; i < index.getColumnCount(); i++) { if (!pkColNames.contains(index.getColumn(i).getName())) { indexMatchesPk = false; break; } } return indexMatchesPk; } @Override protected void enhanceTableMetaData(Connection connection, DatabaseMetaDataWrapper metaData, Table table) throws SQLException { log.debug("about to read additional column data"); /* DB2 does not return the auto-increment status via the database metadata */ String sql = "SELECT NAME, IDENTITY, DEFAULT, DFTVALUE FROM QSYS2.SYSCOLUMNS WHERE TBNAME=?"; if (StringUtils.isNotBlank(metaData.getSchemaPattern())) { sql = sql + " AND DBNAME=?"; } PreparedStatement pstmt = null; ResultSet rs = null; try { pstmt = connection.prepareStatement(sql); pstmt.setString(1, table.getName()); if (StringUtils.isNotBlank(metaData.getSchemaPattern())) { pstmt.setString(2, metaData.getSchemaPattern()); } rs = pstmt.executeQuery(); while (rs.next()) { String columnName = rs.getString(1); Column column = table.getColumnWithName(columnName); if (column != null) { String isIdentity = rs.getString(2); if (isIdentity != null && isIdentity.startsWith("Y")) { column.setAutoIncrement(true); if (log.isDebugEnabled()) { log.debug("Found identity column {} on {}", columnName, table.getName()); } } String hasDefault = rs.getString(3); if (hasDefault != null && hasDefault.startsWith("Y")) { column.setDefaultValue(rs.getString(4)); } else { column.setDefaultValue(null); } } } } finally { JdbcSqlTemplate.close(rs); JdbcSqlTemplate.close(pstmt); } log.debug("done reading additional column data"); } }