From 39ac64c32ede4d1a7e015922fa8552f784726044 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=AB=98=E9=93=81?= Date: Sun, 14 Jul 2019 13:21:15 +0800 Subject: [PATCH] support JDBC 4.1 --- .../java/com/alibaba/druid/filter/Filter.java | 4 ++ .../alibaba/druid/filter/FilterAdapter.java | 10 ++++ .../com/alibaba/druid/filter/FilterChain.java | 4 ++ .../alibaba/druid/filter/FilterChainImpl.java | 52 ++++++++++++++++ .../encoding/EncodingConvertFilter.java | 60 +++++++++++++------ .../alibaba/druid/filter/stat/StatFilter.java | 30 ++++++++++ .../druid/proxy/jdbc/ResultSetProxyImpl.java | 5 +- .../com/alibaba/druid/wall/WallFilter.java | 5 ++ 8 files changed, 151 insertions(+), 19 deletions(-) diff --git a/src/main/java/com/alibaba/druid/filter/Filter.java b/src/main/java/com/alibaba/druid/filter/Filter.java index 87dd7b5c6b..6e38a8af0a 100644 --- a/src/main/java/com/alibaba/druid/filter/Filter.java +++ b/src/main/java/com/alibaba/druid/filter/Filter.java @@ -290,8 +290,12 @@ public interface Filter extends Wrapper { Object resultSet_getObject(FilterChain chain, ResultSetProxy resultSet, int columnIndex) throws SQLException; + T resultSet_getObject(FilterChain chain, ResultSetProxy resultSet, int columnIndex, Class type) throws SQLException; + Object resultSet_getObject(FilterChain chain, ResultSetProxy resultSet, String columnLabel) throws SQLException; + T resultSet_getObject(FilterChain chain, ResultSetProxy resultSet, String columnLabel, Class type) throws SQLException; + int resultSet_findColumn(FilterChain chain, ResultSetProxy resultSet, String columnLabel) throws SQLException; java.io.Reader resultSet_getCharacterStream(FilterChain chain, ResultSetProxy resultSet, int columnIndex) diff --git a/src/main/java/com/alibaba/druid/filter/FilterAdapter.java b/src/main/java/com/alibaba/druid/filter/FilterAdapter.java index 32f8207ad3..40d238895d 100644 --- a/src/main/java/com/alibaba/druid/filter/FilterAdapter.java +++ b/src/main/java/com/alibaba/druid/filter/FilterAdapter.java @@ -1698,6 +1698,11 @@ public abstract class FilterAdapter extends NotificationBroadcasterSupport imple return chain.resultSet_getObject(result, columnIndex); } + @Override + public T resultSet_getObject(FilterChain chain, ResultSetProxy result, int columnIndex, Class type) throws SQLException { + return chain.resultSet_getObject(result, columnIndex, type); + } + @Override public Object resultSet_getObject(FilterChain chain, ResultSetProxy result, int columnIndex, java.util.Map> map) throws SQLException { @@ -1709,6 +1714,11 @@ public abstract class FilterAdapter extends NotificationBroadcasterSupport imple return chain.resultSet_getObject(result, columnLabel); } + @Override + public T resultSet_getObject(FilterChain chain, ResultSetProxy result, String columnLabel, Class type) throws SQLException { + return chain.resultSet_getObject(result, columnLabel, type); + } + @Override public Object resultSet_getObject(FilterChain chain, ResultSetProxy result, String columnLabel, java.util.Map> map) throws SQLException { diff --git a/src/main/java/com/alibaba/druid/filter/FilterChain.java b/src/main/java/com/alibaba/druid/filter/FilterChain.java index 9b63e082d7..c2d0cfee1a 100644 --- a/src/main/java/com/alibaba/druid/filter/FilterChain.java +++ b/src/main/java/com/alibaba/druid/filter/FilterChain.java @@ -266,8 +266,12 @@ public interface FilterChain { Object resultSet_getObject(ResultSetProxy resultSet, int columnIndex) throws SQLException; + T resultSet_getObject(ResultSetProxy resultSet, int columnIndex, Class type) throws SQLException; + Object resultSet_getObject(ResultSetProxy resultSet, String columnLabel) throws SQLException; + T resultSet_getObject(ResultSetProxy resultSet, String columnLabel, Class type) throws SQLException; + int resultSet_findColumn(ResultSetProxy resultSet, String columnLabel) throws SQLException; java.io.Reader resultSet_getCharacterStream(ResultSetProxy resultSet, int columnIndex) throws SQLException; diff --git a/src/main/java/com/alibaba/druid/filter/FilterChainImpl.java b/src/main/java/com/alibaba/druid/filter/FilterChainImpl.java index 36d2b9f3bc..fa7fc67e2e 100644 --- a/src/main/java/com/alibaba/druid/filter/FilterChainImpl.java +++ b/src/main/java/com/alibaba/druid/filter/FilterChainImpl.java @@ -1368,6 +1368,32 @@ public class FilterChainImpl implements FilterChain { return obj; } + @Override + public T resultSet_getObject(ResultSetProxy rs, int columnIndex, Class type) throws SQLException { + if (this.pos < filterSize) { + return nextFilter() + .resultSet_getObject(this, rs, columnIndex, type); + } + + Object obj = rs.getResultSetRaw().getObject(columnIndex, type); + + if (obj instanceof ResultSet) { + StatementProxy statement = rs.getStatementProxy(); + return (T) new ResultSetProxyImpl(statement + , (ResultSet) obj + , dataSource.createResultSetId() + , statement.getLastExecuteSql() + ); + } + + if (obj instanceof Clob) { + return (T) wrap( + rs.getStatementProxy(), (Clob) obj); + } + + return (T) obj; + } + @Override public Object resultSet_getObject(ResultSetProxy rs, String columnLabel) throws SQLException { if (this.pos < filterSize) { @@ -1394,6 +1420,32 @@ public class FilterChainImpl implements FilterChain { return obj; } + @Override + public T resultSet_getObject(ResultSetProxy rs, String columnLabel, Class type) throws SQLException { + if (this.pos < filterSize) { + return nextFilter() + .resultSet_getObject(this, rs, columnLabel, type); + } + + T obj = rs.getResultSetRaw() + .getObject(columnLabel, type); + + if (obj instanceof ResultSet) { + StatementProxy stmt = rs.getStatementProxy(); + return (T) new ResultSetProxyImpl(stmt + , (ResultSet) obj + , dataSource.createResultSetId() + , stmt.getLastExecuteSql() + ); + } + + if (obj instanceof Clob) { + return (T) wrap(rs.getStatementProxy(), (Clob) obj); + } + + return obj; + } + @Override public int resultSet_findColumn(ResultSetProxy rs, String columnLabel) throws SQLException { if (this.pos < filterSize) { diff --git a/src/main/java/com/alibaba/druid/filter/encoding/EncodingConvertFilter.java b/src/main/java/com/alibaba/druid/filter/encoding/EncodingConvertFilter.java index e9aa365991..e7eb617086 100644 --- a/src/main/java/com/alibaba/druid/filter/encoding/EncodingConvertFilter.java +++ b/src/main/java/com/alibaba/druid/filter/encoding/EncodingConvertFilter.java @@ -85,14 +85,8 @@ public class EncodingConvertFilter extends FilterAdapter { Object value = null; switch (columnType) { case Types.CHAR: - value = super.resultSet_getString(chain, result, columnIndex); - break; case Types.CLOB: - value = super.resultSet_getString(chain, result, columnIndex); - break; case Types.LONGVARCHAR: - value = super.resultSet_getString(chain, result, columnIndex); - break; case Types.VARCHAR: value = super.resultSet_getString(chain, result, columnIndex); break; @@ -103,6 +97,27 @@ public class EncodingConvertFilter extends FilterAdapter { return decodeObject(result.getStatementProxy().getConnectionProxy(), value); } + @Override + public T resultSet_getObject(FilterChain chain, ResultSetProxy result, int columnIndex, Class type) throws SQLException { + ResultSet rawResultSet = result.getResultSetRaw(); + ResultSetMetaData metadata = rawResultSet.getMetaData(); + int columnType = metadata.getColumnType(columnIndex); + + Object value = null; + switch (columnType) { + case Types.CHAR: + case Types.CLOB: + case Types.LONGVARCHAR: + case Types.VARCHAR: + value = super.resultSet_getString(chain, result, columnIndex); + break; + default: + value = super.resultSet_getObject(chain, result, columnIndex, type); + } + + return (T) decodeObject(result.getStatementProxy().getConnectionProxy(), value); + } + @Override public Object resultSet_getObject(FilterChain chain, ResultSetProxy result, int columnIndex, java.util.Map> map) throws SQLException { @@ -113,14 +128,8 @@ public class EncodingConvertFilter extends FilterAdapter { Object value = null; switch (columnType) { case Types.CHAR: - value = super.resultSet_getString(chain, result, columnIndex); - break; case Types.CLOB: - value = super.resultSet_getString(chain, result, columnIndex); - break; case Types.LONGVARCHAR: - value = super.resultSet_getString(chain, result, columnIndex); - break; case Types.VARCHAR: value = super.resultSet_getString(chain, result, columnIndex); break; @@ -141,14 +150,8 @@ public class EncodingConvertFilter extends FilterAdapter { Object value = null; switch (columnType) { case Types.CHAR: - value = super.resultSet_getString(chain, result, columnLabel); - break; case Types.CLOB: - value = super.resultSet_getString(chain, result, columnLabel); - break; case Types.LONGVARCHAR: - value = super.resultSet_getString(chain, result, columnLabel); - break; case Types.VARCHAR: value = super.resultSet_getString(chain, result, columnLabel); break; @@ -158,6 +161,27 @@ public class EncodingConvertFilter extends FilterAdapter { return decodeObject(result.getStatementProxy().getConnectionProxy(), value); } + @Override + public T resultSet_getObject(FilterChain chain, ResultSetProxy result, String columnLabel, Class type) throws SQLException { + ResultSet rawResultSet = result.getResultSetRaw(); + ResultSetMetaData metadata = rawResultSet.getMetaData(); + int columnIndex = rawResultSet.findColumn(columnLabel); + int columnType = metadata.getColumnType(columnIndex); + + Object value = null; + switch (columnType) { + case Types.CHAR: + case Types.CLOB: + case Types.LONGVARCHAR: + case Types.VARCHAR: + value = super.resultSet_getString(chain, result, columnLabel); + break; + default: + value = super.resultSet_getObject(chain, result, columnLabel, type); + } + return (T) decodeObject(result.getStatementProxy().getConnectionProxy(), value); + } + @Override public Object resultSet_getObject(FilterChain chain, ResultSetProxy result, String columnLabel, java.util.Map> map) throws SQLException { diff --git a/src/main/java/com/alibaba/druid/filter/stat/StatFilter.java b/src/main/java/com/alibaba/druid/filter/stat/StatFilter.java index 6557432ca3..bf0690cb50 100644 --- a/src/main/java/com/alibaba/druid/filter/stat/StatFilter.java +++ b/src/main/java/com/alibaba/druid/filter/stat/StatFilter.java @@ -795,6 +795,21 @@ public class StatFilter extends FilterEventAdapter implements StatFilterMBean { return obj; } + @Override + public T resultSet_getObject(FilterChain chain, ResultSetProxy result, int columnIndex, Class type) throws SQLException { + T obj = chain.resultSet_getObject(result, columnIndex, type); + + if (obj instanceof Clob) { + clobOpenAfter(chain.getDataSource().getDataSourceStat(), result, (ClobProxy) obj); + } else if (obj instanceof Blob) { + blobOpenAfter(chain.getDataSource().getDataSourceStat(), result, (Blob) obj); + } else if (obj instanceof String) { + result.addReadStringLength(((String) obj).length()); + } + + return obj; + } + @Override public Object resultSet_getObject(FilterChain chain, ResultSetProxy result, int columnIndex, java.util.Map> map) throws SQLException { @@ -826,6 +841,21 @@ public class StatFilter extends FilterEventAdapter implements StatFilterMBean { return obj; } + @Override + public T resultSet_getObject(FilterChain chain, ResultSetProxy result, String columnLabel, Class type) throws SQLException { + T obj = chain.resultSet_getObject(result, columnLabel, type); + + if (obj instanceof Clob) { + clobOpenAfter(chain.getDataSource().getDataSourceStat(), result, (ClobProxy) obj); + } else if (obj instanceof Blob) { + blobOpenAfter(chain.getDataSource().getDataSourceStat(), result, (Blob) obj); + } else if (obj instanceof String) { + result.addReadStringLength(((String) obj).length()); + } + + return obj; + } + @Override public Object resultSet_getObject(FilterChain chain, ResultSetProxy result, String columnLabel, java.util.Map> map) throws SQLException { diff --git a/src/main/java/com/alibaba/druid/proxy/jdbc/ResultSetProxyImpl.java b/src/main/java/com/alibaba/druid/proxy/jdbc/ResultSetProxyImpl.java index a7f1517dde..9dfb94d9bf 100644 --- a/src/main/java/com/alibaba/druid/proxy/jdbc/ResultSetProxyImpl.java +++ b/src/main/java/com/alibaba/druid/proxy/jdbc/ResultSetProxyImpl.java @@ -1549,7 +1549,10 @@ public class ResultSetProxyImpl extends WrapperProxyImpl implements ResultSetPro } public T getObject(int columnIndex, Class type) throws SQLException { - throw new SQLFeatureNotSupportedException(); + FilterChainImpl chain = createChain(); + Object value = chain.resultSet_getObject(this, columnIndex, type); + recycleFilterChain(chain); + return (T) value; } public T getObject(String columnLabel, Class type) throws SQLException { diff --git a/src/main/java/com/alibaba/druid/wall/WallFilter.java b/src/main/java/com/alibaba/druid/wall/WallFilter.java index 49c664b30c..0d0b91d532 100644 --- a/src/main/java/com/alibaba/druid/wall/WallFilter.java +++ b/src/main/java/com/alibaba/druid/wall/WallFilter.java @@ -991,6 +991,11 @@ public class WallFilter extends FilterAdapter implements WallFilterMBean { return chain.resultSet_getObject(resultSet, resultSet.getPhysicalColumn(columnIndex)); } + @Override + public T resultSet_getObject(FilterChain chain, ResultSetProxy resultSet, int columnIndex, Class type) throws SQLException { + return chain.resultSet_getObject(resultSet, resultSet.getPhysicalColumn(columnIndex), type); + } + @Override public Object resultSet_getObject(FilterChain chain, ResultSetProxy resultSet, int columnIndex, java.util.Map> map) throws SQLException {