package org.jdbcdslog;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class ResultSetLoggingProxy implements InvocationHandler {
static Logger logger = LoggerFactory.getLogger(ResultSetLoggingProxy.class);
Object target = null;
public ResultSetLoggingProxy(ResultSet target) {
this.target = target;
}
public Object invoke(Object proxy, Method method, Object[] args)
throws Throwable {
Object r = null;
try {
r = method.invoke(target, args);
} catch(Throwable e) {
LogUtils.handleException(e, ResultSetLogger.logger, LogUtils.createLogEntry(method, null, null, null));
}
if(ResultSetLogger.logger.isInfoEnabled() && method.getName().equals("next") && ((Boolean)r).booleanValue()) {
String fullMethodName = method.getDeclaringClass().getName() + "." + method.getName();
ResultSet rs = (ResultSet)target;
ResultSetMetaData md = rs.getMetaData();
StringBuffer s = new StringBuffer(fullMethodName).append(" {");
if(md.getColumnCount() > 0)
s.append(LogUtils.sqlValueToString(rs.getObject(1)));
for(int i = 2; i <= md.getColumnCount(); i++)
s.append(", ").append(LogUtils.sqlValueToString(rs.getObject(i)));
s.append("}");
ResultSetLogger.logger.info(s.toString());
}
return r;
}
static Object wrapByResultSetProxy(ResultSet r) {
return Proxy.newProxyInstance(r.getClass().getClassLoader(), new Class[]{ResultSet.class},
new ResultSetLoggingProxy(r));
}
}