/* * JBoss, Home of Professional Open Source. * See the COPYRIGHT.txt file distributed with this work for information * regarding copyright ownership. Some portions may be licensed * to Red Hat, Inc. under one or more contributor license agreements. * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA * 02110-1301 USA. */ package org.teiid.jdbc; import java.util.HashSet; import java.util.Set; /** * Utility class containing 1) SQL state constants used to represent JDBC error state code, and * 2) utility methods to check whether a SQL state belongs to a particular class of exception states. * @since 4.3 */ public class SQLStates { // Class 80 - connection exception /** * Identifies the SQLState class Connection Exception (08). */ public static final SQLStateClass CLASS_CONNECTION_EXCEPTION = new SQLStateClass( "08"); //$NON-NLS-1$ /** * Connection Exception with no subclass (SQL-99 08000) */ public static final String CONNECTION_EXCEPTION_NO_SUBCLASS = "08000"; //$NON-NLS-1$ /** * SQL-client unable to establish SQL-connection (SQL-99 08001) */ public static final String CONNECTION_EXCEPTION_SQLCLIENT_UNABLE_TO_ESTABLISH_SQLCONNECTION = "08001"; //$NON-NLS-1$ /** * Connection name in use (SQL-99 08002) */ public static final String CONNECTION_EXCEPTION_CONNECTION_NAME_IN_USE = "08002"; //$NON-NLS-1$ /** * Connection does not exist (SQL-99 08003) */ public static final String CONNECTION_EXCEPTION_CONNECTION_DOES_NOT_EXIST = "08003"; //$NON-NLS-1$ /** * SQL-server rejected establishment of SQL-connection (SQL-99 08004) */ public static final String CONNECTION_EXCEPTION_SQLSERVER_REJECTED_ESTABLISHMENT_OF_SQLCONNECTION = "08004"; //$NON-NLS-1$ /** * Connection failure (SQL-99 08006) */ public static final String CONNECTION_EXCEPTION_CONNECTION_FAILURE = "08006"; //$NON-NLS-1$ /** * Transaction resolution unknown (SQL-99 08007) */ public static final String CONNECTION_EXCEPTION_TRANSACTION_RESOLUTION_UNKNOWN = "08007"; //$NON-NLS-1$ /** * Connection is stale and should no longer be used. (08S01) * <p> * The SQLState subclass S01 is an implementation-specified condition and * conforms to the subclass DataDirect uses for SocketExceptions. */ public static final String CONNECTION_EXCEPTION_STALE_CONNECTION = "08S01"; //$NON-NLS-1$ public static final String QUERY_CANCELED = "57014"; //$NON-NLS-1$ // Class 28 - invalid authorization specification /** * Identifies the SQLState class Invalid Authorization Specification (28). */ public static final SQLStateClass CLASS_INVALID_AUTHORIZATION_SPECIFICATION = new SQLStateClass( "28"); //$NON-NLS-1$ /** * Invalid authorization specification with no subclass (SQL-99 28000) */ public static final String INVALID_AUTHORIZATION_SPECIFICATION_NO_SUBCLASS = "28000"; //$NON-NLS-1$ // Class 38 - External Routine Exception (as defined by SQL spec): /** External routine exception. This is the default unknown code */ public static final String DEFAULT = "38000"; //$NON-NLS-1$ public static final String SUCESS = "00000"; //$NON-NLS-1$ // Class 50 - Query execution errors public static final SQLStateClass CLASS_USAGE_ERROR = new SQLStateClass("50"); //$NON-NLS-1$ /** General query execution error*/ public static final String USAGE_ERROR = "50000"; //$NON-NLS-1$ /** Error raised by ERROR instruction in virtual procedure.*/ public static final String VIRTUAL_PROCEDURE_ERROR = "50001"; //$NON-NLS-1$ private static final SQLStateClass[] stateClasses = {CLASS_USAGE_ERROR}; static { CLASS_USAGE_ERROR.stateCodes.add(USAGE_ERROR); CLASS_USAGE_ERROR.stateCodes.add(VIRTUAL_PROCEDURE_ERROR); } public static boolean isSystemErrorState(String sqlStateCode) { return !isUsageErrorState(sqlStateCode); } public static boolean isUsageErrorState(String sqlStateCode) { return belongsToClass(sqlStateCode, CLASS_USAGE_ERROR); } public static boolean belongsToClass(String sqlStateCode, SQLStateClass sqlStateClass) { return sqlStateCode.startsWith(sqlStateClass.codeBeginsWith); } public static SQLStateClass getClass(String sqlStateCode) { for (int i = 0; i < stateClasses.length; i++) { if (stateClasses[i].containsSQLState(sqlStateCode)) { return stateClasses[i]; } } return null; } public static final class SQLStateClass { private String codeBeginsWith; private Set stateCodes = new HashSet(); private SQLStateClass(String beginsWith) { this.codeBeginsWith = beginsWith; } public boolean containsSQLState(String sqlState) { return stateCodes.contains(sqlState); } } }