1
0
mirror of https://github.com/postgres/postgres.git synced 2025-05-20 05:13:53 +03:00

cancel row updates sets values to null by Kris Jurka

This commit is contained in:
Dave Cramer 2003-12-12 18:38:19 +00:00
parent 31769dcb02
commit 2712da556a
2 changed files with 74 additions and 17 deletions

View File

@ -9,7 +9,7 @@
* Copyright (c) 2003, PostgreSQL Global Development Group * Copyright (c) 2003, PostgreSQL Global Development Group
* *
* IDENTIFICATION * IDENTIFICATION
* $Header: /cvsroot/pgsql/src/interfaces/jdbc/org/postgresql/jdbc2/Attic/AbstractJdbc2ResultSet.java,v 1.25 2003/10/29 02:39:09 davec Exp $ * $Header: /cvsroot/pgsql/src/interfaces/jdbc/org/postgresql/jdbc2/Attic/AbstractJdbc2ResultSet.java,v 1.25.2.1 2003/12/12 18:38:19 davec Exp $
* *
*------------------------------------------------------------------------- *-------------------------------------------------------------------------
*/ */
@ -518,7 +518,7 @@ public abstract class AbstractJdbc2ResultSet extends org.postgresql.jdbc1.Abstra
{ {
doingUpdates = false; doingUpdates = false;
clearRowBuffer(); clearRowBuffer(true);
} }
} }
@ -661,7 +661,7 @@ public abstract class AbstractJdbc2ResultSet extends org.postgresql.jdbc1.Abstra
this_row = rowBuffer; this_row = rowBuffer;
// need to clear this in case of another insert // need to clear this in case of another insert
clearRowBuffer(); clearRowBuffer(false);
} }
@ -706,7 +706,7 @@ public abstract class AbstractJdbc2ResultSet extends org.postgresql.jdbc1.Abstra
// make sure the underlying data is null // make sure the underlying data is null
clearRowBuffer(); clearRowBuffer(false);
onInsertRow = true; onInsertRow = true;
doingUpdates = false; doingUpdates = false;
@ -714,12 +714,17 @@ public abstract class AbstractJdbc2ResultSet extends org.postgresql.jdbc1.Abstra
} }
private synchronized void clearRowBuffer() private synchronized void clearRowBuffer(boolean copyCurrentRow)
throws SQLException throws SQLException
{ {
// rowBuffer is the temporary storage for the row // rowBuffer is the temporary storage for the row
rowBuffer = new byte[fields.length][]; 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 // clear the updateValues hashTable for the next set of updates
updateValues.clear(); updateValues.clear();

View File

@ -15,25 +15,79 @@ import org.postgresql.test.TestUtil;
public class UpdateableResultTest extends TestCase public class UpdateableResultTest extends TestCase
{ {
private Connection con;
public UpdateableResultTest( String name ) public UpdateableResultTest( String name )
{ {
super( 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() public void testUpdateable()
{ {
try 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 ); Statement st = con.createStatement( ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_UPDATABLE );
ResultSet rs = st.executeQuery( "select * from updateable"); ResultSet rs = st.executeQuery( "select * from updateable");
assertNotNull( rs ); assertNotNull( rs );
@ -123,12 +177,10 @@ public class UpdateableResultTest extends TestCase
st.close(); st.close();
TestUtil.dropTable( con, "updateable" );
TestUtil.dropTable( con, "second" );
TestUtil.closeDB( con );
} }
catch (Exception ex) catch (Exception ex)
{ {
ex.printStackTrace();
fail(ex.getMessage()); fail(ex.getMessage());
} }
} }