コード例 #1
0
  @Override
  protected Column readColumn(DatabaseMetaDataWrapper metaData, Map<String, Object> values)
      throws SQLException {
    Column column = super.readColumn(metaData, values);
    if (column.getMappedTypeCode() == Types.DECIMAL) {
      // We're back-mapping the NUMBER columns returned by Oracle
      // Note that the JDBC driver returns DECIMAL for these NUMBER
      // columns
      if (column.getScale() <= -127 || column.getScale() >= 127) {
        if (column.getSizeAsInt() == 0) {
          /*
           * Latest oracle jdbc drivers for 11g return (0,-127) for
           * types defined as integer resulting in bad mappings.
           * NUMBER without scale or precision looks the same as
           * INTEGER in the jdbc driver. We must check the Oracle
           * meta data to see if type is an INTEGER.
           */
          if (isColumnInteger(
              (String) values.get("TABLE_NAME"), (String) values.get("COLUMN_NAME"))) {
            column.setMappedTypeCode(Types.BIGINT);
          }
        } else if (column.getSizeAsInt() <= 63) {
          column.setMappedTypeCode(Types.REAL);
        } else {
          column.setMappedTypeCode(Types.DOUBLE);
        }
      }
    } else if (column.getMappedTypeCode() == Types.FLOAT) {
      // Same for REAL, FLOAT, DOUBLE PRECISION, which all back-map to
      // FLOAT but with
      // different sizes (63 for REAL, 126 for FLOAT/DOUBLE PRECISION)
      switch (column.getSizeAsInt()) {
        case 63:
          column.setMappedTypeCode(Types.REAL);
          break;
        case 126:
          column.setMappedTypeCode(Types.DOUBLE);
          break;
      }
    } else if ((column.getMappedTypeCode() == Types.DATE)
        || (column.getMappedTypeCode() == Types.TIMESTAMP)) {
      // we also reverse the ISO-format adaptation, and adjust the default
      // value to timestamp
      if (column.getDefaultValue() != null) {
        Timestamp timestamp = null;

        Matcher matcher = oracleIsoTimestampPattern.matcher(column.getDefaultValue());

        if (matcher.matches()) {
          String timestampVal = matcher.group(1);
          timestamp = Timestamp.valueOf(timestampVal);
        } else {
          matcher = oracleIsoDatePattern.matcher(column.getDefaultValue());
          if (matcher.matches()) {
            String dateVal = matcher.group(1);
            timestamp = new Timestamp(Date.valueOf(dateVal).getTime());
          } else {
            matcher = oracleIsoTimePattern.matcher(column.getDefaultValue());
            if (matcher.matches()) {
              String timeVal = matcher.group(1);

              timestamp = new Timestamp(Time.valueOf(timeVal).getTime());
            }
          }
        }
        if (timestamp != null) {
          column.setDefaultValue(timestamp.toString());
        }
      }
    } else if (TypeMap.isTextType(column.getMappedTypeCode())) {
      String defaultValue = column.getDefaultValue();
      if (isNotBlank(defaultValue)
          && defaultValue.startsWith("('")
          && defaultValue.endsWith("')")) {
        defaultValue = defaultValue.substring(2, defaultValue.length() - 2);
      }
      column.setDefaultValue(unescape(defaultValue, "'", "''"));
    }
    return column;
  }