Hello,
Attached is a patch to remove some redundant code in the JDBC driver.

* Merges identical code from org.postgresql.jdbc[1|2].Statement into
  org.postgresql.Statement.
* Moves escapeSQL() method from Connection to Statement (the only place
  it's used)
* Minor cleanup of the new isolation level stuff.
* Minor cleanup of version string handling.

/Anders
_____________________________________________________________________
A n d e r s  B e n g t s s o n                   [EMAIL PROTECTED]
Stockholm, Sweden
Index: src/interfaces/jdbc/org/postgresql/Connection.java
===================================================================
RCS file: 
/home/projects/pgsql/cvsroot/pgsql/src/interfaces/jdbc/org/postgresql/Connection.java,v

retrieving revision 1.24
diff -c -r1.24 Connection.java
*** src/interfaces/jdbc/org/postgresql/Connection.java  2001/08/07 17:45:29     1.24
--- src/interfaces/jdbc/org/postgresql/Connection.java  2001/08/08 19:51:53
***************
*** 37,43 ****
     */
    private Encoding encoding = Encoding.defaultEncoding();
  
-   private String dbVersionLong;
    private String dbVersionNumber;
  
    public boolean CONNECTION_OK = true;
--- 37,42 ----
***************
*** 257,264 ****
  
        firstWarning = null;
  
-       String dbEncoding;
- 
        // "pg_encoding_to_char(1)" will return 'EUC_JP' for a backend compiled with 
multibyte,
        // otherwise it's hardcoded to 'SQL_ASCII'.
        // If the backend doesn't know about multibyte we can't assume anything about 
the encoding
--- 256,261 ----
***************
*** 276,283 ****
        if (! resultSet.next()) {
          throw new PSQLException("postgresql.con.failed", "failed getting backend 
encoding");
        }
!       dbVersionLong = resultSet.getString(1);
!       dbEncoding = resultSet.getString(2);
        encoding = Encoding.getEncoding(dbEncoding, info.getProperty("charSet"));
  
        // Initialise object handling
--- 273,282 ----
        if (! resultSet.next()) {
          throw new PSQLException("postgresql.con.failed", "failed getting backend 
encoding");
        }
!       String version = resultSet.getString(1);
!       dbVersionNumber = extractVersionNumber(version);
! 
!       String dbEncoding = resultSet.getString(2);
        encoding = Encoding.getEncoding(dbEncoding, info.getProperty("charSet"));
  
        // Initialise object handling
***************
*** 1002,1026 ****
          //this can be simplified
          isolationLevel = level;
          String isolationLevelSQL;
-       switch(isolationLevel) {
-           case java.sql.Connection.TRANSACTION_READ_COMMITTED:
-               if (haveMinimumServerVersion("7.1")) {
-                 isolationLevelSQL = "SET SESSION CHARACTERISTICS AS TRANSACTION 
ISOLATION LEVEL READ COMMITTED";
-               } else {
-                   isolationLevelSQL = getIsolationLevelSQL();
-                 }
-                 break;
- 
-           case java.sql.Connection.TRANSACTION_SERIALIZABLE:
-               if (haveMinimumServerVersion("7.1")) {
-                 isolationLevelSQL = "SET SESSION CHARACTERISTICS AS TRANSACTION 
ISOLATION LEVEL SERIALIZABLE";
-               } else {
-                   isolationLevelSQL = getIsolationLevelSQL();
-                 }
-                 break;
  
!           default:
!               throw new PSQLException("postgresql.con.isolevel",new 
Integer(isolationLevel));
        }
        ExecSQL(isolationLevelSQL);
      }
--- 1001,1022 ----
          //this can be simplified
          isolationLevel = level;
          String isolationLevelSQL;
  
!       if (!haveMinimumServerVersion("7.1")) {
!           isolationLevelSQL = getIsolationLevelSQL();
!       } else {
!           isolationLevelSQL = "SET SESSION CHARACTERISTICS AS TRANSACTION ISOLATION 
LEVEL ";
!           switch(isolationLevel) {
!               case java.sql.Connection.TRANSACTION_READ_COMMITTED:
!                   isolationLevelSQL += "READ COMMITTED";
!                   break;
!               case java.sql.Connection.TRANSACTION_SERIALIZABLE:
!                   isolationLevelSQL += "SERIALIZABLE";
!                   break;
!               default:
!                   throw new PSQLException("postgresql.con.isolevel",
!                                           new Integer(isolationLevel));
!           }
        }
        ExecSQL(isolationLevelSQL);
      }
***************
*** 1094,1152 ****
        close();
      }
  
!     /**
!      * This is an attempt to implement SQL Escape clauses
!      */
!     public String EscapeSQL(String sql) {
!       //if (DEBUG) { System.out.println ("parseSQLEscapes called"); }
! 
!       // If we find a "{d", assume we have a date escape.
!       //
!       // Since the date escape syntax is very close to the
!       // native Postgres date format, we just remove the escape
!       // delimiters.
!       //
!       // This implementation could use some optimization, but it has
!       // worked in practice for two years of solid use.
!       int index = sql.indexOf("{d");
!       while (index != -1) {
!         //System.out.println ("escape found at index: " + index);
!         StringBuffer buf = new StringBuffer(sql);
!         buf.setCharAt(index, ' ');
!         buf.setCharAt(index + 1, ' ');
!         buf.setCharAt(sql.indexOf('}', index), ' ');
!         sql = new String(buf);
!         index = sql.indexOf("{d");
!       }
!       //System.out.println ("modified SQL: " + sql);
!       return sql;
!     }
! 
!   /**
!    * What is the version of the server
!    *
!    * @return the database version
!    * @exception SQLException if a database access error occurs
!    */
!   public String getDBVersionNumber() throws SQLException
    {
!     if(dbVersionNumber == null) {
!       StringTokenizer versionParts = new StringTokenizer(dbVersionLong);
        versionParts.nextToken(); /* "PostgreSQL" */
!       dbVersionNumber = versionParts.nextToken(); /* "X.Y.Z" */
!     }
!     return dbVersionNumber;
    }
  
    public boolean haveMinimumServerVersion(String ver) throws SQLException
    {
!       if (getDBVersionNumber().compareTo(ver)>=0)
!         return true;
!       else
!         return false;
    }
- 
- 
- 
  }
     
--- 1090,1112 ----
        close();
      }
  
!   private static String extractVersionNumber(String fullVersionString)
    {
!       StringTokenizer versionParts = new StringTokenizer(fullVersionString);
        versionParts.nextToken(); /* "PostgreSQL" */
!       return versionParts.nextToken(); /* "X.Y.Z" */
    }
  
+     /**
+      * Get server version number
+      */
+     public String getDBVersionNumber() {
+       return dbVersionNumber;
+     }
+ 
    public boolean haveMinimumServerVersion(String ver) throws SQLException
    {
!       return (getDBVersionNumber().compareTo(ver) >= 0);
    }
  }
     
Index: src/interfaces/jdbc/org/postgresql/Statement.java
===================================================================
RCS file: 
/home/projects/pgsql/cvsroot/pgsql/src/interfaces/jdbc/org/postgresql/Statement.java,v
retrieving revision 1.1
diff -c -r1.1 Statement.java
*** src/interfaces/jdbc/org/postgresql/Statement.java   2001/01/31 09:23:45     1.1
--- src/interfaces/jdbc/org/postgresql/Statement.java   2001/08/08 19:51:53
***************
*** 1,6 ****
  package org.postgresql;
  
! import java.sql.SQLException;
  
  /**
   * This class defines methods implemented by the two subclasses
--- 1,7 ----
  package org.postgresql;
  
! import java.sql.*;
! import org.postgresql.util.PSQLException;
  
  /**
   * This class defines methods implemented by the two subclasses
***************
*** 24,42 ****
  
  public abstract class Statement {
  
!   public Statement() {
!   }
  
!   /**
!     * Returns the status message from the current Result.<p>
!     * This is used internally by the driver.
!     *
!     * @return status message from backend
!     */
!   public abstract String getResultStatusString();
! 
!   /**
!    * @return the OID of the last row inserted
!    */
!   public abstract int getInsertedOID() throws SQLException;
! }
\ No newline at end of file
--- 25,251 ----
  
  public abstract class Statement {
  
!     /** The warnings chain. */
!     protected SQLWarning warnings = null;
  
!     /** The current results */
!     protected java.sql.ResultSet result = null;
! 
!     /** Maximum number of rows to return, 0 = unlimited */
!     protected int maxrows = 0;  
! 
!     /** Timeout (in seconds) for a query (not used) */
!     protected int timeout = 0;
! 
!     protected boolean escapeProcessing = true;
! 
! 
!     public Statement() {
!     }
! 
!     /**
!      * Returns the status message from the current Result.<p>
!      * This is used internally by the driver.
!      *
!      * @return status message from backend
!      */
!     public String getResultStatusString() {
!       if (result == null)
!           return null;
!       return ((org.postgresql.ResultSet) result).getStatusString();
!     }
! 
!     /**
!      * The maxRows limit is set to limit the number of rows that
!      * any ResultSet can contain.  If the limit is exceeded, the
!      * excess rows are silently dropped.
!      *
!      * @return the current maximum row limit; zero means unlimited
!      * @exception SQLException if a database access error occurs
!      */
!     public int getMaxRows() throws SQLException {
!       return maxrows;
!     }
! 
!     /**
!      * Set the maximum number of rows
!      *
!      * @param max the new max rows limit; zero means unlimited
!      * @exception SQLException if a database access error occurs
!      * @see getMaxRows
!      */
!     public void setMaxRows(int max) throws SQLException {
!       maxrows = max;
!     }
! 
!     /**
!      * If escape scanning is on (the default), the driver will do escape
!      * substitution before sending the SQL to the database.
!      *
!      * @param enable true to enable; false to disable
!      * @exception SQLException if a database access error occurs
!      */
!     public void setEscapeProcessing(boolean enable) throws SQLException {
!       escapeProcessing = enable;
!     }
! 
!     /**
!      * The queryTimeout limit is the number of seconds the driver
!      * will wait for a Statement to execute.  If the limit is
!      * exceeded, a SQLException is thrown.
!      *
!      * @return the current query timeout limit in seconds; 0 = unlimited
!      * @exception SQLException if a database access error occurs
!      */
!     public int getQueryTimeout() throws SQLException {
!       return timeout;
!     }
! 
!     /**
!      * Sets the queryTimeout limit
!      *
!      * @param seconds - the new query timeout limit in seconds
!      * @exception SQLException if a database access error occurs
!      */
!     public void setQueryTimeout(int seconds) throws SQLException {
!       timeout = seconds;
!     }
! 
!     /**
!      * The first warning reported by calls on this Statement is
!      * returned.  A Statement's execute methods clear its SQLWarning
!      * chain.  Subsequent Statement warnings will be chained to this
!      * SQLWarning.
!      *
!      * <p>The Warning chain is automatically cleared each time a statement
!      * is (re)executed.
!      *
!      * <p><B>Note:</B>  If you are processing a ResultSet then any warnings
!      * associated with ResultSet reads will be chained on the ResultSet
!      * object.
!      *
!      * @return the first SQLWarning on null
!      * @exception SQLException if a database access error occurs
!      */
!     public SQLWarning getWarnings() throws SQLException {
!       return warnings;
!     }
! 
!     /**
!      * The maxFieldSize limit (in bytes) is the maximum amount of
!      * data returned for any column value; it only applies to
!      * BINARY, VARBINARY, LONGVARBINARY, CHAR, VARCHAR and LONGVARCHAR
!      * columns.  If the limit is exceeded, the excess data is silently
!      * discarded.
!      *
!      * @return the current max column size limit; zero means unlimited
!      * @exception SQLException if a database access error occurs
!      */
!     public int getMaxFieldSize() throws SQLException {
!       return 8192;            // We cannot change this
!     }
! 
!     /**
!      * Sets the maxFieldSize - NOT! - We throw an SQLException just
!      * to inform them to stop doing this.
!      *
!      * @param max the new max column size limit; zero means unlimited
!      * @exception SQLException if a database access error occurs
!      */
!     public void setMaxFieldSize(int max) throws SQLException {
!       throw new PSQLException("postgresql.stat.maxfieldsize");
!     }
! 
!     /**
!      * After this call, getWarnings returns null until a new warning
!      * is reported for this Statement.
!      *
!      * @exception SQLException if a database access error occurs
!      */
!     public void clearWarnings() throws SQLException {
!       warnings = null;
!     }
! 
!     /**
!      * Cancel can be used by one thread to cancel a statement that
!      * is being executed by another thread.
!      * <p>
!      * Not implemented, this method is a no-op.
!      *
!      * @exception SQLException only because thats the spec.
!      */
!     public void cancel() throws SQLException {
!       // FIXME: Cancel feature has been available since 6.4. Implement it here!
!     }
! 
!     /**
!      * New in 7.1: Returns the Last inserted oid. This should be used, rather
!      * than the old method using getResultSet, which for executeUpdate returns
!      * null.
!      * @return OID of last insert
!      */
!     public int getInsertedOID() throws SQLException {
!       if (result == null)
!           return 0;
!       return ((org.postgresql.ResultSet) result).getInsertedOID();
!     }
! 
!     /**
!      * getResultSet returns the current result as a ResultSet.  It
!      * should only be called once per result.
!      *
!      * @return the current result set; null if there are no more
!      * @exception SQLException if a database access error occurs (why?)
!      */
!     public java.sql.ResultSet getResultSet() throws SQLException {
!       if (result != null && ((org.postgresql.ResultSet) result).reallyResultSet())
!             return result;
!       return null;
!     }
! 
!     /**
!      * In many cases, it is desirable to immediately release a
!      * Statement's database and JDBC resources instead of waiting
!      * for this to happen when it is automatically closed.  The
!      * close method provides this immediate release.
!      *
!      * <p><B>Note:</B> A Statement is automatically closed when it is
!      * garbage collected.  When a Statement is closed, its current
!      * ResultSet, if one exists, is also closed.
!      *
!      * @exception SQLException if a database access error occurs (why?)
!      */
!     public void close() throws SQLException {
!       // Force the ResultSet to close
!       java.sql.ResultSet rs = getResultSet();
!       if(rs!=null)
!             rs.close();
! 
!       // Disasociate it from us (For Garbage Collection)
!       result = null;
!     }
! 
!     /**
!      * This is an attempt to implement SQL Escape clauses
!      */
!     protected static String escapeSQL(String sql) {
!       // If we find a "{d", assume we have a date escape.
!       //
!       // Since the date escape syntax is very close to the
!       // native Postgres date format, we just remove the escape
!       // delimiters.
!       //
!       // This implementation could use some optimization, but it has
!       // worked in practice for two years of solid use.
!       int index = sql.indexOf("{d");
!       while (index != -1) {
!         StringBuffer buf = new StringBuffer(sql);
!         buf.setCharAt(index, ' ');
!         buf.setCharAt(index + 1, ' ');
!         buf.setCharAt(sql.indexOf('}', index), ' ');
!         sql = new String(buf);
!         index = sql.indexOf("{d");
!       }
!       return sql;
!     }
! }
Index: src/interfaces/jdbc/org/postgresql/jdbc1/Statement.java
===================================================================
RCS file: 
/home/projects/pgsql/cvsroot/pgsql/src/interfaces/jdbc/org/postgresql/jdbc1/Statement.java,v

retrieving revision 1.9
diff -c -r1.9 Statement.java
*** src/interfaces/jdbc/org/postgresql/jdbc1/Statement.java     2001/05/16 16:20:53    
 1.9
--- src/interfaces/jdbc/org/postgresql/jdbc1/Statement.java     2001/08/08 19:51:54
***************
*** 24,35 ****
   */
  public class Statement extends org.postgresql.Statement implements 
java.sql.Statement
  {
!     Connection connection;            // The connection who created us
!     java.sql.ResultSet result = null; // The current results
!     SQLWarning warnings = null;       // The warnings chain.
!     int timeout = 0;          // The timeout for a query (not used)
!     boolean escapeProcessing = true;// escape processing flag
!     int maxrows=0;
  
        /**
         * Constructor for a Statement.  It simply sets the connection
--- 24,30 ----
   */
  public class Statement extends org.postgresql.Statement implements 
java.sql.Statement
  {
!     private Connection connection;            // The connection who created us
  
        /**
         * Constructor for a Statement.  It simply sets the connection
***************
*** 77,242 ****
        }
  
        /**
-        * In many cases, it is desirable to immediately release a
-        * Statement's database and JDBC resources instead of waiting
-        * for this to happen when it is automatically closed.  The
-        * close method provides this immediate release.
-        *
-        * <p><B>Note:</B> A Statement is automatically closed when it is
-        * garbage collected.  When a Statement is closed, its current
-        * ResultSet, if one exists, is also closed.
-        *
-        * @exception SQLException if a database access error occurs (why?)
-        */
-       public void close() throws SQLException
-       {
-           // Force the ResultSet to close
-           java.sql.ResultSet rs = getResultSet();
-           if(rs!=null)
-             rs.close();
- 
-           // Disasociate it from us (For Garbage Collection)
-           result = null;
-       }
- 
-       /**
-        * The maxFieldSize limit (in bytes) is the maximum amount of
-        * data returned for any column value; it only applies to
-        * BINARY, VARBINARY, LONGVARBINARY, CHAR, VARCHAR and LONGVARCHAR
-        * columns.  If the limit is exceeded, the excess data is silently
-        * discarded.
-        *
-        * @return the current max column size limit; zero means unlimited
-        * @exception SQLException if a database access error occurs
-        */
-       public int getMaxFieldSize() throws SQLException
-       {
-               return 8192;            // We cannot change this
-       }
- 
-       /**
-        * Sets the maxFieldSize - NOT! - We throw an SQLException just
-        * to inform them to stop doing this.
-        *
-        * @param max the new max column size limit; zero means unlimited
-        * @exception SQLException if a database access error occurs
-        */
-       public void setMaxFieldSize(int max) throws SQLException
-       {
-               throw new PSQLException("postgresql.stat.maxfieldsize");
-       }
- 
-       /**
-        * The maxRows limit is set to limit the number of rows that
-        * any ResultSet can contain.  If the limit is exceeded, the
-        * excess rows are silently dropped.
-        *
-        * @return the current maximum row limit; zero means unlimited
-        * @exception SQLException if a database access error occurs
-        */
-       public int getMaxRows() throws SQLException
-       {
-               return maxrows;
-       }
- 
-       /**
-        * Set the maximum number of rows
-        *
-        * @param max the new max rows limit; zero means unlimited
-        * @exception SQLException if a database access error occurs
-        * @see getMaxRows
-        */
-       public void setMaxRows(int max) throws SQLException
-       {
-         maxrows = max;
-       }
- 
-       /**
-        * If escape scanning is on (the default), the driver will do escape
-        * substitution before sending the SQL to the database.
-        *
-        * @param enable true to enable; false to disable
-        * @exception SQLException if a database access error occurs
-        */
-       public void setEscapeProcessing(boolean enable) throws SQLException
-       {
-               escapeProcessing = enable;
-       }
- 
-       /**
-        * The queryTimeout limit is the number of seconds the driver
-        * will wait for a Statement to execute.  If the limit is
-        * exceeded, a SQLException is thrown.
-        *
-        * @return the current query timeout limit in seconds; 0 = unlimited
-        * @exception SQLException if a database access error occurs
-        */
-       public int getQueryTimeout() throws SQLException
-       {
-               return timeout;
-       }
- 
-       /**
-        * Sets the queryTimeout limit
-        *
-        * @param seconds - the new query timeout limit in seconds
-        * @exception SQLException if a database access error occurs
-        */
-       public void setQueryTimeout(int seconds) throws SQLException
-       {
-               timeout = seconds;
-       }
- 
-       /**
-        * Cancel can be used by one thread to cancel a statement that
-        * is being executed by another thread.  However, PostgreSQL is
-        * a sync. sort of thing, so this really has no meaning - we
-        * define it as a no-op (i.e. you can't cancel, but there is no
-        * error if you try.)
-        *
-        * 6.4 introduced a cancel operation, but we have not implemented it
-        * yet. Sometime before 6.5, this method will be implemented.
-        *
-        * @exception SQLException only because thats the spec.
-        */
-       public void cancel() throws SQLException
-       {
-               // No-op
-       }
- 
-       /**
-        * The first warning reported by calls on this Statement is
-        * returned.  A Statement's execute methods clear its SQLWarning
-        * chain.  Subsequent Statement warnings will be chained to this
-        * SQLWarning.
-        *
-        * <p>The Warning chain is automatically cleared each time a statement
-        * is (re)executed.
-        *
-        * <p><B>Note:</B>  If you are processing a ResultSet then any warnings
-        * associated with ResultSet reads will be chained on the ResultSet
-        * object.
-        *
-        * @return the first SQLWarning on null
-        * @exception SQLException if a database access error occurs
-        */
-       public SQLWarning getWarnings() throws SQLException
-       {
-               return warnings;
-       }
- 
-       /**
-        * After this call, getWarnings returns null until a new warning
-        * is reported for this Statement.
-        *
-        * @exception SQLException if a database access error occurs (why?)
-        */
-       public void clearWarnings() throws SQLException
-       {
-               warnings = null;
-       }
- 
-       /**
         * setCursorName defines the SQL cursor name that will be used by
         * subsequent execute methods.  This name can then be used in SQL
         * positioned update/delete statements to identify the current row
--- 72,77 ----
***************
*** 273,299 ****
         */
        public boolean execute(String sql) throws SQLException
        {
!           if(escapeProcessing)
!             sql=connection.EscapeSQL(sql);
            result = connection.ExecSQL(sql);
            return (result != null && 
((org.postgresql.ResultSet)result).reallyResultSet());
        }
  
        /**
-        * getResultSet returns the current result as a ResultSet.  It
-        * should only be called once per result.
-        *
-        * @return the current result set; null if there are no more
-        * @exception SQLException if a database access error occurs (why?)
-        */
-       public java.sql.ResultSet getResultSet() throws SQLException
-       {
-           if (result != null && 
((org.postgresql.ResultSet)result).reallyResultSet())
-             return result;
-           return null;
-       }
- 
-       /**
         * getUpdateCount returns the current result as an update count,
         * if the result is a ResultSet or there are no more results, -1
         * is returned.  It should only be called once per result.
--- 108,120 ----
         */
        public boolean execute(String sql) throws SQLException
        {
!           if (escapeProcessing)
!             sql = escapeSql(sql);
            result = connection.ExecSQL(sql);
            return (result != null && 
((org.postgresql.ResultSet)result).reallyResultSet());
        }
  
        /**
         * getUpdateCount returns the current result as an update count,
         * if the result is a ResultSet or there are no more results, -1
         * is returned.  It should only be called once per result.
***************
*** 320,350 ****
                result = ((org.postgresql.ResultSet)result).getNext();
                return (result != null && 
((org.postgresql.ResultSet)result).reallyResultSet());
        }
- 
-    /**
-     * Returns the status message from the current Result.<p>
-     * This is used internally by the driver.
-     *
-     * @return status message from backend
-     */
-    public String getResultStatusString()
-    {
-      if(result == null)
-        return null;
-      return ((org.postgresql.ResultSet)result).getStatusString();
-    }
- 
-     /**
-      * New in 7.1: Returns the Last inserted oid. This should be used, rather
-      * than the old method using getResultSet, which for executeUpdate returns
-      * null.
-      * @return OID of last insert
-      */
-     public int getInsertedOID() throws SQLException
-     {
-       if(result!=null)
-         return ((org.postgresql.ResultSet)result).getInsertedOID();
-       return 0;
-     }
- 
  }
--- 141,144 ----
Index: src/interfaces/jdbc/org/postgresql/jdbc2/Statement.java
===================================================================
RCS file: 
/home/projects/pgsql/cvsroot/pgsql/src/interfaces/jdbc/org/postgresql/jdbc2/Statement.java,v

retrieving revision 1.10
diff -c -r1.10 Statement.java
*** src/interfaces/jdbc/org/postgresql/jdbc2/Statement.java     2001/02/16 16:45:00    
 1.10
--- src/interfaces/jdbc/org/postgresql/jdbc2/Statement.java     2001/08/08 19:51:55
***************
*** 24,38 ****
   */
  public class Statement extends org.postgresql.Statement implements 
java.sql.Statement
  {
!     Connection connection;            // The connection who created us
!     java.sql.ResultSet result = null; // The current results
!     SQLWarning warnings = null;       // The warnings chain.
!     int timeout = 0;          // The timeout for a query (not used)
!     boolean escapeProcessing = true;// escape processing flag
      private Vector batch=null;
!     int resultsettype;                // the resultset type to return
!     int concurrency;         // is it updateable or not?
!     int maxrows=0;            // the maximum number of rows to return 0=unlimited
  
        /**
         * Constructor for a Statement.  It simply sets the connection
--- 24,33 ----
   */
  public class Statement extends org.postgresql.Statement implements 
java.sql.Statement
  {
!     private Connection connection;            // The connection who created us
      private Vector batch=null;
!     private int resultsettype;                // the resultset type to return
!     private int concurrency;         // is it updateable or not?
  
        /**
         * Constructor for a Statement.  It simply sets the connection
***************
*** 82,247 ****
        }
  
        /**
-        * In many cases, it is desirable to immediately release a
-        * Statement's database and JDBC resources instead of waiting
-        * for this to happen when it is automatically closed.  The
-        * close method provides this immediate release.
-        *
-        * <p><B>Note:</B> A Statement is automatically closed when it is
-        * garbage collected.  When a Statement is closed, its current
-        * ResultSet, if one exists, is also closed.
-        *
-        * @exception SQLException if a database access error occurs (why?)
-        */
-       public void close() throws SQLException
-       {
-           // Force the ResultSet to close
-           java.sql.ResultSet rs = getResultSet();
-           if(rs!=null)
-             rs.close();
- 
-           // Disasociate it from us (For Garbage Collection)
-           result = null;
-       }
- 
-       /**
-        * The maxFieldSize limit (in bytes) is the maximum amount of
-        * data returned for any column value; it only applies to
-        * BINARY, VARBINARY, LONGVARBINARY, CHAR, VARCHAR and LONGVARCHAR
-        * columns.  If the limit is exceeded, the excess data is silently
-        * discarded.
-        *
-        * @return the current max column size limit; zero means unlimited
-        * @exception SQLException if a database access error occurs
-        */
-       public int getMaxFieldSize() throws SQLException
-       {
-               return 8192;            // We cannot change this
-       }
- 
-       /**
-        * Sets the maxFieldSize - NOT! - We throw an SQLException just
-        * to inform them to stop doing this.
-        *
-        * @param max the new max column size limit; zero means unlimited
-        * @exception SQLException if a database access error occurs
-        */
-       public void setMaxFieldSize(int max) throws SQLException
-       {
-               throw new PSQLException("postgresql.stat.maxfieldsize");
-       }
- 
-       /**
-        * The maxRows limit is set to limit the number of rows that
-        * any ResultSet can contain.  If the limit is exceeded, the
-        * excess rows are silently dropped.
-        *
-        * @return the current maximum row limit; zero means unlimited
-        * @exception SQLException if a database access error occurs
-        */
-       public int getMaxRows() throws SQLException
-       {
-               return maxrows;
-       }
- 
-       /**
-        * Set the maximum number of rows
-        *
-        * @param max the new max rows limit; zero means unlimited
-        * @exception SQLException if a database access error occurs
-        * @see getMaxRows
-        */
-       public void setMaxRows(int max) throws SQLException
-       {
-         maxrows = max;
-       }
- 
-       /**
-        * If escape scanning is on (the default), the driver will do escape
-        * substitution before sending the SQL to the database.
-        *
-        * @param enable true to enable; false to disable
-        * @exception SQLException if a database access error occurs
-        */
-       public void setEscapeProcessing(boolean enable) throws SQLException
-       {
-               escapeProcessing = enable;
-       }
- 
-       /**
-        * The queryTimeout limit is the number of seconds the driver
-        * will wait for a Statement to execute.  If the limit is
-        * exceeded, a SQLException is thrown.
-        *
-        * @return the current query timeout limit in seconds; 0 = unlimited
-        * @exception SQLException if a database access error occurs
-        */
-       public int getQueryTimeout() throws SQLException
-       {
-               return timeout;
-       }
- 
-       /**
-        * Sets the queryTimeout limit
-        *
-        * @param seconds - the new query timeout limit in seconds
-        * @exception SQLException if a database access error occurs
-        */
-       public void setQueryTimeout(int seconds) throws SQLException
-       {
-               timeout = seconds;
-       }
- 
-       /**
-        * Cancel can be used by one thread to cancel a statement that
-        * is being executed by another thread.  However, PostgreSQL is
-        * a sync. sort of thing, so this really has no meaning - we
-        * define it as a no-op (i.e. you can't cancel, but there is no
-        * error if you try.)
-        *
-        * 6.4 introduced a cancel operation, but we have not implemented it
-        * yet. Sometime before 6.5, this method will be implemented.
-        *
-        * @exception SQLException only because thats the spec.
-        */
-       public void cancel() throws SQLException
-       {
-               // No-op
-       }
- 
-       /**
-        * The first warning reported by calls on this Statement is
-        * returned.  A Statement's execute methods clear its SQLWarning
-        * chain.  Subsequent Statement warnings will be chained to this
-        * SQLWarning.
-        *
-        * <p>The Warning chain is automatically cleared each time a statement
-        * is (re)executed.
-        *
-        * <p><B>Note:</B>  If you are processing a ResultSet then any warnings
-        * associated with ResultSet reads will be chained on the ResultSet
-        * object.
-        *
-        * @return the first SQLWarning on null
-        * @exception SQLException if a database access error occurs
-        */
-       public SQLWarning getWarnings() throws SQLException
-       {
-               return warnings;
-       }
- 
-       /**
-        * After this call, getWarnings returns null until a new warning
-        * is reported for this Statement.
-        *
-        * @exception SQLException if a database access error occurs (why?)
-        */
-       public void clearWarnings() throws SQLException
-       {
-               warnings = null;
-       }
- 
-       /**
         * setCursorName defines the SQL cursor name that will be used by
         * subsequent execute methods.  This name can then be used in SQL
         * positioned update/delete statements to identify the current row
--- 77,82 ----
***************
*** 278,285 ****
         */
      public boolean execute(String sql) throws SQLException
      {
!       if(escapeProcessing)
!           sql=connection.EscapeSQL(sql);
  
          // New in 7.1, if we have a previous resultset then force it to close
          // This brings us nearer to compliance, and helps memory management.
--- 113,120 ----
         */
      public boolean execute(String sql) throws SQLException
      {
!       if (escapeProcessing)
!           sql = escapeSQL(sql);
  
          // New in 7.1, if we have a previous resultset then force it to close
          // This brings us nearer to compliance, and helps memory management.
***************
*** 300,319 ****
      }
  
        /**
-        * getResultSet returns the current result as a ResultSet.  It
-        * should only be called once per result.
-        *
-        * @return the current result set; null if there are no more
-        * @exception SQLException if a database access error occurs (why?)
-        */
-       public java.sql.ResultSet getResultSet() throws SQLException
-       {
-           if (result != null && 
((org.postgresql.ResultSet)result).reallyResultSet())
-             return result;
-           return null;
-       }
- 
-       /**
         * getUpdateCount returns the current result as an update count,
         * if the result is a ResultSet or there are no more results, -1
         * is returned.  It should only be called once per result.
--- 135,140 ----
***************
*** 341,359 ****
                return (result != null && 
((org.postgresql.ResultSet)result).reallyResultSet());
        }
  
-    /**
-     * Returns the status message from the current Result.<p>
-     * This is used internally by the driver.
-     *
-     * @return status message from backend
-     */
-    public String getResultStatusString()
-    {
-      if(result == null)
-        return null;
-      return ((org.postgresql.ResultSet)result).getStatusString();
-    }
- 
      // ** JDBC 2 Extensions **
  
      public void addBatch(String sql) throws SQLException
--- 162,167 ----
***************
*** 442,459 ****
      {
        resultsettype=value;
      }
- 
-     /**
-      * New in 7.1: Returns the Last inserted oid. This should be used, rather
-      * than the old method using getResultSet, which for executeUpdate returns
-      * null.
-      * @return OID of last insert
-      */
-     public int getInsertedOID() throws SQLException
-     {
-       if(result!=null)
-         return ((org.postgresql.ResultSet)result).getInsertedOID();
-       return 0;
-     }
- 
  }
--- 250,253 ----

---------------------------(end of broadcast)---------------------------
TIP 3: if posting/reading through Usenet, please send an appropriate
subscribe-nomail command to [EMAIL PROTECTED] so that your
message can get through to the mailing list cleanly

Reply via email to