in src/main/java/com/amazon/redshift/jdbc/RedshiftResultSet.java [1768:1958]
private void updateRowBuffer() throws SQLException {
for (Map.Entry<String, Object> entry : updateValues.entrySet()) {
int columnIndex = findColumn(entry.getKey()) - 1;
Object valueObject = entry.getValue();
if (valueObject instanceof RedshiftObject) {
String value = ((RedshiftObject) valueObject).getValue();
rowBuffer.set(columnIndex, (value == null) ? null : connection.encodeString(value));
} else {
switch (getSQLType(columnIndex + 1)) {
// boolean needs to be formatted as t or f instead of true or false
case Types.BIT:
case Types.BOOLEAN:
if (isBinary(columnIndex + 1)
&& valueObject != null) {
byte[] val = new byte[1];
ByteConverter.bool(val, 0, ((Boolean) valueObject).booleanValue());
rowBuffer.set(columnIndex, val);
}
else {
rowBuffer.set(columnIndex, connection
.encodeString(((Boolean) valueObject).booleanValue() ? "t" : "f"));
}
break;
//
// toString() isn't enough for date and time types; we must format it correctly
// or we won't be able to re-parse it.
//
case Types.DATE:
if (isBinary(columnIndex + 1)
&& valueObject != null) {
byte[] val = new byte[4];
TimeZone tz = null;
connection.getTimestampUtils().toBinDate(tz, val, (Date) valueObject);
rowBuffer.set(columnIndex, val);
}
else {
rowBuffer.set(columnIndex, connection
.encodeString(
connection.getTimestampUtils().toString(
getDefaultCalendar(), (Date) valueObject)));
}
break;
case Types.TIME:
rowBuffer.set(columnIndex, connection
.encodeString(
connection.getTimestampUtils().toString(
getDefaultCalendar(), (Time) valueObject)));
break;
case Types.TIMESTAMP:
if (isBinary(columnIndex + 1)
&& valueObject != null) {
byte[] val = new byte[8];
connection.getTimestampUtils().toBinTimestamp(null, val, (Timestamp) valueObject);
rowBuffer.set(columnIndex, val);
}
else {
rowBuffer.set(columnIndex, connection.encodeString(
connection.getTimestampUtils().toString(
getDefaultCalendar(), (Timestamp) valueObject)));
}
break;
case Types.NULL:
// Should never happen?
break;
case Types.BINARY:
case Types.LONGVARBINARY:
case Types.VARBINARY:
if (isBinary(columnIndex + 1)) {
rowBuffer.set(columnIndex, (byte[]) valueObject);
} else {
try {
rowBuffer.set(columnIndex,
RedshiftBytea.toRSString((byte[]) valueObject).getBytes("ISO-8859-1"));
} catch (UnsupportedEncodingException e) {
throw new RedshiftException(
GT.tr("The JVM claims not to support the encoding: {0}", "ISO-8859-1"),
RedshiftState.UNEXPECTED_ERROR, e);
}
}
break;
case Types.SMALLINT:
if (isBinary(columnIndex + 1)
&& valueObject != null) {
byte[] val = new byte[2];
ByteConverter.int2(val, 0, Integer.valueOf(String.valueOf(valueObject)));
rowBuffer.set(columnIndex, val);
}
else {
// Does as default switch case
rowBuffer.set(columnIndex, connection.encodeString(String.valueOf(valueObject)));
}
break;
case Types.INTEGER:
if (isBinary(columnIndex + 1)
&& valueObject != null) {
byte[] val = new byte[4];
ByteConverter.int4(val, 0, Integer.valueOf(String.valueOf(valueObject)));
rowBuffer.set(columnIndex, val);
}
else {
// Does as default switch case
rowBuffer.set(columnIndex, connection.encodeString(String.valueOf(valueObject)));
}
break;
case Types.BIGINT:
if (isBinary(columnIndex + 1)
&& valueObject != null) {
byte[] val = new byte[8];
ByteConverter.int8(val, 0, Long.valueOf(String.valueOf(valueObject)));
rowBuffer.set(columnIndex, val);
}
else {
// Does as default switch case
rowBuffer.set(columnIndex, connection.encodeString(String.valueOf(valueObject)));
}
break;
case Types.FLOAT:
if (isBinary(columnIndex + 1)
&& valueObject != null) {
byte[] val = new byte[4];
ByteConverter.float4(val, 0, Float.parseFloat(String.valueOf(valueObject)));
rowBuffer.set(columnIndex, val);
}
else {
// Does as default switch case
rowBuffer.set(columnIndex, connection.encodeString(String.valueOf(valueObject)));
}
case Types.DOUBLE:
if (isBinary(columnIndex + 1)
&& valueObject != null) {
byte[] val = new byte[8];
ByteConverter.float8(val, 0, Double.parseDouble(String.valueOf(valueObject)));
rowBuffer.set(columnIndex, val);
}
else {
// Does as default switch case
rowBuffer.set(columnIndex, connection.encodeString(String.valueOf(valueObject)));
}
break;
case Types.DECIMAL:
case Types.NUMERIC:
if (isBinary(columnIndex + 1)
&& valueObject != null) {
Field field = fields[columnIndex];
int mod = field.getMod();
int serverPrecision;
int serverScale;
serverPrecision = (mod == -1)
? 0
: ((mod - 4) & 0xFFFF0000) >> 16;
serverScale = (mod == -1)
? 0
: (mod - 4) & 0xFFFF;
byte[] val = ByteConverter.redshiftNumeric(new BigDecimal(String.valueOf(valueObject)), serverPrecision, serverScale);
rowBuffer.set(columnIndex, val);
}
else {
// Does as default switch case
rowBuffer.set(columnIndex, connection.encodeString(String.valueOf(valueObject)));
}
break;
default:
rowBuffer.set(columnIndex, connection.encodeString(String.valueOf(valueObject)));
break;
}
}
}
}