/* * Licensed to the Apache Software Foundation (ASF) under one or more * contributor license agreements. See the NOTICE file distributed with * this work for additional information regarding copyright ownership. * The ASF licenses this file to You under the Apache License, Version 2.0 * (the "License"); you may not use this file except in compliance with * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.apache.ignite.cache.store.jdbc; import java.math.BigDecimal; import java.nio.ByteBuffer; import java.sql.Date; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Time; import java.sql.Timestamp; import java.util.UUID; /** * Default implementation of {@link JdbcTypesTransformer}. */ public class JdbcTypesDefaultTransformer implements JdbcTypesTransformer { /** */ private static final long serialVersionUID = 0L; /** Singleton instance to use. */ public static final JdbcTypesDefaultTransformer INSTANCE = new JdbcTypesDefaultTransformer(); /** {@inheritDoc} */ @Override public Object getColumnValue(ResultSet rs, int colIdx, Class<?> type) throws SQLException { if (type == String.class) return rs.getString(colIdx); if (type == int.class || type == Integer.class) { int res = rs.getInt(colIdx); return rs.wasNull() && type == Integer.class ? null : res; } if (type == long.class || type == Long.class) { long res = rs.getLong(colIdx); return rs.wasNull() && type == Long.class ? null : res; } if (type == double.class || type == Double.class) { double res = rs.getDouble(colIdx); return rs.wasNull() && type == Double.class ? null : res; } if (type == Date.class || type == java.util.Date.class) return rs.getDate(colIdx); if (type == Timestamp.class) return rs.getTimestamp(colIdx); if (type == Time.class) return rs.getTime(colIdx); if (type == boolean.class || type == Boolean.class) { boolean res = rs.getBoolean(colIdx); return rs.wasNull() && type == Boolean.class ? null : res; } if (type == byte.class || type == Byte.class) { byte res = rs.getByte(colIdx); return rs.wasNull() && type == Byte.class ? null : res; } if (type == short.class || type == Short.class) { short res = rs.getShort(colIdx); return rs.wasNull() && type == Short.class ? null : res; } if (type == float.class || type == Float.class) { float res = rs.getFloat(colIdx); return rs.wasNull() && type == Float.class ? null : res; } if (type == BigDecimal.class) return rs.getBigDecimal(colIdx); if (type == UUID.class) { Object res = rs.getObject(colIdx); if (res instanceof UUID) return res; if (res instanceof byte[]) { ByteBuffer bb = ByteBuffer.wrap((byte[])res); long most = bb.getLong(); long least = bb.getLong(); return new UUID(most, least); } if (res instanceof String) return UUID.fromString((String)res); } if (type.isEnum()) { if (NUMERIC_TYPES.contains(rs.getMetaData().getColumnType(colIdx))) { int ordinal = rs.getInt(colIdx); Object[] values = type.getEnumConstants(); return rs.wasNull() || ordinal >= values.length ? null : values[ordinal]; } String str = rs.getString(colIdx); try { return rs.wasNull() ? null : Enum.valueOf((Class<? extends Enum>) type, str.trim()); } catch (IllegalArgumentException ignore) { return null; } } return rs.getObject(colIdx); } }