package org.fastcatsearch.http.action.management.collections;
import java.io.PrintWriter;
import java.io.Writer;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.Statement;
import org.fastcatsearch.http.ActionAuthority;
import org.fastcatsearch.http.ActionAuthorityLevel;
import org.fastcatsearch.http.ActionMapping;
import org.fastcatsearch.http.action.ActionRequest;
import org.fastcatsearch.http.action.ActionResponse;
import org.fastcatsearch.http.action.AuthAction;
import org.fastcatsearch.ir.IRService;
import org.fastcatsearch.ir.config.JDBCSourceInfo;
import org.fastcatsearch.service.ServiceManager;
import org.fastcatsearch.util.DynamicClassLoader;
@ActionMapping(value = "/management/collections/execute-jdbc-query", authority = ActionAuthority.Collections, authorityLevel = ActionAuthorityLevel.WRITABLE)
public class ExecuteJdbcQueryAction extends AuthAction {
@Override
public void doAuthAction(ActionRequest request, ActionResponse response) throws Exception {
Writer writer = response.getWriter();
try {
String jdbcSourceId = request.getParameter("jdbcSourceId");
String query = request.getParameter("query");
int length = request.getIntParameter("length", 10);
if (length > 100) {
length = 100;
}
IRService irService = ServiceManager.getInstance().getService(IRService.class);
JDBCSourceInfo jdbcSourceInfo = irService.getJDBCSourceInfo(jdbcSourceId);
if (jdbcSourceInfo == null) {
writer.write("[Error] Unknown jdbc id : " + jdbcSourceId);
} else if (query == null || query.trim().length() == 0) {
writer.write("[Error] Query is empty.");
} else {
// 드라이버 로딩.
Class<?> clazz = DynamicClassLoader.loadClass(jdbcSourceInfo.getDriver());
if (clazz == null) {
writer.write("[Error] Cannot find driver : " + jdbcSourceInfo.getDriver());
} else {
Connection connection = DriverManager.getConnection(jdbcSourceInfo.getUrl(), jdbcSourceInfo.getUser(), jdbcSourceInfo.getPassword());
Statement statement = connection.createStatement();
statement.setMaxRows(length);
boolean hasResultSet = statement.execute(query);
if (hasResultSet) {
ResultSet rs = statement.getResultSet();
ResultSetMetaData metaData = rs.getMetaData();
int columnCount = metaData.getColumnCount();
String[] columnLabelList = new String[columnCount];
String[] columnTypeList = new String[columnCount];
for (int i = 0; i < columnCount; i++) {
columnLabelList[i] = metaData.getColumnLabel(i + 1).toUpperCase();
columnTypeList[i] = metaData.getColumnTypeName(i + 1).toLowerCase();
}
while (rs.next()) {
writer.write("-- ");
writer.write(Integer.toString(rs.getRow()));
writer.write(" -----------\n");
for (int i = 0; i < columnCount; i++) {
writer.write(columnLabelList[i]);
writer.write(" [");
writer.write(columnTypeList[i]);
writer.write("] : ");
String value = rs.getString(i + 1);
writer.write(value != null ? value : "[NULL]");
writer.write("\n");
}
writer.write("\n");
}
} else {
int updateCount = statement.getUpdateCount();
writer.write("[INFO] " + updateCount + " rows affected.");
}
}
}
} catch (Exception e) {
writer.write("[ERROR] ");
e.printStackTrace(new PrintWriter(writer));
} finally {
if (writer != null) {
writer.close();
}
}
}
}