/* * Created on 8/04/2003 * */ package com.quantum.sql.metadata; import java.sql.Connection; import java.sql.DatabaseMetaData; import java.sql.ResultSet; import java.sql.ResultSetMetaData; import java.sql.SQLException; import java.sql.Statement; import com.quantum.util.StringMatrix; /** * Groups functions that allow extracting data from a JDBC connection * in the form of StringMatrix objects * * @author panic * */ public class MetaDataJDBCInterface { /** * @param con : A valid (open) connection to an JDBC database * @param schema : Schema of the table. Must be null if not given * @param table : Name of the table. * @return a StringMatrix with the info of the columns' metadata, null if error */ public static StringMatrix getColumns(Connection con, String schema, String table) throws SQLException { DatabaseMetaData meta = con.getMetaData(); ResultSet set = null; StringMatrix columns = null; try { set = meta.getColumns(null, schema, table, null); columns = fillMatrix(set); set.close(); } catch (SQLException e) { } if (columns == null) { columns = new StringMatrix(); String query = "SELECT * FROM \"" + table + "\" WHERE (1 = 0)"; //$NON-NLS-1$ //$NON-NLS-2$ Statement stmt = con.createStatement(); stmt.execute(query); ResultSet rset = stmt.getResultSet(); ResultSetMetaData rsMetaData = rset.getMetaData(); int columnCount = rsMetaData.getColumnCount(); String headMatrix[] = {"TABLE_CAT","TABLE_SCHEM","TABLE_NAME","COLUMN_NAME","DATA_TYPE","TYPE_NAME","COLUMN_SIZE", "BUFFER_LENGTH","DECIMAL_DIGITS","NUM_PREC_RADIX","NULLABLE","REMARKS", "COLUMN_DEF","SQL_DATA_TYPE","SQL_DATETIME_SUB","CHAR_OCTET_LENGTH", "ORDINAL_POSITION","IS_NULLABLE","SCOPE_CATLOG","SCOPE_SCHEMA","SCOPE_TABLE","SOURCE_DATA_TYPE"}; columns.addMatrixHeader(headMatrix); for (int i = 0; i < columnCount; i++) { columns.add(null, i); /* TABLE_CAT */ columns.add(schema, i); /* TABLE_SCHEM */ columns.add(table, i); /* TABLE_NAME */ columns.add(rsMetaData.getColumnName(i+1), i); /* COLUMN_NAME */ columns.add(String.valueOf(rsMetaData.getColumnType(i+1)), i); /* DATA_TYPE */ columns.add(rsMetaData.getColumnTypeName(i+1), i); /* TYPE_NAME */ columns.add(String.valueOf(rsMetaData.getPrecision(i+1)), i); /* COLUMN_SIZE */ columns.add(null, i); /* BUFFER_LENGTH */ columns.add(String.valueOf(rsMetaData.getScale(i+1)), i); /* DECIMAL_DIGITS */ columns.add(null, i); /* NUM_PREC_RADIX */ int isNullable = rsMetaData.isNullable(i+1); columns.add(String.valueOf(isNullable), i); /* NULLABLE */ columns.add(null, i); /* REMARKS */ columns.add(null, i); /* COLUMN_DEF */ columns.add(null, i); /* SQL_DATA_TYPE */ columns.add(null, i); /* SQL_DATETIME_SUB */ columns.add(String.valueOf(rsMetaData.getColumnDisplaySize(i+1)), i); /* CHAR_OCTET_LENGTH */ columns.add(String.valueOf(i+1), i); /* ORDINAL_POSITION */ columns.add(isNullable == DatabaseMetaData.columnNullable ? "YES" : "NO", i ); columns.add(null, i); /* SCOPE_CATLOG */ columns.add(null, i); /* SCOPE_SCHEMA */ columns.add(null, i); /* SCOPE_TABLE */ columns.add(null, i); /* SOURCE_DATA_TYPE */ } } return columns; } /** * @param con : A valid (open) connection to an JDBC database * @param schema : Schema of the table. Must be null if not given * @param table : Name of the table. * @return a StringMatrix with the info of the primary keys */ public static StringMatrix getPrimaryKeys(Connection con, String schema, String table) { StringMatrix keys = new StringMatrix(); try { DatabaseMetaData meta = con.getMetaData(); ResultSet set = meta.getPrimaryKeys(null, schema, table); keys = fillMatrix(set); set.close(); } catch (SQLException e) { e.printStackTrace(); } return keys; } /** * @param con : A valid (open) connection to an JDBC database * @param schema : Schema of the table. Must be null if not given * @param table : Name of the table. * @param imported : Determines if the foreign keys are the imported or exported ones * @return a StringMatrix with the info of the foreign keys */ public static StringMatrix getForeignKeys(Connection con, String schema, String table, boolean imported ) { ResultSet set = null; StringMatrix keys = new StringMatrix(); try { DatabaseMetaData meta = con.getMetaData(); if (imported){ set = meta.getImportedKeys(null, schema, table); } else { set = meta.getExportedKeys(null, schema, table); } keys = fillMatrix(set); set.close(); } catch (SQLException e) { e.printStackTrace(); } return keys; } /** * @param con : A valid (open) connection to an JDBC database * @param schema : Schema of the table. Must be null if not given * @param table : Name of the table. * @return a StringMatrix with the info of the indexes on that table */ public static StringMatrix getIndexInfo(Connection con, String schema, String table) { ResultSet set = null; DatabaseMetaData meta; StringMatrix keys = new StringMatrix(); try { meta = con.getMetaData(); set = meta.getIndexInfo(null, schema, table, false, false); keys = fillMatrix(set); set.close(); } catch (SQLException e) { e.printStackTrace(); } return keys; } /** * * @param set * @return a filled StringMatrix with the set results * @throws SQLException */ public static StringMatrix fillMatrix(ResultSet set) throws SQLException { int columnCount = set.getMetaData().getColumnCount(); StringMatrix keys = new StringMatrix(); for (int i = 1; i <= columnCount; i++) { keys.addHeader(set.getMetaData().getColumnName(i)); } int row = 0; while (set.next()) { for (int i = 1; i <= columnCount; i++) { keys.add(set.getString(i), row); } row++; } return keys; } /** * @param con * @param schema * @param tableName */ public static StringMatrix getBestRowId(Connection con, String schema, String table) throws SQLException { ResultSet set = null; DatabaseMetaData meta = con.getMetaData(); set = meta.getBestRowIdentifier(null, schema, table, DatabaseMetaData.bestRowSession, true); StringMatrix keys = fillMatrix(set); set.close(); return keys; } }