Index: src/interfaces/jdbc/org/postgresql/PG_Stream.java =================================================================== RCS file: /projects/cvsroot/pgsql-server/src/interfaces/jdbc/org/postgresql/PG_Stream.java,v retrieving revision 1.17 diff -c -p -r1.17 PG_Stream.java *** src/interfaces/jdbc/org/postgresql/PG_Stream.java 2002/08/20 04:26:02 1.17 --- src/interfaces/jdbc/org/postgresql/PG_Stream.java 2002/11/22 19:11:02 *************** public class PG_Stream *** 137,147 **** { c = pg_input.read(); if (c < 0) ! throw new PSQLException("postgresql.stream.eof"); } catch (IOException e) { ! throw new PSQLException("postgresql.stream.ioerror", e); } return c; } --- 137,147 ---- { c = pg_input.read(); if (c < 0) ! throw new PSQLException("postgresql.stream.eof", PSQLException.comm_link_error); } catch (IOException e) { ! throw new PSQLException("postgresql.stream.ioerror", PSQLException.comm_link_error, e); } return c; } *************** public class PG_Stream *** 164,176 **** int b = pg_input.read(); if (b < 0) ! throw new PSQLException("postgresql.stream.eof"); n = n | (b << (8 * i)) ; } } catch (IOException e) { ! throw new PSQLException("postgresql.stream.ioerror", e); } return n; } --- 164,176 ---- int b = pg_input.read(); if (b < 0) ! throw new PSQLException("postgresql.stream.eof", PSQLException.comm_link_error); n = n | (b << (8 * i)) ; } } catch (IOException e) { ! throw new PSQLException("postgresql.stream.ioerror", PSQLException.comm_link_error, e); } return n; } *************** public class PG_Stream *** 193,205 **** int b = pg_input.read(); if (b < 0) ! throw new PSQLException("postgresql.stream.eof"); n = b | (n << 8); } } catch (IOException e) { ! throw new PSQLException("postgresql.stream.ioerror", e); } return n; } --- 193,205 ---- int b = pg_input.read(); if (b < 0) ! throw new PSQLException("postgresql.stream.eof", PSQLException.comm_link_error); n = b | (n << 8); } } catch (IOException e) { ! throw new PSQLException("postgresql.stream.ioerror", PSQLException.comm_link_error, e); } return n; } *************** public class PG_Stream *** 227,233 **** { int c = pg_input.read(); if (c < 0) ! throw new PSQLException("postgresql.stream.eof"); else if (c == 0) { rst[s] = 0; --- 227,233 ---- { int c = pg_input.read(); if (c < 0) ! throw new PSQLException("postgresql.stream.eof", PSQLException.comm_link_error); else if (c == 0) { rst[s] = 0; *************** public class PG_Stream *** 250,256 **** } catch (IOException e) { ! throw new PSQLException("postgresql.stream.ioerror", e); } return encoding.decode(rst, 0, s); } --- 250,256 ---- } catch (IOException e) { ! throw new PSQLException("postgresql.stream.ioerror", PSQLException.comm_link_error, e); } return encoding.decode(rst, 0, s); } *************** public class PG_Stream *** 330,342 **** { int w = pg_input.read(b, off + s, siz - s); if (w < 0) ! throw new PSQLException("postgresql.stream.eof"); s += w; } } catch (IOException e) { ! throw new PSQLException("postgresql.stream.ioerror", e); } } --- 330,342 ---- { int w = pg_input.read(b, off + s, siz - s); if (w < 0) ! throw new PSQLException("postgresql.stream.eof", PSQLException.comm_link_error); s += w; } } catch (IOException e) { ! throw new PSQLException("postgresql.stream.ioerror", PSQLException.comm_link_error, e); } } *************** public class PG_Stream *** 353,359 **** } catch (IOException e) { ! throw new PSQLException("postgresql.stream.flush", e); } } --- 353,359 ---- } catch (IOException e) { ! throw new PSQLException("postgresql.stream.flush", PSQLException.comm_link_error, e); } } Index: src/interfaces/jdbc/org/postgresql/core/QueryExecutor.java =================================================================== RCS file: /projects/cvsroot/pgsql-server/src/interfaces/jdbc/org/postgresql/core/QueryExecutor.java,v retrieving revision 1.17 diff -c -p -r1.17 QueryExecutor.java *** src/interfaces/jdbc/org/postgresql/core/QueryExecutor.java 2002/11/14 05:35:45 1.17 --- src/interfaces/jdbc/org/postgresql/core/QueryExecutor.java 2002/11/22 19:11:02 *************** public class QueryExecutor *** 61,67 **** if (pg_stream == null) { ! throw new PSQLException("postgresql.con.closed"); } synchronized (pg_stream) --- 61,67 ---- if (pg_stream == null) { ! throw new PSQLException("postgresql.con.closed", PSQLException.inexistent_connection); } synchronized (pg_stream) *************** public class QueryExecutor *** 120,126 **** l_endQuery = true; break; default: ! throw new PSQLException("postgresql.con.type", new Character((char) c)); } --- 120,126 ---- l_endQuery = true; break; default: ! throw new PSQLException("postgresql.con.type", PSQLException.connection_failure, new Character((char) c)); } *************** public class QueryExecutor *** 156,162 **** } catch (IOException e) { ! throw new PSQLException("postgresql.con.ioerror", e); } } --- 156,162 ---- } catch (IOException e) { ! throw new PSQLException("postgresql.con.ioerror", PSQLException.comm_link_error, e); } } *************** public class QueryExecutor *** 168,174 **** private void receiveTuple(boolean isBinary) throws SQLException { if (fields == null) ! throw new PSQLException("postgresql.con.tuple"); Object tuple = pg_stream.ReceiveTuple(fields.length, isBinary); if (isBinary) binaryCursor = true; --- 168,174 ---- private void receiveTuple(boolean isBinary) throws SQLException { if (fields == null) ! throw new PSQLException("postgresql.con.tuple", PSQLException.connection_failure); Object tuple = pg_stream.ReceiveTuple(fields.length, isBinary); if (isBinary) binaryCursor = true; *************** public class QueryExecutor *** 199,205 **** } catch (NumberFormatException nfe) { ! throw new PSQLException("postgresql.con.fathom", status); } } --- 199,205 ---- } catch (NumberFormatException nfe) { ! throw new PSQLException("postgresql.con.fathom", PSQLException.connection_failure, status); } } *************** public class QueryExecutor *** 209,215 **** private void receiveFields() throws SQLException { if (fields != null) ! throw new PSQLException("postgresql.con.multres"); int size = pg_stream.ReceiveIntegerR(2); fields = new Field[size]; --- 209,215 ---- private void receiveFields() throws SQLException { if (fields != null) ! throw new PSQLException("postgresql.con.multres", PSQLException.connection_failure); int size = pg_stream.ReceiveIntegerR(2); fields = new Field[size]; Index: src/interfaces/jdbc/org/postgresql/fastpath/Fastpath.java =================================================================== RCS file: /projects/cvsroot/pgsql-server/src/interfaces/jdbc/org/postgresql/fastpath/Fastpath.java,v retrieving revision 1.11 diff -c -p -r1.11 Fastpath.java *** src/interfaces/jdbc/org/postgresql/fastpath/Fastpath.java 2002/09/06 21:23:05 1.11 --- src/interfaces/jdbc/org/postgresql/fastpath/Fastpath.java 2002/11/22 19:11:03 *************** public class Fastpath *** 81,87 **** } catch (IOException ioe) { ! throw new PSQLException("postgresql.fp.send", new Integer(fnid), ioe); } // Now handle the result --- 81,89 ---- } catch (IOException ioe) { ! throw new PSQLException("postgresql.fp.send", ! PSQLException.comm_link_error, ! new Integer(fnid), ioe); } // Now handle the result Index: src/interfaces/jdbc/org/postgresql/jdbc1/AbstractJdbc1Connection.java =================================================================== RCS file: /projects/cvsroot/pgsql-server/src/interfaces/jdbc/org/postgresql/jdbc1/AbstractJdbc1Connection.java,v retrieving revision 1.13 diff -c -p -r1.13 AbstractJdbc1Connection.java *** src/interfaces/jdbc/org/postgresql/jdbc1/AbstractJdbc1Connection.java 2002/11/14 05:35:45 1.13 --- src/interfaces/jdbc/org/postgresql/jdbc1/AbstractJdbc1Connection.java 2002/11/22 19:11:03 *************** public abstract class AbstractJdbc1Conne *** 104,110 **** // This occasionally occurs when the client uses the properties version // of getConnection(), and is a common question on the email lists if (info.getProperty("user") == null) ! throw new PSQLException("postgresql.con.user"); this_driver = (org.postgresql.Driver)d; this_url = url; --- 104,110 ---- // This occasionally occurs when the client uses the properties version // of getConnection(), and is a common question on the email lists if (info.getProperty("user") == null) ! throw new PSQLException("postgresql.con.user", PSQLException.connection_rejected); this_driver = (org.postgresql.Driver)d; this_url = url; *************** public abstract class AbstractJdbc1Conne *** 164,174 **** // Added by Peter Mount // 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 startup packet --- 164,174 ---- // Added by Peter Mount // 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", PSQLException.connection_rejected); } catch (IOException e) { ! throw new PSQLException ("postgresql.con.failed", PSQLException.unable_to_connect, e); } // Now we need to construct and send a startup packet *************** public abstract class AbstractJdbc1Conne *** 199,205 **** // The most common one to be thrown here is: // "User authentication failed" // ! throw new PSQLException("postgresql.con.misc", pg_stream.ReceiveString(encoding)); case 'R': // Get the type of request --- 199,206 ---- // The most common one to be thrown here is: // "User authentication failed" // ! throw new PSQLException("postgresql.con.misc", PSQLException.connection_rejected, ! pg_stream.ReceiveString(encoding)); case 'R': // Get the type of request *************** public abstract class AbstractJdbc1Conne *** 237,248 **** case AUTH_REQ_KRB4: if (org.postgresql.Driver.logDebug) org.postgresql.Driver.debug("postgresql: KRB4"); ! throw new PSQLException("postgresql.con.kerb4"); case AUTH_REQ_KRB5: if (org.postgresql.Driver.logDebug) org.postgresql.Driver.debug("postgresql: KRB5"); ! throw new PSQLException("postgresql.con.kerb5"); case AUTH_REQ_PASSWORD: if (org.postgresql.Driver.logDebug) --- 238,249 ---- case AUTH_REQ_KRB4: if (org.postgresql.Driver.logDebug) org.postgresql.Driver.debug("postgresql: KRB4"); ! throw new PSQLException("postgresql.con.kerb4", PSQLException.connection_rejected); case AUTH_REQ_KRB5: if (org.postgresql.Driver.logDebug) org.postgresql.Driver.debug("postgresql: KRB5"); ! throw new PSQLException("postgresql.con.kerb5", PSQLException.connection_rejected); case AUTH_REQ_PASSWORD: if (org.postgresql.Driver.logDebug) *************** public abstract class AbstractJdbc1Conne *** 274,285 **** break; default: ! throw new PSQLException("postgresql.con.auth", new Integer(areq)); } break; default: ! throw new PSQLException("postgresql.con.authfail"); } } while (areq != AUTH_REQ_OK); --- 275,287 ---- break; default: ! throw new PSQLException("postgresql.con.auth", PSQLException.connection_rejected, ! new Integer(areq)); } break; default: ! throw new PSQLException("postgresql.con.authfail", PSQLException.connection_rejected); } } while (areq != AUTH_REQ_OK); *************** public abstract class AbstractJdbc1Conne *** 287,293 **** } catch (IOException e) { ! throw new PSQLException("postgresql.con.failed", e); } --- 289,295 ---- } catch (IOException e) { ! throw new PSQLException("postgresql.con.failed", PSQLException.unable_to_connect, e); } *************** public abstract class AbstractJdbc1Conne *** 303,314 **** ckey = pg_stream.ReceiveIntegerR(4); break; case 'E': ! throw new PSQLException("postgresql.con.backend", pg_stream.ReceiveString(encoding)); case 'N': addWarning(pg_stream.ReceiveString(encoding)); break; default: ! throw new PSQLException("postgresql.con.setup"); } } while (beresp == 'N'); --- 305,317 ---- ckey = pg_stream.ReceiveIntegerR(4); break; case 'E': ! throw new PSQLException("postgresql.con.backend", PSQLException.unable_to_connect, ! pg_stream.ReceiveString(encoding)); case 'N': addWarning(pg_stream.ReceiveString(encoding)); break; default: ! throw new PSQLException("postgresql.con.setup", PSQLException.unable_to_connect); } } while (beresp == 'N'); *************** public abstract class AbstractJdbc1Conne *** 325,333 **** addWarning(pg_stream.ReceiveString(encoding)); break; case 'E': ! throw new PSQLException("postgresql.con.backend", pg_stream.ReceiveString(encoding)); default: ! throw new PSQLException("postgresql.con.setup"); } } while (beresp == 'N'); --- 328,337 ---- addWarning(pg_stream.ReceiveString(encoding)); break; case 'E': ! throw new PSQLException("postgresql.con.backend", PSQLException.unable_to_connect, ! pg_stream.ReceiveString(encoding)); default: ! throw new PSQLException("postgresql.con.setup", PSQLException.unable_to_connect); } } while (beresp == 'N'); *************** public abstract class AbstractJdbc1Conne *** 355,361 **** if (! resultSet.next()) { ! throw new PSQLException("postgresql.con.failed", "failed getting backend encoding"); } String version = resultSet.getString(1); dbVersionNumber = extractVersionNumber(version); --- 359,366 ---- if (! resultSet.next()) { ! throw new PSQLException("postgresql.con.failed", PSQLException.unable_to_connect, ! "failed getting backend encoding"); } String version = resultSet.getString(1); dbVersionNumber = extractVersionNumber(version); *************** public abstract class AbstractJdbc1Conne *** 380,386 **** if (!acRset.next()) { ! throw new PSQLException("postgresql.con.failed", "failed getting autocommit status"); } //if autocommit is currently off we need to turn it on //note that we will be in a transaction because the select above --- 385,392 ---- if (!acRset.next()) { ! throw new PSQLException("postgresql.con.failed", PSQLException.unable_to_connect, ! "failed getting autocommit status"); } //if autocommit is currently off we need to turn it on //note that we will be in a transaction because the select above *************** public abstract class AbstractJdbc1Conne *** 477,483 **** { if (isClosed()) { ! throw new PSQLException("postgresql.con.closed"); } return new QueryExecutor(new String[] {sql}, EMPTY_OBJECT_ARRAY, stat, pg_stream, (java.sql.Connection)this).execute(); } --- 483,489 ---- { if (isClosed()) { ! throw new PSQLException("postgresql.con.closed", PSQLException.inexistent_connection); } return new QueryExecutor(new String[] {sql}, EMPTY_OBJECT_ARRAY, stat, pg_stream, (java.sql.Connection)this).execute(); } *************** public abstract class AbstractJdbc1Conne *** 500,506 **** { if (isClosed()) { ! throw new PSQLException("postgresql.con.closed"); } return new QueryExecutor(p_sqlFragments, p_binds, stat, pg_stream, (java.sql.Connection)this).execute(); } --- 506,512 ---- { if (isClosed()) { ! throw new PSQLException("postgresql.con.closed", PSQLException.inexistent_connection); } return new QueryExecutor(p_sqlFragments, p_binds, stat, pg_stream, (java.sql.Connection)this).execute(); } *************** public abstract class AbstractJdbc1Conne *** 695,701 **** } catch (Exception ex) { ! throw new PSQLException("postgresql.con.creobj", type, ex); } // should never be reached --- 701,707 ---- } catch (Exception ex) { ! throw new PSQLException("postgresql.con.creobj", PSQLException.connection_failure, type, ex); } // should never be reached *************** public abstract class AbstractJdbc1Conne *** 744,750 **** return ((Serialize)x).storeObject(o); // Thow an exception because the type is unknown ! throw new PSQLException("postgresql.con.strobj"); } catch (SQLException sx) --- 750,756 ---- return ((Serialize)x).storeObject(o); // Thow an exception because the type is unknown ! throw new PSQLException("postgresql.con.strobj", PSQLException.data_exception); } catch (SQLException sx) *************** public abstract class AbstractJdbc1Conne *** 1117,1123 **** isolationLevelSQL += "SERIALIZABLE"; break; default: ! throw new PSQLException("postgresql.con.isolevel", new Integer(isolationLevel)); } } --- 1123,1129 ---- isolationLevelSQL += "SERIALIZABLE"; break; default: ! throw new PSQLException("postgresql.con.isolevel", PSQLException.inv_transaction_state, new Integer(isolationLevel)); } } *************** public abstract class AbstractJdbc1Conne *** 1154,1160 **** break; default: ! throw new PSQLException("postgresql.con.isolevel", new Integer(isolationLevel)); } return sb.toString(); } --- 1160,1167 ---- break; default: ! throw new PSQLException("postgresql.con.isolevel", PSQLException.inv_transaction_state, ! new Integer(isolationLevel)); } return sb.toString(); } Index: src/interfaces/jdbc/org/postgresql/jdbc1/AbstractJdbc1ResultSet.java =================================================================== RCS file: /projects/cvsroot/pgsql-server/src/interfaces/jdbc/org/postgresql/jdbc1/AbstractJdbc1ResultSet.java,v retrieving revision 1.7 diff -c -p -r1.7 AbstractJdbc1ResultSet.java *** src/interfaces/jdbc/org/postgresql/jdbc1/AbstractJdbc1ResultSet.java 2002/10/19 22:10:36 1.7 --- src/interfaces/jdbc/org/postgresql/jdbc1/AbstractJdbc1ResultSet.java 2002/11/22 19:11:03 *************** public abstract class AbstractJdbc1Resul *** 60,66 **** public boolean next() throws SQLException { if (rows == null) ! throw new PSQLException("postgresql.con.closed"); if (++current_row >= rows.size()) return false; --- 60,66 ---- public boolean next() throws SQLException { if (rows == null) ! throw new PSQLException("postgresql.con.closed", PSQLException.inexistent_connection); if (++current_row >= rows.size()) return false; Index: src/interfaces/jdbc/org/postgresql/jdbc2/AbstractJdbc2Connection.java =================================================================== RCS file: /projects/cvsroot/pgsql-server/src/interfaces/jdbc/org/postgresql/jdbc2/AbstractJdbc2Connection.java,v retrieving revision 1.2 diff -c -p -r1.2 AbstractJdbc2Connection.java *** src/interfaces/jdbc/org/postgresql/jdbc2/AbstractJdbc2Connection.java 2002/09/06 21:23:06 1.2 --- src/interfaces/jdbc/org/postgresql/jdbc2/AbstractJdbc2Connection.java 2002/11/22 19:11:03 *************** public abstract class AbstractJdbc2Conne *** 64,74 **** // Added by Peter Mount // 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 --- 64,74 ---- // Added by Peter Mount // 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", PSQLException.connection_rejected); } catch (IOException e) { ! throw new PSQLException ("postgresql.con.failed", PSQLException.unable_to_connect, e); } // Now we need to construct and send a cancel packet *************** public abstract class AbstractJdbc2Conne *** 82,88 **** } catch (IOException e) { ! throw new PSQLException("postgresql.con.failed", e); } finally { --- 82,88 ---- } catch (IOException e) { ! throw new PSQLException("postgresql.con.failed", PSQLException.comm_link_error, e); } finally { Index: src/interfaces/jdbc/org/postgresql/jdbc3/AbstractJdbc3DatabaseMetaData.java =================================================================== RCS file: /projects/cvsroot/pgsql-server/src/interfaces/jdbc/org/postgresql/jdbc3/AbstractJdbc3DatabaseMetaData.java,v retrieving revision 1.3 diff -c -p -r1.3 AbstractJdbc3DatabaseMetaData.java *** src/interfaces/jdbc/org/postgresql/jdbc3/AbstractJdbc3DatabaseMetaData.java 2002/11/20 20:37:53 1.3 --- src/interfaces/jdbc/org/postgresql/jdbc3/AbstractJdbc3DatabaseMetaData.java 2002/11/22 19:11:03 *************** public abstract class AbstractJdbc3Datab *** 323,329 **** */ public int getSQLStateType() throws SQLException { ! throw org.postgresql.Driver.notImplemented(); } /** --- 323,329 ---- */ public int getSQLStateType() throws SQLException { ! return DatabaseMetaData.sqlStateXOpen; } /** Index: src/interfaces/jdbc/org/postgresql/util/PSQLException.java =================================================================== RCS file: /projects/cvsroot/pgsql-server/src/interfaces/jdbc/org/postgresql/util/PSQLException.java,v retrieving revision 1.7 diff -c -p -r1.7 PSQLException.java *** src/interfaces/jdbc/org/postgresql/util/PSQLException.java 2001/11/19 22:33:39 1.7 --- src/interfaces/jdbc/org/postgresql/util/PSQLException.java 2002/11/22 19:11:03 *************** public class PSQLException extends SQLEx *** 11,16 **** --- 11,30 ---- private String message; /* + * PSQLState constants + * + * Using the constants make the code more legible. + */ + + public static final PSQLState unable_to_connect = new PSQLState("08001"); + public static final PSQLState inexistent_connection = new PSQLState("08003"); + public static final PSQLState connection_rejected = new PSQLState("08004"); + public static final PSQLState connection_failure = new PSQLState("08006"); + public static final PSQLState comm_link_error = new PSQLState("08S01"); + public static final PSQLState data_exception = new PSQLState("22000"); + public static final PSQLState inv_transaction_state = new PSQLState("25000"); + + /* * This provides the same functionality to SQLException * @param error Error string */ *************** public class PSQLException extends SQLEx *** 21,26 **** --- 35,51 ---- } /* + * Like the above, but sets SQLState + * @param error Error string + * @param sqlstate PSQLState constant + */ + public PSQLException(String error, PSQLState sqlstate) + { + super("", sqlstate.toString()); + translate(error, null); + } + + /* * A more generic entry point. * @param error Error string or standard message id * @param args Array of arguments *************** public class PSQLException extends SQLEx *** 74,84 **** --- 99,152 ---- } /* + * Like the above, but sets the SQLState + */ + public PSQLException(String error, PSQLState sqlstate, Exception ex) + { + super("", sqlstate.toString()); + + Object[] argv = new Object[1]; + + try + { + ByteArrayOutputStream baos = new ByteArrayOutputStream(); + PrintWriter pw = new PrintWriter(baos); + pw.println("Exception: " + ex.toString() + "\nStack Trace:\n"); + ex.printStackTrace(pw); + pw.println("End of Stack Trace"); + pw.flush(); + argv[0] = baos.toString(); + pw.close(); + baos.close(); + } + catch (Exception ioe) + { + argv[0] = ex.toString() + "\nIO Error on stack trace generation! " + ioe.toString(); + } + + translate(error, argv); + } + + /* * Helper version for 2 args */ public PSQLException(String error, Object arg1, Object arg2) { super(); + Object[] argv = new Object[2]; + argv[0] = arg1; + argv[1] = arg2; + translate(error, argv); + } + + /* + * Like the above, but sets SQLState + * @param error Error string + * @param sqlstate PSQLState constant + */ + public PSQLException(String error, PSQLState sqlstate, Object arg1, Object arg2) + { + super("", sqlstate.toString()); Object[] argv = new Object[2]; argv[0] = arg1; argv[1] = arg2; New file: src/interfaces/jdbc/org/postgresql/util/PSQLState.java =================================================================== package org.postgresql.util; /* * This class encapsulates a String, so that SQLState arguments have their own type * (for method overload resolution) */ public class PSQLState extends Object { private String sqlstate; /* * We only instantiate this with the X/Open strintgs, * so we only provide this constructor. * @param sqlstate PSQLState constant */ public PSQLState(String sqlstate) { this.sqlstate = sqlstate; } public String toString() { return sqlstate; } public boolean equals(String other) { return sqlstate.equals(other); } }