package com.alimama.mdrill.jdbc; import java.io.BufferedInputStream; import java.io.InputStream; import java.sql.Connection; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.SQLWarning; import java.util.ArrayList; import java.util.List; import org.apache.commons.httpclient.params.HttpMethodParams; import org.apache.http.HttpResponse; import org.apache.http.NameValuePair; import org.apache.http.client.HttpClient; import org.apache.http.client.entity.UrlEncodedFormEntity; import org.apache.http.client.methods.HttpPost; import org.apache.http.impl.client.DefaultHttpClient; import org.apache.http.message.BasicNameValuePair; import org.apache.http.util.ByteArrayBuffer; public class MdrillStatement implements java.sql.Statement{ private String strurl; private int fetchSize = 50; public MdrillStatement(String strurl) { this.strurl = strurl; } /** * We need to keep a reference to the result set to support the following: * <code> * statement.execute(String sql); * statement.getResultSet(); * </code>. */ private ResultSet resultSet = null; /** * The maximum number of rows this statement should return (0 => all rows). */ private int maxRows = 0; /** * Add SQLWarnings to the warningChain if needed. */ private SQLWarning warningChain = null; /** * Keep state so we can fail certain calls made after close(). */ private boolean isClosed = false; public void addBatch(String sql) throws SQLException { throw new SQLException("Method not supported"); } public void cancel() throws SQLException { throw new SQLException("Method not supported"); } public void clearBatch() throws SQLException { throw new SQLException("Method not supported"); } public void clearWarnings() throws SQLException { warningChain = null; } public void close() throws SQLException { this.strurl = null; resultSet = null; isClosed = true; } public boolean execute(String sql) throws SQLException { String lowercase=sql.toLowerCase(); if(lowercase.indexOf("insert")>=0&&lowercase.indexOf("into")>0 && lowercase.indexOf("values")>0) { InsertParser parser=new InsertParser(); try { parser.parse(sql); HttpClient httpclient = new DefaultHttpClient(); httpclient.getParams().setParameter(HttpMethodParams.SO_TIMEOUT, 60000*30); httpclient.getParams().setParameter(HttpMethodParams.HTTP_CONTENT_CHARSET, "UTF8"); HttpPost httppost = new HttpPost("http://" + this.strurl+ "/higo/insert.jsp"); List<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>(1); nameValuePairs.add(new BasicNameValuePair("project",parser.tablename)); nameValuePairs.add(new BasicNameValuePair("json", parser.jsons)); httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs,"UTF-8")); HttpResponse response = httpclient.execute(httppost); InputStream is = response.getEntity().getContent(); BufferedInputStream bis = new BufferedInputStream(is); ByteArrayBuffer baf = new ByteArrayBuffer(1024); int current = 0; while ((current = bis.read()) != -1) { baf.append((byte) current); } return true; }catch(Throwable e){ throw new SQLException(e); } } ResultSet rs = executeQuery(sql); return rs != null; } public boolean execute(String sql, int autoGeneratedKeys) throws SQLException { throw new SQLException("Method not supported"); } public boolean execute(String sql, int[] columnIndexes) throws SQLException { throw new SQLException("Method not supported"); } public boolean execute(String sql, String[] columnNames) throws SQLException { throw new SQLException("Method not supported"); } public int[] executeBatch() throws SQLException { throw new SQLException("Method not supported"); } public ResultSet executeQuery(String sql) throws SQLException { if (isClosed) { throw new SQLException("Can't execute after statement has been closed"); } SqlParser parse=new SqlParser(); Long total=0l; StringBuffer debug=new StringBuffer(); List<List<Object>> results=new ArrayList<List<Object>>(); MdrillRequest request=new MdrillRequest(parse, this.strurl); try { this.clearWarnings(); resultSet = null; parse.parse(sql); debug.append(parse.toString()); debug.append("\n"); total=request.request(results); if(total<0) { throw new Exception("server exception"); } } catch (Exception ex) { debug.append(request.content); throw new SQLException(ex.toString()+"\n"+debug.toString(), "08S01"); } resultSet = new MdrillQueryResultSet(parse,results,total); resultSet.setFetchSize(fetchSize); return resultSet; } public int executeUpdate(String sql) throws SQLException { throw new SQLException("Method not supported"); } public int executeUpdate(String sql, int autoGeneratedKeys) throws SQLException { throw new SQLException("Method not supported"); } public int executeUpdate(String sql, int[] columnIndexes) throws SQLException { throw new SQLException("Method not supported"); } public int executeUpdate(String sql, String[] columnNames) throws SQLException { throw new SQLException("Method not supported"); } public Connection getConnection() throws SQLException { throw new SQLException("Method not supported"); } public int getFetchDirection() throws SQLException { throw new SQLException("Method not supported"); } public int getFetchSize() throws SQLException { return fetchSize; } public ResultSet getGeneratedKeys() throws SQLException { throw new SQLException("Method not supported"); } public int getMaxFieldSize() throws SQLException { throw new SQLException("Method not supported"); } public int getMaxRows() throws SQLException { return maxRows; } public boolean getMoreResults() throws SQLException { throw new SQLException("Method not supported"); } public boolean getMoreResults(int current) throws SQLException { throw new SQLException("Method not supported"); } public int getQueryTimeout() throws SQLException { throw new SQLException("Method not supported"); } public ResultSet getResultSet() throws SQLException { return resultSet; } public int getResultSetConcurrency() throws SQLException { throw new SQLException("Method not supported"); } public int getResultSetHoldability() throws SQLException { throw new SQLException("Method not supported"); } public int getResultSetType() throws SQLException { throw new SQLException("Method not supported"); } public int getUpdateCount() throws SQLException { return 0; } public SQLWarning getWarnings() throws SQLException { return warningChain; } public boolean isClosed() throws SQLException { return isClosed; } public boolean isPoolable() throws SQLException { throw new SQLException("Method not supported"); } public void setCursorName(String name) throws SQLException { throw new SQLException("Method not supported"); } public void setEscapeProcessing(boolean enable) throws SQLException { throw new SQLException("Method not supported"); } public void setFetchDirection(int direction) throws SQLException { throw new SQLException("Method not supported"); } public void setFetchSize(int rows) throws SQLException { fetchSize = rows; } public void setMaxFieldSize(int max) throws SQLException { throw new SQLException("Method not supported"); } public void setMaxRows(int max) throws SQLException { if (max < 0) { throw new SQLException("max must be >= 0"); } maxRows = max; } public void setPoolable(boolean poolable) throws SQLException { throw new SQLException("Method not supported"); } public void setQueryTimeout(int seconds) throws SQLException { throw new SQLException("Method not supported"); } public boolean isWrapperFor(Class<?> iface) throws SQLException { throw new SQLException("Method not supported"); } public <T> T unwrap(Class<T> iface) throws SQLException { throw new SQLException("Method not supported"); } public void closeOnCompletion() throws SQLException { // TODO Auto-generated method stub } public boolean isCloseOnCompletion() throws SQLException { // TODO Auto-generated method stub return false; } }