private static void appendLines(
      final String symbol,
      final List<Column[]> rows,
      final SortedSet<henplus.sqlmodel.Column> rowSet) {
    for (henplus.sqlmodel.Column col : rowSet) {

      final Column[] row = new Column[8];
      row[0] = new Column(symbol);
      row[1] = new Column(col.getPosition());
      row[2] = new Column(col.getName());
      final String type = extractType(col);
      row[3] = new Column(type);
      row[4] = new Column(col.isNullable() ? YES : NO);

      final String defaultVal = col.getDefault();
      // oracle appends newline to default values for some reason.
      row[5] = new Column((defaultVal != null ? defaultVal.trim() : null));

      // String pkdesc = (String)pks.get(colname);
      row[6] = new Column(getPkDesc(col));
      // String fkdesc = (String)fks.get(colname);
      row[7] = new Column(getFkDesc(col));
      rows.add(row);
    }
  }
 private static String extractType(final henplus.sqlmodel.Column col) {
   String type = col.getType();
   final int colSize = col.getSize();
   if (colSize > 0) {
     final StringBuilder sb = new StringBuilder(type);
     sb.append("(").append(colSize).append(")");
     type = sb.toString();
   }
   return type;
 }
  private static String getPkDesc(final henplus.sqlmodel.Column col) {
    String pkDesc = "";

    if (col.isPartOfPk()) {
      final ColumnPkInfo pkInfo = col.getPkInfo();
      if (pkInfo.getColumnIndex() == 1) {
        pkDesc = pkInfo.getPkName() != null ? pkInfo.getPkName() : "*";
      } else { // the pk index is greater than 1
        pkDesc = pkInfo.getPkName() != null ? pkInfo.getPkName() : "*";
        pkDesc =
            new StringBuilder(pkDesc)
                .append("{")
                .append(pkInfo.getColumnIndex())
                .append("}")
                .toString();
      }
    }

    return pkDesc;
  }
  private static String getFkDesc(final henplus.sqlmodel.Column col) {
    String fkDesc = "";

    final ColumnFkInfo fkInfo = col.getFkInfo();
    if (fkInfo != null) {
      final StringBuilder sb = new StringBuilder();
      if (fkInfo.getFkName() != null) {
        sb.append(fkInfo.getFkName()).append("\n -> ");
      } else {
        sb.append(" -> ");
      }
      sb.append(fkInfo.getPkTable()).append("(").append(fkInfo.getPkColumn()).append(")");
      fkDesc = sb.toString();
    }

    return fkDesc;
  }
  private static void appendModified(
      final List<Column[]> rows,
      final LinkedHashMap<henplus.sqlmodel.Column, henplus.sqlmodel.Column> modified) {
    final Iterator<henplus.sqlmodel.Column> iter = modified.keySet().iterator();
    while (iter.hasNext()) {
      final henplus.sqlmodel.Column org = iter.next();
      final henplus.sqlmodel.Column mod = modified.get(org);

      final ExtendedColumn[] orgView = new ExtendedColumn[8];
      final ExtendedColumn[] modView = new ExtendedColumn[8];

      orgView[0] = new ExtendedColumn(STAT_MODIFIED_ORG, DESC_META[0].getAlignment());
      modView[0] = new ExtendedColumn(STAT_MODIFIED_NEW, DESC_META[0].getAlignment());

      // if this was modified it doesn't matter
      orgView[1] = new ExtendedColumn(org.getPosition(), DESC_META[1].getAlignment());
      modView[1] = new ExtendedColumn(mod.getPosition(), DESC_META[1].getAlignment());

      // this should not differ
      orgView[2] = new ExtendedColumn(org.getName(), DESC_META[2].getAlignment());
      modView[2] = new ExtendedColumn(mod.getName(), DESC_META[2].getAlignment());

      final String orgType = extractType(org);
      final String modType = extractType(mod);
      orgView[3] = new ExtendedColumn(orgType, DESC_META[3].getAlignment());
      modView[3] = new ExtendedColumn(modType, DESC_META[3].getAlignment());
      if (!modType.equals(orgType)) {
        markAsChanged(modView[3]);
      }

      orgView[4] = new ExtendedColumn(org.isNullable() ? YES : NO, DESC_META[4].getAlignment());
      modView[4] = new ExtendedColumn(mod.isNullable() ? YES : NO, DESC_META[4].getAlignment());
      if (org.isNullable() != mod.isNullable()) {
        markAsChanged(modView[4]);
      }

      Logger.debug("default: %s", org.getDefault());
      final String orgDefaultVal = org.getDefault() != null ? org.getDefault().trim() : null;
      // oracle appends newline to default values for some reason.
      orgView[5] = new ExtendedColumn(orgDefaultVal, DESC_META[5].getAlignment());

      final String modDefaultVal = mod.getDefault() != null ? mod.getDefault().trim() : null;
      modView[5] = new ExtendedColumn(modDefaultVal, DESC_META[5].getAlignment());
      if (orgDefaultVal != null && !orgDefaultVal.equals(modDefaultVal)
          || orgDefaultVal == null && modDefaultVal != null) {
        markAsChanged(modView[5]);
      }

      // primary key
      final String pkDescOrg = getPkDesc(org);
      final String pkDescMod = getPkDesc(mod);
      orgView[6] = new ExtendedColumn(pkDescOrg, DESC_META[6].getAlignment());
      modView[6] = new ExtendedColumn(pkDescMod, DESC_META[6].getAlignment());
      // check if one of the cols has to be marked as changed
      if (org.isPartOfPk() && !mod.isPartOfPk()) {
        markAsChanged(orgView[6]);
      } else if (!org.isPartOfPk() && mod.isPartOfPk()) {
        markAsChanged(modView[6]);
      } else if (org.isPartOfPk() && mod.isPartOfPk()) {
        // compare values of pk names
        if (org.getPkInfo().getPkName() != null
            && !org.getPkInfo().getPkName().equals(mod.getPkInfo().getPkName())) {
          markAsChanged(modView[6]);
        }
      }

      // foreign key
      final String fkDescOrg = getFkDesc(org);
      final String fkDescMod = getFkDesc(mod);
      orgView[7] = new ExtendedColumn(fkDescOrg, DESC_META[7].getAlignment());
      modView[7] = new ExtendedColumn(fkDescMod, DESC_META[7].getAlignment());
      // check if one of the cols has to be marked as changed
      if (org.isForeignKey() && !mod.isForeignKey()) {
        markAsChanged(orgView[7]);
      } else if (!org.isForeignKey() && mod.isForeignKey()) {
        markAsChanged(modView[7]);
      } else if (org.isForeignKey() && mod.isForeignKey()) {
        // compare values of pk names
        if (!org.getFkInfo().equals(mod.getFkInfo())) {
          markAsChanged(modView[7]);
        }
      }

      rows.add(orgView);
      rows.add(modView);
    }
  }