/*******************************************************************************
* 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.rdb.erd.core.relation;
import java.sql.Connection;
import java.sql.ResultSet;
import java.util.ArrayList;
import java.util.List;
import org.apache.commons.lang.StringUtils;
import org.apache.log4j.Logger;
import com.hangum.tadpole.engine.manager.TadpoleSQLManager;
import com.hangum.tadpole.engine.query.dao.mysql.ReferencedTableDAO;
import com.hangum.tadpole.engine.query.dao.system.UserDBDAO;
import com.ibatis.sqlmap.client.SqlMapClient;
/**
* cubrid db의 table relation 정보 생성
*
* http://www.cubrid.org/questions/317560 참고.
*
* @author hangum
*
*/
public class CubridTableRelation {
private static final Logger logger = Logger.getLogger(CubridTableRelation.class);
/**
* 테이블 relation 정보 생성
*
* @param userDB
* @return
*/
public static List<ReferencedTableDAO> makeCubridRelation(UserDBDAO userDB, String tableName) throws Exception {
List<ReferencedTableDAO> listRealRefTableDAO = new ArrayList<ReferencedTableDAO>();
Connection conn = null;
ResultSet rs = null;
String[] tableNames = StringUtils.split(tableName, ',');
for (String table : tableNames) {
table = StringUtils.replace(table, "'", "");
try {
conn = TadpoleSQLManager.getConnection(userDB);
rs = conn.getMetaData().getImportedKeys("", "", table);
while (rs.next()) {
ReferencedTableDAO ref = new ReferencedTableDAO();
if(rs.getString("FK_NAME") == null || "".equals(rs.getString("FK_NAME"))) ref.setConstraint_name(rs.getString("FK_NAME"));
else ref.setConstraint_name(rs.getString("fk_name"));
// Table names
if(rs.getString("FKTABLE_NAME") == null || "".equals(rs.getString("FKTABLE_NAME"))) ref.setTable_name(rs.getString("FKTABLE_NAME"));
else ref.setTable_name(rs.getString("fktable_name"));
if(rs.getString("FKCOLUMN_NAME") == null || "".equals(rs.getString("FKCOLUMN_NAME"))) ref.setColumn_name(rs.getString("FKCOLUMN_NAME"));
else ref.setColumn_name(rs.getString("fkcolumn_name"));
if(rs.getString("PKTABLE_NAME") == null || "".equals(rs.getString("PKTABLE_NAME"))) ref.setReferenced_table_name(rs.getString("PKTABLE_NAME"));
else ref.setReferenced_table_name(rs.getString("pktable_name"));
if(rs.getString("PKCOLUMN_NAME") == null || "".equals(rs.getString("PKCOLUMN_NAME"))) ref.setReferenced_column_name(rs.getString("PKCOLUMN_NAME"));
else ref.setReferenced_column_name(rs.getString("pkcolumn_name"));
if(logger.isDebugEnabled()) logger.debug(ref.toString());
listRealRefTableDAO.add(ref);
}
} catch (Exception e) {
logger.error("cubrid relation", e);
throw new Exception("Cubrid relation exception " + e.getMessage());
} finally {
if(rs != null) try { rs.close(); } catch(Exception e) {}
if(conn != null) try { conn.close(); } catch(Exception e) {}
}
} // end last for
return listRealRefTableDAO;
}
/**
* 모든 테이블 relation 정보 생성
*
* @param userDB
* @return
*/
public static List<ReferencedTableDAO> makeCubridRelation(UserDBDAO userDB) throws Exception {
List<ReferencedTableDAO> listRealRefTableDAO = new ArrayList<ReferencedTableDAO>();
// 모든 테이블 목록을 가져옵니다.
try {
SqlMapClient sqlClient = TadpoleSQLManager.getInstance(userDB);
List showTables = sqlClient.queryForList("tableList", StringUtils.isBlank(userDB.getSchema()) ? userDB.getDb() : userDB.getSchema()); //$NON-NLS-1$
String tables = "";
for (Object table : showTables) {
tables += String.format("'%s',", table);
}
if("".equals(tables)) return listRealRefTableDAO;
return makeCubridRelation(userDB, StringUtils.removeEnd(tables, "'"));
} catch(Exception e) {
logger.error("cubrid all table", e);
throw new Exception("Cubrid relation exception " + e.getMessage());
}
}
}