Implementation for cancelQuery by Grant Finnemore <grantf@guruhut.co.za>
authorDave Cramer <davec@fastcrypt.com>
Tue, 26 Feb 2002 02:15:55 +0000 (02:15 +0000)
committerDave Cramer <davec@fastcrypt.com>
Tue, 26 Feb 2002 02:15:55 +0000 (02:15 +0000)
src/interfaces/jdbc/org/postgresql/Connection.java
src/interfaces/jdbc/org/postgresql/Statement.java
src/interfaces/jdbc/org/postgresql/jdbc2/Statement.java

index 54506257c0012735b370a52c9d3d1039ba720db6..4bdf684a60815f63404f71231e0657e4a1815e55 100644 (file)
@@ -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;
index 932b93aec8010e04a3e372861b667e7935999656..dbd061bfd3910f6094872080ab330efa7c2795ba 100644 (file)
@@ -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"); 
    }
 
    /*
index 19f64d25528524bc977f39a747a987f2b6d22cb5..7ca9f6d5d055eabac7807cd7d599041943707a11 100644 (file)
@@ -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;