in src/main/core-impl/java/com/mysql/cj/AbstractQueryBindings.java [322:1029]
public void setObject(int parameterIndex, Object parameterObj, MysqlType targetMysqlType, int scaleOrLength) {
if (parameterObj == null) {
setNull(parameterIndex);
return;
}
/*
* According to Table-B5 in the JDBC Spec
*/
try {
if (parameterObj instanceof LocalDate) {
switch (targetMysqlType) {
case DATE:
setLocalDate(parameterIndex, (LocalDate) parameterObj, targetMysqlType);
break;
case DATETIME:
case TIMESTAMP:
setLocalDateTime(parameterIndex, LocalDateTime.of((LocalDate) parameterObj, DEFAULT_TIME), targetMysqlType);
break;
case YEAR:
setInt(parameterIndex, ((LocalDate) parameterObj).getYear());
break;
case CHAR:
case VARCHAR:
case TINYTEXT:
case TEXT:
case MEDIUMTEXT:
case LONGTEXT:
setString(parameterIndex, parameterObj.toString());
break;
default:
throw ExceptionFactory.createException(WrongArgumentException.class,
Messages.getString("PreparedStatement.67", new Object[] { parameterObj.getClass().getName(), targetMysqlType.toString() }),
this.session.getExceptionInterceptor());
}
} else if (parameterObj instanceof LocalTime) {
switch (targetMysqlType) {
case TIME:
setLocalTime(parameterIndex, (LocalTime) parameterObj, targetMysqlType);
break;
case CHAR:
case VARCHAR:
case TINYTEXT:
case TEXT:
case MEDIUMTEXT:
case LONGTEXT:
setString(parameterIndex,
((LocalTime) parameterObj).format(this.sendFractionalSeconds.getValue() && ((LocalTime) parameterObj).getNano() > 0
? TimeUtil.TIME_FORMATTER_WITH_NANOS_NO_OFFSET
: TimeUtil.TIME_FORMATTER_NO_FRACT_NO_OFFSET));
break;
default:
throw ExceptionFactory.createException(WrongArgumentException.class,
Messages.getString("PreparedStatement.67", new Object[] { parameterObj.getClass().getName(), targetMysqlType.toString() }),
this.session.getExceptionInterceptor());
}
} else if (parameterObj instanceof LocalDateTime) {
switch (targetMysqlType) {
case DATE:
case DATETIME:
case TIMESTAMP:
case TIME:
setLocalDateTime(parameterIndex, ((LocalDateTime) parameterObj), targetMysqlType);
break;
case YEAR:
setInt(parameterIndex, ((LocalDateTime) parameterObj).getYear());
break;
case CHAR:
case VARCHAR:
case TINYTEXT:
case TEXT:
case MEDIUMTEXT:
case LONGTEXT:
setString(parameterIndex,
((LocalDateTime) parameterObj).format(this.sendFractionalSeconds.getValue() && ((LocalDateTime) parameterObj).getNano() > 0
? TimeUtil.DATETIME_FORMATTER_WITH_NANOS_NO_OFFSET
: TimeUtil.DATETIME_FORMATTER_NO_FRACT_NO_OFFSET));
break;
default:
throw ExceptionFactory.createException(WrongArgumentException.class,
Messages.getString("PreparedStatement.67", new Object[] { parameterObj.getClass().getName(), targetMysqlType.toString() }),
this.session.getExceptionInterceptor());
}
} else if (parameterObj instanceof OffsetTime) {
switch (targetMysqlType) {
case TIME:
setLocalTime(parameterIndex,
((OffsetTime) parameterObj)
.withOffsetSameInstant(
ZoneOffset.ofTotalSeconds(this.session.getServerSession().getDefaultTimeZone().getRawOffset() / 1000))
.toLocalTime(),
targetMysqlType);
break;
case CHAR:
case VARCHAR:
case TINYTEXT:
case TEXT:
case MEDIUMTEXT:
case LONGTEXT:
setString(parameterIndex,
((OffsetTime) parameterObj).format(this.sendFractionalSeconds.getValue() && ((OffsetTime) parameterObj).getNano() > 0
? TimeUtil.TIME_FORMATTER_WITH_NANOS_WITH_OFFSET
: TimeUtil.TIME_FORMATTER_NO_FRACT_WITH_OFFSET));
break;
default:
throw ExceptionFactory.createException(WrongArgumentException.class,
Messages.getString("PreparedStatement.67", new Object[] { parameterObj.getClass().getName(), targetMysqlType.toString() }),
this.session.getExceptionInterceptor());
}
} else if (parameterObj instanceof OffsetDateTime) {
switch (targetMysqlType) {
case DATE:
setLocalDate(parameterIndex, ((OffsetDateTime) parameterObj)
.atZoneSameInstant(this.session.getServerSession().getDefaultTimeZone().toZoneId()).toLocalDate(), targetMysqlType);
break;
case DATETIME:
case TIMESTAMP:
java.sql.Timestamp ts = Timestamp.valueOf(((OffsetDateTime) parameterObj)
.atZoneSameInstant(this.session.getServerSession().getDefaultTimeZone().toZoneId()).toLocalDateTime());
int fractLen = -1;
if (!this.session.getServerSession().getCapabilities().serverSupportsFracSecs() || !this.sendFractionalSeconds.getValue()) {
fractLen = 0;
} else if (this.columnDefinition != null && parameterIndex <= this.columnDefinition.getFields().length && parameterIndex >= 0
&& this.columnDefinition.getFields()[parameterIndex].getDecimals() > 0) {
fractLen = this.columnDefinition.getFields()[parameterIndex].getDecimals();
}
if (fractLen == 0) {
ts = TimeUtil.truncateFractionalSeconds(ts);
}
bindTimestamp(parameterIndex, ts, null, fractLen, targetMysqlType);
break;
case TIME:
setLocalTime(parameterIndex, ((OffsetDateTime) parameterObj)
.atZoneSameInstant(this.session.getServerSession().getDefaultTimeZone().toZoneId()).toLocalTime(), targetMysqlType);
break;
case YEAR:
setInt(parameterIndex,
((OffsetDateTime) parameterObj).atZoneSameInstant(this.session.getServerSession().getDefaultTimeZone().toZoneId()).getYear());
break;
case CHAR:
case VARCHAR:
case TINYTEXT:
case TEXT:
case MEDIUMTEXT:
case LONGTEXT:
setString(parameterIndex,
((OffsetDateTime) parameterObj).format(this.sendFractionalSeconds.getValue() && ((OffsetDateTime) parameterObj).getNano() > 0
? TimeUtil.DATETIME_FORMATTER_WITH_NANOS_WITH_OFFSET
: TimeUtil.DATETIME_FORMATTER_NO_FRACT_WITH_OFFSET));
break;
default:
throw ExceptionFactory.createException(WrongArgumentException.class,
Messages.getString("PreparedStatement.67", new Object[] { parameterObj.getClass().getName(), targetMysqlType.toString() }),
this.session.getExceptionInterceptor());
}
} else if (parameterObj instanceof ZonedDateTime) {
switch (targetMysqlType) {
case DATE:
setLocalDate(parameterIndex, ((ZonedDateTime) parameterObj)
.withZoneSameInstant(this.session.getServerSession().getDefaultTimeZone().toZoneId()).toLocalDate(), targetMysqlType);
break;
case DATETIME:
case TIMESTAMP:
java.sql.Timestamp ts = Timestamp.valueOf(((ZonedDateTime) parameterObj)
.withZoneSameInstant(this.session.getServerSession().getDefaultTimeZone().toZoneId()).toLocalDateTime());
int fractLen = -1;
if (!this.session.getServerSession().getCapabilities().serverSupportsFracSecs() || !this.sendFractionalSeconds.getValue()) {
fractLen = 0;
} else if (this.columnDefinition != null && parameterIndex <= this.columnDefinition.getFields().length && parameterIndex >= 0
&& this.columnDefinition.getFields()[parameterIndex].getDecimals() > 0) {
fractLen = this.columnDefinition.getFields()[parameterIndex].getDecimals();
}
if (fractLen == 0) {
ts = TimeUtil.truncateFractionalSeconds(ts);
}
bindTimestamp(parameterIndex, ts, null, fractLen, targetMysqlType);
break;
case TIME:
setLocalTime(parameterIndex, ((ZonedDateTime) parameterObj)
.withZoneSameInstant(this.session.getServerSession().getDefaultTimeZone().toZoneId()).toLocalTime(), targetMysqlType);
break;
case YEAR:
setInt(parameterIndex,
((ZonedDateTime) parameterObj).withZoneSameInstant(this.session.getServerSession().getDefaultTimeZone().toZoneId()).getYear());
break;
case CHAR:
case VARCHAR:
case TINYTEXT:
case TEXT:
case MEDIUMTEXT:
case LONGTEXT:
setString(parameterIndex,
((ZonedDateTime) parameterObj).format(this.sendFractionalSeconds.getValue() && ((ZonedDateTime) parameterObj).getNano() > 0
? TimeUtil.DATETIME_FORMATTER_WITH_NANOS_WITH_OFFSET
: TimeUtil.DATETIME_FORMATTER_NO_FRACT_WITH_OFFSET));
break;
default:
throw ExceptionFactory.createException(WrongArgumentException.class,
Messages.getString("PreparedStatement.67", new Object[] { parameterObj.getClass().getName(), targetMysqlType.toString() }),
this.session.getExceptionInterceptor());
}
} else if (parameterObj instanceof java.sql.Date) {
switch (targetMysqlType) {
case DATE:
setDate(parameterIndex, (java.sql.Date) parameterObj);
break;
case DATETIME:
case TIMESTAMP:
setTimestamp(parameterIndex, new java.sql.Timestamp(((java.util.Date) parameterObj).getTime()), targetMysqlType);
break;
case YEAR:
Calendar cal = Calendar.getInstance();
cal.setTime((java.util.Date) parameterObj);
setInt(parameterIndex, cal.get(Calendar.YEAR));
break;
case CHAR:
case VARCHAR:
case TINYTEXT:
case TEXT:
case MEDIUMTEXT:
case LONGTEXT:
setString(parameterIndex, parameterObj.toString());
break;
default:
throw ExceptionFactory.createException(WrongArgumentException.class,
Messages.getString("PreparedStatement.67", new Object[] { parameterObj.getClass().getName(), targetMysqlType.toString() }),
this.session.getExceptionInterceptor());
}
} else if (parameterObj instanceof java.sql.Timestamp) {
switch (targetMysqlType) {
case DATE:
setDate(parameterIndex, new java.sql.Date(((java.util.Date) parameterObj).getTime()));
break;
case DATETIME:
case TIMESTAMP:
setTimestamp(parameterIndex, (java.sql.Timestamp) parameterObj, targetMysqlType);
break;
case YEAR:
Calendar cal = Calendar.getInstance();
cal.setTime((java.util.Date) parameterObj);
setInt(parameterIndex, cal.get(Calendar.YEAR));
break;
case TIME:
setLocalTime(parameterIndex, ((java.sql.Timestamp) parameterObj).toLocalDateTime().toLocalTime(), targetMysqlType);
break;
case CHAR:
case VARCHAR:
case TINYTEXT:
case TEXT:
case MEDIUMTEXT:
case LONGTEXT:
String val = parameterObj.toString();
int dotPos;
if ((((java.sql.Timestamp) parameterObj).getNanos() == 0 || !this.sendFractionalSeconds.getValue())
&& (dotPos = val.indexOf(".")) > 0) {
val = val.substring(0, dotPos);
}
setString(parameterIndex, val);
break;
default:
throw ExceptionFactory.createException(WrongArgumentException.class,
Messages.getString("PreparedStatement.67", new Object[] { parameterObj.getClass().getName(), targetMysqlType.toString() }),
this.session.getExceptionInterceptor());
}
} else if (parameterObj instanceof java.sql.Time) {
switch (targetMysqlType) {
case DATE:
setDate(parameterIndex, new java.sql.Date(((java.util.Date) parameterObj).getTime()));
break;
case DATETIME:
case TIMESTAMP:
java.sql.Timestamp ts = new java.sql.Timestamp(((java.sql.Time) parameterObj).getTime());
int fractLen = -1;
if (!this.session.getServerSession().getCapabilities().serverSupportsFracSecs() || !this.sendFractionalSecondsForTime.getValue()
|| !this.sendFractionalSeconds.getValue()) {
fractLen = 0;
} else if (this.columnDefinition != null && parameterIndex <= this.columnDefinition.getFields().length && parameterIndex >= 0
&& this.columnDefinition.getFields()[parameterIndex].getDecimals() > 0) {
fractLen = this.columnDefinition.getFields()[parameterIndex].getDecimals();
}
if (fractLen == 0) {
ts = TimeUtil.truncateFractionalSeconds(ts);
}
bindTimestamp(parameterIndex, ts, null, fractLen, MysqlType.DATETIME); // Override TIMESTAMP to avoid conversion to the server time zone
break;
case YEAR:
Calendar cal = Calendar.getInstance();
cal.setTime((java.util.Date) parameterObj);
setInt(parameterIndex, cal.get(Calendar.YEAR));
break;
case TIME:
setTime(parameterIndex, (java.sql.Time) parameterObj);
break;
case CHAR:
case VARCHAR:
case TINYTEXT:
case TEXT:
case MEDIUMTEXT:
case LONGTEXT:
setString(
parameterIndex, TimeUtil
.getSimpleDateFormat(this.session.getServerSession().getCapabilities().serverSupportsFracSecs()
&& this.sendFractionalSeconds.getValue() && this.sendFractionalSecondsForTime.getValue()
&& TimeUtil.hasFractionalSeconds((java.sql.Time) parameterObj) ? "HH:mm:ss.SSS" : "HH:mm:ss", null)
.format(parameterObj));
break;
default:
throw ExceptionFactory.createException(WrongArgumentException.class,
Messages.getString("PreparedStatement.67", new Object[] { parameterObj.getClass().getName(), targetMysqlType.toString() }),
this.session.getExceptionInterceptor());
}
} else if (parameterObj instanceof java.util.Date) {
if (!this.treatUtilDateAsTimestamp.getValue()) { // TODO is it needed at all?
setSerializableObject(parameterIndex, parameterObj);
return;
}
switch (targetMysqlType) {
case DATE:
setDate(parameterIndex, new java.sql.Date(((java.util.Date) parameterObj).getTime()));
break;
case DATETIME:
case TIMESTAMP:
setTimestamp(parameterIndex, new java.sql.Timestamp(((java.util.Date) parameterObj).getTime()), targetMysqlType);
break;
case YEAR:
Calendar cal = Calendar.getInstance();
cal.setTime(((java.util.Date) parameterObj));
setInt(parameterIndex, cal.get(Calendar.YEAR));
break;
case TIME:
LocalTime lt = ((java.util.Date) parameterObj).toInstant().atZone(this.session.getServerSession().getDefaultTimeZone().toZoneId())
.toLocalTime();
setLocalTime(parameterIndex, lt, targetMysqlType);
break;
case CHAR:
case VARCHAR:
case TINYTEXT:
case TEXT:
case MEDIUMTEXT:
case LONGTEXT:
setString(parameterIndex, TimeUtil.getSimpleDateFormat(
this.session.getServerSession().getCapabilities().serverSupportsFracSecs() && this.sendFractionalSeconds.getValue()
&& ((java.util.Date) parameterObj).toInstant().getNano() > 0 ? "yyyy-MM-dd HH:mm:ss.SSS" : "yyyy-MM-dd HH:mm:ss",
null).format(parameterObj));
break;
default:
throw ExceptionFactory.createException(WrongArgumentException.class,
Messages.getString("PreparedStatement.67", new Object[] { parameterObj.getClass().getName(), targetMysqlType.toString() }),
this.session.getExceptionInterceptor());
}
} else if (parameterObj instanceof java.util.Calendar) {
switch (targetMysqlType) {
case DATE:
setDate(parameterIndex, new java.sql.Date(((java.util.Calendar) parameterObj).getTimeInMillis()));
break;
case DATETIME:
case TIMESTAMP:
setTimestamp(parameterIndex, new java.sql.Timestamp(((java.util.Calendar) parameterObj).getTimeInMillis()), targetMysqlType);
break;
case YEAR:
setInt(parameterIndex, ((java.util.Calendar) parameterObj).get(Calendar.YEAR));
break;
case TIME:
LocalTime lt = ((java.util.Calendar) parameterObj).toInstant().atZone(this.session.getServerSession().getDefaultTimeZone().toZoneId())
.toLocalTime();
setLocalTime(parameterIndex, lt, targetMysqlType);
break;
case CHAR:
case VARCHAR:
case TINYTEXT:
case TEXT:
case MEDIUMTEXT:
case LONGTEXT:
ZonedDateTime zdt = ZonedDateTime
.ofInstant(((java.util.Calendar) parameterObj).toInstant(), ((java.util.Calendar) parameterObj).getTimeZone().toZoneId())
.withZoneSameInstant(this.session.getServerSession().getDefaultTimeZone().toZoneId());
setString(parameterIndex,
zdt.format(zdt.getNano() > 0 && this.session.getServerSession().getCapabilities().serverSupportsFracSecs()
&& this.sendFractionalSeconds.getValue() ? TimeUtil.DATETIME_FORMATTER_WITH_MILLIS_NO_OFFSET
: TimeUtil.DATETIME_FORMATTER_NO_FRACT_NO_OFFSET));
break;
default:
throw ExceptionFactory.createException(WrongArgumentException.class,
Messages.getString("PreparedStatement.67", new Object[] { parameterObj.getClass().getName(), targetMysqlType.toString() }),
this.session.getExceptionInterceptor());
}
} else if (parameterObj instanceof String) {
switch (targetMysqlType) {
case BOOLEAN:
if ("true".equalsIgnoreCase((String) parameterObj) || "Y".equalsIgnoreCase((String) parameterObj)) {
setBoolean(parameterIndex, true);
} else if ("false".equalsIgnoreCase((String) parameterObj) || "N".equalsIgnoreCase((String) parameterObj)) {
setBoolean(parameterIndex, false);
} else if (((String) parameterObj).matches("-?\\d+\\.?\\d*")) {
setBoolean(parameterIndex, !((String) parameterObj).matches("-?[0]+[.]*[0]*"));
} else {
throw ExceptionFactory.createException(WrongArgumentException.class,
Messages.getString("PreparedStatement.66", new Object[] { parameterObj }), this.session.getExceptionInterceptor());
}
break;
case BIT:
if ("1".equals(parameterObj) || "0".equals(parameterObj)) {
setInt(parameterIndex, Integer.valueOf((String) parameterObj).intValue());
} else {
boolean parameterAsBoolean = "true".equalsIgnoreCase((String) parameterObj);
setInt(parameterIndex, parameterAsBoolean ? 1 : 0);
}
break;
case TINYINT:
case TINYINT_UNSIGNED:
case SMALLINT:
case SMALLINT_UNSIGNED:
case MEDIUMINT:
case MEDIUMINT_UNSIGNED:
case INT:
case INT_UNSIGNED:
//case YEAR:
setInt(parameterIndex, Integer.valueOf((String) parameterObj).intValue());
break;
case BIGINT:
setLong(parameterIndex, Long.valueOf((String) parameterObj).longValue());
break;
case BIGINT_UNSIGNED:
setLong(parameterIndex, new BigInteger((String) parameterObj).longValue());
break;
case FLOAT:
case FLOAT_UNSIGNED:
setFloat(parameterIndex, Float.valueOf((String) parameterObj).floatValue());
break;
case DOUBLE:
case DOUBLE_UNSIGNED:
setDouble(parameterIndex, Double.valueOf((String) parameterObj).doubleValue());
break;
case DECIMAL:
case DECIMAL_UNSIGNED:
BigDecimal parameterAsNum = new BigDecimal((String) parameterObj);
BigDecimal scaledBigDecimal = null;
try {
scaledBigDecimal = parameterAsNum.setScale(scaleOrLength);
} catch (ArithmeticException ex) {
try {
scaledBigDecimal = parameterAsNum.setScale(scaleOrLength, BigDecimal.ROUND_HALF_UP);
} catch (ArithmeticException arEx) {
throw ExceptionFactory.createException(WrongArgumentException.class,
Messages.getString("PreparedStatement.65", new Object[] { scaleOrLength, parameterAsNum }),
this.session.getExceptionInterceptor());
}
}
setBigDecimal(parameterIndex, scaledBigDecimal);
break;
case CHAR:
case ENUM:
case SET:
case VARCHAR:
case TINYTEXT:
case TEXT:
case MEDIUMTEXT:
case LONGTEXT:
case JSON:
setString(parameterIndex, parameterObj.toString());
break;
case BINARY:
case GEOMETRY:
case VARBINARY:
case TINYBLOB:
case BLOB:
case MEDIUMBLOB:
case LONGBLOB:
setBytes(parameterIndex, StringUtils.getBytes(parameterObj.toString(), this.charEncoding));
break;
case DATE:
case DATETIME:
case TIMESTAMP:
case YEAR:
ParsePosition pp = new ParsePosition(0);
java.text.DateFormat sdf = new java.text.SimpleDateFormat(TimeUtil.getDateTimePattern((String) parameterObj, false), Locale.US);
setObject(parameterIndex, sdf.parse((String) parameterObj, pp), targetMysqlType, scaleOrLength);
break;
case TIME:
sdf = new java.text.SimpleDateFormat(TimeUtil.getDateTimePattern((String) parameterObj, true), Locale.US);
setTime(parameterIndex, new java.sql.Time(sdf.parse((String) parameterObj).getTime()));
break;
case UNKNOWN:
setSerializableObject(parameterIndex, parameterObj);
break;
default:
throw ExceptionFactory.createException(WrongArgumentException.class,
Messages.getString("PreparedStatement.67", new Object[] { parameterObj.getClass().getName(), targetMysqlType.toString() }),
this.session.getExceptionInterceptor());
}
} else if (parameterObj instanceof InputStream) {
setBinaryStream(parameterIndex, (InputStream) parameterObj, -1);
} else if (parameterObj instanceof Boolean) {
switch (targetMysqlType) {
case BOOLEAN:
setBoolean(parameterIndex, ((Boolean) parameterObj).booleanValue());
break;
case BIT:
case TINYINT:
case TINYINT_UNSIGNED:
case SMALLINT:
case SMALLINT_UNSIGNED:
case MEDIUMINT:
case MEDIUMINT_UNSIGNED:
case INT:
case INT_UNSIGNED:
case YEAR:
setInt(parameterIndex, ((Boolean) parameterObj).booleanValue() ? 1 : 0);
break;
case BIGINT:
case BIGINT_UNSIGNED:
setLong(parameterIndex, ((Boolean) parameterObj).booleanValue() ? 1L : 0L);
break;
case FLOAT:
case FLOAT_UNSIGNED:
setFloat(parameterIndex, ((Boolean) parameterObj).booleanValue() ? 1f : 0f);
break;
case DOUBLE:
case DOUBLE_UNSIGNED:
setDouble(parameterIndex, ((Boolean) parameterObj).booleanValue() ? 1d : 0d);
break;
case DECIMAL:
case DECIMAL_UNSIGNED:
setBigDecimal(parameterIndex, new java.math.BigDecimal(((Boolean) parameterObj).booleanValue() ? 1d : 0d));
break;
case CHAR:
case VARCHAR:
case TINYTEXT:
case TEXT:
case MEDIUMTEXT:
case LONGTEXT:
setString(parameterIndex, parameterObj.toString());
break;
default:
throw ExceptionFactory.createException(WrongArgumentException.class,
Messages.getString("PreparedStatement.67", new Object[] { parameterObj.getClass().getName(), targetMysqlType.toString() }),
this.session.getExceptionInterceptor());
}
} else if (parameterObj instanceof Number) {
Number parameterAsNum = (Number) parameterObj;
switch (targetMysqlType) {
case BOOLEAN:
setBoolean(parameterIndex, parameterAsNum.intValue() != 0);
break;
case BIT:
case TINYINT:
case TINYINT_UNSIGNED:
case SMALLINT:
case SMALLINT_UNSIGNED:
case MEDIUMINT:
case MEDIUMINT_UNSIGNED:
case INT:
case INT_UNSIGNED:
case YEAR:
setInt(parameterIndex, parameterAsNum.intValue());
break;
case BIGINT:
case BIGINT_UNSIGNED:
setLong(parameterIndex, parameterAsNum.longValue());
break;
case FLOAT:
case FLOAT_UNSIGNED:
setFloat(parameterIndex, parameterAsNum.floatValue());
break;
case DOUBLE:
case DOUBLE_UNSIGNED:
setDouble(parameterIndex, parameterAsNum.doubleValue());
break;
case DECIMAL:
case DECIMAL_UNSIGNED:
if (parameterAsNum instanceof BigDecimal) {
BigDecimal scaledBigDecimal = null;
try {
scaledBigDecimal = ((BigDecimal) parameterAsNum).setScale(scaleOrLength);
} catch (ArithmeticException ex) {
try {
scaledBigDecimal = ((BigDecimal) parameterAsNum).setScale(scaleOrLength, BigDecimal.ROUND_HALF_UP);
} catch (ArithmeticException arEx) {
throw ExceptionFactory.createException(WrongArgumentException.class,
Messages.getString("PreparedStatement.65", new Object[] { scaleOrLength, parameterAsNum }),
this.session.getExceptionInterceptor());
}
}
setBigDecimal(parameterIndex, scaledBigDecimal);
} else if (parameterAsNum instanceof java.math.BigInteger) {
setBigDecimal(parameterIndex, new BigDecimal((java.math.BigInteger) parameterAsNum, scaleOrLength));
} else {
setBigDecimal(parameterIndex, new BigDecimal(parameterAsNum.doubleValue()));
}
break;
case CHAR:
case ENUM:
case SET:
case VARCHAR:
case TINYTEXT:
case TEXT:
case MEDIUMTEXT:
case LONGTEXT:
case JSON:
if (parameterObj instanceof BigDecimal) {
setString(parameterIndex, (StringUtils.fixDecimalExponent(((BigDecimal) parameterObj).toPlainString())));
} else {
setString(parameterIndex, parameterObj.toString());
}
break;
case BINARY:
case GEOMETRY:
case VARBINARY:
case TINYBLOB:
case BLOB:
case MEDIUMBLOB:
case LONGBLOB:
setBytes(parameterIndex, StringUtils.getBytes(parameterObj.toString(), this.charEncoding));
break;
default:
throw ExceptionFactory.createException(WrongArgumentException.class,
Messages.getString("PreparedStatement.67", new Object[] { parameterObj.getClass().getName(), targetMysqlType.toString() }),
this.session.getExceptionInterceptor());
}
} else {
switch (targetMysqlType) {
case BOOLEAN:
throw ExceptionFactory.createException(WrongArgumentException.class,
Messages.getString("PreparedStatement.66", new Object[] { parameterObj.getClass().getName() }),
this.session.getExceptionInterceptor());
case CHAR:
case ENUM:
case SET:
case VARCHAR:
case TINYTEXT:
case TEXT:
case MEDIUMTEXT:
case LONGTEXT:
case JSON:
if (parameterObj instanceof BigDecimal) {
setString(parameterIndex, (StringUtils.fixDecimalExponent(((BigDecimal) parameterObj).toPlainString())));
} else if (parameterObj instanceof java.sql.Clob) {
setClob(parameterIndex, (java.sql.Clob) parameterObj);
} else {
setString(parameterIndex, parameterObj.toString());
}
break;
case BINARY:
case GEOMETRY:
case VARBINARY:
case TINYBLOB:
case BLOB:
case MEDIUMBLOB:
case LONGBLOB:
if (parameterObj instanceof byte[]) {
setBytes(parameterIndex, (byte[]) parameterObj);
} else if (parameterObj instanceof java.sql.Blob) {
setBlob(parameterIndex, (java.sql.Blob) parameterObj);
} else {
setBytes(parameterIndex, StringUtils.getBytes(parameterObj.toString(), this.charEncoding));
}
break;
case UNKNOWN:
setSerializableObject(parameterIndex, parameterObj);
break;
default:
throw ExceptionFactory.createException(WrongArgumentException.class,
Messages.getString("PreparedStatement.67", new Object[] { parameterObj.getClass().getName(), targetMysqlType.toString() }),
this.session.getExceptionInterceptor());
}
}
} catch (Exception ex) {
throw ExceptionFactory.createException(
Messages.getString("PreparedStatement.17") + parameterObj.getClass().toString() + Messages.getString("PreparedStatement.18")
+ ex.getClass().getName() + Messages.getString("PreparedStatement.19") + ex.getMessage(),
ex, this.session.getExceptionInterceptor());
}
}