Fix resultset results after updateBinaryStream

From: Mikko Tiihonen <mikko(dot)tiihonen(at)iki(dot)fi>
To: pgsql-jdbc <pgsql-jdbc(at)postgresql(dot)org>
Subject: Fix resultset results after updateBinaryStream
Date: 2007-07-20 23:02:24
Message-ID: 1184972544.1632.55.camel@dual.local
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-jdbc

Hi,

The current UpdateableResultSet tests did not properly test more complex binary data updating.
The following patch makes the test a bit harder and fixes the driver to pass the test.

Index: org/postgresql/test/jdbc2/UpdateableResultTest.java
===================================================================
RCS file: /usr/local/cvsroot/pgjdbc/pgjdbc/org/postgresql/test/jdbc2/UpdateableResultTest.java,v
retrieving revision 1.24
diff -u -r1.24 UpdateableResultTest.java
--- org/postgresql/test/jdbc2/UpdateableResultTest.java 16 Apr 2007 16:36:41 -0000 1.24
+++ org/postgresql/test/jdbc2/UpdateableResultTest.java 20 Jul 2007 22:28:21 -0000
@@ -10,6 +10,8 @@
package org.postgresql.test.jdbc2;

import java.sql.*;
+import java.util.Arrays;
+
import junit.framework.TestCase;

import java.io.InputStream;
@@ -238,25 +240,26 @@
String string = "Hello";
InputStream asi = new ByteArrayInputStream(string.getBytes("US-ASCII"));
Reader chr = new StringReader(string);
- InputStream bin = new ByteArrayInputStream(string.getBytes("US-ASCII"));
+ byte[] bytes = new byte[]{0,'\\',(byte) 128,(byte) 255};
+ InputStream bin = new ByteArrayInputStream(bytes);

rs.updateInt("id", 2);
rs.updateAsciiStream("asi", asi, 5);
rs.updateCharacterStream("chr", chr, 5);
- rs.updateBinaryStream("bin", bin, 5);
+ rs.updateBinaryStream("bin", bin, bytes.length);
rs.updateRow();

assertEquals(2, rs.getInt(1));
assertEquals(string, rs.getString(2));
assertEquals(string, rs.getString(3));
- assertEquals(string, rs.getString(4));
+ assertEquals("Got wrong bytes immediately after update", Arrays.toString(bytes), Arrays.toString(rs.getBytes(4)));

rs.refreshRow();

assertEquals(2, rs.getInt(1));
assertEquals(string, rs.getString(2));
assertEquals(string, rs.getString(3));
- assertEquals(string, rs.getString(4));
+ assertEquals("Got wrong bytes from database", Arrays.toString(bytes), Arrays.toString(rs.getBytes(4)));

rs.close();
stmt.close();
Index: org/postgresql/jdbc2/AbstractJdbc2ResultSet.java
===================================================================
RCS file: /usr/local/cvsroot/pgjdbc/pgjdbc/org/postgresql/jdbc2/AbstractJdbc2ResultSet.java,v
retrieving revision 1.94
diff -u -r1.94 AbstractJdbc2ResultSet.java
--- org/postgresql/jdbc2/AbstractJdbc2ResultSet.java 16 Apr 2007 16:36:41 -0000 1.94
+++ org/postgresql/jdbc2/AbstractJdbc2ResultSet.java 20 Jul 2007 22:28:21 -0000
@@ -1205,6 +1205,7 @@

if ( rs.next() )
{
+ System.arraycopy(rs.fields, 0, fields, 0, numColumns);
rowBuffer = rs.rowBuffer;
}

@@ -1657,6 +1658,7 @@
{
String columnName = (String) columns.next();
int columnIndex = findColumn( columnName ) - 1;
+ fields[columnIndex].setFormat(Field.TEXT_FORMAT);

Object valueObject = updateValues.get(columnName);
if (valueObject instanceof NullObject)
@@ -1709,6 +1711,13 @@
// Should never happen?
break;

+ case Types.BINARY:
+ case Types.LONGVARBINARY:
+ case Types.VARBINARY:
+ fields[columnIndex].setFormat(Field.BINARY_FORMAT);
+ rowBuffer[columnIndex] = (byte[]) valueObject;
+ break;
+
default:
rowBuffer[columnIndex] = (byte[]) valueObject;
}

Responses

Browse pgsql-jdbc by date

  From Date Subject
Next Message Mikko Tiihonen 2007-07-21 11:31:58 Clean up wasNullFlag usage
Previous Message Mikko Tiihonen 2007-07-20 20:18:37 Test code for ResultSet numeric getXXX methods