151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski/* 251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Copyright (c) 1996, 2006, Oracle and/or its affiliates. All rights reserved. 351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. 451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * This code is free software; you can redistribute it and/or modify it 651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * under the terms of the GNU General Public License version 2 only, as 751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * published by the Free Software Foundation. Oracle designates this 851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * particular file as subject to the "Classpath" exception as provided 951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * by Oracle in the LICENSE file that accompanied this code. 1051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 1151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * This code is distributed in the hope that it will be useful, but WITHOUT 1251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 1351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License 1451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * version 2 for more details (a copy is included in the LICENSE file that 1551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * accompanied this code). 1651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 1751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * You should have received a copy of the GNU General Public License version 1851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 2 along with this work; if not, write to the Free Software Foundation, 1951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. 2051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 2151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA 2251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * or visit www.oracle.com if you need additional information or have any 2351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * questions. 2451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski */ 2551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 2651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebskipackage java.sql; 2751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 2851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebskiimport java.util.Iterator; 2951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebskiimport java.util.NoSuchElementException; 3051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebskiimport java.util.concurrent.atomic.AtomicReferenceFieldUpdater; 3151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 3251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski/** 3351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * <P>An exception that provides information on a database access 3451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * error or other errors. 3551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 3651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * <P>Each <code>SQLException</code> provides several kinds of information: 3751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * <UL> 3851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * <LI> a string describing the error. This is used as the Java Exception 3951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * message, available via the method <code>getMesasge</code>. 4051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * <LI> a "SQLstate" string, which follows either the XOPEN SQLstate conventions 4151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * or the SQL:2003 conventions. 4251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * The values of the SQLState string are described in the appropriate spec. 4351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * The <code>DatabaseMetaData</code> method <code>getSQLStateType</code> 4451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * can be used to discover whether the driver returns the XOPEN type or 4551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * the SQL:2003 type. 4651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * <LI> an integer error code that is specific to each vendor. Normally this will 4751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * be the actual error code returned by the underlying database. 4851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * <LI> a chain to a next Exception. This can be used to provide additional 4951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * error information. 5051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * <LI> the causal relationship, if any for this <code>SQLException</code>. 5151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * </UL> 5251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski */ 5351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebskipublic class SQLException extends java.lang.Exception 5451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski implements Iterable<Throwable> { 5551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 5651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski /** 5751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Constructs a <code>SQLException</code> object with a given 5851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * <code>reason</code>, <code>SQLState</code> and 5951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * <code>vendorCode</code>. 6051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 6151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * The <code>cause</code> is not initialized, and may subsequently be 6251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * initialized by a call to the 6351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * {@link Throwable#initCause(java.lang.Throwable)} method. 6451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * <p> 6551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @param reason a description of the exception 6651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @param SQLState an XOPEN or SQL:2003 code identifying the exception 6751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @param vendorCode a database vendor-specific exception code 6851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski */ 6951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski public SQLException(String reason, String SQLState, int vendorCode) { 7051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski super(reason); 7151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski this.SQLState = SQLState; 7251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski this.vendorCode = vendorCode; 7351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski if (!(this instanceof SQLWarning)) { 7451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski if (DriverManager.getLogWriter() != null) { 7551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski DriverManager.println("SQLState(" + SQLState + 7651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski ") vendor code(" + vendorCode + ")"); 7751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski printStackTrace(DriverManager.getLogWriter()); 7851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 7951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 8051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 8151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 8251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 8351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski /** 8451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Constructs a <code>SQLException</code> object with a given 8551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * <code>reason</code> and <code>SQLState</code>. 8651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 8751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * The <code>cause</code> is not initialized, and may subsequently be 8851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * initialized by a call to the 8951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * {@link Throwable#initCause(java.lang.Throwable)} method. The vendor code 9051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * is initialized to 0. 9151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * <p> 9251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @param reason a description of the exception 9351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @param SQLState an XOPEN or SQL:2003 code identifying the exception 9451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski */ 9551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski public SQLException(String reason, String SQLState) { 9651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski super(reason); 9751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski this.SQLState = SQLState; 9851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski this.vendorCode = 0; 9951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski if (!(this instanceof SQLWarning)) { 10051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski if (DriverManager.getLogWriter() != null) { 10151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski printStackTrace(DriverManager.getLogWriter()); 10251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski DriverManager.println("SQLException: SQLState(" + SQLState + ")"); 10351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 10451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 10551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 10651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 10751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski /** 10851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Constructs a <code>SQLException</code> object with a given 10951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * <code>reason</code>. The <code>SQLState</code> is initialized to 11051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * <code>null</code> and the vender code is initialized to 0. 11151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 11251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * The <code>cause</code> is not initialized, and may subsequently be 11351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * initialized by a call to the 11451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * {@link Throwable#initCause(java.lang.Throwable)} method. 11551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * <p> 11651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @param reason a description of the exception 11751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski */ 11851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski public SQLException(String reason) { 11951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski super(reason); 12051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski this.SQLState = null; 12151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski this.vendorCode = 0; 12251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski if (!(this instanceof SQLWarning)) { 12351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski if (DriverManager.getLogWriter() != null) { 12451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski printStackTrace(DriverManager.getLogWriter()); 12551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 12651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 12751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 12851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 12951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski /** 13051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Constructs a <code>SQLException</code> object. 13151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * The <code>reason</code>, <code>SQLState</code> are initialized 13251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * to <code>null</code> and the vendor code is initialized to 0. 13351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 13451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * The <code>cause</code> is not initialized, and may subsequently be 13551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * initialized by a call to the 13651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * {@link Throwable#initCause(java.lang.Throwable)} method. 13751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * <p> 13851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski */ 13951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski public SQLException() { 14051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski super(); 14151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski this.SQLState = null; 14251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski this.vendorCode = 0; 14351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski if (!(this instanceof SQLWarning)) { 14451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski if (DriverManager.getLogWriter() != null) { 14551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski printStackTrace(DriverManager.getLogWriter()); 14651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 14751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 14851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 14951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 15051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski /** 15151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Constructs a <code>SQLException</code> object with a given 15251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * <code>cause</code>. 15351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * The <code>SQLState</code> is initialized 15451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * to <code>null</code> and the vendor code is initialized to 0. 15551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * The <code>reason</code> is initialized to <code>null</code> if 15651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * <code>cause==null</code> or to <code>cause.toString()</code> if 15751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * <code>cause!=null</code>. 15851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * <p> 15951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @param cause the underlying reason for this <code>SQLException</code> 16051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * (which is saved for later retrieval by the <code>getCause()</code> method); 16151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * may be null indicating the cause is non-existent or unknown. 16251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @since 1.6 16351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski */ 16451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski public SQLException(Throwable cause) { 16551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski super(cause); 16651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 16751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski if (!(this instanceof SQLWarning)) { 16851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski if (DriverManager.getLogWriter() != null) { 16951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski printStackTrace(DriverManager.getLogWriter()); 17051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 17151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 17251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 17351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 17451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski /** 17551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Constructs a <code>SQLException</code> object with a given 17651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * <code>reason</code> and <code>cause</code>. 17751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * The <code>SQLState</code> is initialized to <code>null</code> 17851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * and the vendor code is initialized to 0. 17951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * <p> 18051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @param reason a description of the exception. 18151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @param cause the underlying reason for this <code>SQLException</code> 18251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * (which is saved for later retrieval by the <code>getCause()</code> method); 18351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * may be null indicating the cause is non-existent or unknown. 18451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @since 1.6 18551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski */ 18651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski public SQLException(String reason, Throwable cause) { 18751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski super(reason,cause); 18851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 18951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski if (!(this instanceof SQLWarning)) { 19051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski if (DriverManager.getLogWriter() != null) { 19151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski printStackTrace(DriverManager.getLogWriter()); 19251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 19351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 19451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 19551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 19651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski /** 19751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Constructs a <code>SQLException</code> object with a given 19851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * <code>reason</code>, <code>SQLState</code> and <code>cause</code>. 19951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * The vendor code is initialized to 0. 20051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * <p> 20151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @param reason a description of the exception. 20251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @param sqlState an XOPEN or SQL:2003 code identifying the exception 20351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @param cause the underlying reason for this <code>SQLException</code> 20451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * (which is saved for later retrieval by the 20551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * <code>getCause()</code> method); may be null indicating 20651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * the cause is non-existent or unknown. 20751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @since 1.6 20851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski */ 20951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski public SQLException(String reason, String sqlState, Throwable cause) { 21051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski super(reason,cause); 21151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 21251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski this.SQLState = sqlState; 21351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski this.vendorCode = 0; 21451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski if (!(this instanceof SQLWarning)) { 21551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski if (DriverManager.getLogWriter() != null) { 21651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski printStackTrace(DriverManager.getLogWriter()); 21751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski DriverManager.println("SQLState(" + SQLState + ")"); 21851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 21951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 22051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 22151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 22251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski /** 22351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Constructs a <code>SQLException</code> object with a given 22451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * <code>reason</code>, <code>SQLState</code>, <code>vendorCode</code> 22551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * and <code>cause</code>. 22651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * <p> 22751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @param reason a description of the exception 22851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @param sqlState an XOPEN or SQL:2003 code identifying the exception 22951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @param vendorCode a database vendor-specific exception code 23051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @param cause the underlying reason for this <code>SQLException</code> 23151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * (which is saved for later retrieval by the <code>getCause()</code> method); 23251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * may be null indicating the cause is non-existent or unknown. 23351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @since 1.6 23451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski */ 23551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski public SQLException(String reason, String sqlState, int vendorCode, Throwable cause) { 23651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski super(reason,cause); 23751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 23851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski this.SQLState = sqlState; 23951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski this.vendorCode = vendorCode; 24051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski if (!(this instanceof SQLWarning)) { 24151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski if (DriverManager.getLogWriter() != null) { 24251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski DriverManager.println("SQLState(" + SQLState + 24351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski ") vendor code(" + vendorCode + ")"); 24451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski printStackTrace(DriverManager.getLogWriter()); 24551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 24651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 24751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 24851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 24951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski /** 25051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Retrieves the SQLState for this <code>SQLException</code> object. 25151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 25251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @return the SQLState value 25351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski */ 25451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski public String getSQLState() { 25551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski return (SQLState); 25651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 25751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 25851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski /** 25951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Retrieves the vendor-specific exception code 26051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * for this <code>SQLException</code> object. 26151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 26251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @return the vendor's error code 26351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski */ 26451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski public int getErrorCode() { 26551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski return (vendorCode); 26651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 26751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 26851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski /** 26951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Retrieves the exception chained to this 27051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * <code>SQLException</code> object by setNextException(SQLException ex). 27151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 27251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @return the next <code>SQLException</code> object in the chain; 27351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * <code>null</code> if there are none 27451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @see #setNextException 27551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski */ 27651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski public SQLException getNextException() { 27751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski return (next); 27851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 27951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 28051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski /** 28151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Adds an <code>SQLException</code> object to the end of the chain. 28251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 28351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @param ex the new exception that will be added to the end of 28451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * the <code>SQLException</code> chain 28551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @see #getNextException 28651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski */ 28751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski public void setNextException(SQLException ex) { 28851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 28951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski SQLException current = this; 29051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski for(;;) { 29151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski SQLException next=current.next; 29251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski if (next != null) { 29351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski current = next; 29451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski continue; 29551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 29651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 29751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski if (nextUpdater.compareAndSet(current,null,ex)) { 29851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski return; 29951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 30051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski current=current.next; 30151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 30251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 30351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 30451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski /** 30551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Returns an iterator over the chained SQLExceptions. The iterator will 30651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * be used to iterate over each SQLException and its underlying cause 30751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * (if any). 30851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 30951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @return an iterator over the chained SQLExceptions and causes in the proper 31051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * order 31151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 31251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @since 1.6 31351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski */ 31451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski public Iterator<Throwable> iterator() { 31551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 31651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski return new Iterator<Throwable>() { 31751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 31851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski SQLException firstException = SQLException.this; 31951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski SQLException nextException = firstException.getNextException(); 32051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski Throwable cause = firstException.getCause(); 32151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 32251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski public boolean hasNext() { 32351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski if(firstException != null || nextException != null || cause != null) 32451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski return true; 32551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski return false; 32651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 32751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 32851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski public Throwable next() { 32951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski Throwable throwable = null; 33051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski if(firstException != null){ 33151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski throwable = firstException; 33251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski firstException = null; 33351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 33451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski else if(cause != null){ 33551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski throwable = cause; 33651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski cause = cause.getCause(); 33751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 33851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski else if(nextException != null){ 33951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski throwable = nextException; 34051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski cause = nextException.getCause(); 34151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski nextException = nextException.getNextException(); 34251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 34351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski else 34451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski throw new NoSuchElementException(); 34551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski return throwable; 34651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 34751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 34851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski public void remove() { 34951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski throw new UnsupportedOperationException(); 35051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 35151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 35251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski }; 35351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 35451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 35551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 35651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski /** 35751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @serial 35851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski */ 35951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski private String SQLState; 36051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 36151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski /** 36251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @serial 36351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski */ 36451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski private int vendorCode; 36551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 36651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski /** 36751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @serial 36851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski */ 36951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski private volatile SQLException next; 37051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 37151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski private static final AtomicReferenceFieldUpdater<SQLException,SQLException> nextUpdater = 37251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski AtomicReferenceFieldUpdater.newUpdater(SQLException.class,SQLException.class,"next"); 37351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 37451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski private static final long serialVersionUID = 2135244094396331484L; 37551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski} 376