[libpostgresql-jdbc-java] 11/19: cancel row updates sets values to null by Kris Jurka

Emmanuel Bourg ebourg-guest at moszumanska.debian.org
Mon Jan 9 10:19:08 UTC 2017


This is an automated email from the git hooks/post-receive script.

ebourg-guest pushed a commit to tag REL7_4_1
in repository libpostgresql-jdbc-java.

commit 0fe5c1a42ddc9db3d397ad259384ae11fc77c7c7
Author: Dave Cramer <davec at fastcrypt.com>
Date:   Fri Dec 12 18:38:19 2003 +0000

    cancel row updates sets values to null by Kris Jurka
---
 org/postgresql/jdbc2/AbstractJdbc2ResultSet.java   | 13 ++--
 .../test/jdbc2/UpdateableResultTest.java           | 76 ++++++++++++++++++----
 2 files changed, 73 insertions(+), 16 deletions(-)

diff --git a/org/postgresql/jdbc2/AbstractJdbc2ResultSet.java b/org/postgresql/jdbc2/AbstractJdbc2ResultSet.java
index 9d4a1d7..3ebd764 100644
--- a/org/postgresql/jdbc2/AbstractJdbc2ResultSet.java
+++ b/org/postgresql/jdbc2/AbstractJdbc2ResultSet.java
@@ -518,7 +518,7 @@ public abstract class AbstractJdbc2ResultSet extends org.postgresql.jdbc1.Abstra
 		{
 			doingUpdates = false;
 
-			clearRowBuffer();
+			clearRowBuffer(true);
 		}
 	}
 
@@ -661,7 +661,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);
 
 
 		}
@@ -706,7 +706,7 @@ public abstract class AbstractJdbc2ResultSet extends org.postgresql.jdbc1.Abstra
 
 
 		// make sure the underlying data is null
-		clearRowBuffer();
+		clearRowBuffer(false);
 
 		onInsertRow = true;
 		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
 	{
 		// 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();
 
diff --git a/org/postgresql/test/jdbc2/UpdateableResultTest.java b/org/postgresql/test/jdbc2/UpdateableResultTest.java
index fcd6321..362f3ac 100644
--- a/org/postgresql/test/jdbc2/UpdateableResultTest.java
+++ b/org/postgresql/test/jdbc2/UpdateableResultTest.java
@@ -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());
 		}
 	}

-- 
Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/pkg-java/libpostgresql-jdbc-java.git



More information about the pkg-java-commits mailing list