001package org.itsallcode.jdbc.dialect;
002
003import java.time.*;
004import java.time.format.DateTimeFormatter;
005
006import org.itsallcode.jdbc.resultset.generic.ColumnMetaData;
007
008/**
009 * Dialect for the Exasol database.
010 */
011public class ExasolDialect extends AbstractDbDialect {
012    private static final DateTimeFormatter DATE_TIME_FORMATTER = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss.SSS");
013    private static final ZoneId UTC_ZONE = ZoneId.of("UTC");
014
015    /**
016     * Create a new instance.
017     */
018    public ExasolDialect() {
019        super("jdbc:exa:");
020    }
021
022    @Override
023    public ColumnValueExtractor createExtractor(final ColumnMetaData column) {
024        return switch (column.type().jdbcType()) {
025        case TIMESTAMP -> Extractors.timestampToUTCInstant();
026        case CLOB -> Extractors.clobToString();
027        case BLOB -> Extractors.blobToBytes();
028        case DATE -> Extractors.dateToLocalDate();
029        default -> Extractors.generic();
030        };
031    }
032
033    @SuppressWarnings("unchecked")
034    @Override
035    public <T> ColumnValueSetter<T> createSetter(final Class<T> type) {
036        if (type == LocalDate.class) {
037            return (ColumnValueSetter<T>) Setters.localDateToString();
038        }
039        if (type == Instant.class) {
040            return (ColumnValueSetter<T>) Setters.instantToString(DATE_TIME_FORMATTER, UTC_ZONE);
041        }
042        if (type == LocalDateTime.class) {
043            return (ColumnValueSetter<T>) Setters.localDateTimeToString(DATE_TIME_FORMATTER);
044        }
045        return Setters.generic();
046    }
047}