예제 #1
0
파일: ModelReader.java 프로젝트: pms1/da
  final DatabaseModel read(Connection connection) throws SQLException {
    DatabaseMetaData metaData = connection.getMetaData();

    DatabaseModel m = DatabaseModel.create();

    try (ResultSet resultSet = metaData.getTables(null, null, null, null)) {
      while (resultSet.next()) {
        String c = resultSet.getString("TABLE_CAT");
        String s = resultSet.getString("TABLE_SCHEM");
        String n = resultSet.getString("TABLE_NAME");

        if (!Objects.equals(resultSet.getString("TABLE_TYPE"), "TABLE")) continue;

        if (ignore(c, s, n)) continue;

        m = m.addTable(TableModel.create(TableId.create(SchemaId.create(s), n)));
      }
    }

    try (ResultSet resultSet = metaData.getColumns(null, null, null, null)) {
      while (resultSet.next()) {
        String c = resultSet.getString("TABLE_CAT");
        String s = resultSet.getString("TABLE_SCHEM");
        String n = resultSet.getString("TABLE_NAME");

        TableId tableId = TableId.create(SchemaId.create(s), n);
        if (!m.hasTable(tableId)) continue;

        String col = resultSet.getString("COLUMN_NAME");

        int dataType = resultSet.getInt("DATA_TYPE");
        int columnSize = resultSet.getInt("COLUMN_SIZE");
        int decimalDigits = resultSet.getInt("DECIMAL_DIGITS");
        int numPrecRadix = resultSet.getInt("NUM_PREC_RADIX");
        ColumnModel.Builder cm = ColumnModel.newBuilder();

        cm = cm.withId(ColumnId.create(tableId, col));

        JDBCType dataType2 = JDBCType.valueOf(dataType);

        switch (dataType2) {
          case BIGINT:
            cm = cm.withType(BigIntType.create());
            break;
          case BOOLEAN:
            cm = cm.withType(BooleanType.create());
            break;
          case CHAR:
            cm = cm.withType(CharType.create());
            break;
          case BLOB:
            cm = cm.withType(BLOBType.create());
            break;
          case CLOB:
            cm = cm.withType(CLOBType.create());
            break;
          case DATE:
            cm = cm.withType(DateType.create());
            break;
          case DECIMAL:
            cm = cm.withType(DecimalType.create());
            break;
          case DOUBLE:
            cm = cm.withType(DoubleType.create());
            break;
          case INTEGER:
            cm = cm.withType(IntType.create());
            break;
          case SMALLINT:
            cm = cm.withType(SmallIntType.create());
            break;
          case VARCHAR:
            cm = cm.withType(VarcharType.create());
            break;
          case TIME:
            cm = cm.withType(TimeType.create());
            break;
          case TIMESTAMP:
            cm = cm.withType(TimestampType.create());
            break;
          case TINYINT:
            cm = cm.withType(TinyIntType.create());
            break;
          case VARBINARY:
            cm = cm.withType(VarbinaryType.create());
            break;
          case LONGVARCHAR:
            cm = cm.withType(LongVarcharType.create());
            break;
          default:
            throw new Error("missing type " + dataType + " " + dataType2);
        }
        m = m.addColumn(cm.build());
      }
    }

    m = postProcess(connection, m);

    return m;
  }