[libpostgresql-jdbc-java] 89/93: backpatch exception during close of fully read stream from romank0

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


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

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

commit df4f8367bcf35ffa946ba0ec4e5ec78255166216
Author: Dave Cramer <davecramer at gmail.com>
Date:   Tue Jul 8 15:58:09 2014 -0400

    backpatch exception during close of fully read stream from romank0
---
 org/postgresql/copy/PGCopyInputStream.java         | 16 ++--
 .../test/jdbc4/PGCopyInputStreamTest.java          | 92 ++++++++++++++++++++++
 2 files changed, 101 insertions(+), 7 deletions(-)

diff --git a/org/postgresql/copy/PGCopyInputStream.java b/org/postgresql/copy/PGCopyInputStream.java
index 8450475..f540541 100644
--- a/org/postgresql/copy/PGCopyInputStream.java
+++ b/org/postgresql/copy/PGCopyInputStream.java
@@ -115,12 +115,14 @@ public class PGCopyInputStream extends InputStream implements CopyOut {
         if (op == null)
             return;
 
-        try {
-            op.cancelCopy();
-        } catch(SQLException se) {
-            IOException ioe = new IOException("Failed to close copy reader.");
-            ioe.initCause(se);
-            throw ioe;
+        if (op.isActive()) {
+	        try {
+	            op.cancelCopy();
+	        } catch(SQLException se) {
+	            IOException ioe = new IOException("Failed to close copy reader.");
+	            ioe.initCause(se);
+	            throw ioe;
+	        }
         }
         op = null;
     }
@@ -142,7 +144,7 @@ public class PGCopyInputStream extends InputStream implements CopyOut {
     }
 
     public boolean isActive() {
-        return op.isActive();
+        return op != null && op.isActive();
     }
 
     public long getHandledRowCount() {
diff --git a/org/postgresql/test/jdbc4/PGCopyInputStreamTest.java b/org/postgresql/test/jdbc4/PGCopyInputStreamTest.java
new file mode 100644
index 0000000..7c5f921
--- /dev/null
+++ b/org/postgresql/test/jdbc4/PGCopyInputStreamTest.java
@@ -0,0 +1,92 @@
+package org.postgresql.test.jdbc4;
+
+import java.io.IOException;
+import java.sql.Connection;
+import java.sql.PreparedStatement;
+import java.sql.SQLException;
+
+import org.postgresql.PGConnection;
+import org.postgresql.copy.PGCopyInputStream;
+import org.postgresql.test.TestUtil;
+
+import junit.framework.TestCase;
+
+public class PGCopyInputStreamTest extends TestCase {
+    private Connection _conn;
+    private PGCopyInputStream sut;
+
+    public PGCopyInputStreamTest(String name) {
+        super(name);
+    }
+
+    protected void setUp() throws Exception {
+        _conn = TestUtil.openDB();
+        TestUtil.createTable(_conn, "cpinstreamtest", "i int");
+    }
+
+    protected void tearDown() throws SQLException {
+    	silentlyCloseStream(sut);
+        TestUtil.dropTable(_conn, "cpinstreamtest");
+        TestUtil.closeDB(_conn);
+    }
+    
+    public void testReadBytesCorrectlyHandlesEof() throws SQLException, IOException {
+    	insertSomeData();
+    	
+    	sut = new PGCopyInputStream((PGConnection) _conn, "COPY cpinstreamtest (i) TO STDOUT WITH (FORMAT CSV, HEADER false)");
+    	
+    	byte[] buf = new byte[100]; // large enough to read everything on the next step
+    	assertTrue(sut.read(buf) > 0);
+    	
+    	assertEquals(-1, sut.read(buf));
+    }
+
+    public void testReadBytesCorrectlyReadsDataInChunks() throws SQLException, IOException {
+    	insertSomeData();
+    	
+    	sut = new PGCopyInputStream((PGConnection) _conn, "COPY (select i from cpinstreamtest order by i asc) TO STDOUT WITH (FORMAT CSV, HEADER false)");
+    	
+    	byte[] buf = new byte[2]; // small enough to read in multiple chunks
+    	StringBuilder result = new StringBuilder(100);
+    	int chunks = 0;
+    	while (sut.read(buf) > 0) {
+    		result.append(new String(buf));
+    		++chunks;
+    	}
+    	
+    	assertEquals(4, chunks);
+    	assertEquals("0\n1\n2\n3\n", result.toString());
+    }
+    
+    public void testStreamCanBeClosedAfterReadUp() throws SQLException, IOException {
+    	insertSomeData();
+    	
+    	sut = new PGCopyInputStream((PGConnection) _conn, "COPY (select i from cpinstreamtest order by i asc) TO STDOUT WITH (FORMAT CSV, HEADER false)");
+    	
+    	byte[] buff = new byte[100];
+		while(sut.read(buff) > 0);
+		
+		sut.close();
+    }
+    
+	private void silentlyCloseStream(PGCopyInputStream sut) {
+		if (sut != null) {
+			try {
+				if (sut.isActive()) {
+					sut.close();
+				}
+			} catch (IOException e) {
+				// intentionally ignore 
+			}
+		}
+	}
+
+	private void insertSomeData() throws SQLException {
+		PreparedStatement pstmt = _conn.prepareStatement("insert into cpinstreamtest (i) values (?)");
+		for (int i = 0; i < 4; ++i) {
+	    	pstmt.setInt(1, i);
+	    	pstmt.addBatch();    	
+		}
+		pstmt.executeBatch();
+	}
+}

-- 
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