/*******************************************************************************
* Copyright (c) 2017 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.query.surface;
import java.sql.Connection;
import java.sql.DatabaseMetaData;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import org.apache.log4j.Logger;
import com.hangum.tadpole.commons.libs.core.define.PublicTadpoleDefine.SQL_STATEMENT_TYPE;
import com.hangum.tadpole.engine.query.dao.mysql.TableColumnDAO;
import com.hangum.tadpole.engine.query.dao.mysql.TableDAO;
import com.hangum.tadpole.engine.query.dao.system.UserDBDAO;
import com.hangum.tadpole.engine.sql.util.PartQueryUtil;
import com.hangum.tadpole.engine.sql.util.resultset.QueryExecuteResultDTO;
/**
* JDBC 메타데이터를 이용하여 스키마, 테이블, 컬럼 정보를 요청합니다,
*
* @author hangum
*
*/
public abstract class BasicDBInfo implements ConnectionInterfact {
private static final Logger logger = Logger.getLogger(BasicDBInfo.class);
public abstract Connection getInstance(final UserDBDAO userDB) throws Exception;
/**
* @param javaConn
* @param userDB
* @return
* @throws Exception
*/
public static String getKeyworkd(final Connection javaConn, final UserDBDAO userDB) throws Exception {
String strKeyWord = "";
try {
strKeyWord = javaConn.getMetaData().getSQLKeywords();
} finally {
try { if(javaConn != null) javaConn.close(); } catch(Exception e){}
}
return strKeyWord;
}
/**
* not select
*
* @param javaConn
* @param userDB
* @param sqlQuery
* @return
*/
public void executeUpdate(final Connection javaConn, UserDBDAO userDB, String sqlQuery) throws Exception {
Statement statement = null;
try {
statement = javaConn.createStatement();
statement.executeUpdate(sqlQuery);
} finally {
try { if(statement != null) statement.close(); } catch(Exception e) {}
try { if(javaConn != null) javaConn.close(); } catch(Exception e){}
}
}
/**
* execute query plan
*
* @param javaConn
* @param objects
* @param sql_STATEMENT_TYPE
* @param statementParameter
*
* @return
* @throws Exception
*/
public QueryExecuteResultDTO executeQueryPlan(final Connection javaConn, UserDBDAO userDB, String strQuery, SQL_STATEMENT_TYPE sql_STATEMENT_TYPE, Object[] statementParameter) throws Exception {
return select(javaConn, userDB, PartQueryUtil.makeExplainQuery(userDB, strQuery), statementParameter, 1000);
}
/**
* execute update
*
* @param javaConn
* @param userDB
* @param string
* @param name
* @throws Exception
*/
public void executeUpdate(final Connection javaConn, UserDBDAO userDB, String string, String name) throws Exception {
Statement statement = null;
try {
String quoteString = javaConn.getMetaData().getIdentifierQuoteString();
statement = javaConn.createStatement();
statement.executeUpdate(String.format(string, quoteString + name + quoteString));
} finally {
try { if(statement != null) statement.close(); } catch(Exception e) {}
try { if(javaConn != null) javaConn.close(); } catch(Exception e){}
}
}
/**
* 연결 테스트 합니다.
*
* @param userDB
*/
public void connectionCheck(final Connection javaConn, UserDBDAO userDB) throws Exception {
Connection conn = null;
ResultSet rs = null;
try {
DatabaseMetaData dbmd = conn.getMetaData();
rs = dbmd.getTables(null, null, null, null);
} catch(Exception e) {
logger.error("connection check", e);
throw e;
} finally {
try { if(rs != null) rs.close(); } catch(Exception e) {}
try { if(conn != null) conn.close(); } catch(Exception e) {}
}
}
/**
* table 정보를 리턴합니다.
*
* @param userDB
* @throws Exception
*/
public List<TableDAO> tableList(final Connection javaConn, UserDBDAO userDB) throws Exception {
List<TableDAO> showTables = new ArrayList<TableDAO>();
Connection conn = null;
ResultSet rs = null;
try {
DatabaseMetaData dbmd = conn.getMetaData();
rs = dbmd.getTables(userDB.getDb(), null, null, null);
while(rs.next()) {
String strTBName = rs.getString("TABLE_NAME");
String strComment = rs.getString("REMARKS");
// logger.debug( rs.getString("TABLE_CAT") );
// logger.debug( rs.getString("TABLE_SCHEM") );
// logger.debug( rs.getString("TABLE_NAME") );
// logger.debug( rs.getString("TABLE_TYPE") );
// logger.debug( rs.getString("REMARKS") );
TableDAO tdao = new TableDAO(strTBName, strComment);
showTables.add(tdao);
}
} catch(Exception e) {
logger.error("table list", e);
throw e;
} finally {
try { if(rs != null) rs.close(); } catch(Exception e) {}
try { if(conn != null) conn.close(); } catch(Exception e) {}
}
return showTables;
}
/**
* table의 컬컴 정보를 리턴합니다.
*
* @param javaConn
* @param userDB
* @param tbName
* @throws Exception
*/
public List<TableColumnDAO> tableColumnList(final Connection javaConn, UserDBDAO userDB, Map<String, String> mapParam) throws Exception {
List<TableColumnDAO> showTableColumns = new ArrayList<TableColumnDAO>();
ResultSet rs = null;
try {
DatabaseMetaData dbmd = javaConn.getMetaData();
rs = dbmd.getColumns(userDB.getDb(), null, mapParam.get("table"), null);
while(rs.next()) {
TableColumnDAO tcDAO = new TableColumnDAO();
tcDAO.setName(rs.getString("COLUMN_NAME"));
tcDAO.setType(rs.getString("TYPE_NAME"));
tcDAO.setComment(rs.getString("REMARKS"));
showTableColumns.add(tcDAO);
}
} catch(Exception e) {
logger.error(mapParam.get("table") + " table column", e);
throw e;
} finally {
try { if(rs != null) rs.close(); } catch(Exception e) {}
try { if(javaConn != null) javaConn.close(); } catch(Exception e) {}
}
return showTableColumns;
}
/**
* select
*
* @param javaConn
* @param userDB
* @param requestQuery
* @param statementParameter
* @param limitCount
*
* @throws Exception
*/
public QueryExecuteResultDTO select(final Connection javaConn, UserDBDAO userDB, String requestQuery, Object[] statementParameter, int limitCount) throws Exception {
if(logger.isDebugEnabled()) logger.debug("\t * Query is [ " + requestQuery );
PreparedStatement pstmt = null;
ResultSet rs = null;
try {
pstmt = javaConn.prepareStatement(requestQuery);
if(statementParameter != null) {
for (int i=1; i<=statementParameter.length; i++) {
pstmt.setObject(i, statementParameter[i-1]);
}
}
rs = pstmt.executeQuery();
return new QueryExecuteResultDTO(userDB, requestQuery, true, rs, limitCount);
} catch(Exception e) {
logger.error("Tajo select", e);
throw e;
} finally {
try { if(pstmt != null) pstmt.close(); } catch(Exception e) {}
try { if(rs != null) rs.close(); } catch(Exception e) {}
try { if(javaConn != null) javaConn.close(); } catch(Exception e){}
}
}
}