blob: a4865b80f6c7d21939286f5296a981b4ed48386d [file] [log] [blame]
/**
* 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.netbeans.modules.db.metadata.model.jdbc;
import java.sql.DatabaseMetaData;
import java.sql.Types;
import java.util.EnumSet;
import java.util.logging.Level;
import java.util.logging.Logger;
import org.netbeans.modules.db.metadata.model.api.Index.IndexType;
import org.netbeans.modules.db.metadata.model.api.Nullable;
import org.netbeans.modules.db.metadata.model.api.Ordering;
import org.netbeans.modules.db.metadata.model.api.Parameter.Direction;
import org.netbeans.modules.db.metadata.model.api.SQLType;
/**
*
* @author David
*/
public final class JDBCUtils {
private static final Logger LOGGER = Logger.getLogger(JDBCUtils.class.getName());
private static EnumSet<SQLType> charTypes = EnumSet.of(SQLType.CHAR, SQLType.VARCHAR, SQLType.LONGVARCHAR);
private static EnumSet<SQLType> dateTypes = EnumSet.of(SQLType.DATE, SQLType.TIME, SQLType.TIMESTAMP);
private static EnumSet<SQLType> numericTypes = EnumSet.of(SQLType.TINYINT, SQLType.INTEGER, SQLType.BIGINT, SQLType.SMALLINT,
SQLType.FLOAT, SQLType.DOUBLE, SQLType.REAL, SQLType.NUMERIC, SQLType.DECIMAL);
/**
* Get the SQLType for the given java.sql.Type type.
*
* @param type the java.sql.Type type specifier
* @return SQLType.the SQLType for this java.sql.Type, or null if it's not recognized
*/
public static SQLType getSQLType(int type) {
switch (type) {
case Types.BIT: return SQLType.BIT;
case Types.TINYINT: return SQLType.TINYINT;
case Types.SMALLINT: return SQLType.SMALLINT;
case Types.INTEGER: return SQLType.INTEGER;
case Types.BIGINT: return SQLType.BIGINT;
case Types.FLOAT: return SQLType.FLOAT;
case Types.REAL: return SQLType.REAL;
case Types.DOUBLE: return SQLType.DOUBLE;
case Types.NUMERIC: return SQLType.NUMERIC;
case Types.DECIMAL: return SQLType.DECIMAL;
case Types.CHAR: return SQLType.CHAR;
case Types.VARCHAR: return SQLType.VARCHAR;
case Types.LONGVARCHAR: return SQLType.LONGVARCHAR;
case Types.DATE: return SQLType.DATE;
case Types.TIME: return SQLType.TIME;
case Types.TIMESTAMP: return SQLType.TIMESTAMP;
case Types.BINARY: return SQLType.BINARY;
case Types.VARBINARY: return SQLType.VARBINARY;
case Types.LONGVARBINARY: return SQLType.LONGVARBINARY;
case Types.NULL: return SQLType.NULL;
case Types.OTHER: return SQLType.OTHER;
case Types.JAVA_OBJECT: return SQLType.JAVA_OBJECT;
case Types.DISTINCT: return SQLType.DISTINCT;
case Types.STRUCT: return SQLType.STRUCT;
case Types.ARRAY: return SQLType.ARRAY;
case Types.BLOB: return SQLType.BLOB;
case Types.CLOB: return SQLType.CLOB;
case Types.REF: return SQLType.REF;
case Types.DATALINK: return SQLType.DATALINK;
case Types.BOOLEAN: return SQLType.BOOLEAN;
case Types.LONGNVARCHAR: return SQLType.LONGVARCHAR;
case Types.NCHAR: return SQLType.CHAR;
case Types.NCLOB: return SQLType.CLOB;
case Types.NVARCHAR: return SQLType.VARCHAR;
case Types.SQLXML: return SQLType.SQLXML;
case Types.ROWID: return SQLType.ROWID;
default:
Logger.getLogger(JDBCUtils.class.getName()).log(Level.WARNING, "Unknown JDBC column type: " + type + ". Returns null.");
return null;
}
}
public static boolean isCharType(SQLType type) {
return charTypes.contains(type);
}
public static boolean isDateType(SQLType type) {
return dateTypes.contains(type);
}
public static boolean isNumericType(SQLType type) {
return numericTypes.contains(type);
}
public static Nullable getColumnNullable(int dbmdColumnNullable) {
switch (dbmdColumnNullable) {
case DatabaseMetaData.columnNoNulls:
return Nullable.NOT_NULLABLE;
case DatabaseMetaData.columnNullable:
return Nullable.NULLABLE;
case DatabaseMetaData.columnNullableUnknown:
default:
return Nullable.UNKNOWN;
}
}
public static Nullable getProcedureNullable(int dbmdProcedureNullable) {
switch (dbmdProcedureNullable) {
case DatabaseMetaData.procedureNoNulls:
return Nullable.NOT_NULLABLE;
case DatabaseMetaData.procedureNullable:
return Nullable.NULLABLE;
case DatabaseMetaData.procedureNullableUnknown:
default:
return Nullable.UNKNOWN;
}
}
public static Direction getProcedureDirection(short sqlDirection) {
switch (sqlDirection) {
case DatabaseMetaData.procedureColumnOut:
return Direction.OUT;
case DatabaseMetaData.procedureColumnInOut:
return Direction.INOUT;
case DatabaseMetaData.procedureColumnIn:
return Direction.IN;
default:
LOGGER.log(Level.INFO, "Unknown direction value from DatabaseMetadata.getProcedureColumns(): " + sqlDirection);
return Direction.IN;
}
}
public static Direction getFunctionDirection(short sqlDirection) {
switch (sqlDirection) {
case DatabaseMetaData.functionColumnOut:
return Direction.OUT;
case DatabaseMetaData.functionColumnInOut:
return Direction.INOUT;
case DatabaseMetaData.functionColumnIn:
return Direction.IN;
default:
LOGGER.log(Level.INFO, "Unknown direction value from DatabaseMetadata.getFunctionColumns(): " + sqlDirection);
return Direction.IN;
}
}
public static Ordering getOrdering(String ascOrDesc) {
if (ascOrDesc == null || ascOrDesc.length() == 0) {
return Ordering.NOT_SUPPORTED;
} else if (ascOrDesc.equals("A")) {
return Ordering.ASCENDING;
} else if (ascOrDesc.equals("D")) {
return Ordering.DESCENDING;
} else {
LOGGER.log(Level.INFO, "Unexpected ordering code from database: " + ascOrDesc);
return Ordering.NOT_SUPPORTED;
}
}
static IndexType getIndexType(short sqlIndexType) {
switch (sqlIndexType) {
case DatabaseMetaData.tableIndexHashed:
return IndexType.HASHED;
case DatabaseMetaData.tableIndexClustered:
return IndexType.CLUSTERED;
case DatabaseMetaData.tableIndexOther:
return IndexType.OTHER;
case DatabaseMetaData.tableIndexStatistic:
LOGGER.log(Level.INFO, "Got unexpected index type of tableIndexStatistic, marking as 'other'");
return IndexType.OTHER;
default:
LOGGER.log(Level.INFO, "Unexpected index type code from database metadata: " + sqlIndexType);
return IndexType.OTHER;
}
}
}