in timescaledb-connector/src/main/java/com/epam/deltix/timebase/connector/service/timescale/TimescaleDataService.java [163:278]
private void prepareValue(PreparedStatement ps, TimescaleColumn.TimescaleDataType dataType, Object value, int position) {
try {
switch (dataType) {
case BYTEA:
if (value == null) {
ps.setNull(position, Types.BINARY);
} else {
byte[] bytes = (byte[]) value;
ps.setBinaryStream(position, new ByteArrayInputStream(bytes), bytes.length);
}
break;
case CHAR:
if (value == null) {
ps.setNull(position, Types.CHAR);
} else {
ps.setString(position, value.toString());
}
break;
case VARCHAR:
case UUID:
if (value == null) {
ps.setNull(position, Types.VARCHAR);
} else {
ps.setString(position, value.toString());
}
break;
case DATE:
if (value == null) {
ps.setNull(position, Types.DATE);
} else {
ps.setDate(position, Date.valueOf(value.toString()));
}
break;
case DATETIME:
if (value == null) {
ps.setNull(position, Types.TIMESTAMP);
} else {
ps.setTimestamp(position, new Timestamp((Long) value));
}
break;
case BOOLEAN:
if (value == null) {
ps.setNull(position, Types.BOOLEAN);
} else {
ps.setBoolean(position, (Boolean) value);
}
break;
case TIME:
if (value == null) {
ps.setNull(position, Types.TIME);
} else {
ps.setTime(position, new Time((Long) value));
}
break;
case INTEGER:
if (value == null) {
ps.setNull(position, Types.INTEGER);
} else {
if (value instanceof Short) {
ps.setShort(position, (Short) value);
} else if (value instanceof Byte) {
ps.setByte(position, (Byte) value);
} else {
ps.setInt(position, (Integer) value);
}
}
break;
case LONG:
if (value == null) {
ps.setNull(position, Types.BIGINT);
} else {
ps.setLong(position, (Long) value);
}
break;
case DECIMAL64:
if (value != null) {
Decimal64 decimal64 = Decimal64.fromUnderlying((Long) value);
if (!decimal64.isNaN() && !decimal64.isInfinity() && !decimal64.isNegativeInfinity()) {
ps.setBigDecimal(position, decimal64.toBigDecimal());
} else {
ps.setNull(position, Types.DECIMAL);
}
} else {
ps.setNull(position, Types.DECIMAL);
}
break;
case DECIMAL:
if (value == null) {
ps.setNull(position, Types.DECIMAL);
} else if (value instanceof Float){
ps.setFloat(position, (Float) value);
} else {
ps.setDouble(position, (Double) value);
}
break;
case JSON:
case JSONB:
//TODO add jsonb support
if (value == null) {
ps.setNull(position, Types.OTHER);
} else {
//jsonb
PGobject json = new PGobject();
json.setType("json");
json.setValue(mapper.writeValueAsString(value));
ps.setObject(position, json);
}
break;
default:
throw new IllegalArgumentException("Timescale data type is not supported: " + dataType);
}
} catch (Exception ex) {
throw new RuntimeException("DataType: " + dataType + " with value: " + value + " value class: " + value.getClass(), ex);
}
}