diff --git a/src/interfaces/jdbc/org/postgresql/Driver.java.in b/src/interfaces/jdbc/org/postgresql/Driver.java.in index 5263cf9d0b6e14681d0a1ef843f3ce35e9c5011e..a6d0fb03a257332a819443545e0f8ae9cfcabd6e 100644 --- a/src/interfaces/jdbc/org/postgresql/Driver.java.in +++ b/src/interfaces/jdbc/org/postgresql/Driver.java.in @@ -27,11 +27,13 @@ import org.postgresql.util.PSQLException; public class Driver implements java.sql.Driver { - protected static final int DEBUG = 0; - protected static final int INFO = 1; - protected static final int WARN = 2; - protected static final int ERROR = 3; - protected static final int FATAL = 4; + // make these public so they can be used in setLogLevel below + + public static final int DEBUG = 0; + public static final int INFO = 1; + public static final int WARN = 2; + public static final int ERROR = 3; + public static final int FATAL = 4; private static int logLevel = FATAL; @@ -439,6 +441,18 @@ public class Driver implements java.sql.Driver { return new PSQLException("postgresql.unimplemented"); } + + /** + * used to turn logging on to a certain level, can be called + * by specifying fully qualified class ie org.postgresql.Driver.setLogLevel() + * @param int logLevel sets the level which logging will respond to + * FATAL being almost no messages + * DEBUG most verbose + */ + public static void setLogLevel(int logLevel) + { + Driver.logLevel = logLevel; + } /* * logging message at the debug level * messages will be printed if the logging level is less or equal to DEBUG diff --git a/src/interfaces/jdbc/org/postgresql/core/QueryExecutor.java b/src/interfaces/jdbc/org/postgresql/core/QueryExecutor.java index f5b9aef492fc5b4e262223f70ed8815ff8415ca1..72877e5e4ce4aec77eb83471042cf9887aa17dfb 100644 --- a/src/interfaces/jdbc/org/postgresql/core/QueryExecutor.java +++ b/src/interfaces/jdbc/org/postgresql/core/QueryExecutor.java @@ -13,7 +13,7 @@ import org.postgresql.util.PSQLException; * <p>The lifetime of a QueryExecutor object is from sending the query * until the response has been received from the backend. * - * $Id: QueryExecutor.java,v 1.8 2002/03/05 20:11:57 davec Exp $ + * $Id: QueryExecutor.java,v 1.9 2002/03/16 02:15:23 davec Exp $ */ public class QueryExecutor @@ -58,6 +58,8 @@ public class QueryExecutor int fqp = 0; boolean hfr = false; + StringBuffer errorMessage = null; + synchronized (pg_stream) { @@ -91,7 +93,19 @@ public class QueryExecutor receiveTuple(false); break; case 'E': // Error Message - throw new SQLException(pg_stream.ReceiveString(connection.getEncoding())); + + // it's possible to get more than one error message for a query + // see libpq comments wrt backend closing a connection + // so, append messages to a string buffer and keep processing + // check at the bottom to see if we need to throw an exception + + if ( errorMessage == null ) + errorMessage = new StringBuffer(); + + errorMessage.append(pg_stream.ReceiveString(connection.getEncoding())); + // keep processing + break; + case 'I': // Empty Query int t = pg_stream.ReceiveChar(); if (t != 0) @@ -117,6 +131,10 @@ public class QueryExecutor throw new PSQLException("postgresql.con.type", new Character((char) c)); } + + // did we get an error during this query? + if ( errorMessage != null ) + throw new SQLException( errorMessage.toString() ); } return connection.getResultSet(connection, statement, fields, tuples, status, update_count, insert_oid, binaryCursor); }