diff --git a/src/interfaces/jdbc/org/postgresql/Connection.java b/src/interfaces/jdbc/org/postgresql/Connection.java index 54506257c0012735b370a52c9d3d1039ba720db6..4bdf684a60815f63404f71231e0657e4a1815e55 100644 --- a/src/interfaces/jdbc/org/postgresql/Connection.java +++ b/src/interfaces/jdbc/org/postgresql/Connection.java @@ -11,7 +11,7 @@ import org.postgresql.util.*; import org.postgresql.core.*; /* - * $Id: Connection.java,v 1.40 2001/12/11 04:44:23 barry Exp $ + * $Id: Connection.java,v 1.41 2002/02/26 02:15:54 davec Exp $ * * This abstract class is used by org.postgresql.Driver to open either the JDBC1 or * JDBC2 versions of the Connection class. @@ -91,6 +91,40 @@ public abstract class Connection public Connection() {} + public void cancelQuery() throws SQLException + { + PG_Stream cancelStream = null; + try { + cancelStream = new PG_Stream(PG_HOST, PG_PORT); + } catch (ConnectException cex) { + // Added by Peter Mount <peter@retep.org.uk> + // ConnectException is thrown when the connection cannot be made. + // we trap this an return a more meaningful message for the end user + throw new PSQLException ("postgresql.con.refused"); + } catch (IOException e) { + throw new PSQLException ("postgresql.con.failed",e); + } + + // Now we need to construct and send a cancel packet + try { + cancelStream.SendInteger(16, 4); + cancelStream.SendInteger(80877102, 4); + cancelStream.SendInteger(pid, 4); + cancelStream.SendInteger(ckey, 4); + cancelStream.flush(); + } + catch(IOException e) { + throw new PSQLException("postgresql.con.failed",e); + } + finally { + try { + if(cancelStream != null) + cancelStream.close(); + } + catch(IOException e) {} // Ignore + } + } + /* * This method actually opens the connection. It is called by Driver. * @@ -266,8 +300,8 @@ public abstract class Connection switch (beresp) { case 'K': - pid = pg_stream.ReceiveInteger(4); - ckey = pg_stream.ReceiveInteger(4); + pid = pg_stream.ReceiveIntegerR(4); + ckey = pg_stream.ReceiveIntegerR(4); break; case 'E': case 'N': @@ -281,6 +315,16 @@ public abstract class Connection switch (beresp) { case 'Z': + + try + { + pg_stream.SendChar('Q'); + pg_stream.SendChar(' '); + pg_stream.SendChar(0); + pg_stream.flush(); + } catch (IOException e) { + throw new PSQLException("postgresql.con.ioerror",e); + } break; case 'E': case 'N': @@ -448,6 +492,7 @@ public abstract class Connection * @return the user name * @exception SQLException just in case... */ + int lastMessage = 0; public String getUserName() throws SQLException { return PG_USER; diff --git a/src/interfaces/jdbc/org/postgresql/Statement.java b/src/interfaces/jdbc/org/postgresql/Statement.java index 932b93aec8010e04a3e372861b667e7935999656..dbd061bfd3910f6094872080ab330efa7c2795ba 100644 --- a/src/interfaces/jdbc/org/postgresql/Statement.java +++ b/src/interfaces/jdbc/org/postgresql/Statement.java @@ -179,7 +179,7 @@ public abstract class Statement */ public void cancel() throws SQLException { - // FIXME: Cancel feature has been available since 6.4. Implement it here! + throw new PSQLException("postgresql.unimplemented"); } /* diff --git a/src/interfaces/jdbc/org/postgresql/jdbc2/Statement.java b/src/interfaces/jdbc/org/postgresql/jdbc2/Statement.java index 19f64d25528524bc977f39a747a987f2b6d22cb5..7ca9f6d5d055eabac7807cd7d599041943707a11 100644 --- a/src/interfaces/jdbc/org/postgresql/jdbc2/Statement.java +++ b/src/interfaces/jdbc/org/postgresql/jdbc2/Statement.java @@ -211,6 +211,11 @@ public class Statement extends org.postgresql.Statement implements java.sql.Stat return result; } + public void Cancel() throws SQLException + { + connection.cancelQuery(); + } + public java.sql.Connection getConnection() throws SQLException { return (java.sql.Connection)connection;