/*******************************************************************************
* Copyright (c) 2013 hangum.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the GNU Lesser Public License v2.1
* which accompanies this distribution, and is available at
* http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
*
* Contributors:
* hangum - initial API and implementation
******************************************************************************/
package com.hangum.tadpole.engine.sql.util;
import java.sql.Types;
import java.util.HashMap;
import java.util.Map;
import org.apache.commons.lang.StringUtils;
import org.apache.log4j.Logger;
import com.hangum.tadpole.engine.define.DBDefine;
import com.hangum.tadpole.engine.define.DBGroupDefine;
import com.hangum.tadpole.engine.query.dao.system.UserDBDAO;
/**
* RDB type to Java type mapping utils
*
* @author hangum
*
*/
public class RDBTypeToJavaTypeUtils {
private static final Logger logger = Logger.getLogger(RDBTypeToJavaTypeUtils.class);
private static Map<String, Integer> mapTypes = new HashMap<String, Integer>();
private static String[] oracleParams = new String[] {"VARCHAR2","CHAR","NUMBER","DECIMAL","DATE","TIME","DATETIME","INTEGER","LONG","FLOAT","DOUBLE"};
private static String[] mssqlParams = new String[] {"VARCHAR","CHAR","NUMERIC","DATE","INT","LONG","FLOAT","DOUBLE"};
private static String[] etcParams = new String[] {"VARCHAR","CHAR","DATE","INT","LONG"};
static {
mapTypes.put("BIT", java.sql.Types.BIT);
mapTypes.put("TINYINT", java.sql.Types.TINYINT);
mapTypes.put("SMALLINT", java.sql.Types.SMALLINT);
mapTypes.put("MEDIUMINT", java.sql.Types.INTEGER);
mapTypes.put("INT", java.sql.Types.INTEGER);
mapTypes.put("INTEGER", java.sql.Types.INTEGER);
mapTypes.put("INT24", java.sql.Types.INTEGER);
mapTypes.put("BIGINT", java.sql.Types.BIGINT);
mapTypes.put("REAL", java.sql.Types.DOUBLE);
mapTypes.put("FLOAT", java.sql.Types.FLOAT);
mapTypes.put("DECIMAL", java.sql.Types.DECIMAL);
mapTypes.put("NUMERIC", java.sql.Types.DECIMAL);
mapTypes.put("DOUBLE", java.sql.Types.DOUBLE);
mapTypes.put("CHAR", java.sql.Types.CHAR);
mapTypes.put("VARCHAR", java.sql.Types.VARCHAR);
mapTypes.put("VARCHAR2", java.sql.Types.VARCHAR);
mapTypes.put("DATE", java.sql.Types.DATE);
mapTypes.put("TIME", java.sql.Types.TIME);
mapTypes.put("YEAR", java.sql.Types.DATE);
mapTypes.put("TIMESTAMP", java.sql.Types.TIMESTAMP);
mapTypes.put("DATETIME", java.sql.Types.TIMESTAMP);
mapTypes.put("TINYBLOB", java.sql.Types.BINARY);
mapTypes.put("BLOB", java.sql.Types.BLOB);//LONGVARBINARY);
mapTypes.put("MEDIUMBLOB", java.sql.Types.LONGVARBINARY);
mapTypes.put("LONGBLOB", java.sql.Types.LONGVARBINARY);
mapTypes.put("TINYTEXT", java.sql.Types.VARCHAR);
mapTypes.put("TEXT", java.sql.Types.LONGVARCHAR);
mapTypes.put("MEDIUMTEXT", java.sql.Types.LONGVARCHAR);
mapTypes.put("LONGTEXT", java.sql.Types.LONGVARCHAR);
mapTypes.put("GEOMETRY", java.sql.Types.BINARY);
mapTypes.put("BINARY", java.sql.Types.BINARY);
mapTypes.put("VARBINARY", java.sql.Types.VARBINARY);
mapTypes.put("NUMBER", java.sql.Types.DECIMAL);
mapTypes.put("SYS_REFCURSOR", -10);// OracleTypes.CURSOR);
// pgsql JSON type
mapTypes.put("JSON", 1111);
}
/**
* rdb type to java
*
* @param rdbType
* @return
*/
public static Integer getJavaType(String rdbType) {
// if(logger.isDebugEnabled()) logger.debug("rdb type is " + rdbType);
Integer javaType = mapTypes.get(rdbType);
if (javaType == null) {
// logger.info("SQL type to Java type not found is" + rdbType);
return java.sql.Types.VARCHAR;
}
return javaType;
}
/**
* java type to rdb
*
* @param rdbType
* @return
*/
public static String getRDBType(int javaType) {
for (String key :mapTypes.keySet()){
// logger.debug("==> "+ key +":" + mapTypes.get(key) + ":" + javaType);
if (mapTypes.get(key).equals(javaType)) {
return key;
}
}
return "";
}
/**
* 숫자 컬럼인지
*
* @param sqlType
* @return
*/
public static boolean isNumberType(int sqlType) {
switch (sqlType) {
case Types.BIGINT:
case Types.DECIMAL:
case Types.DOUBLE:
case Types.FLOAT:
case Types.INTEGER:
case Types.NUMERIC:
case Types.BIT:
case Types.SMALLINT:
case Types.TINYINT:
return true;
}
return false;
}
public static boolean isNumberType(String rdbType) {
if(rdbType == null) return false;
// 데이터 타입하고 데이터 사이즈가 함께 있을경우.. decimal(8)
if(StringUtils.contains(rdbType, "(")){
rdbType = StringUtils.substringBefore(rdbType, "(");
}
Integer intType = mapTypes.get(rdbType.toUpperCase());
if(intType == null) return false;
return isNumberType(intType);
}
/**
* 문자 컬럼인지
*
* @param sqlType
* @return
*/
public static boolean isCharType(int sqlType) {
switch (sqlType) {
case Types.CHAR:
case Types.VARCHAR:
return true;
}
return false;
}
public static boolean isCharType(String rdbType) {
return isCharType(mapTypes.get(rdbType));
}
/**
* 데이터베이스 종류에 따라 파라미터 입력대화창을 지원하는 데이터 타입을 리턴한다.
* @param userDB
* @return
*/
public static String[] supportParameterTypes(UserDBDAO userDB) {
if (DBDefine.ORACLE_DEFAULT == userDB.getDBDefine()) {
return oracleParams;
}else if (DBGroupDefine.MYSQL_GROUP == userDB.getDBGroup()) {
return mssqlParams;
}else {
return etcParams;
}
}
public static int getIndex(UserDBDAO userDB, String rdbType) {
int index = -1;
for(String key : supportParameterTypes(userDB)){
index++;
if(key.equals(rdbType)) return index;
}
return 0;
}
}