/*******************************************************************************
* 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.PreparedStatement;
import java.sql.ResultSet;
import org.apache.log4j.Logger;
import com.hangum.tadpole.engine.manager.TadpoleSQLManager;
import com.hangum.tadpole.engine.query.dao.system.UserDBDAO;
import com.hangum.tadpole.engine.sql.util.resultset.QueryExecuteResultDTO;
import com.hangum.tadpole.preference.define.GetAdminPreference;
/**
* sql query util
*
* @author hangum
*/
public class SQLQueryUtil {
/**
* Logger for this class
*/
private static final Logger logger = Logger.getLogger(SQLQueryUtil.class);
private int DATA_COUNT = 3000;
/** DATA MAX COUNT */
private int MAX_DATA_COUNT = -1;//Integer.parseInt(GetAdminPreference.getQueryResultDownloadLimit());
private UserDBDAO userDB;
private String requestQuery;
/** 처음한번은 반듯이 동작해야 하므로 */
private boolean isFirst = true;
private int startPoint = 0;
private boolean isOneTime = false;
private QueryExecuteResultDTO queryResultDAO = new QueryExecuteResultDTO();
public SQLQueryUtil(UserDBDAO userDB, String requestQuery) {
this(userDB, requestQuery, false, -1);
}
/**
*
* @param userDB
* @param requestQuery
* @param isOneTime
*/
public SQLQueryUtil(UserDBDAO userDB, String requestQuery, boolean isOneTime, int intMaxCount) {
this.userDB = userDB;
this.requestQuery = requestQuery;
this.isFirst = true;
this.startPoint = 0;
this.isOneTime = isOneTime;
this.MAX_DATA_COUNT = intMaxCount;
}
public QueryExecuteResultDTO nextQuery() throws Exception {
return runSQLSelect();
}
/**
* 테이블에 쿼리를 실행합니다.
*/
private QueryExecuteResultDTO runSQLSelect() throws Exception {
queryResultDAO = new QueryExecuteResultDTO();
// 한번에 데이터 가져오기를 실행하면 가져올수 있는데이터만큼 가져온다.
int GET_DATA_COUNT = DATA_COUNT;
if(this.isOneTime) {
if(MAX_DATA_COUNT != -1) {
GET_DATA_COUNT = MAX_DATA_COUNT;
}
}
String thisTimeQuery = PartQueryUtil.makeSelect(userDB, requestQuery, startPoint, GET_DATA_COUNT);
// if(logger.isDebugEnabled()) logger.debug("[query]" + thisTimeQuery);
ResultSet rs = null;
PreparedStatement stmt = null;
java.sql.Connection javaConn = null;
try {
javaConn = TadpoleSQLManager.getConnection(userDB);
stmt = javaConn.prepareStatement(thisTimeQuery);
rs = stmt.executeQuery();//Query( selText );
// table column의 정보
queryResultDAO = new QueryExecuteResultDTO(userDB, thisTimeQuery, false, rs, startPoint, DATA_COUNT);
} finally {
try { if(rs != null) rs.close(); } catch(Exception e) {}
try { if(stmt != null) stmt.close();} catch(Exception e) {}
try { if(javaConn != null) javaConn.close(); } catch(Exception e){}
}
return queryResultDAO;
}
public boolean hasNext() {
if(isFirst) {
isFirst = false;
return true;
} else {
startPoint = startPoint + DATA_COUNT;
if(queryResultDAO.getDataList().getData().isEmpty()) return false;
// -1 이면 전체 데이터를 넘겨 받는다.
if("-1".equals(MAX_DATA_COUNT)) if(this.isOneTime) return false;
}
return true;
}
public String getRequestQuery() {
return requestQuery;
}
public void setRequestQuery(String requestQuery) {
this.requestQuery = requestQuery;
}
public int getStartPoint() {
return startPoint;
}
public void setStartPoint(int startPoint) {
this.startPoint = startPoint;
}
}