package org.jdbi.v3.core.mapper;
import java.lang.reflect.Type;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.IdentityHashMap;
import java.util.Map;
import java.util.Optional;
import org.jdbi.v3.core.config.ConfigRegistry;
import static org.jdbi.v3.core.generic.GenericTypes.getErasedType;
class PrimitiveMapperFactory implements ColumnMapperFactory {
private final Map<Class<?>, ColumnMapper<?>> mappers = new IdentityHashMap<>();
PrimitiveMapperFactory() {
mappers.put(boolean.class, primitiveMapper(ResultSet::getBoolean));
mappers.put(byte.class, primitiveMapper(ResultSet::getByte));
mappers.put(char.class, primitiveMapper(PrimitiveMapperFactory::getChar));
mappers.put(short.class, primitiveMapper(ResultSet::getShort));
mappers.put(int.class, primitiveMapper(ResultSet::getInt));
mappers.put(long.class, primitiveMapper(ResultSet::getLong));
mappers.put(float.class, primitiveMapper(ResultSet::getFloat));
mappers.put(double.class, primitiveMapper(ResultSet::getDouble));
}
@Override
public Optional<ColumnMapper<?>> build(Type type, ConfigRegistry config) {
Class<?> rawType = getErasedType(type);
return Optional.ofNullable(mappers.get(rawType));
}
private static <T> ColumnMapper<T> primitiveMapper(ColumnGetter<T> getter) {
return (r, i, ctx) -> getter.get(r, i);
}
private static char getChar(ResultSet r, int i) throws SQLException {
Character character = getCharacter(r, i);
return character == null ? '\000' : character;
}
private static Character getCharacter(ResultSet r, int i) throws SQLException {
String s = r.getString(i);
if (s != null && !s.isEmpty()) {
return s.charAt(0);
}
return null;
}
}