/*
 * Copyright (c) 2011, 2020 Oracle and/or its affiliates. All rights reserved.
 *
 * This program and the accompanying materials are made available under the
 * terms of the Eclipse Public License v. 2.0 which is available at
 * http://www.eclipse.org/legal/epl-2.0,
 * or the Eclipse Distribution License v. 1.0 which is available at
 * http://www.eclipse.org/org/documents/edl-v10.php.
 *
 * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause
 */

// Contributors:
// David McCann - 2.4 - Initial implementation
package org.eclipse.persistence.internal.xr;

import java.util.List;

/**
 * For use with a batch SQL query, i.e. two or more SQL statements that
 * are to be executed against the database in order.  The result will
 * be either 0 (success) or 1 (failure).  Note that if a statement
 * fails, i.e. an exception is thrown upon executing a given SQL
 * statement, none of the remaining statements are executed.
 *
 * Warning:  the SQL is assumed to be valid and well formed, and no
 * roll back or any type of error handling is performed.
 *
 */
public class BatchQueryOperation extends QueryOperation {
    protected List<String> batchSql;

    /**
     * Return the List of SQL statements to be executed for this operation.
     */
    public List<String> getBatchSql() {
        return batchSql;
    }

    /**
     * Set the List of SQL statements to be executed for this operation.
     */
    public void setBatchSql(List<String> batchSql) {
        this.batchSql = batchSql;
    }

    /**
     * Invoke the SQL statements in order against the database.
     * The returned ValueOject will hold either 0 (success) or
     * 1 (failure).
     *
     */
    @Override
    public Object invoke(XRServiceAdapter xrService, Invocation invocation) {
        ValueObject v = new ValueObject();
        for (String sqlString : batchSql) {
            try {
                xrService.getORSession().executeNonSelectingSQL(sqlString);
            } catch (Exception x) {
                try {
                    xrService.getORSession().executeSQL(sqlString);
                } catch (Exception xx) {
                    v.value = 1;
                    return v;
                }
            }
        }
        v.value = 0;
        return v;
    }

    /**
     * No validation can be done for a batch query operation.
     *
     */
    @Override
    public void validate(XRServiceAdapter xrService) {}

    /**
     * The initialize method will add an XMLDesctriptor for
     * org.eclipse.persistence.internal.xr.ValueObject to
     * the OX project.  This class is used to hold the
     * result of the batch SQL execution.
     *
     */
    @Override
    public void initialize(XRServiceAdapter xrService) {
        addValueObjectDescriptor(xrService);
    }
}
