Re: PGCopyOutputStream close() v. endCopy()

From: Sehrope Sarkuni <sehrope(at)jackdb(dot)com>
To: Rob Sargent <robjsargent(at)gmail(dot)com>
Cc: pgsql-jdbc(at)lists(dot)postgresql(dot)org
Subject: Re: PGCopyOutputStream close() v. endCopy()
Date: 2019-01-11 13:36:14
Message-ID: CAH7T-aqTXbXc9QEAo83ObQjzkNGEdqW_bTZj12vmA5Y8hpk5AQ@mail.gmail.com
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: 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/

In response to

Responses

Browse pgsql-jdbc by date

  From Date Subject
Next Message Rob Sargent 2019-01-11 17:07:19 Re: PGCopyOutputStream close() v. endCopy()
Previous Message Rob Sargent 2019-01-10 16:27:27 PGCopyOutputStream close() v. endCopy()