/*******************************************************************************
 * Copyright (c) 2011, 2013 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 v1.0 and Eclipse Distribution License v. 1.0
 * which accompanies this distribution.
 * The Eclipse Public License is available at http://www.eclipse.org/legal/epl-v10.html
 * and the Eclipse Distribution License is available at
 * http://www.eclipse.org/org/documents/edl-v10.php.
 *
 * 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);
    }
}