package combd;

import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;

/**
 *   Classe que permite a manipulação de procedimentos que utilizam PreparedStatement
 * para execução de queries.
 *
 * @author Marcos V. S. Godinho
 */
public class ProcedimentoPSttmt extends ProcedimentoAbstrato{

    /* Flag que indica que foi produzido ResultadoDeBusca na execução do procedimento. */
    public static int EXISTE_RESULTADO = -765;

    /**
     * Cria um nova instância de ProcedimentoPSttmt.
     * @param psttmt o PreparedStatement.
     */
    public ProcedimentoPSttmt(PreparedStatement psttmt){

        super(psttmt);//Armazena o PreparedStatement fornecido.
    }//ProcedimentoPSttmt


    /*
     * Não Tem outras variáveis de instância a mais, só as da superclasse.
     */


    /**
     * Seta os parametros de um procedimento antes de sua execução.
     * @param param um array de parametros.
     */
    public final void setParamIN(Object[] param){

        try{//Seta todos os parametros.
            for(int i = 0; i < param.length;)
              ((PreparedStatement)statement).setObject(++i, param[i-1]);
        }
        catch(SQLException ex){

            System.err.println("Ocorreu um erro na inserção de um parametro de um ProcedimentoPSttmt.");
            ex.printStackTrace();
        }
    }//setParamIN.

    /**
     * Executa um procedimento que não retorna um ResultSet.
     * @return o número de colunas afetadas, EXISTE_RESULTADO se produzir
     *  ResultadoDeBusca ou -1 se houver erro.
     */
    public int executeProcedimento(){

        try{//Se o resultado da query for um ResultSet retorna EXISTE_RESULTADO,
            // senão retorna o update count.
            return ( ((PreparedStatement)statement).execute() == true ?
                     EXISTE_RESULTADO : statement.getUpdateCount());
        }
        catch(SQLException ex){

            System.err.println("Ocorreu um erro na execução de um ProcedimentoPSttmt.");
            ex.printStackTrace();
        }


        return -1;//houve erro na execução.
    }//executeProcedimento


    /**
     * Executa uma procedimento que retorna um ResultSet, manipulado pela
     * classe <code>ResultadoDeBusca</code>.
     * @return o resultado da busca. Retorna <code>null</code> se houver erro.
     */
    public ResultadoDeBusca executeBusca(){

        ResultSet resultado;
        ResultSetMetaData info;

        try{
            resultado = ((PreparedStatement)statement).executeQuery();
            info = resultado.getMetaData();
        }
        catch(SQLException ex){

            System.err.println("Ocorreu um erro na execução de um ProcedimentoPSttmt.");
            ex.printStackTrace();

            return null;
        }

        return new ResultadoDeBusca(resultado);
    }//executeBusca
}
