/* * StreamCruncher: Copyright (c) 2006-2008, Ashwin Jayaprakash. All Rights Reserved. * Contact: ashwin {dot} jayaprakash {at} gmail {dot} com * Web: http://www.StreamCruncher.com * * This file is part of StreamCruncher. * * StreamCruncher is free software: you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * StreamCruncher is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with StreamCruncher. If not, see <http://www.gnu.org/licenses/>. */ package streamcruncher.innards.impl; import java.sql.CallableStatement; import java.sql.Connection; import java.sql.DriverManager; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; import java.sql.Timestamp; import java.util.Calendar; import java.util.Map; import java.util.Properties; import oracle.sql.TIMESTAMP; import streamcruncher.api.DBName; import streamcruncher.innards.core.partition.aggregate.AbstractAggregatedColumnDDLHelper; import streamcruncher.innards.db.DatabaseInterface; import streamcruncher.innards.impl.query.DDLHelper; import streamcruncher.innards.impl.query.OracleDDLHelper; import streamcruncher.innards.impl.query.OracleParser; import streamcruncher.innards.query.Parser; import streamcruncher.innards.util.CallableStatementWrapper; import streamcruncher.innards.util.ConnectionWrapper; import streamcruncher.innards.util.CustomDriver; import streamcruncher.innards.util.PreparedStatementWrapper; import streamcruncher.innards.util.ResultSetWrapper; import streamcruncher.innards.util.StatementWrapper; /* * Author: Ashwin Jayaprakash Date: Jul 22, 2006 Time: 6:52:50 PM */ public class OracleDatabaseInterface extends DatabaseInterface { @Override public void start(Object... params) throws Exception { Properties props = (Properties) params[0]; OracleDriverAdapter adapter = new OracleDriverAdapter(props); DriverManager.registerDriver(adapter); // ----------- super.start(params); } @Override public Class<? extends Parser> getParser() { return OracleParser.class; } @Override public DBName getDBName() { return DBName.Oracle; } @Override public AbstractAggregatedColumnDDLHelper getAggregatedColumnDDLHelper() { return new OracleDDLHelper(); } @Override public DDLHelper getDDLHelper() { return new OracleDDLHelper(); } // ------------ public static class OracleDriverAdapter extends CustomDriver { public OracleDriverAdapter(Properties properties) throws InstantiationException, IllegalAccessException, ClassNotFoundException { super(properties); } @Override protected Connection wrapNewConnection(Connection connection) { OracleConnectionWrapper wrapper = new OracleConnectionWrapper(connection); return wrapper; } } public static class OracleConnectionWrapper extends ConnectionWrapper { public OracleConnectionWrapper(Connection realConnection) { super(realConnection); } @Override public Statement createStatement() throws SQLException { Statement statement = super.createStatement(); OracleStatementWrapper wrapper = new OracleStatementWrapper(this, statement); return wrapper; } @Override public Statement createStatement(int resultSetType, int resultSetConcurrency) throws SQLException { Statement statement = super.createStatement(resultSetType, resultSetConcurrency); OracleStatementWrapper wrapper = new OracleStatementWrapper(this, statement); return wrapper; } @Override public Statement createStatement(int resultSetType, int resultSetConcurrency, int resultSetHoldability) throws SQLException { Statement statement = super.createStatement(resultSetType, resultSetConcurrency, resultSetHoldability); OracleStatementWrapper wrapper = new OracleStatementWrapper(this, statement); return wrapper; } @Override public CallableStatement prepareCall(String sql, int resultSetType, int resultSetConcurrency, int resultSetHoldability) throws SQLException { CallableStatement callableStatement = super.prepareCall(sql, resultSetType, resultSetConcurrency, resultSetHoldability); OracleCallableStatementWrapper wrapper = new OracleCallableStatementWrapper(this, callableStatement); return wrapper; } @Override public CallableStatement prepareCall(String sql, int resultSetType, int resultSetConcurrency) throws SQLException { CallableStatement callableStatement = super.prepareCall(sql, resultSetType, resultSetConcurrency); OracleCallableStatementWrapper wrapper = new OracleCallableStatementWrapper(this, callableStatement); return wrapper; } @Override public CallableStatement prepareCall(String sql) throws SQLException { CallableStatement callableStatement = super.prepareCall(sql); OracleCallableStatementWrapper wrapper = new OracleCallableStatementWrapper(this, callableStatement); return wrapper; } @Override public PreparedStatement prepareStatement(String sql, int resultSetType, int resultSetConcurrency, int resultSetHoldability) throws SQLException { PreparedStatement preparedStatement = super.prepareStatement(sql, resultSetType, resultSetConcurrency, resultSetHoldability); OraclePreparedStatementWrapper wrapper = new OraclePreparedStatementWrapper(this, preparedStatement); return wrapper; } @Override public PreparedStatement prepareStatement(String sql, int resultSetType, int resultSetConcurrency) throws SQLException { PreparedStatement preparedStatement = super.prepareStatement(sql, resultSetType, resultSetConcurrency); OraclePreparedStatementWrapper wrapper = new OraclePreparedStatementWrapper(this, preparedStatement); return wrapper; } @Override public PreparedStatement prepareStatement(String sql, int autoGeneratedKeys) throws SQLException { PreparedStatement preparedStatement = super.prepareStatement(sql, autoGeneratedKeys); OraclePreparedStatementWrapper wrapper = new OraclePreparedStatementWrapper(this, preparedStatement); return wrapper; } @Override public PreparedStatement prepareStatement(String sql, int[] columnIndexes) throws SQLException { PreparedStatement preparedStatement = super.prepareStatement(sql, columnIndexes); OraclePreparedStatementWrapper wrapper = new OraclePreparedStatementWrapper(this, preparedStatement); return wrapper; } @Override public PreparedStatement prepareStatement(String sql, String[] columnNames) throws SQLException { PreparedStatement preparedStatement = super.prepareStatement(sql, columnNames); OraclePreparedStatementWrapper wrapper = new OraclePreparedStatementWrapper(this, preparedStatement); return wrapper; } @Override public PreparedStatement prepareStatement(String sql) throws SQLException { PreparedStatement preparedStatement = super.prepareStatement(sql); OraclePreparedStatementWrapper wrapper = new OraclePreparedStatementWrapper(this, preparedStatement); return wrapper; } } public static class OracleStatementWrapper extends StatementWrapper { public OracleStatementWrapper(Connection wrappedConnection, Statement realStatement) { super(wrappedConnection, realStatement); } @Override public ResultSet executeQuery(String sql) throws SQLException { ResultSet resultSet = super.executeQuery(sql); OracleResultSetWrapper wrapper = new OracleResultSetWrapper(this, resultSet); return wrapper; } @Override public ResultSet getResultSet() throws SQLException { ResultSet resultSet = super.getResultSet(); OracleResultSetWrapper wrapper = new OracleResultSetWrapper(this, resultSet); return wrapper; } } public static class OraclePreparedStatementWrapper extends PreparedStatementWrapper { public OraclePreparedStatementWrapper(Connection wrappedConnection, PreparedStatement realStatement) { super(wrappedConnection, realStatement); } @Override public ResultSet executeQuery() throws SQLException { ResultSet resultSet = super.executeQuery(); OracleResultSetWrapper wrapper = new OracleResultSetWrapper(this, resultSet); return wrapper; } @Override public ResultSet executeQuery(String sql) throws SQLException { ResultSet resultSet = super.executeQuery(sql); OracleResultSetWrapper wrapper = new OracleResultSetWrapper(this, resultSet); return wrapper; } @Override public ResultSet getResultSet() throws SQLException { ResultSet resultSet = super.getResultSet(); OracleResultSetWrapper wrapper = new OracleResultSetWrapper(this, resultSet); return wrapper; } } public static class OracleCallableStatementWrapper extends CallableStatementWrapper { public OracleCallableStatementWrapper(Connection wrappedConnection, CallableStatement realStatement) { super(wrappedConnection, realStatement); } @Override public ResultSet executeQuery() throws SQLException { ResultSet resultSet = super.executeQuery(); OracleResultSetWrapper wrapper = new OracleResultSetWrapper(this, resultSet); return wrapper; } @Override public ResultSet executeQuery(String sql) throws SQLException { ResultSet resultSet = super.executeQuery(sql); OracleResultSetWrapper wrapper = new OracleResultSetWrapper(this, resultSet); return wrapper; } @Override public ResultSet getResultSet() throws SQLException { ResultSet resultSet = super.getResultSet(); OracleResultSetWrapper wrapper = new OracleResultSetWrapper(this, resultSet); return wrapper; } } /** * Oracle Driver has a problem handling ResultSet.getTimestamp(..) * correctly. Such calls are intercepted and handled by the Kernel. */ public static class OracleResultSetWrapper extends ResultSetWrapper { public OracleResultSetWrapper(Statement wrappedStatement, ResultSet realResultSet) throws SQLException { super(wrappedStatement, realResultSet); } protected Object checkAndConvertToTS(Object obj) throws SQLException { Object retVal = obj; // todo Remove this compile-time dependency on Oracle Driver. if (obj != null && obj instanceof TIMESTAMP) { TIMESTAMP ts = (TIMESTAMP) obj; Timestamp timestamp = ts.timestampValue(); retVal = timestamp; } return retVal; } @Override public Object getObject(int arg0, Map<String, Class<?>> arg1) throws SQLException { Object obj = super.getObject(arg0, arg1); obj = checkAndConvertToTS(obj); return obj; } @Override public Object getObject(int parameterIndex) throws SQLException { Object obj = super.getObject(parameterIndex); obj = checkAndConvertToTS(obj); return obj; } @Override public Object getObject(String arg0, Map<String, Class<?>> arg1) throws SQLException { Object obj = super.getObject(arg0, arg1); obj = checkAndConvertToTS(obj); return obj; } @Override public Object getObject(String parameterName) throws SQLException { Object obj = super.getObject(parameterName); obj = checkAndConvertToTS(obj); return obj; } @Override public Timestamp getTimestamp(int parameterIndex, Calendar cal) throws SQLException { Object obj = super.getTimestamp(parameterIndex, cal); Timestamp ts = (Timestamp) checkAndConvertToTS(obj); return ts; } @Override public Timestamp getTimestamp(int parameterIndex) throws SQLException { Object obj = super.getTimestamp(parameterIndex); Timestamp ts = (Timestamp) checkAndConvertToTS(obj); return ts; } @Override public Timestamp getTimestamp(String parameterName, Calendar cal) throws SQLException { Object obj = super.getTimestamp(parameterName, cal); Timestamp ts = (Timestamp) checkAndConvertToTS(obj); return ts; } @Override public Timestamp getTimestamp(String parameterName) throws SQLException { Object obj = super.getTimestamp(parameterName); Timestamp ts = (Timestamp) checkAndConvertToTS(obj); return ts; } } }