in nifi-extension-bundles/nifi-extension-utils/nifi-database-utils/src/main/java/org/apache/nifi/util/db/JdbcCommon.java [766:913]
public static void setParameter(final PreparedStatement stmt, final int parameterIndex, final String parameterValue, final int jdbcType,
final String valueFormat)
throws SQLException, UnsupportedEncodingException, ParseException {
if (parameterValue == null) {
stmt.setNull(parameterIndex, jdbcType);
} else {
switch (jdbcType) {
case Types.BIT:
stmt.setBoolean(parameterIndex, "1".equals(parameterValue) || "t".equalsIgnoreCase(parameterValue) || Boolean.parseBoolean(parameterValue));
break;
case Types.BOOLEAN:
stmt.setBoolean(parameterIndex, Boolean.parseBoolean(parameterValue));
break;
case Types.TINYINT:
stmt.setByte(parameterIndex, Byte.parseByte(parameterValue));
break;
case Types.SMALLINT:
stmt.setShort(parameterIndex, Short.parseShort(parameterValue));
break;
case Types.INTEGER:
stmt.setInt(parameterIndex, Integer.parseInt(parameterValue));
break;
case Types.BIGINT:
stmt.setLong(parameterIndex, Long.parseLong(parameterValue));
break;
case Types.REAL:
stmt.setFloat(parameterIndex, Float.parseFloat(parameterValue));
break;
case Types.FLOAT:
case Types.DOUBLE:
stmt.setDouble(parameterIndex, Double.parseDouble(parameterValue));
break;
case Types.DECIMAL:
case Types.NUMERIC:
stmt.setBigDecimal(parameterIndex, new BigDecimal(parameterValue));
break;
case Types.DATE:
java.sql.Date date;
if (valueFormat.equals("")) {
if (LONG_PATTERN.matcher(parameterValue).matches()) {
date = new java.sql.Date(Long.parseLong(parameterValue));
} else {
final LocalDate localDate = LocalDate.parse(parameterValue);
date = java.sql.Date.valueOf(localDate);
}
} else {
final DateTimeFormatter dtFormatter = getDateTimeFormatter(valueFormat);
LocalDate parsedDate = LocalDate.parse(parameterValue, dtFormatter);
date = new java.sql.Date(java.sql.Date.from(parsedDate.atStartOfDay().atZone(ZoneId.systemDefault()).toInstant()).getTime());
}
stmt.setDate(parameterIndex, date);
break;
case Types.TIME:
Time time;
if (valueFormat.equals("")) {
if (LONG_PATTERN.matcher(parameterValue).matches()) {
time = new Time(Long.parseLong(parameterValue));
} else {
final LocalTime localTime = LocalTime.parse(parameterValue, TIME_FORMATTER);
time = Time.valueOf(localTime);
}
} else {
final DateTimeFormatter dtFormatter = getDateTimeFormatter(valueFormat);
LocalTime parsedTime = LocalTime.parse(parameterValue, dtFormatter);
LocalDateTime localDateTime = parsedTime.atDate(LocalDate.ofEpochDay(0));
Instant instant = localDateTime.atZone(ZoneId.systemDefault()).toInstant();
time = new Time(instant.toEpochMilli());
}
stmt.setTime(parameterIndex, time);
break;
case Types.TIMESTAMP:
Timestamp ts;
// Backwards compatibility note: Format was unsupported for a timestamp field.
if (valueFormat.equals("")) {
long lTimestamp = 0L;
if (LONG_PATTERN.matcher(parameterValue).matches()) {
lTimestamp = Long.parseLong(parameterValue);
} else {
final LocalDateTime localDateTime = LocalDateTime.parse(parameterValue, TIMESTAMP_FORMATTER);
lTimestamp = Timestamp.valueOf(localDateTime).getTime();
}
ts = new Timestamp(lTimestamp);
} else {
final DateTimeFormatter dtFormatter = getDateTimeFormatter(valueFormat);
LocalDateTime ldt = LocalDateTime.parse(parameterValue, dtFormatter);
ts = Timestamp.from(ldt.atZone(ZoneId.systemDefault()).toInstant());
}
stmt.setTimestamp(parameterIndex, ts);
break;
case Types.BINARY:
case Types.VARBINARY:
case Types.LONGVARBINARY:
byte[] bValue;
switch (valueFormat) {
case "":
case "ascii":
bValue = parameterValue.getBytes(StandardCharsets.US_ASCII);
break;
case "hex":
try {
bValue = Hex.decodeHex(parameterValue);
} catch (final DecoderException e) {
throw new RuntimeException("Hexadecimal decoding failed", e);
}
break;
case "base64":
bValue = Base64.getDecoder().decode(parameterValue);
break;
default:
throw new ParseException("Unable to parse binary data using the formatter `" + valueFormat + "`.", 0);
}
try {
stmt.setBinaryStream(parameterIndex, new ByteArrayInputStream(bValue), bValue.length);
} catch (Exception ex) {
stmt.setBytes(parameterIndex, bValue);
}
break;
case Types.CHAR:
case Types.VARCHAR:
case Types.LONGNVARCHAR:
case Types.LONGVARCHAR:
stmt.setString(parameterIndex, parameterValue);
break;
case Types.CLOB:
try (final StringReader reader = new StringReader(parameterValue)) {
stmt.setCharacterStream(parameterIndex, reader);
}
break;
case Types.NCLOB:
try (final StringReader reader = new StringReader(parameterValue)) {
stmt.setNCharacterStream(parameterIndex, reader);
}
break;
default:
stmt.setObject(parameterIndex, parameterValue, jdbcType);
break;
}
}
}