Author: markt
Date: Thu Feb 19 13:40:35 2009
New Revision: 745857

URL: http://svn.apache.org/viewvc?rev=745857&view=rev
Log:
Add a DelegatingDatabaseMetaData to address DBCP-265.
Still need to add the compile time switches. These will follwo shortly.

Modified:
    
commons/proper/dbcp/trunk/src/java/org/apache/commons/dbcp/DelegatingConnection.java
    
commons/proper/dbcp/trunk/src/java/org/apache/commons/dbcp/DelegatingResultSet.java

Modified: 
commons/proper/dbcp/trunk/src/java/org/apache/commons/dbcp/DelegatingConnection.java
URL: 
http://svn.apache.org/viewvc/commons/proper/dbcp/trunk/src/java/org/apache/commons/dbcp/DelegatingConnection.java?rev=745857&r1=745856&r2=745857&view=diff
==============================================================================
--- 
commons/proper/dbcp/trunk/src/java/org/apache/commons/dbcp/DelegatingConnection.java
 (original)
+++ 
commons/proper/dbcp/trunk/src/java/org/apache/commons/dbcp/DelegatingConnection.java
 Thu Feb 19 13:40:35 2009
@@ -326,8 +326,15 @@
     public String getCatalog() throws SQLException
     { checkOpen(); try { return _conn.getCatalog(); } catch (SQLException e) { 
handleException(e); return null; } }
     
-    public DatabaseMetaData getMetaData() throws SQLException
-    { checkOpen(); try { return _conn.getMetaData(); } catch (SQLException e) 
{ handleException(e); return null; } }
+    public DatabaseMetaData getMetaData() throws SQLException {
+        checkOpen();
+        try {
+            return new DelegatingDatabaseMetaData(this, _conn.getMetaData());
+        } catch (SQLException e) {
+            handleException(e);
+            return null;
+        }
+    }
     
     public int getTransactionIsolation() throws SQLException
     { checkOpen(); try { return _conn.getTransactionIsolation(); } catch 
(SQLException e) { handleException(e); return -1; } }

Modified: 
commons/proper/dbcp/trunk/src/java/org/apache/commons/dbcp/DelegatingResultSet.java
URL: 
http://svn.apache.org/viewvc/commons/proper/dbcp/trunk/src/java/org/apache/commons/dbcp/DelegatingResultSet.java?rev=745857&r1=745856&r2=745857&view=diff
==============================================================================
--- 
commons/proper/dbcp/trunk/src/java/org/apache/commons/dbcp/DelegatingResultSet.java
 (original)
+++ 
commons/proper/dbcp/trunk/src/java/org/apache/commons/dbcp/DelegatingResultSet.java
 Thu Feb 19 13:40:35 2009
@@ -29,6 +29,7 @@
 import java.io.Reader;
 import java.sql.Statement;
 import java.util.Map;
+import java.sql.Connection;
 import java.sql.Ref;
 import java.sql.Blob;
 import java.sql.Clob;
@@ -65,6 +66,9 @@
     /** The Statement that created me, if any. **/
     private Statement _stmt;
 
+    /** The Connection that created me, if any. **/
+    private Connection _conn;
+
     /**
      * Create a wrapper for the ResultSet which traces this
      * ResultSet to the Statement which created it and the
@@ -79,6 +83,20 @@
         this._res = res;
     }
     
+    /**
+     * Create a wrapper for the ResultSet which traces this
+     * ResultSet to the Connection which created it (via, for
+     * example DatabaseMetadata, and the code which created it.
+     *
+     * @param conn Connection which created this ResultSet
+     * @param res ResultSet to wrap
+     */
+    public DelegatingResultSet(Connection conn, ResultSet res) {
+        super((AbandonedTrace)conn);
+        this._conn = conn;
+        this._res = res;
+    }
+    
     public static ResultSet wrapResultSet(Statement stmt, ResultSet rset) {
         if(null == rset) {
             return null;
@@ -87,6 +105,14 @@
         }
     }
 
+    public static ResultSet wrapResultSet(Connection conn, ResultSet rset) {
+        if(null == rset) {
+            return null;
+        } else {
+            return new DelegatingResultSet(conn,rset);
+        }
+    }
+
     public ResultSet getDelegate() {
         return _res;
     }
@@ -154,6 +180,10 @@
                 ((AbandonedTrace)_stmt).removeTrace(this);
                 _stmt = null;
             }
+            if(_conn != null) {
+                ((AbandonedTrace)_conn).removeTrace(this);
+                _conn = null;
+            }
             _res.close();
         }
         catch (SQLException e) {
@@ -165,6 +195,9 @@
         if ((_stmt != null) && (_stmt instanceof DelegatingStatement)) {
             ((DelegatingStatement)_stmt).handleException(e);
         }
+        else if ((_conn != null) && (_conn instanceof DelegatingConnection)) {
+            ((DelegatingConnection)_conn).handleException(e);
+        }
         else {
             throw e;
         }


Reply via email to