When deleteRow() is called on an updateable ResultSet the ResultSet
authorKris Jurka <books@ejurka.com>
Wed, 16 Jun 2004 05:12:13 +0000 (05:12 +0000)
committerKris Jurka <books@ejurka.com>
Wed, 16 Jun 2004 05:12:13 +0000 (05:12 +0000)
should be positioned on the previous row.

Reported by Bob Messenger and Chris Pesarchick.

src/interfaces/jdbc/org/postgresql/jdbc2/AbstractJdbc2ResultSet.java
src/interfaces/jdbc/org/postgresql/test/jdbc2/UpdateableResultTest.java

index ac55120aa37cbf6e647a0e1e3299c481e713d65c..6a479e7cd012128f96ccd93f481e796d7aeace4a 100644 (file)
@@ -9,7 +9,7 @@
  * Copyright (c) 2003, PostgreSQL Global Development Group
  *
  * IDENTIFICATION
- *   $Header: /cvsroot/pgsql/src/interfaces/jdbc/org/postgresql/jdbc2/Attic/AbstractJdbc2ResultSet.java,v 1.25.2.5 2004/04/24 01:54:45 jurka Exp $
+ *   $Header: /cvsroot/pgsql/src/interfaces/jdbc/org/postgresql/jdbc2/Attic/AbstractJdbc2ResultSet.java,v 1.25.2.6 2004/06/16 05:11:44 jurka Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -584,6 +584,8 @@ public abstract class AbstractJdbc2ResultSet extends org.postgresql.jdbc1.Abstra
        deleteStatement.executeUpdate();
 
        rows.removeElementAt(current_row);
+       current_row--;
+       moveToCurrentRow();
    }
 
 
@@ -738,22 +740,19 @@ public abstract class AbstractJdbc2ResultSet extends org.postgresql.jdbc1.Abstra
 
    public boolean rowDeleted() throws SQLException
    {
-       // only sub-classes implement CONCURuPDATEABLE
-       throw Driver.notImplemented();
+       return false;
    }
 
 
    public boolean rowInserted() throws SQLException
    {
-       // only sub-classes implement CONCURuPDATEABLE
-       throw Driver.notImplemented();
+       return false;
    }
 
 
    public boolean rowUpdated() throws SQLException
    {
-       // only sub-classes implement CONCURuPDATEABLE
-       throw Driver.notImplemented();
+       return false;
    }
 
 
@@ -938,74 +937,69 @@ public abstract class AbstractJdbc2ResultSet extends org.postgresql.jdbc1.Abstra
        {
            throw new PSQLException( "postgresql.updateable.notupdateable" );
        }
+       if (onInsertRow)
+           throw new PSQLException("postgresql.res.oninsertrow");
 
-       try
-       {
-           StringBuffer selectSQL = new StringBuffer( "select ");
+       if (isBeforeFirst() || isAfterLast())
+           return;
 
-           final int numColumns = java.lang.reflect.Array.getLength(fields);
+       StringBuffer selectSQL = new StringBuffer( "select ");
 
-           for (int i = 0; i < numColumns; i++ )
-           {
+       final int numColumns = java.lang.reflect.Array.getLength(fields);
 
-               selectSQL.append( fields[i].getName() );
+       for (int i = 0; i < numColumns; i++ )
+       {
 
-               if ( i < numColumns - 1 )
-               {
+           selectSQL.append( fields[i].getName() );
 
-                   selectSQL.append(", ");
-               }
+           if ( i < numColumns - 1 )
+           {
 
+               selectSQL.append(", ");
            }
-           selectSQL.append(" from " ).append(tableName).append(" where ");
 
-           int numKeys = primaryKeys.size();
-
-           for ( int i = 0; i < numKeys; i++ )
-           {
+       }
+       selectSQL.append(" from " ).append(tableName).append(" where ");
 
-               PrimaryKey primaryKey = ((PrimaryKey) primaryKeys.get(i));
-               selectSQL.append(primaryKey.name).append("= ?");
+       int numKeys = primaryKeys.size();
 
-               if ( i < numKeys - 1 )
-               {
-                   selectSQL.append(" and ");
-               }
-           }
-           if ( Driver.logDebug )
-               Driver.debug("selecting " + selectSQL.toString());
-           selectStatement = ((java.sql.Connection) connection).prepareStatement(selectSQL.toString());
+       for ( int i = 0; i < numKeys; i++ )
+       {
 
+           PrimaryKey primaryKey = ((PrimaryKey) primaryKeys.get(i));
+           selectSQL.append(primaryKey.name).append("= ?");
 
-           for ( int j = 0, i = 1; j < numKeys; j++, i++)
+           if ( i < numKeys - 1 )
            {
-               selectStatement.setObject( i, ((PrimaryKey) primaryKeys.get(j)).getValue() );
+               selectSQL.append(" and ");
            }
+       }
+       if ( Driver.logDebug )
+           Driver.debug("selecting " + selectSQL.toString());
+       selectStatement = ((java.sql.Connection) connection).prepareStatement(selectSQL.toString());
 
-           AbstractJdbc2ResultSet rs = (AbstractJdbc2ResultSet) selectStatement.executeQuery();
-
-           if ( rs.first() )
-           {
-               rowBuffer = rs.rowBuffer;
-           }
 
-           rows.setElementAt( rowBuffer, current_row );
-           this_row = rowBuffer;
-           if ( Driver.logDebug )
-               Driver.debug("done updates");
+       for ( int j = 0, i = 1; j < numKeys; j++, i++)
+       {
+           selectStatement.setObject( i, ((PrimaryKey) primaryKeys.get(j)).getValue() );
+       }
 
-           rs.close();
-           selectStatement.close();
-           selectStatement = null;
+       AbstractJdbc2ResultSet rs = (AbstractJdbc2ResultSet) selectStatement.executeQuery();
 
-       }
-       catch (Exception e)
+       if ( rs.first() )
        {
-           if ( Driver.logDebug )
-               Driver.debug(e.getClass().getName() + e);
-           throw new SQLException( e.getMessage() );
+           rowBuffer = rs.rowBuffer;
        }
 
+       rows.setElementAt( rowBuffer, current_row );
+       this_row = rowBuffer;
+       if ( Driver.logDebug )
+           Driver.debug("done updates");
+
+       rs.close();
+       selectStatement.close();
+       selectStatement = null;
+
    }
 
 
index 362f3ace63b8bb570187d3ff077061edc23ec0f2..e3a932136a1f2663ade8072f8f748a0d5eaed123 100644 (file)
@@ -42,6 +42,34 @@ public class UpdateableResultTest extends TestCase
        TestUtil.closeDB(con);
    }
 
+   public void testDeleteRows() throws SQLException
+   {
+       Statement st = con.createStatement();
+       st.executeUpdate("INSERT INTO second values (2,'two')");
+       st.executeUpdate("INSERT INTO second values (3,'three')");
+       st.executeUpdate("INSERT INTO second values (4,'four')");
+       st.close();
+
+       st = con.createStatement( ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_UPDATABLE );
+       ResultSet rs = st.executeQuery( "select id1,name1 from second order by id1");
+
+       assertTrue(rs.next());
+       assertEquals(1, rs.getInt("id1"));
+       rs.deleteRow();
+       assertTrue(rs.isBeforeFirst());
+
+       assertTrue(rs.next());
+       assertTrue(rs.next());
+       assertEquals(3, rs.getInt("id1"));
+       rs.deleteRow();
+       assertEquals(2, rs.getInt("id1"));
+
+       rs.close();
+       st.close();
+   }
+       
+       
+
    public void testCancelRowUpdates() throws Exception
    {
        Statement st = con.createStatement( ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_UPDATABLE );
@@ -84,106 +112,91 @@ public class UpdateableResultTest extends TestCase
 
 
 
-   public void testUpdateable()
+   public void testUpdateable() throws SQLException
    {
-       try
-       {
-           Statement st = con.createStatement( ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_UPDATABLE );
-           ResultSet rs = st.executeQuery( "select * from updateable");
-           assertNotNull( rs );
-           rs.moveToInsertRow();
-           rs.updateInt( 1, 1 );
-           rs.updateString( 2, "jake" );
-           rs.updateString( 3, "avalue" );
-           rs.insertRow();
-           rs.first();
-
-           rs.updateInt( "id", 2 );
-           rs.updateString( "name", "dave" );
-           rs.updateRow();
-
-           assertTrue( rs.getInt("id") == 2 );
-           assertTrue( rs.getString("name").equals("dave"));
-           assertTrue( rs.getString("notselected").equals("avalue") );
-
-           rs.deleteRow();
-           rs.moveToInsertRow();
-           rs.updateInt("id", 3);
-           rs.updateString("name", "paul");
-
-           rs.insertRow();
-           rs.refreshRow();
-           assertTrue( rs.getInt("id") == 3 );
-           assertTrue( rs.getString("name").equals("paul"));
-           assertTrue( rs.getString("notselected") == null );
+       Statement st = con.createStatement( ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_UPDATABLE );
+       ResultSet rs = st.executeQuery( "select * from updateable");
+       assertNotNull( rs );
+       rs.moveToInsertRow();
+       rs.updateInt( 1, 1 );
+       rs.updateString( 2, "jake" );
+       rs.updateString( 3, "avalue" );
+       rs.insertRow();
+       rs.first();
 
+       rs.updateInt( "id", 2 );
+       rs.updateString( "name", "dave" );
+       rs.updateRow();
 
-           rs.close();
+       assertEquals(2, rs.getInt("id"));
+       assertEquals("dave", rs.getString("name"));
+       assertEquals("avalue", rs.getString("notselected"));
 
-           rs = st.executeQuery("select id1, id, name, name1 from updateable, second" );
-           try
-           {
-               while ( rs.next() )
-               {
-                   rs.updateInt( "id", 2 );
-                   rs.updateString( "name", "dave" );
-                   rs.updateRow();
-               }
+       rs.deleteRow();
+       rs.moveToInsertRow();
+       rs.updateInt("id", 3);
+       rs.updateString("name", "paul");
 
+       rs.insertRow();
 
-               assertTrue( "should not get here, update should fail", false );
-           }
-           catch (SQLException ex)
-           {}
+       try {
+           rs.refreshRow();
+           fail("Can't refresh when on the insert row.");
+       } catch (SQLException sqle) { }
 
-           try
-           {
-               rs = st.executeQuery("select oid,* from updateable");
-               if ( rs.first() )
-               {
-                   rs.updateInt( "id", 3 );
-                   rs.updateString( "name", "dave3");
-                   rs.updateRow();
-                   assertTrue(rs.getInt("id") == 3 );
-                   assertTrue(rs.getString("name").equals("dave3"));
-
-                   rs.moveToInsertRow();
-                   rs.updateInt( "id", 4 );
-                   rs.updateString( "name", "dave4" );
-
-                   rs.insertRow();
-                   rs.updateInt("id", 5 );
-                   rs.updateString( "name", "dave5" );
-                   rs.insertRow();
-
-                   rs.moveToCurrentRow();
-                   assertTrue(rs.getInt("id") == 3 );
-                   assertTrue(rs.getString("name").equals("dave3"));
-
-                   assertTrue( rs.next() );
-                   assertTrue(rs.getInt("id") == 4 );
-                   assertTrue(rs.getString("name").equals("dave4"));
-
-                   assertTrue( rs.next() );
-                   assertTrue(rs.getInt("id") == 5 );
-                   assertTrue(rs.getString("name").equals("dave5"));
-
-               }
-           }
-           catch (SQLException ex)
+       assertEquals(3, rs.getInt("id"));
+       assertEquals("paul", rs.getString("name"));
+       assertNull(rs.getString("notselected"));
+
+       rs.close();
+
+       rs = st.executeQuery("select id1, id, name, name1 from updateable, second" );
+       try
+       {
+           while ( rs.next() )
            {
-               fail(ex.getMessage());
+               rs.updateInt( "id", 2 );
+               rs.updateString( "name", "dave" );
+               rs.updateRow();
            }
 
-           st.close();
 
+           fail("should not get here, update should fail");
        }
-       catch (Exception ex)
-       {
-           ex.printStackTrace();
-           fail(ex.getMessage());
-       }
-   }
+       catch (SQLException ex)
+       {}
 
+       rs = st.executeQuery("select oid,* from updateable");
+       assertTrue(rs.first());
+       rs.updateInt( "id", 3 );
+       rs.updateString( "name", "dave3");
+       rs.updateRow();
+       assertEquals(3, rs.getInt("id"));
+       assertEquals("dave3", rs.getString("name"));
+
+       rs.moveToInsertRow();
+       rs.updateInt( "id", 4 );
+       rs.updateString( "name", "dave4" );
+
+       rs.insertRow();
+       rs.updateInt("id", 5 );
+       rs.updateString( "name", "dave5" );
+       rs.insertRow();
+
+       rs.moveToCurrentRow();
+       assertEquals(3, rs.getInt("id"));
+       assertEquals("dave3", rs.getString("name"));
+
+       assertTrue( rs.next() );
+       assertEquals(4, rs.getInt("id"));
+       assertEquals("dave4", rs.getString("name"));
+
+       assertTrue( rs.next() );
+       assertEquals(5, rs.getInt("id"));
+       assertEquals("dave5", rs.getString("name"));
+
+       rs.close();
+       st.close();
+   }
 
 }