Re: Postgres driver bug - Mailing list pgsql-jdbc

From Dave Cramer
Subject Re: Postgres driver bug
Date
Msg-id CADK3HHL4mBZBGsy+HJoXoxSog_S924iQ76ugxhyJOVdovEuKCg@mail.gmail.com
Whole thread Raw
In response to Postgres driver bug  (Nikos Viorres <nviorres@gmail.com>)
Responses Re: Postgres driver bug  (Nikos Viorres <nviorres@gmail.com>)
List pgsql-jdbc
Nikos,

What version of the driver are you using ?

From what I see getOutputStream() will always throw an exception ?

Dave

Dave Cramer

dave.cramer(at)credativ(dot)ca
http://www.credativ.ca

On 6 February 2015 at 03:57, Nikos Viorres <nviorres@gmail.com> wrote:
Hi,

The attached simple piece of code results always in a the driver going into a wait state that never receives a wake up signal and by looking at the code, even if it does it will loop again into the same wait state. If anyone else thinks this is a problem i could provide a fix

regards



package nvrs.test;

import org.postgresql.PGConnection;
import org.postgresql.copy.PGCopyInputStream;

import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;

/**
 * Date: 5/2/2015
 */
public class PostgresDriverBug {

  public static void main(String...args) throws SQLException {
    PostgresConnectionFactory connectionFactory
        = new PostgresConnectionFactory("localhost", 5432, "postgres",
                                        "postgres", "postgres");

    Connection con = connectionFactory.getNewConnection();


    try (InputStream is = getPostgresInputStream("select * from public.some_table", con);
         OutputStream os = getOutputStream()) {

      final byte[] buffer = new byte[1024 * 4];
      int read = is.read(buffer);

      while (read > 0) {
        os.write(buffer, 0, read);
        read = is.read(buffer);
      }

    } catch (IOException e) {
      System.err.println("Something bad happened " + e.getMessage());

      con.rollback();
    }

    System.out.println("Done!");
  }

  private static OutputStream getOutputStream() throws IOException {
    throw new FileNotFoundException("ooops");
  }

  private static InputStream getPostgresInputStream(String selectQuery, Connection con)
      throws SQLException {

    return new PGCopyInputStream(PGConnection.class.cast(con),
                                 "COPY (" + selectQuery +") TO STDOUT");
  }

  public static class PostgresConnectionFactory {
    private final String host;
    private final int port;
    private final String database;
    private final String user;
    private final String password;

    public PostgresConnectionFactory(final String host, final int port, final String database,
                                     final String user, final String password) {
      this.host = host;
      this.port = port;
      this.database = database;
      this.user = user;
      this.password = password;
    }

    private String getConnectionUrl() {
      return "jdbc:postgresql://" + host + ":" + port + "/" + database;
    }

    public Connection getNewConnection() throws SQLException {
      Connection con = DriverManager.getConnection(getConnectionUrl(),
                                                   user,
                                                   password);

      con.setAutoCommit(false);
      return con;
    }
  }

}

pgsql-jdbc by date:

Previous
From: Nikos Viorres
Date:
Subject: Postgres driver bug
Next
From: Nikos Viorres
Date:
Subject: Re: Postgres driver bug