/* * 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.internal.jdbc; import java.sql.SQLException; import java.sql.Time; import java.sql.Timestamp; import java.sql.Types; import java.util.Arrays; import java.util.Collections; import java.util.Date; import java.util.Map; import java.util.UUID; import org.apache.ignite.IgniteCheckedException; import org.apache.ignite.internal.util.typedef.internal.U; import org.apache.ignite.marshaller.Marshaller; import org.apache.ignite.marshaller.jdk.JdkMarshaller; import static java.sql.Types.BIGINT; import static java.sql.Types.BINARY; import static java.sql.Types.BOOLEAN; import static java.sql.Types.DATE; import static java.sql.Types.DOUBLE; import static java.sql.Types.FLOAT; import static java.sql.Types.INTEGER; import static java.sql.Types.OTHER; import static java.sql.Types.SMALLINT; import static java.sql.Types.TIME; import static java.sql.Types.TIMESTAMP; import static java.sql.Types.TINYINT; import static java.sql.Types.VARCHAR; /** * Utility methods for JDBC driver. * * @deprecated Using Ignite client node based JDBC driver is preferable. * See documentation of {@link org.apache.ignite.IgniteJdbcDriver} for details. */ @Deprecated class JdbcUtils { /** Marshaller. */ private static final Marshaller MARSHALLER = new JdkMarshaller(); /** * Marshals task argument to byte array. * * @param args Task argument. * @return Byte array. * @throws SQLException In marshalling failed. */ public static byte[] marshalArgument(Map<String, Object> args) throws SQLException { assert args != null; try { return U.marshal(MARSHALLER, args); } catch (IgniteCheckedException e) { throw new SQLException("Failed to unmarshal result.", e); } } /** * Unmarshals exception from byte array. * * @param bytes Byte array. * @return Exception. * @throws SQLException If unmarshalling failed. */ public static SQLException unmarshalError(byte[] bytes) throws SQLException { return unmarshal(bytes); } /** * Unmarshals object from byte array. * * @param bytes Byte array. * @return Object. * @throws SQLException If unmarshalling failed. */ public static <T> T unmarshal(byte[] bytes) throws SQLException { assert bytes != null; try { return U.unmarshal(MARSHALLER, bytes, null); } catch (IgniteCheckedException e) { throw new SQLException("Failed to unmarshal result.", e); } } /** * Creates task argument for first execution. * * @param nodeId Node ID. * @param cacheName Cache name. * @param sql SQL query. * @param timeout Query timeout. * @param args Query arguments. * @param pageSize Page size. * @param maxRows Maximum number of rows. * @return Task argument. */ public static Map<String, Object> taskArgument(UUID nodeId, String cacheName, String sql, long timeout, Object[] args, int pageSize, int maxRows) { assert sql != null; assert timeout >= 0; assert pageSize > 0; assert maxRows >= 0; Map<String, Object> map = U.newHashMap(7); map.put("confNodeId", nodeId); map.put("cache", cacheName); map.put("sql", sql); map.put("timeout", timeout); map.put("args", args != null ? Arrays.asList(args) : Collections.emptyList()); map.put("pageSize", pageSize); map.put("maxRows", maxRows); return map; } /** * Creates task argument. * * @param nodeId Node ID. * @param futId Future ID. * @param pageSize Page size. * @param maxRows Maximum number of rows. * @return Task argument. */ public static Map<String, Object> taskArgument(UUID nodeId, UUID futId, int pageSize, int maxRows) { assert nodeId != null; assert futId != null; assert pageSize > 0; assert maxRows >= 0; Map<String, Object> map = U.newHashMap(4); map.put("nodeId", nodeId); map.put("futId", futId); map.put("pageSize", pageSize); map.put("maxRows", maxRows); return map; } /** * Converts Java class name to type from {@link Types}. * * @param cls Java class name. * @return Type from {@link Types}. */ @SuppressWarnings("IfMayBeConditional") public static int type(String cls) { if (Boolean.class.getName().equals(cls) || boolean.class.getName().equals(cls)) return BOOLEAN; else if (Byte.class.getName().equals(cls) || byte.class.getName().equals(cls)) return TINYINT; else if (Short.class.getName().equals(cls) || short.class.getName().equals(cls)) return SMALLINT; else if (Integer.class.getName().equals(cls) || int.class.getName().equals(cls)) return INTEGER; else if (Long.class.getName().equals(cls) || long.class.getName().equals(cls)) return BIGINT; else if (Float.class.getName().equals(cls) || float.class.getName().equals(cls)) return FLOAT; else if (Double.class.getName().equals(cls) || double.class.getName().equals(cls)) return DOUBLE; else if (String.class.getName().equals(cls)) return VARCHAR; else if (byte[].class.getName().equals(cls)) return BINARY; else if (Time.class.getName().equals(cls)) return TIME; else if (Timestamp.class.getName().equals(cls)) return TIMESTAMP; else if (Date.class.getName().equals(cls)) return DATE; else return OTHER; } /** * Converts Java class name to SQL type name. * * @param cls Java class name. * @return SQL type name. */ @SuppressWarnings("IfMayBeConditional") public static String typeName(String cls) { if (Boolean.class.getName().equals(cls) || boolean.class.getName().equals(cls)) return "BOOLEAN"; else if (Byte.class.getName().equals(cls) || byte.class.getName().equals(cls)) return "TINYINT"; else if (Short.class.getName().equals(cls) || short.class.getName().equals(cls)) return "SMALLINT"; else if (Integer.class.getName().equals(cls) || int.class.getName().equals(cls)) return "INTEGER"; else if (Long.class.getName().equals(cls) || long.class.getName().equals(cls)) return "BIGINT"; else if (Float.class.getName().equals(cls) || float.class.getName().equals(cls)) return "FLOAT"; else if (Double.class.getName().equals(cls) || double.class.getName().equals(cls)) return "DOUBLE"; else if (String.class.getName().equals(cls)) return "VARCHAR"; else if (byte[].class.getName().equals(cls)) return "BINARY"; else if (Time.class.getName().equals(cls)) return "TIME"; else if (Timestamp.class.getName().equals(cls)) return "TIMESTAMP"; else if (Date.class.getName().equals(cls)) return "DATE"; else return "OTHER"; } /** * Determines whether type is nullable. * * @param name Column name. * @param cls Java class name. * @return {@code True} if nullable. */ public static boolean nullable(String name, String cls) { return !"_KEY".equalsIgnoreCase(name) && !"_VAL".equalsIgnoreCase(name) && !(boolean.class.getName().equals(cls) || byte.class.getName().equals(cls) || short.class.getName().equals(cls) || int.class.getName().equals(cls) || long.class.getName().equals(cls) || float.class.getName().equals(cls) || double.class.getName().equals(cls)); } }