/*******************************************************************************
* 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.sqlscripts.scripts;
import java.util.HashMap;
import java.util.List;
import org.apache.commons.lang.StringUtils;
import org.apache.log4j.Logger;
import com.hangum.tadpole.commons.libs.core.define.PublicTadpoleDefine.OBJECT_TYPE;
import com.hangum.tadpole.engine.manager.TadpoleSQLManager;
import com.hangum.tadpole.engine.query.dao.mysql.InformationSchemaDAO;
import com.hangum.tadpole.engine.query.dao.mysql.ProcedureFunctionDAO;
import com.hangum.tadpole.engine.query.dao.mysql.TableDAO;
import com.hangum.tadpole.engine.query.dao.mysql.TriggerDAO;
import com.hangum.tadpole.engine.query.dao.rdb.InOutParameterDAO;
import com.hangum.tadpole.engine.query.dao.rdb.OracleDBLinkDAO;
import com.hangum.tadpole.engine.query.dao.rdb.OracleSequenceDAO;
import com.hangum.tadpole.engine.query.dao.system.UserDBDAO;
import com.ibatis.sqlmap.client.SqlMapClient;
/**
*
* MSSQL V8.0 이하 버전의 DDL Script를 관리합니다.
*
* @author hangum
*
*/
public class MSSQL_8_LE_DDLScript extends AbstractRDBDDLScript {
private static final Logger logger = Logger.getLogger(MSSQL_8_LE_DDLScript.class);
/**
* @param userDB
* @param actionType
*/
public MSSQL_8_LE_DDLScript(UserDBDAO userDB, OBJECT_TYPE actionType) {
super(userDB, actionType);
}
/* (non-Javadoc)
* @see com.hangum.tadpole.rdb.core.editors.objects.table.scripts.RDBDDLScript#getTableScript(com.hangum.tadpole.dao.mysql.TableDAO)
*/
@Override
public String getTableScript(TableDAO tableDAO) throws Exception {
SqlMapClient client = TadpoleSQLManager.getInstance(userDB);
List<HashMap> srcList = client.queryForList("getTableScript", tableDAO.getName());
StringBuilder result = new StringBuilder("");
// result.append("/* DROP TABLE " + tableDAO.getName() + " CASCADE CONSTRAINT; */ \n\n");
result.append("CREATE TABLE " + tableDAO.getName() + "( \n");
for (int i=0; i<srcList.size(); i++){
HashMap<String, Object> source = srcList.get(i);
result.append("\t");
if(i>0)result.append(",");
result.append(source.get("COLUMN_NAME")).append(" ");
result.append(source.get("DATA_TYPE"));
if (source.get("DATA_PRECISION") != null && ((Integer)source.get("DATA_PRECISION")).intValue() > 0 ){
result.append("("+source.get("DATA_PRECISION"));
if (source.get("DATA_SCALE") != null && ((Integer)source.get("DATA_SCALE")).intValue() > 0 ){
result.append(","+source.get("DATA_SCALE"));
}
result.append(")");
}else if (!StringUtils.contains((String)source.get("DATA_TYPE"), "DATE") && !StringUtils.contains((String)source.get("DATA_TYPE"), "NUMBER") && ((Integer)source.get("DATA_LENGTH")).intValue() > 0 ){
result.append("("+source.get("DATA_LENGTH")+")");
}else{
result.append(" ");
}
if (source.get("DATA_DEFAULT") != null ){
if (StringUtils.contains((String)source.get("DATA_TYPE"), "CHAR") ){
result.append(" DEFAULT '"+(String)source.get("DATA_DEFAULT")+"'");
}else{
result.append(" DEFAULT "+(String)source.get("DATA_DEFAULT") );
}
}
if("NO".equals(source.get("NULLABLE"))){
result.append(" NOT NULL ");
}
result.append("\n");
}
// primary key
List<HashMap> srcPkList = client.queryForList("getTableScript.pk", tableDAO.getName());
for (int i=0; i<srcPkList.size(); i++){
HashMap<String, Object> source = srcPkList.get(i);
if(i==0){
result.append("\t,CONSTRAINT ").append(source.get("CONSTRAINT_NAME")).append(" PRIMARY KEY ");
if ("CLUSTERED".equals(source.get("INDEX_TYPE")) ) {
result.append(" CLUSTERED ");
}
result.append(" ( ").append(source.get("COLUMN_NAME"));
if ((Boolean)source.get("DESCENDING")){
result.append(" DESC ");
}
}else{
result.append(", "+source.get("COLUMN_NAME"));
if ((Boolean)source.get("DESCENDING")){
result.append(" DESC ");
}
}
if(i == srcPkList.size()-1){
result.append(") \n");
}
}
result.append("); \n\n");
// table, column comments
List<String> srcCommentList = client.queryForList("getTableScript.comments", tableDAO.getName());
for (int i=0; i<srcCommentList.size(); i++){
result.append( srcCommentList.get(i)+"\n");
}
// foreign key
// column constraint (사용자 정의 컬럼 제약조건)
// partition table define
// storage option
// iot_type table define
// table grant
// table trigger
// table synonyms
return result.toString();
}
/* (non-Javadoc)
* @see com.hangum.tadpole.rdb.core.editors.objects.table.scripts.RDBDDLScript#getViewScript(java.lang.String)
*/
@Override
public String getViewScript(TableDAO tableDao) throws Exception {
SqlMapClient client = TadpoleSQLManager.getInstance(userDB);
StringBuilder result = new StringBuilder("");
// result.append("/* DROP VIEW " + strName + "; */ \n\n");
List<String> srcProcList = client.queryForList("getViewScript", tableDao.getName());
for (int i=0; i<srcProcList.size(); i++){
result.append(srcProcList.get(i));
}
return result.toString();
}
/* (non-Javadoc)
* @see com.hangum.tadpole.rdb.core.editors.objects.table.scripts.RDBDDLScript#getIndexScript(com.hangum.tadpole.dao.mysql.InformationSchemaDAO)
*/
@Override
public String getIndexScript(InformationSchemaDAO indexDAO)
throws Exception {
throw new Exception("Not Support Database");
}
/* (non-Javadoc)
* @see com.hangum.tadpole.rdb.core.editors.objects.table.scripts.RDBDDLScript#getFunctionScript(com.hangum.tadpole.dao.mysql.ProcedureFunctionDAO)
*/
@Override
public String getFunctionScript(ProcedureFunctionDAO functionDAO) throws Exception {
SqlMapClient client = TadpoleSQLManager.getInstance(userDB);
StringBuilder result = new StringBuilder("");
// result.append("/* DROP FUNCTION " + functionDAO.getName() + "; */ \n\n");
List<String> srcProcList = client.queryForList("getFunctionScript", functionDAO.getName());
for (int i=0; i<srcProcList.size(); i++){
result.append(srcProcList.get(i));
}
return result.toString();
}
/* (non-Javadoc)
* @see com.hangum.tadpole.rdb.core.editors.objects.table.scripts.RDBDDLScript#getProcedureScript(com.hangum.tadpole.dao.mysql.ProcedureFunctionDAO)
*/
@Override
public String getProcedureScript(ProcedureFunctionDAO procedureDAO) throws Exception {
try {
SqlMapClient client = TadpoleSQLManager.getInstance(userDB);
StringBuilder result = new StringBuilder("");
// result.append("/* DROP PROCEDURE '" + procedureDAO.getName() + "'; */ \n\n");
List<String> srcProcList = client.queryForList("getProcedureScript", procedureDAO.getName());
for (int i=0; i<srcProcList.size(); i++){
result.append(srcProcList.get(i));
}
return result.toString();
} catch(Exception e) {
logger.error("get procedure script [" + procedureDAO.getName() + "]", e);
throw e;
}
}
@Override
public List<InOutParameterDAO> getProcedureInParamter(ProcedureFunctionDAO procedureDAO) throws Exception {
SqlMapClient client = TadpoleSQLManager.getInstance(userDB);
return client.queryForList("getProcedureInParamter", procedureDAO.getName());
}
@Override
public List<InOutParameterDAO> getProcedureOutParamter(ProcedureFunctionDAO procedureDAO) throws Exception {
SqlMapClient client = TadpoleSQLManager.getInstance(userDB);
return client.queryForList("getProcedureOutParamter", procedureDAO.getName());
}
/* (non-Javadoc)
* @see com.hangum.tadpole.rdb.core.editors.objects.table.scripts.RDBDDLScript#getTriggerScript(com.hangum.tadpole.dao.mysql.TriggerDAO)
*/
@Override
public String getTriggerScript(TriggerDAO triggerDAO) throws Exception {
SqlMapClient client = TadpoleSQLManager.getInstance(userDB);
StringBuilder result = new StringBuilder("");
// result.append("/* DROP PROCEDURE " + triggerDAO.getName() + "; */ \n\n");
List<String> srcProcList = client.queryForList("getTriggerScript", triggerDAO.getName());
for (int i=0; i<srcProcList.size(); i++){
result.append(srcProcList.get(i));
}
return result.toString();
}
@Override
public String getSequenceScript(OracleSequenceDAO sequenceDAO) throws Exception {
// TODO Auto-generated method stub
return "undefined";
}
@Override
public String getDBLinkScript(OracleDBLinkDAO dblinkDAO) throws Exception {
// TODO Auto-generated method stub
return "undefined";
}
}