Re: PGCopyOutputStream close() v. endCopy() - Mailing list pgsql-jdbc

From Sehrope Sarkuni
Subject Re: PGCopyOutputStream close() v. endCopy()
Date
Msg-id CAH7T-aqTXbXc9QEAo83ObQjzkNGEdqW_bTZj12vmA5Y8hpk5AQ@mail.gmail.com
Whole thread Raw
In response to PGCopyOutputStream close() v. endCopy()  (Rob Sargent <robjsargent@gmail.com>)
Responses Re: PGCopyOutputStream close() v. endCopy()  (Rob Sargent <robjsargent@gmail.com>)
List pgsql-jdbc
You're getting that error because endCopy() is being called twice. Once by you explicitly in deliverSegments() and again when the PGCopyOutputStream gets automatically closed by the try-with-resources: https://github.com/pgjdbc/pgjdbc/blob/master/pgjdbc/src/main/java/org/postgresql/copy/PGCopyOutputStream.java#L98-L112

PGCopyOutputStream is a wrapper CopyIn (write to OutputStream => COPY TO STDIN) that adds some buffering. You shouldn't be calling endCopy() on it.

You can either:

1. Remove the PGCopyOutputStream.endCopy() entirely as close() will handle it. If do not need the final row count then you're done.
2. Use CopyIn directly, manage the buffer yourself, and call endCopy() on it.
3. Manually manage the resources for PGCopyOutputStream so you can reference it for getHandledRowCount() after the close().
4. Call close() instead of endCopy() on PGCopyOutputStream as it handles being invoked more than once (it's a no-op for subsequent close() calls).

I'm going to take a look why PGCopyOutputStream.endCopy() is declared public as currently there's no way to call both it and close() without getting an error, and you're definitely supposed to call close(). Either it should not be public or it should be performing the same work as close(), i.e. clearing the internal "op" (copy operation) member to indicate that the close is complete so subsequent close() calls are not errant.

Regards,
-- Sehrope Sarkuni
Founder & CEO | JackDB, Inc. | https://www.jackdb.com/

pgsql-jdbc by date:

Previous
From: Rob Sargent
Date:
Subject: PGCopyOutputStream close() v. endCopy()
Next
From: Rob Sargent
Date:
Subject: Re: PGCopyOutputStream close() v. endCopy()