From 7c8d8d071e896fd317872642de16c197c6bfae30 Mon Sep 17 00:00:00 2001 From: Brett Wooldridge Date: Thu, 7 Nov 2013 16:19:48 +0900 Subject: [PATCH] Make sure to wrap/inject all ResultSets and set the parent _statement otherwise we get an NPE in _checkException() which needs to bubble-up to the Statement level. --- .../hikari/proxy/CallableStatementProxy.java | 17 ------- .../hikari/proxy/PreparedStatementProxy.java | 22 +++++--- .../zaxxer/hikari/proxy/ResultSetProxy.java | 3 +- .../zaxxer/hikari/proxy/StatementProxy.java | 50 +++++++++++++++---- 4 files changed, 58 insertions(+), 34 deletions(-) diff --git a/src/main/java/com/zaxxer/hikari/proxy/CallableStatementProxy.java b/src/main/java/com/zaxxer/hikari/proxy/CallableStatementProxy.java index f851eb7a..9cd50236 100644 --- a/src/main/java/com/zaxxer/hikari/proxy/CallableStatementProxy.java +++ b/src/main/java/com/zaxxer/hikari/proxy/CallableStatementProxy.java @@ -17,9 +17,6 @@ package com.zaxxer.hikari.proxy; import java.sql.CallableStatement; -import java.sql.SQLException; - -import com.zaxxer.hikari.javassist.HikariOverride; /** * @@ -36,20 +33,6 @@ public abstract class CallableStatementProxy extends PreparedStatementProxy impl // Overridden java.sql.CallableStatement Methods // ********************************************************************** - @HikariOverride - public void close() throws SQLException - { - _connection._unregisterStatement(this); - try - { - __close(); - } - catch (SQLException e) - { - throw _checkException(e); - } - } - // *********************************************************************** // These methods contain code we do not want injected into the actual // java.sql.Connection implementation class. These methods are only diff --git a/src/main/java/com/zaxxer/hikari/proxy/PreparedStatementProxy.java b/src/main/java/com/zaxxer/hikari/proxy/PreparedStatementProxy.java index acf56257..cbc37aee 100644 --- a/src/main/java/com/zaxxer/hikari/proxy/PreparedStatementProxy.java +++ b/src/main/java/com/zaxxer/hikari/proxy/PreparedStatementProxy.java @@ -20,6 +20,8 @@ import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; +import com.zaxxer.hikari.javassist.HikariOverride; + /** * * @author Brett Wooldridge @@ -35,19 +37,18 @@ public abstract class PreparedStatementProxy extends StatementProxy implements I // Overridden java.sql.PreparedStatement Methods // ********************************************************************** + @HikariOverride public ResultSet executeQuery() throws SQLException { try { - ResultSet rs = ((PreparedStatement) delegate).executeQuery(); - if (rs == null) + ResultSet rs = __executeQuery(); + if (rs != null) { - return null; + ((IHikariResultSetProxy) rs)._setProxyStatement(this); } - IHikariResultSetProxy resultSet = (IHikariResultSetProxy) PROXY_FACTORY.getProxyResultSet(this, rs); - resultSet._setProxyStatement(this); - return (ResultSet) resultSet; + return rs; } catch (SQLException e) { @@ -62,4 +63,13 @@ public abstract class PreparedStatementProxy extends StatementProxy implements I // delegating proxies are used. // *********************************************************************** + public ResultSet __executeQuery() throws SQLException + { + ResultSet resultSet = ((PreparedStatement) delegate).executeQuery(); + if (resultSet != null) + { + resultSet = PROXY_FACTORY.getProxyResultSet(this, resultSet); + } + return resultSet; + } } diff --git a/src/main/java/com/zaxxer/hikari/proxy/ResultSetProxy.java b/src/main/java/com/zaxxer/hikari/proxy/ResultSetProxy.java index 6ee1f4c0..05a1643a 100644 --- a/src/main/java/com/zaxxer/hikari/proxy/ResultSetProxy.java +++ b/src/main/java/com/zaxxer/hikari/proxy/ResultSetProxy.java @@ -42,7 +42,8 @@ public abstract class ResultSetProxy implements IHikariResultSetProxy, ResultSet { return _statement._checkException(e); } - + + @HikariInject public void _setProxyStatement(IHikariStatementProxy statement) { this._statement = statement; diff --git a/src/main/java/com/zaxxer/hikari/proxy/StatementProxy.java b/src/main/java/com/zaxxer/hikari/proxy/StatementProxy.java index eae5ea06..fc832543 100644 --- a/src/main/java/com/zaxxer/hikari/proxy/StatementProxy.java +++ b/src/main/java/com/zaxxer/hikari/proxy/StatementProxy.java @@ -35,7 +35,7 @@ public abstract class StatementProxy implements IHikariStatementProxy, Statement @HikariInject protected boolean _isClosed; - protected Statement delegate; + protected final Statement delegate; static { @@ -89,14 +89,14 @@ public abstract class StatementProxy implements IHikariStatementProxy, Statement } } + @HikariOverride public ResultSet executeQuery(String sql) throws SQLException { try { - ResultSet rs = delegate.executeQuery(sql); - if (rs == null) + ResultSet rs = __executeQuery(sql); + if (rs != null) { - rs = PROXY_FACTORY.getProxyResultSet(this, rs); ((IHikariResultSetProxy) rs)._setProxyStatement(this); } @@ -108,14 +108,14 @@ public abstract class StatementProxy implements IHikariStatementProxy, Statement } } + @HikariOverride public ResultSet getResultSet() throws SQLException { try { - ResultSet rs = delegate.getResultSet(); + ResultSet rs = __getResultSet(); if (rs != null) { - rs = PROXY_FACTORY.getProxyResultSet(this, rs); ((IHikariResultSetProxy) rs)._setProxyStatement(this); } @@ -127,14 +127,14 @@ public abstract class StatementProxy implements IHikariStatementProxy, Statement } } + @HikariOverride public ResultSet getGeneratedKeys() throws SQLException { try { - ResultSet rs = delegate.getGeneratedKeys(); - if (rs == null) + ResultSet rs = __getGeneratedKeys(); + if (rs != null) { - rs = PROXY_FACTORY.getProxyResultSet(this, rs); ((IHikariResultSetProxy) rs)._setProxyStatement(this); } @@ -158,7 +158,7 @@ public abstract class StatementProxy implements IHikariStatementProxy, Statement // delegating proxies are used. // *********************************************************************** - protected static void __static() + private static void __static() { if (PROXY_FACTORY == null) { @@ -175,4 +175,34 @@ public abstract class StatementProxy implements IHikariStatementProxy, Statement delegate.close(); } + + public ResultSet __executeQuery(String sql) throws SQLException + { + ResultSet resultSet = delegate.executeQuery(sql); + if (resultSet != null) + { + resultSet = PROXY_FACTORY.getProxyResultSet(this, resultSet); + } + return resultSet; + } + + public ResultSet __getGeneratedKeys() throws SQLException + { + ResultSet generatedKeys = delegate.getGeneratedKeys(); + if (generatedKeys != null) + { + generatedKeys = PROXY_FACTORY.getProxyResultSet(this, generatedKeys); + } + return generatedKeys; + } + + public ResultSet __getResultSet() throws SQLException + { + ResultSet resultSet = delegate.getResultSet(); + if (resultSet != null) + { + resultSet = PROXY_FACTORY.getProxyResultSet(this, resultSet); + } + return resultSet; + } } \ No newline at end of file