public Object convertToConnectFieldValue()

in connectors/rocketmq-connect-jdbc/src/main/java/org/apache/rocketmq/connect/jdbc/converter/DefaultColumnConverter.java [61:274]


    public Object convertToConnectFieldValue(ResultSet rs, ColumnDefinition columnDefinition, int columnNumber) throws SQLException, IOException {
        switch (columnDefinition.type()) {
            case Types.BOOLEAN:
                return rs.getBoolean(columnNumber);

            case Types.BIT:
                return rs.getByte(columnNumber);

            // 8 bits int
            case Types.TINYINT:
                if (columnDefinition.isSignedNumber()) {
                    return rs.getByte(columnNumber);
                } else {
                    return rs.getShort(columnNumber);
                }

                // 16 bits int
            case Types.SMALLINT:
                if (columnDefinition.isSignedNumber()) {
                    return rs.getShort(columnNumber);
                } else {
                    return rs.getInt(columnNumber);
                }

                // 32 bits int
            case Types.INTEGER:
                if (columnDefinition.isSignedNumber()) {
                    return rs.getInt(columnNumber);
                } else {
                    return rs.getLong(columnNumber);
                }

                // 64 bits int
            case Types.BIGINT:
                return rs.getLong(columnNumber);

            // REAL is a single precision floating point value, i.e. a Java float
            case Types.REAL:
                return rs.getFloat(columnNumber);

            // FLOAT is, confusingly, double precision and effectively the same as DOUBLE. See REAL
            // for single precision
            case Types.FLOAT:
            case Types.DOUBLE:
                return rs.getDouble(columnNumber);

            case Types.NUMERIC:
                if (numericMapping == NumericMapping.PRECISION_ONLY) {
                    int precision = columnDefinition.precision();
                    int scale = columnDefinition.scale();
                    log.trace("NUMERIC with precision: '{}' and scale: '{}'", precision, scale);
                    if (scale == 0 && precision <= MAX_INTEGER_TYPE_PRECISION) { // integer
                        if (precision > 9) {
                            return rs.getLong(columnNumber);
                        } else if (precision > 4) {
                            return rs.getInt(columnNumber);
                        } else if (precision > 2) {
                            return rs.getShort(columnNumber);
                        } else {
                            return rs.getByte(columnNumber);
                        }
                    }
                } else if (numericMapping == NumericMapping.BEST_FIT) {
                    int precision = columnDefinition.precision();
                    int scale = columnDefinition.scale();
                    log.trace("NUMERIC with precision: '{}' and scale: '{}'", precision, scale);
                    if (precision <= MAX_INTEGER_TYPE_PRECISION) { // fits in primitive data types.
                        if (scale < 1 && scale >= NUMERIC_TYPE_SCALE_LOW) { // integer
                            if (precision > 9) {
                                return rs.getLong(columnNumber);
                            } else if (precision > 4) {
                                return rs.getInt(columnNumber);
                            } else if (precision > 2) {
                                return rs.getShort(columnNumber);
                            } else {
                                return rs.getByte(columnNumber);
                            }
                        } else if (scale > 0) { // floating point - use double in all cases
                            return rs.getDouble(columnNumber);
                        }
                    }
                } else if (numericMapping == NumericMapping.BEST_FIT_EAGER_DOUBLE) {
                    int precision = columnDefinition.precision();
                    int scale = columnDefinition.scale();
                    log.trace("NUMERIC with precision: '{}' and scale: '{}'", precision, scale);
                    if (scale < 1 && scale >= NUMERIC_TYPE_SCALE_LOW) { // integer
                        if (precision <= MAX_INTEGER_TYPE_PRECISION) { // fits in primitive data types.
                            if (precision > 9) {
                                return rs.getLong(columnNumber);
                            } else if (precision > 4) {
                                return rs.getInt(columnNumber);
                            } else if (precision > 2) {
                                return rs.getShort(columnNumber);
                            } else {
                                return rs.getByte(columnNumber);
                            }
                        }
                    } else if (scale > 0) { // floating point - use double in all cases
                        return rs.getDouble(columnNumber);
                    }
                }
                // fallthrough

            case Types.DECIMAL:
                final int precision = columnDefinition.precision();
                log.debug("DECIMAL with precision: '{}' and scale: '{}'", precision, columnDefinition.scale());
                final int scale = decimalScale(columnDefinition);
                return rs.getBigDecimal(columnNumber, scale);

            case Types.CHAR:
            case Types.VARCHAR:
            case Types.LONGVARCHAR:
                return rs.getString(columnNumber);

            case Types.NCHAR:
            case Types.NVARCHAR:
            case Types.LONGNVARCHAR:
                return rs.getNString(columnNumber);

            // Binary == fixed, VARBINARY and LONGVARBINARY == bytes
            case Types.BINARY:
            case Types.VARBINARY:
            case Types.LONGVARBINARY:
                return rs.getBytes(columnNumber);

            // Date is day + month + year
            case Types.DATE:
                return rs.getDate(columnNumber,
                    DateTimeUtils.getTimeZoneCalendar(TimeZone.getTimeZone(ZoneOffset.UTC)));

            // Time is a time of day -- hour, minute, seconds, nanoseconds
            case Types.TIME:
                return rs.getTime(columnNumber, DateTimeUtils.getTimeZoneCalendar(timeZone));

            // Timestamp is a date + time
            case Types.TIMESTAMP:
                return rs.getTimestamp(columnNumber, DateTimeUtils.getTimeZoneCalendar(timeZone));

            // Datalink is basically a URL -> string
            case Types.DATALINK:
                URL url = rs.getURL(columnNumber);
                return (url != null) ? url.toString() : null;

            // BLOB == fixed
            case Types.BLOB:
                Blob blob = rs.getBlob(columnNumber);
                if (blob == null) {
                    return null;
                } else {
                    try {
                        if (blob.length() > Integer.MAX_VALUE) {
                            throw new IOException("Can't process BLOBs longer than " + Integer.MAX_VALUE);
                        }
                        return blob.getBytes(1, (int) blob.length());
                    } finally {
                        if (isJdbc4) {
                            free(blob);
                        }
                    }
                }

            case Types.CLOB:
                Clob clob = rs.getClob(columnNumber);
                if (clob == null) {
                    return null;
                } else {
                    try {
                        if (clob.length() > Integer.MAX_VALUE) {
                            throw new IOException("Can't process CLOBs longer than " + Integer.MAX_VALUE);
                        }
                        return clob.getSubString(1, (int) clob.length());
                    } finally {
                        if (isJdbc4) {
                            free(clob);
                        }
                    }
                }
            case Types.NCLOB:
                Clob nClob = rs.getNClob(columnNumber);
                if (nClob == null) {
                    return null;
                } else {
                    try {
                        if (nClob.length() > Integer.MAX_VALUE) {
                            throw new IOException("Can't process NCLOBs longer than " + Integer.MAX_VALUE);
                        }
                        return nClob.getSubString(1, (int) nClob.length());
                    } finally {
                        if (isJdbc4) {
                            free(nClob);
                        }
                    }
                }

                // XML -> string
            case Types.SQLXML:
                SQLXML xml = rs.getSQLXML(columnNumber);
                return xml != null ? xml.getString() : null;

            case Types.NULL:
            case Types.ARRAY:
            case Types.JAVA_OBJECT:
            case Types.OTHER:
            case Types.DISTINCT:
            case Types.STRUCT:
            case Types.REF:
            case Types.ROWID:
            default:
                // These are not currently supported
                log.warn("JDBC type {} ({}) not supported", columnDefinition.type(), columnDefinition.typeName());
                break;
        }
        return null;
    }