Author: tomdz
Date: Tue Aug  9 13:55:22 2005
New Revision: 231110

URL: http://svn.apache.org/viewcvs?rev=231110&view=rev
Log:
Fixed error in DynaSqlIterator that advanced the result set too early

Added a dynasql test containing a query with a join

Modified:
    db/ddlutils/trunk/src/java/org/apache/ddlutils/dynabean/DynaSql.java
    db/ddlutils/trunk/src/java/org/apache/ddlutils/dynabean/DynaSqlIterator.java
    db/ddlutils/trunk/src/java/org/apache/ddlutils/util/DDLExecutor.java
    db/ddlutils/trunk/src/java/org/apache/ddlutils/util/JdbcSupport.java
    
db/ddlutils/trunk/src/test/org/apache/ddlutils/dynabean/TestDynaSqlQueries.java

Modified: db/ddlutils/trunk/src/java/org/apache/ddlutils/dynabean/DynaSql.java
URL: 
http://svn.apache.org/viewcvs/db/ddlutils/trunk/src/java/org/apache/ddlutils/dynabean/DynaSql.java?rev=231110&r1=231109&r2=231110&view=diff
==============================================================================
--- db/ddlutils/trunk/src/java/org/apache/ddlutils/dynabean/DynaSql.java 
(original)
+++ db/ddlutils/trunk/src/java/org/apache/ddlutils/dynabean/DynaSql.java Tue 
Aug  9 13:55:22 2005
@@ -146,7 +146,8 @@
             // otherwise we're leaving it open for the iterator
             if (answer == null)
             {
-                closeStatementAndConnection(statement);
+                closeStatement(statement);
+                returnConnection(connection);
             }
         }
     }
@@ -181,10 +182,11 @@
         }
         finally
         {
-            // if any exceptions are thrown, close things down
+            // if any exceptions are thrown (no answer), close things down
             if (answer == null)
             {
-                closeStatementAndConnection(statement);
+                closeStatement(statement);
+                returnConnection(connection);
             }
         }
     }
@@ -254,7 +256,8 @@
         catch (SQLException ex)
         {
             // any other exception comes from the iterator which closes the 
resources automatically
-            closeStatementAndConnection(statement);
+            closeStatement(statement);
+            returnConnection(connection);
         }
         return result;
     }
@@ -305,7 +308,8 @@
         catch (SQLException ex)
         {
             // any other exception comes from the iterator which closes the 
resources automatically
-            closeStatementAndConnection(statement);
+            closeStatement(statement);
+            returnConnection(connection);
         }
         return result;
     }
@@ -486,7 +490,7 @@
         }
         finally
         {
-            closeStatementAndConnection(statement);
+            closeStatement(statement);
             returnConnection(connection);
         }
     }
@@ -562,6 +566,7 @@
     /**
      * Inserts the bean. If one of the columns is an auto-incremented column, 
then the
      * dyna bean will also be updated with the column value generated by the 
database.
+     * Note that the connection will not be closed by this method.
      * 
      * @param dynaBean   The bean
      * @param connection The database connection
@@ -629,7 +634,7 @@
         }
         finally
         {
-            closeStatementAndConnection(statement);
+            closeStatement(statement);
         }
         if (queryIdSql != null)
         {
@@ -670,7 +675,8 @@
                 {
                     lastInsertedIds.close();
                 }
-                closeStatementAndConnection(queryStmt);
+                closeStatement(statement);
+                returnConnection(connection);
             }
         }
     }
@@ -726,7 +732,8 @@
         }
         finally
         {
-            closeStatementAndConnection(statement);
+            closeStatement(statement);
+            returnConnection(connection);
         }
     }
 

Modified: 
db/ddlutils/trunk/src/java/org/apache/ddlutils/dynabean/DynaSqlIterator.java
URL: 
http://svn.apache.org/viewcvs/db/ddlutils/trunk/src/java/org/apache/ddlutils/dynabean/DynaSqlIterator.java?rev=231110&r1=231109&r2=231110&view=diff
==============================================================================
--- 
db/ddlutils/trunk/src/java/org/apache/ddlutils/dynabean/DynaSqlIterator.java 
(original)
+++ 
db/ddlutils/trunk/src/java/org/apache/ddlutils/dynabean/DynaSqlIterator.java 
Tue Aug  9 13:55:22 2005
@@ -32,6 +32,8 @@
     private DynaClass _dynaClass;

     /** Maps column names to properties */

     private Map _columnsToProperties = new ListOrderedMap();

+    /** Whether the next call to hasNext or next needs advancement */

+    private boolean _needsAdvancing = true;

     /** Whether we're already at the end of the result set */

     private boolean _isAtEnd = false;

     /** Whether to close the statement and connection after finishing */

@@ -134,31 +136,8 @@
      */

     public boolean hasNext() throws DynaSqlException

     {

-        if (_isAtEnd)

-        {

-            return false;

-        }

-        else

-        {

-            try

-            {

-                if (_resultSet.next())

-                {

-                    return true;

-                }

-                else

-                {

-                    _isAtEnd = true;

-                    cleanUp();

-                    return false;

-                }

-            }

-            catch (SQLException ex)

-            {

-                cleanUp();

-                throw new DynaSqlException("Exception while advancing the 
resultset cursor", ex);

-            }

-        }

+        advanceIfNecessary();

+        return !_isAtEnd;

     }

 

     /* (non-Javadoc)

@@ -166,6 +145,7 @@
      */

     public Object next() throws DynaSqlException

     {

+        advanceIfNecessary();

         if (_isAtEnd)

         {

             throw new NoSuchElementException("No more elements in the 
resultset");

@@ -182,6 +162,7 @@
 

                     bean.set((String)entry.getValue(), 
_resultSet.getObject((String)entry.getKey()));

                 }

+                _needsAdvancing = true;

                 return bean;

             }

             catch (Exception ex)

@@ -192,6 +173,30 @@
         }

     }

 

+    /**

+     * Advances the result set if necessary.

+     */

+    private void advanceIfNecessary() throws DynaSqlException

+    {

+        if (_needsAdvancing && !_isAtEnd)

+        {

+            try

+            {

+                _isAtEnd        = !_resultSet.next();

+                _needsAdvancing = false;

+            }

+            catch (SQLException ex)

+            {

+                cleanUp();

+                throw new DynaSqlException("Could not retrieve next row from 
result set", ex);

+            }

+            if (_isAtEnd)

+            {

+                cleanUp();

+            }

+        }

+    }

+    

     /* (non-Javadoc)

      * @see java.util.Iterator#remove()

      */


Modified: db/ddlutils/trunk/src/java/org/apache/ddlutils/util/DDLExecutor.java
URL: 
http://svn.apache.org/viewcvs/db/ddlutils/trunk/src/java/org/apache/ddlutils/util/DDLExecutor.java?rev=231110&r1=231109&r2=231110&view=diff
==============================================================================
--- db/ddlutils/trunk/src/java/org/apache/ddlutils/util/DDLExecutor.java 
(original)
+++ db/ddlutils/trunk/src/java/org/apache/ddlutils/util/DDLExecutor.java Tue 
Aug  9 13:55:22 2005
@@ -201,8 +201,9 @@
             }
             log.info( "Executed: "+ commandCount + " statement(s) with " + 
errors + " error(s)" );
         }
-        finally {
-            closeStatementAndConnection(statement);
+        finally
+        {
+            closeStatement(statement);
             returnConnection(connection);
         }
 

Modified: db/ddlutils/trunk/src/java/org/apache/ddlutils/util/JdbcSupport.java
URL: 
http://svn.apache.org/viewcvs/db/ddlutils/trunk/src/java/org/apache/ddlutils/util/JdbcSupport.java?rev=231110&r1=231109&r2=231110&view=diff
==============================================================================
--- db/ddlutils/trunk/src/java/org/apache/ddlutils/util/JdbcSupport.java 
(original)
+++ db/ddlutils/trunk/src/java/org/apache/ddlutils/util/JdbcSupport.java Tue 
Aug  9 13:55:22 2005
@@ -105,7 +105,7 @@
      * 
      * @param statement The statement
      */
-    public void closeStatementAndConnection(Statement statement)
+    public void closeStatement(Statement statement)
     {
         if (statement != null)
         {
@@ -116,11 +116,6 @@
                 if ((conn != null) && !conn.isClosed())
                 {
                     statement.close();
-                    // this might have closed the connection ?
-                    if (!conn.isClosed())
-                    {
-                        returnConnection(conn);
-                    }
                 }
             }
             catch (Exception e)

Modified: 
db/ddlutils/trunk/src/test/org/apache/ddlutils/dynabean/TestDynaSqlQueries.java
URL: 
http://svn.apache.org/viewcvs/db/ddlutils/trunk/src/test/org/apache/ddlutils/dynabean/TestDynaSqlQueries.java?rev=231110&r1=231109&r2=231110&view=diff
==============================================================================
--- 
db/ddlutils/trunk/src/test/org/apache/ddlutils/dynabean/TestDynaSqlQueries.java 
(original)
+++ 
db/ddlutils/trunk/src/test/org/apache/ddlutils/dynabean/TestDynaSqlQueries.java 
Tue Aug  9 13:55:22 2005
@@ -31,6 +31,8 @@
         DynaBean        bean    = null;

 

         assertTrue(it.hasNext());

+        // we call the method a second time to assert that the result set does 
not get advanced twice

+        assertTrue(it.hasNext());

 

         bean = (DynaBean)it.next();

 

@@ -107,4 +109,47 @@
         assertEquals("Text 3",

                      bean.get("text"));

     }

+

+    public void testJoinQuery() throws Exception

+    {

+        createDatabase(

+            "<?xml version='1.0' encoding='ISO-8859-1'?>\n"+

+            "<database name='ddlutils'>\n"+

+            "  <table name='testtable1'>\n"+

+            "    <column name='id1' type='INTEGER' primaryKey='true'/>\n"+

+            "    <column name='id2' type='INTEGER'/>\n"+

+            "  </table>\n"+

+            "  <table name='testtable2'>\n"+

+            "    <column name='id'   type='INTEGER' primaryKey='true'/>\n"+

+            "    <column name='text' type='VARCHAR' size='15'/>\n"+

+            "  </table>\n"+

+            "</database>");

+

+        insertData(

+            "<?xml version='1.0' encoding='ISO-8859-1'?>\n"+

+            "<data>\n"+

+            "  <testtable1 id1='1'/>\n"+

+            "  <testtable1 id1='2' id2='3'/>\n"+

+            "  <testtable2 id='1' text='Text 1'/>\n"+

+            "  <testtable2 id='2' text='Text 2'/>\n"+

+            "  <testtable2 id='3' text='Text 3'/>"+

+            "</data>");

+

+        DynaSql         dynaSql = new DynaSql(getBuilder(), getDataSource(), 
getModel());

+        DynaSqlIterator it      = (DynaSqlIterator)dynaSql.query("SELECT id1, 
text FROM testtable1, testtable2 WHERE id2 = id");

+        DynaBean        bean    = null;

+

+        assertTrue(it.hasNext());

+

+        bean = (DynaBean)it.next();

+

+        assertEquals(new Integer(2),

+                     bean.get("id1"));

+        assertEquals("Text 3",

+                     bean.get("text"));

+

+        assertFalse(it.hasNext());

+        assertFalse(it.isConnectionOpen());

+    }

+

 }



Reply via email to