/*
* codjo.net
*
* Common Apache License 2.0
*/
package net.codjo.dataprocess.server.kernel;
import net.codjo.dataprocess.common.DataProcessConstants;
import net.codjo.dataprocess.common.Log;
import net.codjo.dataprocess.common.context.DataProcessContext;
import net.codjo.dataprocess.common.exception.TreatmentException;
import net.codjo.dataprocess.common.model.ExecutionListModel;
import net.codjo.dataprocess.common.model.TreatmentModel;
import net.codjo.dataprocess.common.util.CommonUtils;
import net.codjo.dataprocess.server.dao.UtilDao;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
/**
*
*/
class SqlTreatmentWithResult extends AbstractSqlTreatment {
private static final String DEFAULT_SEPARATOR = ", ";
private static final String DEFAULT_QUOTE = "\"";
public Object proceedTreatment(DataProcessContext context, Object... param)
throws TreatmentException, SQLException {
return proceedSqlQueryTypeWithResult();
}
private String proceedSqlQueryTypeWithResult() throws TreatmentException, SQLException {
String target = getTreatmentModel().getTarget();
if (target.trim().length() == 0) {
return "";
}
Boolean bColumn = null;
String separator = getArgument(DataProcessConstants.SEPARATOR);
String quote = getArgument(DataProcessConstants.QUOTE);
String column = getArgument(DataProcessConstants.COLUMN);
if (column != null) {
if ("1".equals(column) || "true".equalsIgnoreCase(column)) {
column = "true";
}
else {
column = "false";
}
bColumn = Boolean.valueOf(column);
}
PreparedStatement pStmt = getConnection().prepareStatement(target);
try {
configureStatement(pStmt);
ResultSet rs = pStmt.executeQuery();
try {
String result = CommonUtils.resultSetToStringFormat(rs,
separator == null ?
DEFAULT_SEPARATOR :
separator,
quote == null ? DEFAULT_QUOTE : quote,
bColumn == null ? false : bColumn);
try {
UtilDao utilDao = new UtilDao();
utilDao.dropTables(getConnection(), getTemporaryTables(target));
}
catch (SQLException ex) {
Log.error(getClass(), ex);
}
return result;
}
finally {
rs.close();
}
}
finally {
pStmt.close();
}
}
List<String> getTemporaryTables(String query) {
int idx = 0;
List<String> tempTables = new ArrayList<String>();
while (idx < query.length()) {
if (query.charAt(idx) == '\'') {
idx++;
while (idx < query.length() && query.charAt(idx) != '\'') {
idx++;
}
}
if (query.charAt(idx) == '#') {
StringBuilder tableTemp = new StringBuilder();
while (idx < query.length()
&& query.charAt(idx) != ' '
&& query.charAt(idx) != '.'
&& query.charAt(idx) != ','
&& query.charAt(idx) != ')') {
tableTemp.append(query.charAt(idx));
idx++;
}
if (!tempTables.contains(tableTemp.toString())) {
tempTables.add(tableTemp.toString());
}
}
idx++;
}
return tempTables;
}
public static SqlTreatmentWithResult create(Connection con,
TreatmentModel treatmentModel,
int repositoryId,
ExecutionListModel executionListModel) {
SqlTreatmentWithResult treatment = new SqlTreatmentWithResult();
treatment.setConnection(con);
treatment.setTreatmentModel(treatmentModel);
treatment.setExecutionListModel(executionListModel);
treatment.setRepositoryId(repositoryId);
treatment.buildArgument();
return treatment;
}
}