package eu.dnetlib.dlms.jdbc.server;

import java.sql.SQLException;
import java.util.Collection;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;

import eu.dnetlib.dlms.jdbc.ParamInfo;
import eu.dnetlib.dlms.jdbc.ast.Statement;
import eu.dnetlib.dlms.jdbc.parser.IDQLParser;

/**
 * DummyDOLEngine class using dummy parsers and executers.
 * 
 * @author lexis
 */
public class DummyDOLEngine extends AbstractDOLEngine {

    /**
     * logger.
     */
    private static final Log log = LogFactory.getLog(DummyDOLEngine.class);

    /**
     * {@inheritDoc}
     * 
     * @see eu.dnetlib.dlms.jdbc.server.AbstractDOLEngine#execute(java.lang.String,
     *      eu.dnetlib.dlms.jdbc.ParamInfo[])
     */
    @Override
    public AbstractDOLExecuter execute(final String dolString,
	    final ParamInfo[] paramList) throws SQLException {
	log.debug(this + ".execute(" + dolString + ", " + paramList + ")");
	IDQLParser dolParser = this.getParserFactory().createParser();
	final Collection<Statement> parsedStms = dolParser
		.parse(dolString);
	final AbstractDOLExecuter executer = this.getExecuterFactory()
		.createExecuter();
//	executer.setResultSetExpected(dolParser.isResultSetExpected());
	try {
	    executer.setExecutionCompleted(false);
	    Thread t = new Thread() {
		@Override
		public void run() {
		    // for each node generated by the parsing, ask the executer
		    // to execute it.
		    try {
			for (Statement stm : parsedStms) {
			    executer.execute(stm);
			}
			executer.setExecutionCompleted(true);
		    } catch (Exception e) {
			throw new RuntimeException(e);
		    }
		};
	    };
	    t.start();
	    return executer;
	} catch (Exception e) {
	    throw new SQLException(e);
	}
    }
}
