[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