package org.hwo.sql; import java.sql.Connection; import java.sql.ResultSet; import java.sql.SQLException; import java.util.ArrayList; import java.util.List; import org.hwo.StringHelper; public class Schema { Connection database; List tables; public Schema(Connection database){ this.database = database; this.tables = new ArrayList(); scanTables(); } private void scanTables(){ ResultSet rsTables; try { rsTables = database.getMetaData().getTables(null, null, null, new String[]{"TABLE"}); while (rsTables.next()){ tables.add(new Table(rsTables.getString("TABLE_NAME"))); } } catch (SQLException e) { e.printStackTrace(); } } public void print(){ for (Table t: tables){ System.err.println(t.toString()); } } public class Table { private String name; private ArrayList columns; public Table(String name) throws SQLException{ this.name = name; this.columns = new ArrayList(); scan(); } public Table(){ this.name = ""; this.columns = new ArrayList(); } public String getName() { return name; } public void setName(String name) { this.name = name; } Column[] getColumns(){ return columns.toArray(new Column[0]); } Column getColumn(String name){ for (Column c: columns){ if (c.getName().equals(name)) return c; } return null; } void addColumn(Column c){ columns.add(c); } void removeColumn(Column c){ columns.remove(c); } void removeColumn(String name){ columns.remove(getColumn(name)); } private void scan() throws SQLException { ResultSet rsColumns = database.getMetaData().getColumns(null, null, name, null); while (rsColumns.next()){ addColumn(new Column(rsColumns.getString("COLUMN_NAME"), rsColumns.getString("TYPE_NAME"), rsColumns.getInt("COLUMN_SIZE"))); } } @Override public String toString() { return String.format("TABLE %s (%s)",name,StringHelper.join(columns, ",")); } public class Column { private String name; private String sqltype; private Integer size; public Column(String name,String sqltype,Integer size) { this.name = name; this.sqltype = sqltype; this.size = size; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getSqltype() { return sqltype; } public void setSqltype(String sqltype) { this.sqltype = sqltype; } public Integer getSize() { return size; } public void setSize(Integer size) { this.size = size; } @Override public String toString() { if (!size.equals(0)){ return String.format("%s %s(%d)", name, sqltype, size); } else { return String.format("%s %s", name, sqltype); } } } } }