/* 
 * Licensed to the Apache Software Foundation (ASF) under one or more
 * contributor license agreements.  See the NOTICE file distributed with
 * this work for additional information regarding copyright ownership.
 * The ASF licenses this file to You under the Apache License, Version 2.0
 * (the "License"); you may not use this file except in compliance with
 * the License.  You may obtain a copy of the License at
 * 
 *     http://www.apache.org/licenses/LICENSE-2.0
 * 
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package java.sql;

import java.io.Serializable;

/**
 * This exception is thrown if a problem occurs during a batch update operation.
 * <p>
 * A {@code BatchUpdateException} provides additional information about the
 * problem that occurred, compared with a standard {@code SQLException}. It
 * supplies update counts for successful commands which were executed before the
 * exception was encountered.
 * <p>
 * The element order in the array of update counts matches the order that the
 * commands were added to the batch operation.
 * <p>
 * Once a batch update command fails and a {@code BatchUpdateException} is
 * thrown, the JDBC driver may continue processing the remaining commands in the
 * batch. If the driver does process more commands after the problem occurs, the
 * array returned by {@code BatchUpdateException.getUpdateCounts} has an element
 * for every command in the batch, not only those that executed successfully. In
 * this case, the array element for any command which encountered a problem is
 * set to {@code Statement.EXECUTE_FAILED}.
 */
public class BatchUpdateException extends SQLException implements Serializable {

    private static final long serialVersionUID = 5977529877145521757L;

    private int[] updateCounts = null;

    /**
     * Creates a default {@code BatchUpdateException} with the parameters
     * <i>reason</i>, <i>SQLState</i>, and <i>update counts</i> set to {@code
     * null} and the <i>vendor code</i> set to 0.
     */
    public BatchUpdateException() {
        super();
    }

    /**
     * Creates a {@code BatchUpdateException} with the {@code updateCounts} set
     * to the supplied value. All other fields are set to their
     * default values.
     * 
     * @param updateCounts
     *            the array of {@code updateCounts} giving the number of
     *            successful updates (or another status code) for each command
     *            in the batch that was attempted.
     */
    public BatchUpdateException(int[] updateCounts) {
        super();
        this.updateCounts = updateCounts;
    }

    /**
     * Creates a {@code BatchUpdateException} with the {@code updateCounts} and
     * {@code reason} set to the supplied values. All other fields are set to their
     * default values.
     * 
     * @param reason
     *            the message providing information about the source of this
     *            exception.
     * @param updateCounts
     *            the array of {@code updateCounts} giving the number of
     *            successful updates (or another status code) for each command
     *            in the batch that was attempted.
     */
    public BatchUpdateException(String reason, int[] updateCounts) {
        super(reason);
        this.updateCounts = updateCounts;
    }

    /**
     * Creates a {@code BatchUpdateException} with the {@code reason}, {@code
     * SQLState} and {@code updateCounts} set to the supplied values. All other
     * fields are set to their default values.
     * 
     * @param reason
     *            the message providing information about the source of this
     *            exception.
     * @param SQLState
     *            the X/OPEN value to use for the {@code SQLState}
     * @param updateCounts
     *            the array of {@code updateCounts} giving the number of
     *            successful updates (or another status code) for each command
     *            in the batch that was attempted.
     */
    public BatchUpdateException(String reason, String SQLState,
            int[] updateCounts) {
        super(reason, SQLState);
        this.updateCounts = updateCounts;
    }

    /**
     * Creates a {@code BatchUpdateException} for the case where all relevant
     * information is provided.
     * 
     * @param reason
     *            the message providing information about the source of this
     *            exception.
     * @param SQLState
     *            the X/OPEN value to use for the {@code SQLState}.
     * @param vendorCode
     *            the value to use for the vendor error code.
     * @param updateCounts
     *            the array of {@code updateCounts} giving the number of
     *            successful updates (or another status code) for each command
     *            in the batch that was attempted.
     */
    public BatchUpdateException(String reason, String SQLState, int vendorCode,
            int[] updateCounts) {
        super(reason, SQLState, vendorCode);
        this.updateCounts = updateCounts;
    }

    /**
     * Gets the <i>update count</i> array giving status information for every 
     * command that was attempted in the batch.
     * <p>
     * If a batch update command fails and a {@code BatchUpdateException} is
     * thrown, the JDBC driver may continue processing the remaining commands in
     * the batch. If the driver does so, the array returned by {@code
     * BatchUpdateException.getUpdateCounts} has an element for every command in
     * the batch, not only those that executed successfully. In this case, the
     * array element for any command which encountered a problem is set to
     * {@code Statement.EXECUTE_FAILED}.
     * 
     * @return an array that contains the successful update counts, before this
     *         exception was thrown. Alternatively, if the driver continues to
     *         process commands following an error, for each successive command
     *         there is a corresponding element in the array giving one of the 
     *         following status values:
     *         <ol>
     *         <li>the number of successful updates</li> <li>{@code
     *         Statement.SUCCESS_NO_INFO} indicating that the command completed
     *         successfully, but the amount of altered rows is unknown.</li> 
     *         <li>{@code Statement.EXECUTE_FAILED} indicating that the command
     *         was unsuccessful.</li>
     *         </ol>
     */
    public int[] getUpdateCounts() {
        return updateCounts;
    }
}
