private void prepareValue()

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