// Path: src/main/java/net/chandol/logjdbc/except/LoggableDataSourceException.java
// public class LoggableDataSourceException extends RuntimeException{
// 
//     public LoggableDataSourceException(String message) {
//         super(message);
//     }
// 
//     public LoggableDataSourceException(String message, Throwable cause) {
//         super(message, cause);
//     }
// 
//     public LoggableDataSourceException(Throwable cause) {
//         super(cause);
//     }
// 
//     public LoggableDataSourceException(String message, Throwable cause, boolean enableSuppression, boolean writableStackTrace) {
//         super(message, cause, enableSuppression, writableStackTrace);
//     }
// }
// 
// Path: src/main/java/net/chandol/logjdbc/logging/LogContext.java
// public class LogContext {
//     private LogJdbcConfig config;
// 
//     private String sql;
//     private ParameterCollector parameterCollector;
//     private ResultSetCollector resultSetCollector;
// 
//     private PrintLogHelper helper;
// 
//     public void printLog() {
//         if (parameterPrintable())
//             config.getSqlPrinter().printParameter(this);
// 
//         if (sqlPrintable())
//             config.getSqlPrinter().printSql(this);
// 
//         if (resultSetPrintable())
//             config.getResultSetPrinter().printResultSet(this);
//     }
// 
//     public void setSql(String sql) {
//         this.sql = sql;
//     }
// 
//     public ParameterCollector initParameterCollector() {
//         this.parameterCollector = new ParameterCollector();
//         return this.parameterCollector;
//     }
// 
//     public ResultSetCollector initResultSetCollector(ResultSetMetaData metaData) {
//         this.resultSetCollector = new ResultSetCollector(metaData);
//         return this.resultSetCollector;
//     }
// 
//     /* getter */
//     public LogJdbcConfig getConfig() {
//         return config;
//     }
// 
//     public String getSql() {
//         return sql;
//     }
// 
//     public ParameterCollector getParameterCollector() {
//         return parameterCollector;
//     }
// 
//     public ResultSetCollector getResultSetCollector() {
//         return resultSetCollector;
//     }
// 
//     public PrintLogHelper getHelper() {
//         return helper;
//     }
// 
//     /* printable */
//     private boolean resultSetPrintable() {
//         return resultSetCollector != null;
//     }
// 
//     private boolean parameterPrintable() {
//         return parameterCollector != null;
//     }
// 
//     private boolean sqlPrintable() {
//         return sql != null && !sql.isEmpty();
//     }
// 
//     /* Constructor */
//     private LogContext(LogJdbcConfig config) {
//         this.config = config;
//         this.helper = new PrintLogHelper(config);
//     }
// 
//     private LogContext(LogJdbcConfig config, String sql) {
//         this(config);
//         this.sql = sql;
//     }
// 
//     public static LogContext of(LogJdbcConfig config) {
//         return new LogContext(config);
//     }
// 
//     public static LogContext of(LogJdbcConfig config, String sql) {
//         return new LogContext(config, sql);
//     }
// 
// }
// 
// Path: src/main/java/net/chandol/logjdbc/logging/collector/resultset/ResultSetCollector.java
// public class ResultSetCollector {
//     private ResultSetData datas;
//     private int columnCount;
// 
//     public ResultSetCollector(ResultSetMetaData metaData) {
//         this.datas = new ResultSetData(metaData);
//         this.columnCount = getColumnCount(metaData);
//     }
// 
//     public void collectCurrentCursorResultSetData(ResultSet resultSet) {
//         try {
//             Object[] values = new Object[columnCount];
//             for (int idx = 0; idx < columnCount; idx++)
//                 values[idx] = resultSet.getObject(idx + 1);
// 
//             datas.addRow(values);
//         } catch (SQLException e) {
//             throw new LoggableDataSourceException(e);
//         }
//     }
// 
//     public ResultSetData getResultSetData() {
//         return this.datas;
//     }
// 
// }


import net.chandol.logjdbc.except.LoggableDataSourceException;
import net.chandol.logjdbc.logging.LogContext;
import net.chandol.logjdbc.logging.collector.resultset.ResultSetCollector;
import java.io.InputStream;
import java.io.Reader;
import java.math.BigDecimal;
import java.net.URL;
import java.sql.*;
import java.util.Calendar;
import java.util.Map;
package net.chandol.logjdbc.jdbcproxy;



public class ProxyResultSet implements ResultSet {

    private ResultSet _resultSet;
    private ResultSetCollector rsCollector;
    private LogContext context;

// Path: src/main/java/net/chandol/logjdbc/except/LoggableDataSourceException.java
// public class LoggableDataSourceException extends RuntimeException{
// 
//     public LoggableDataSourceException(String message) {
//         super(message);
//     }
// 
//     public LoggableDataSourceException(String message, Throwable cause) {
//         super(message, cause);
//     }
// 
//     public LoggableDataSourceException(Throwable cause) {
//         super(cause);
//     }
// 
//     public LoggableDataSourceException(String message, Throwable cause, boolean enableSuppression, boolean writableStackTrace) {
//         super(message, cause, enableSuppression, writableStackTrace);
//     }
// }
// 
// Path: src/main/java/net/chandol/logjdbc/logging/LogContext.java
// public class LogContext {
//     private LogJdbcConfig config;
// 
//     private String sql;
//     private ParameterCollector parameterCollector;
//     private ResultSetCollector resultSetCollector;
// 
//     private PrintLogHelper helper;
// 
//     public void printLog() {
//         if (parameterPrintable())
//             config.getSqlPrinter().printParameter(this);
// 
//         if (sqlPrintable())
//             config.getSqlPrinter().printSql(this);
// 
//         if (resultSetPrintable())
//             config.getResultSetPrinter().printResultSet(this);
//     }
// 
//     public void setSql(String sql) {
//         this.sql = sql;
//     }
// 
//     public ParameterCollector initParameterCollector() {
//         this.parameterCollector = new ParameterCollector();
//         return this.parameterCollector;
//     }
// 
//     public ResultSetCollector initResultSetCollector(ResultSetMetaData metaData) {
//         this.resultSetCollector = new ResultSetCollector(metaData);
//         return this.resultSetCollector;
//     }
// 
//     /* getter */
//     public LogJdbcConfig getConfig() {
//         return config;
//     }
// 
//     public String getSql() {
//         return sql;
//     }
// 
//     public ParameterCollector getParameterCollector() {
//         return parameterCollector;
//     }
// 
//     public ResultSetCollector getResultSetCollector() {
//         return resultSetCollector;
//     }
// 
//     public PrintLogHelper getHelper() {
//         return helper;
//     }
// 
//     /* printable */
//     private boolean resultSetPrintable() {
//         return resultSetCollector != null;
//     }
// 
//     private boolean parameterPrintable() {
//         return parameterCollector != null;
//     }
// 
//     private boolean sqlPrintable() {
//         return sql != null && !sql.isEmpty();
//     }
// 
//     /* Constructor */
//     private LogContext(LogJdbcConfig config) {
//         this.config = config;
//         this.helper = new PrintLogHelper(config);
//     }
// 
//     private LogContext(LogJdbcConfig config, String sql) {
//         this(config);
//         this.sql = sql;
//     }
// 
//     public static LogContext of(LogJdbcConfig config) {
//         return new LogContext(config);
//     }
// 
//     public static LogContext of(LogJdbcConfig config, String sql) {
//         return new LogContext(config, sql);
//     }
// 
// }
// 
// Path: src/main/java/net/chandol/logjdbc/logging/collector/resultset/ResultSetCollector.java
// public class ResultSetCollector {
//     private ResultSetData datas;
//     private int columnCount;
// 
//     public ResultSetCollector(ResultSetMetaData metaData) {
//         this.datas = new ResultSetData(metaData);
//         this.columnCount = getColumnCount(metaData);
//     }
// 
//     public void collectCurrentCursorResultSetData(ResultSet resultSet) {
//         try {
//             Object[] values = new Object[columnCount];
//             for (int idx = 0; idx < columnCount; idx++)
//                 values[idx] = resultSet.getObject(idx + 1);
// 
//             datas.addRow(values);
//         } catch (SQLException e) {
//             throw new LoggableDataSourceException(e);
//         }
//     }
// 
//     public ResultSetData getResultSetData() {
//         return this.datas;
//     }
// 
// }


// Path: src/main/java/net/chandol/logjdbc/jdbcproxy/ProxyResultSet.java
import net.chandol.logjdbc.except.LoggableDataSourceException;
import net.chandol.logjdbc.logging.LogContext;
import net.chandol.logjdbc.logging.collector.resultset.ResultSetCollector;
import java.io.InputStream;
import java.io.Reader;
import java.math.BigDecimal;
import java.net.URL;
import java.sql.*;
import java.util.Calendar;
import java.util.Map;

package net.chandol.logjdbc.jdbcproxy;



public class ProxyResultSet implements ResultSet {

    private ResultSet _resultSet;
    private ResultSetCollector rsCollector;
    private LogContext context;

    ProxyResultSet(LogContext context, ResultSet resultSet) {