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;
}