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}