/*******************************************************************************
* 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.define;
import java.util.ArrayList;
import java.util.List;
import org.apache.commons.lang.StringUtils;
import org.apache.log4j.Logger;
import com.hangum.tadpole.commons.util.ApplicationArgumentUtils;
import com.hangum.tadpole.engine.query.dao.system.UserDBDAO;
/**
* TadpoleDBHub에서 지원하는 디비를 정의한다.
*
* @author hangum
*
*/
public enum DBDefine {
/** Tadpole System DB */
TADPOLE_SYSTEM_DEFAULT,
TADPOLE_SYSTEM_MYSQL_DEFAULT,
/** USER DB */
ORACLE_DEFAULT,
TIBERO_DEFAULT,
MSSQL_DEFAULT,
MSSQL_8_LE_DEFAULT,
MYSQL_DEFAULT,
MARIADB_DEFAULT,
SQLite_DEFAULT,
CUBRID_DEFAULT,
AMAZON_REDSHIFT_DEFAULT,
POSTGRE_DEFAULT,
AGENSGRAPH_DEFAULT,
ALTIBASE_DEFAULT,
/** hive */
HIVE_DEFAULT,
HIVE2_DEFAULT,
/** tajo */
TAJO_DEFAULT,
/** NO SQL */
MONGODB_DEFAULT
// ,
/** Aamazon RDS */
// AMAZONRDS_DEFAULT
;
private static final Logger logger = Logger.getLogger(DBDefine.class);
/** 환경정보가 있는 상대 위치 */
private final static String prefix = "com/hangum/tadpole/engine/config/";
private final static String prefix_system = "com/hangum/tadpole/engine/config/internal/system/";
/**
* db 환경이 있는 정보를 리턴한다.
*
* @return
*/
public String getLocation() {
switch ( this ) {
case TADPOLE_SYSTEM_DEFAULT: return prefix_system + "TadpoleSystem-SQLite-Config.xml";
case TADPOLE_SYSTEM_MYSQL_DEFAULT: return prefix_system + "TadpoleSystem-MYSQL-Config.xml";
case ORACLE_DEFAULT: return prefix + "OracleConfig.xml";
case TIBERO_DEFAULT: return prefix + "TiberoConfig.xml";
case MSSQL_DEFAULT: return prefix + "MSSQLConfig.xml";
case MSSQL_8_LE_DEFAULT: return prefix + "MSSQLConfig_8_LE.xml";
case MYSQL_DEFAULT: return prefix + "MySQLConfig.xml";
case MARIADB_DEFAULT: return prefix + "MariaDBConfig.xml";
case SQLite_DEFAULT: return prefix + "SQLiteConfig.xml";
case CUBRID_DEFAULT: return prefix + "CUBRIDConfig.xml";
case POSTGRE_DEFAULT: return prefix + "POSTGREConfig.xml";
case AGENSGRAPH_DEFAULT: return prefix + "AgensGraphConfig.xml";
case HIVE_DEFAULT: return prefix + "HIVEConfig.xml";
case HIVE2_DEFAULT: return prefix + "HIVE2Config.xml";
case TAJO_DEFAULT: return prefix + "TAJOConfig.xml";
case ALTIBASE_DEFAULT: return prefix + "AltibaseConfig.xml";
case AMAZON_REDSHIFT_DEFAULT: return prefix + "AmazonRedshiftConfig.xml";
default:
return "Doesn't define database configuration";
}
}
/**
* DB TYPE을 얻는다.
* @param type
* @return
* @deprecated can use {@DBDefine#getDBDefine()}
*/
public static DBDefine getDBDefine(String type) {
if(type.equalsIgnoreCase("TadpoleSystem")) return TADPOLE_SYSTEM_DEFAULT;
if(type.equalsIgnoreCase("TadpoleSystem_MYSQL")) return TADPOLE_SYSTEM_MYSQL_DEFAULT;
else if(type.equalsIgnoreCase("Oracle")) return ORACLE_DEFAULT;
else if(type.equalsIgnoreCase("Tibero")) return TIBERO_DEFAULT;
else if(type.equalsIgnoreCase("MSSQL")) return MSSQL_DEFAULT;
else if(type.equalsIgnoreCase("MSSQL_8_LE")) return MSSQL_8_LE_DEFAULT;
else if(type.equalsIgnoreCase("MySQL")) return MYSQL_DEFAULT;
else if(type.equalsIgnoreCase("MariaDB")) return MARIADB_DEFAULT;
else if(type.equalsIgnoreCase("SQLite")) return SQLite_DEFAULT;
else if(type.equalsIgnoreCase("Cubrid")) return CUBRID_DEFAULT;
else if(type.equalsIgnoreCase("PostgreSQL")) return POSTGRE_DEFAULT;
else if(type.equalsIgnoreCase("AgensGraph")) return DBDefine.AGENSGRAPH_DEFAULT;
else if(type.equalsIgnoreCase("MongoDB")) return MONGODB_DEFAULT;
// else if(type.equalsIgnoreCase("AmazonRDS")) return AMAZONRDS_DEFAULT;
else if(type.equalsIgnoreCase("Apache Hive")) return HIVE_DEFAULT;
else if(type.equalsIgnoreCase("Apache Hive2")) return HIVE2_DEFAULT;
else if(type.equalsIgnoreCase("Apache Tajo")) return TAJO_DEFAULT;
else if(type.equalsIgnoreCase("Altibase")) return ALTIBASE_DEFAULT;
else if(type.equalsIgnoreCase("RedShift")) return AMAZON_REDSHIFT_DEFAULT;
else return null;
}
/**
* DB Typed을 얻습니다.
* @param userDB
* @return
*/
public static DBDefine getDBDefine(UserDBDAO userDB) {
return getDBDefine(userDB.getDbms_type());
}
/**
* Define default class
* @return
*/
public String getDriverClass() {
switch ( this ) {
case ORACLE_DEFAULT: return "oracle.jdbc.driver.OracleDriver";
case TIBERO_DEFAULT: return "com.tmax.tibero.jdbc.TbDriver";
case MSSQL_DEFAULT:
case MSSQL_8_LE_DEFAULT: return "net.sourceforge.jtds.jdbc.Driver";
case MYSQL_DEFAULT: return "com.mysql.jdbc.Driver";
case MARIADB_DEFAULT: return "org.mariadb.jdbc.Driver";
case SQLite_DEFAULT: return "org.sqlite.JDBC";
case CUBRID_DEFAULT: return "cubrid.jdbc.driver.CUBRIDDriver";
case POSTGRE_DEFAULT: return "org.postgresql.Driver";
case AGENSGRAPH_DEFAULT: return "net.bitnine.agensgraph.Driver";
case HIVE_DEFAULT: return "org.apache.hadoop.hive.jdbc.HiveDriver";
case HIVE2_DEFAULT: return "org.apache.hive.jdbc.HiveDriver";
case TAJO_DEFAULT: return "org.apache.tajo.jdbc.TajoDriver";
case ALTIBASE_DEFAULT: return "com.amazon.redshift.jdbc.Driver";
case AMAZON_REDSHIFT_DEFAULT : return "";
default:
return "undefine class";
}
}
/**
* DB URL INFO를 얻는다.
*
* @param type
* @return
*/
public String getDB_URL_INFO() {
switch ( this ) {
case TADPOLE_SYSTEM_DEFAULT: return "jdbc:sqlite:/%s";
case TADPOLE_SYSTEM_MYSQL_DEFAULT: return "jdbc:mysql://%s:%s/%s";
case ORACLE_DEFAULT: return "jdbc:oracle:thin:@%s:%s:%s";
case TIBERO_DEFAULT: return "jdbc:tibero:thin:@%s:%s:%s";
case MSSQL_DEFAULT:
case MSSQL_8_LE_DEFAULT: return "jdbc:jtds:sqlserver://%s:%s/%s";
case MYSQL_DEFAULT: return "jdbc:mysql://%s:%s/%s";
case MARIADB_DEFAULT: return "jdbc:mariadb://%s:%s/%s";
case SQLite_DEFAULT: return "jdbc:sqlite:/%s";
case CUBRID_DEFAULT: return "jdbc:cubrid:%s:%s:%s:::";
/*
* postgresql이 ssl 을 지원할 경우 는 ?ssl=true&sslfactory=org.postgresql.ssl.NonValidatingFactory 를 써줘야합니다.
*/
case POSTGRE_DEFAULT: return "jdbc:postgresql://%s:%s/%s";
case AGENSGRAPH_DEFAULT: return "jdbc:agensgraph://%s:%s/%s";
/* http://api.mongodb.org/java/1.2/com/mongodb/DBAddress.html
*
* mongodb://[dbuser:dbpassword@]host:port/dbname
*/
case MONGODB_DEFAULT: return "mongodb://%s:%s";//@%s:%s:%s";
case HIVE_DEFAULT: return "jdbc:hive://%s:%s/%s";
case HIVE2_DEFAULT: return "jdbc:hive2://%s:%s/%s";
case TAJO_DEFAULT: return "jdbc:tajo://%s:%s/%s";
/* Altibase JDBC connection string: jdbc:Altibase://ipaddr.port/dbname */
case ALTIBASE_DEFAULT: return "jdbc:Altibase://%s:%s/%s";
case AMAZON_REDSHIFT_DEFAULT : return "jdbc:redshift://%s:%s/%s";
default:
return "undefine db";
}
}
public String getDBToString() {
switch ( this ) {
case TADPOLE_SYSTEM_DEFAULT: return "TadpoleSystem";
case TADPOLE_SYSTEM_MYSQL_DEFAULT: return "TadpoleSystem_MYSQL";
case ORACLE_DEFAULT: return "Oracle";
case TIBERO_DEFAULT: return "Tibero";
case MSSQL_DEFAULT: return "MSSQL";
case MSSQL_8_LE_DEFAULT: return "MSSQL_8_LE";
case MYSQL_DEFAULT: return "MySQL";
case MARIADB_DEFAULT: return "MariaDB";
case SQLite_DEFAULT: return "SQLite";
case CUBRID_DEFAULT: return "Cubrid";
case POSTGRE_DEFAULT: return "PostgreSQL";
case AGENSGRAPH_DEFAULT: return "AgensGraph";
case MONGODB_DEFAULT : return "MongoDB";
// case AMAZONRDS_DEFAULT: return "AmazonRDS";
case HIVE_DEFAULT: return "Apache Hive";
case HIVE2_DEFAULT: return "Apache Hive2";
case TAJO_DEFAULT: return "Apache Tajo";
case ALTIBASE_DEFAULT: return "Altibase";
case AMAZON_REDSHIFT_DEFAULT : return "RedShift";
default:
return "undefine db";
}
}
/**
* 디비의 기본 validate 쿼리를 정의합니다.
* @return
*/
public String getValidateQuery(boolean isTransaction) {
String strConnection = "TadpoleHub_None";
if(isTransaction) strConnection = "TadpoleHub_Tran";
if(this == DBDefine.MYSQL_DEFAULT || this == DBDefine.MARIADB_DEFAULT) {
return String.format("SELECT '%s'", strConnection);
} else if(this == DBDefine.ORACLE_DEFAULT || this == DBDefine.TIBERO_DEFAULT) {
return String.format("SELECT '%s' FROM dual", strConnection);
} else if(this == DBDefine.MSSQL_DEFAULT || this == DBDefine.MSSQL_8_LE_DEFAULT) {
return String.format("SELECT '%s'", strConnection);
} else if(this == DBDefine.SQLite_DEFAULT) {
return "SELECT name FROM sqlite_master where 1 = 0";
} else if(this == DBDefine.HIVE_DEFAULT || this == DBDefine.HIVE2_DEFAULT) {
return "show databases";
} else if(this == DBDefine.POSTGRE_DEFAULT || this == DBDefine.AGENSGRAPH_DEFAULT || this == DBDefine.AMAZON_REDSHIFT_DEFAULT) {
return String.format("SELECT '%s'", strConnection);
} else if(this == DBDefine.CUBRID_DEFAULT) {
return String.format("select '%s' from db_root", strConnection);
} else if(this == DBDefine.TAJO_DEFAULT) {
return "\\d";
} else if(this == DBDefine.ALTIBASE_DEFAULT) {
return String.format("SELECT '%s'", strConnection);
} else {
return "SELECT 1";
}
}
/**
* 에디터에서 사용할 확장자를 만듭니다.
* @return
*/
public String getExt() {
String extension = ""; //$NON-NLS-1$
if(this == MYSQL_DEFAULT) {
extension += "mysql"; //$NON-NLS-1$
} else if(this == MARIADB_DEFAULT) {
extension += "mariadb"; //$NON-NLS-1$
} else if(this == ORACLE_DEFAULT) {
extension += "oracle"; //$NON-NLS-1$
} else if(this == MSSQL_DEFAULT || this == MSSQL_8_LE_DEFAULT) {
extension += "mssql"; //$NON-NLS-1$
} else if(this == SQLite_DEFAULT) {
extension += "sqlite"; //$NON-NLS-1$
} else if(this == HIVE_DEFAULT || this == HIVE2_DEFAULT) {
extension += "hql"; //$NON-NLS-1$
} else if(this == POSTGRE_DEFAULT) {
extension += "pgsql"; //$NON-NLS-1$
} else if(this == AGENSGRAPH_DEFAULT) {
extension += "agens"; //$NON-NLS-1$
} else if(this == CUBRID_DEFAULT) {
extension += "cubrid"; //$NON-NLS-1$
} else if(this == TAJO_DEFAULT) {
extension += "tajo"; //$NON-NLS-1$
} else if(this == ALTIBASE_DEFAULT) {
extension += "altibase";
} else if(this == TIBERO_DEFAULT) {
extension += "tibero";
} else if(this == MONGODB_DEFAULT) {
extension += "mongo";
} else if(this == AMAZON_REDSHIFT_DEFAULT) {
extension += "RedShift";
} else {
extension += "sql"; //$NON-NLS-1$
}
return extension;
}
/**
* define System variable query
* @return
*/
public String[] getSystemVariableQuery() {
switch ( this ) {
case ORACLE_DEFAULT: return DBVariableDefine.ORACLE_VARIABLES;
case TIBERO_DEFAULT: return DBVariableDefine.ORACLE_VARIABLES;
case MSSQL_DEFAULT: return DBVariableDefine.MSSQL_VARIABLES;
case MSSQL_8_LE_DEFAULT: return DBVariableDefine.MSSQL_VARIABLES;
case MYSQL_DEFAULT: return DBVariableDefine.MYSQL_VARIABLES;
case MARIADB_DEFAULT: return DBVariableDefine.MARIA_VARIABLES;
case SQLite_DEFAULT: return DBVariableDefine.SQLITE_VARIABLES;
case CUBRID_DEFAULT: return DBVariableDefine.CUBRID_VARIABLES;
case POSTGRE_DEFAULT:
case AGENSGRAPH_DEFAULT:
case AMAZON_REDSHIFT_DEFAULT:
return DBVariableDefine.PGSQL_VARIABLES;
case MONGODB_DEFAULT : return DBVariableDefine.MONGO_VARIABLE;
case HIVE_DEFAULT: return DBVariableDefine.HIVE_VARIABLE;
case HIVE2_DEFAULT: return DBVariableDefine.HIVE2_VARIABLE;
case TAJO_DEFAULT: return DBVariableDefine.TAJO_VARIABLE;
case ALTIBASE_DEFAULT: return DBVariableDefine.ALTIBASE_VARIABLE;
default:
return new String[]{};
}
}
/**
* 사용자 디비를 리턴한다.
* @return
*/
public static List<DBDefine> userDBValues() {
List<DBDefine> listSupportDb = new ArrayList<DBDefine>();
if(ApplicationArgumentUtils.isUseDB()) {
try {
String strUserDB = ApplicationArgumentUtils.getUseDB();
if("all".equalsIgnoreCase(strUserDB)) listSupportDb = allUserUseDB();
else {
String[] arryUseDBTypes = StringUtils.split(strUserDB, ",");
for (String strDBTyps : arryUseDBTypes) {
DBDefine tmpDBDefine = getDBDefine(strDBTyps);
if(tmpDBDefine != null) {
listSupportDb.add(tmpDBDefine);
} else {
logger.error("*** Error : Not support DB. " + strDBTyps);
}
}
}
} catch (Exception e) {
logger.error("System initialize exception", e);
System.exit(0);
}
} else {
listSupportDb = allUserUseDB();
}
return listSupportDb;
}
/**
* get driver list
*
* @return
*/
public static List<DBDefine> getDriver() {
List<DBDefine> listSupportDb = userDBValues();
// listSupportDb.remove(AMAZONRDS_DEFAULT);
listSupportDb.remove(TAJO_DEFAULT);
listSupportDb.remove(HIVE_DEFAULT);
return listSupportDb;
}
/**
* 사용자가 사용할 수 있는 모든 디비.
* @return
*/
private static List<DBDefine> allUserUseDB() {
List<DBDefine> supportDb = new ArrayList<DBDefine>();
supportDb.add(ALTIBASE_DEFAULT);
supportDb.add(HIVE_DEFAULT);
// supportDb.add(AMAZONRDS_DEFAULT);
supportDb.add(TAJO_DEFAULT);
supportDb.add(CUBRID_DEFAULT);
supportDb.add(MONGODB_DEFAULT);
supportDb.add(MARIADB_DEFAULT);
supportDb.add(MYSQL_DEFAULT);
supportDb.add(MSSQL_DEFAULT);
supportDb.add(ORACLE_DEFAULT);
supportDb.add(TIBERO_DEFAULT);
// supportDb.add(AGENSGRAPH_DEFAULT);
supportDb.add(POSTGRE_DEFAULT);
supportDb.add(SQLite_DEFAULT);
supportDb.add(AMAZON_REDSHIFT_DEFAULT);
return supportDb;
}
}