OSDN Git Service

cancel row updates sets values to null by Kris Jurka
authorDave Cramer <davec@fastcrypt.com>
Fri, 12 Dec 2003 18:34:14 +0000 (18:34 +0000)
committerDave Cramer <davec@fastcrypt.com>
Fri, 12 Dec 2003 18:34:14 +0000 (18:34 +0000)
src/interfaces/jdbc/org/postgresql/jdbc2/AbstractJdbc2ResultSet.java
src/interfaces/jdbc/org/postgresql/test/jdbc2/UpdateableResultTest.java

index 817b5d0..37d7f9c 100644 (file)
@@ -9,7 +9,7 @@
  * Copyright (c) 2003, PostgreSQL Global Development Group
  *
  * IDENTIFICATION
- *       $PostgreSQL: pgsql/src/interfaces/jdbc/org/postgresql/jdbc2/AbstractJdbc2ResultSet.java,v 1.27 2003/11/29 19:52:10 pgsql Exp $
+ *       $PostgreSQL: pgsql/src/interfaces/jdbc/org/postgresql/jdbc2/AbstractJdbc2ResultSet.java,v 1.28 2003/12/12 18:34:14 davec Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -519,7 +519,7 @@ public abstract class AbstractJdbc2ResultSet extends org.postgresql.jdbc1.Abstra
                {
                        doingUpdates = false;
 
-                       clearRowBuffer();
+                       clearRowBuffer(true);
                }
        }
 
@@ -662,7 +662,7 @@ public abstract class AbstractJdbc2ResultSet extends org.postgresql.jdbc1.Abstra
                        this_row = rowBuffer;
 
                        // need to clear this in case of another insert
-                       clearRowBuffer();
+                       clearRowBuffer(false);
 
 
                }
@@ -707,7 +707,7 @@ public abstract class AbstractJdbc2ResultSet extends org.postgresql.jdbc1.Abstra
 
 
                // make sure the underlying data is null
-               clearRowBuffer();
+               clearRowBuffer(false);
 
                onInsertRow = true;
                doingUpdates = false;
@@ -715,12 +715,17 @@ public abstract class AbstractJdbc2ResultSet extends org.postgresql.jdbc1.Abstra
        }
 
 
-       private synchronized void clearRowBuffer()
+       private synchronized void clearRowBuffer(boolean copyCurrentRow)
        throws SQLException
        {
                // rowBuffer is the temporary storage for the row
                rowBuffer = new byte[fields.length][];
 
+               // inserts want an empty array while updates want a copy of the current row
+               if (copyCurrentRow) {
+                       System.arraycopy(this_row, 0, rowBuffer, 0, this_row.length);
+               }
+
                // clear the updateValues hashTable for the next set of updates
                updateValues.clear();
 
index fcd6321..362f3ac 100644 (file)
@@ -15,25 +15,79 @@ import org.postgresql.test.TestUtil;
 
 public class UpdateableResultTest extends TestCase
 {
+       private Connection con;
 
        public UpdateableResultTest( String name )
        {
                super( name );
        }
 
+       protected void setUp() throws Exception
+       {
+               con = TestUtil.openDB();
+               TestUtil.createTable(con, "updateable", "id int primary key, name text, notselected text");
+               TestUtil.createTable(con, "second", "id1 int primary key, name1 text");
+
+               // put some dummy data into second
+               Statement st2 = con.createStatement();
+               st2.execute( "insert into second values (1,'anyvalue' )");
+               st2.close();
+               
+       }
+
+       protected void tearDown() throws Exception
+       {
+               TestUtil.dropTable(con, "updateable");
+               TestUtil.dropTable(con, "second");
+               TestUtil.closeDB(con);
+       }
+
+       public void testCancelRowUpdates() throws Exception
+       {
+               Statement st = con.createStatement( ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_UPDATABLE );
+               ResultSet rs = st.executeQuery( "select * from second");
+
+               // make sure we're dealing with the correct row.
+               rs.first();
+               assertEquals(1,rs.getInt(1));
+               assertEquals("anyvalue",rs.getString(2));
+
+               // update, cancel and make sure nothings changed.
+               rs.updateInt(1,99);
+               rs.cancelRowUpdates();
+               assertEquals(1,rs.getInt(1));
+               assertEquals("anyvalue",rs.getString(2));
+
+               // real update
+               rs.updateInt(1,999);
+               rs.updateRow();
+               assertEquals(999,rs.getInt(1));
+               assertEquals("anyvalue",rs.getString(2));
+
+               // scroll some and make sure the update is still there
+               rs.beforeFirst();
+               rs.next();
+               assertEquals(999,rs.getInt(1));
+               assertEquals("anyvalue",rs.getString(2));
+
+
+               // make sure the update got to the db and the driver isn't lying to us.
+               rs.close();
+               rs = st.executeQuery( "select * from second");
+               rs.first();
+               assertEquals(999,rs.getInt(1));
+               assertEquals("anyvalue",rs.getString(2));
+
+               rs.close();
+               st.close();
+       }
+
+
+
        public void testUpdateable()
        {
                try
                {
-                       Connection con = TestUtil.openDB();
-                       TestUtil.createTable(con, "updateable", "id int primary key, name text, notselected text");
-                       TestUtil.createTable(con, "second", "id1 int primary key, name1 text");
-
-                       // put some dummy data into second
-                       Statement st2 = con.createStatement();
-                       st2.execute( "insert into second values (1,'anyvalue' )");
-                       st2.close();
-
                        Statement st = con.createStatement( ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_UPDATABLE );
                        ResultSet rs = st.executeQuery( "select * from updateable");
                        assertNotNull( rs );
@@ -123,12 +177,10 @@ public class UpdateableResultTest extends TestCase
 
                        st.close();
 
-                       TestUtil.dropTable( con, "updateable" );
-                       TestUtil.dropTable( con, "second" );
-                       TestUtil.closeDB( con );
                }
                catch (Exception ex)
                {
+                       ex.printStackTrace();
                        fail(ex.getMessage());
                }
        }