package com.redspr.redquerybuilder.sample;
import java.io.IOException;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.json.JSONArray;
import org.json.JSONObject;
public class SearchServlet extends HttpServlet {
@Override
public void init() throws ServletException {
super.init();
try {
Class.forName("org.h2.Driver");
Connection conn = DriverManager.getConnection("jdbc:h2:mem:db1",
"sa", "");
conn.createStatement().execute(
"RUNSCRIPT FROM 'classpath:/world.sql'");
} catch (Exception ex) {
ex.printStackTrace();
}
}
@Override
protected void service(HttpServletRequest req, HttpServletResponse res)
throws ServletException, IOException {
try {
String sql = req.getParameter("sql");
String[] args = req.getParameterValues("arg");
final int page = Integer.parseInt(req.getParameter("page")) - 1;
final int rp = Integer.parseInt(req.getParameter("rp"));
final int r0 = page * rp;
final int r1 = r0 + rp;
// TODO 01 read only and really limited
Class.forName("org.h2.Driver");
Connection conn = DriverManager.getConnection(
"jdbc:h2:mem:db1;DB_CLOSE_DELAY=-1;ACCESS_MODE_DATA=r",
"sa", "");
PreparedStatement st = conn.prepareStatement(sql);
if (args != null) {
for (int i = 0; i < args.length; i++) {
st.setString(i + 1, args[i]);
}
}
ResultSet rs = st.executeQuery();
ResultSetMetaData rsmd = rs.getMetaData();
int numColumns = rsmd.getColumnCount();
JSONObject root = new JSONObject();
JSONArray rows = new JSONArray();
// JSONObject data = new JSONObject();
// if ("install".equals(type)) {
// }
// }
// if ("meta".equals(type)) {
// JSONArray metas = new JSONArray();
// root.put("meta", metas);
// //root.put("data", data);
// //{display: 'ISO', name : 'foo', width : 40, sortable : true,
// align: 'center'}
// for (int i = 1; i <= numColumns; i++) {
// JSONObject meta = new JSONObject();
// metas.put(meta);
// meta.put("display", rsmd.getColumnLabel(i));
// meta.put("name", rsmd.getColumnName(i));
// meta.put("width", 8 * rsmd.getColumnDisplaySize(i));
// meta.put("sortable", true);
// meta.put("align", "left");
// }
// } else {
root.put("rows", rows);
root.put("page", 1);
// TODO 00 what if arg is null? At the moment blows up
// TODO 00 number field start with String
int count = -1;
while (rs.next()) {
count++;
if (count < r0 || count >= r1) {
continue;
}
JSONObject cell = new JSONObject();
rows.put(cell);
JSONArray obj = new JSONArray();
cell.put("cell", obj);
for (int i = 1; i < numColumns + 1; i++) {
// TODO 01 nulls!
switch (rsmd.getColumnType(i)) {
case java.sql.Types.BIGINT:
obj.put(rs.getInt(i));
break;
case java.sql.Types.BOOLEAN:
obj.put(rs.getBoolean(i));
break;
case java.sql.Types.DOUBLE:
obj.put(rs.getDouble(i));
break;
case java.sql.Types.FLOAT:
obj.put(rs.getFloat(i));
break;
case java.sql.Types.INTEGER:
case java.sql.Types.SMALLINT:
case java.sql.Types.TINYINT:
obj.put(rs.getInt(i));
break;
// case java.sql.Types.NVARCHAR :
// obj.put(col, rs.getNString(i));
// break;
case java.sql.Types.VARCHAR:
obj.put(rs.getString(i));
break;
case java.sql.Types.DATE:
obj.put(rs.getDate(i));
break;
case java.sql.Types.TIMESTAMP:
obj.put(rs.getTimestamp(i));
break;
default:
obj.put(rs.getString(i));
}
}
}
root.put("page", page + 1);
root.put("total", count + 1);
res.setContentType("application/json");
root.write(res.getWriter());
} catch (Exception ex) {
throw new RuntimeException(ex);
}
}
}