package org.openlca.core.database.internal; import java.io.InputStream; import java.io.InputStreamReader; import java.util.ArrayList; import java.util.List; import org.openlca.core.database.IDatabase; import org.openlca.core.database.NativeSql; /** * A class for running a SQL scripts with insert, update, delete, and DDL * statements on a database connection. */ public class ScriptRunner implements ScriptHandler { private final int MAX_BATCH_SIZE = 1000; private IDatabase database; private List<String> statements = new ArrayList<>(); public ScriptRunner(IDatabase database) { this.database = database; } public void run(InputStream scriptStream, String encoding) throws Exception { try { InputStreamReader reader = new InputStreamReader(scriptStream, encoding); ScriptParser parser = new ScriptParser(this); parser.parse(reader); execBatch(); } catch (Exception e) { throw new Exception("Cannot execute script: " + e.getMessage(), e); } } @Override public void statement(String query) throws Exception { statements.add(query); if (statements.size() >= MAX_BATCH_SIZE) execBatch(); } private void execBatch() throws Exception { if (statements.isEmpty()) return; NativeSql.on(database).batchUpdate(statements); statements.clear(); } }