package com.med.sql;
import java.io.PrintStream;
import java.util.List;
import java.util.Map;
import java.util.Set;
import schemacrawler.schema.*;
public final class SchemaReporter {
public static void printReport(
List<Schema> schemas, Map<String, Set<TriggerInfo>> triggerMap, boolean verbose, boolean printIndices, PrintStream out) throws Exception {
// Get the schema definitions
for (Schema schema : schemas) {
final Table[] tables = schema.getTables();
for (int i = 0; i < tables.length; i++) {
final Table table = tables[i];
out.print("\n"+table.toString());
if (table instanceof View) {
out.println(" (view)");
} else {
out.println();
}
int primaryKeyColumns = 0;
final Column[] columns = table.getColumns();
if (columns.length > 0)
out.println(" Columns:");
for (int j = 0; j < columns.length; j++) {
final Column column = columns[j];
String info = "";
if (column.isPartOfPrimaryKey()) {
info = "(PK) ";
primaryKeyColumns++;
}
else if (column.isPartOfForeignKey())
info = "(fk) ";
else
info = " ";
// if (verbose && column.isPartOfUniqueIndex())
// info += "(*) ";
info += column.toString();
if (verbose)
info += ", type=" + column.getType()
+ ", nullable=" + column.isNullable()
+ ", inUniqueIndex=" + column.isPartOfUniqueIndex()
+ ", size=" + column.getSize()
+ ", digits=" + column.getDecimalDigits()
+ ", width=" + column.getWidth()
+ ", default value=" + column.getDefaultValue();
out.println(" "+info);
}
if (verbose) {
final PrimaryKey primaryKey = table.getPrimaryKey();
if (primaryKey != null) {
String info = primaryKey.toString();
out.println(" Primary key: " + info);
if (primaryKeyColumns > 1) {
out.println(" ### "+table+" has a "+primaryKeyColumns+"-column primary key");
}
} else {
out.println(" *** "+table+" does not have a primary key");
}
}
if (verbose) {
final ForeignKey[] foreignKeys = table.getForeignKeys();
if (foreignKeys.length > 0)
out.println(" Foreign keys:");
for (int j = 0; j < foreignKeys.length; j++) {
final ForeignKey fk = foreignKeys[j];
final String fkId = fk.getName();
ForeignKeyColumnMap[] cms = fk.getColumnPairs();
Column fkCol0 = cms[0].getForeignKeyColumn();
String fkTableId = fkCol0.getParent().getName();
if (table.getName().equals(fkTableId)) { // the FK is defined on this table
String info = fk.toString();
ForeignKeyDeferrability deferability = fk.getDeferrability();
ForeignKeyUpdateRule deleteRule = fk.getDeleteRule();
ForeignKeyUpdateRule updateRule = fk.getUpdateRule();
info += ", deferability="+deferability;
info += ", deleteRule="+deleteRule;
info += ", UpdateRule="+updateRule;
info += fkColumnsToString(cms);
out.println(" fk: " + info);
}
// perhaps also show referencing fks?
}
}
if (verbose) {
final CheckConstraint[] ccs = table.getCheckConstraints();
if (ccs.length > 0)
out.println(" Constraints:");
for (int j = 0; j < ccs.length; j++) {
final CheckConstraint cc = ccs[j];
String info = cc.toString();
if (verbose)
info += ", definition=" +cc.getDefinition();
out.println(" constraint: " + info);
}
}
if (printIndices) {
final Index[] indices = table.getIndices();
if (indices.length > 0)
out.println(" Indices:");
for (int j = 0; j < indices.length; j++) {
final Index index = indices[j];
String info = index.toString();
if (verbose)
info +=
//", type=" +index.getType() +
//", cardinality=" + index.getCardinality() +
", unique=" +index.isUnique() +
", columns=" + columnsToString(index.getColumns());
out.println(" index: " + info);
}
}
if (triggerMap != null) {
String tableName = table.toString();
Set<TriggerInfo> tableTriggers = triggerMap.get(tableName);
if (tableTriggers != null) {
out.println(" Triggers:");
for (TriggerInfo triggerInfo : tableTriggers) {
String info = triggerInfo.toString();
if (verbose)
info += ", event=" +triggerInfo.getEvent()
+ ", type=" + triggerInfo.getType();
out.println(" trigger: " + info);
}
}
}
out.flush();
}
}
}
static String fkColumnsToString(ForeignKeyColumnMap[] cms) {
String s = "[";
for (ForeignKeyColumnMap cm : cms)
s += " "+cm.getForeignKeyColumn()+"->"+cm.getPrimaryKeyColumn();
s += " ]";
return s;
}
static String columnsToString(Column[] cols) {
String s = "[";
for (Column c : cols)
s += " "+c;
s += " ]";
return s;
}
}