mirror of
https://github.com/postgres/postgres.git
synced 2025-04-29 13:56:47 +03:00
cancel row updates sets values to null by Kris Jurka
This commit is contained in:
parent
06ec9044b5
commit
605c1e6df0
@ -9,7 +9,7 @@
|
|||||||
* Copyright (c) 2003, PostgreSQL Global Development Group
|
* Copyright (c) 2003, PostgreSQL Global Development Group
|
||||||
*
|
*
|
||||||
* IDENTIFICATION
|
* 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;
|
doingUpdates = false;
|
||||||
|
|
||||||
clearRowBuffer();
|
clearRowBuffer(true);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -662,7 +662,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);
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
@ -707,7 +707,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;
|
||||||
@ -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
|
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();
|
||||||
|
|
||||||
|
@ -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());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user