/*******************************************************************************
 * Copyright (c) 2010 Robert "Unlogic" Olofsson (unlogic@unlogic.se).
 * All rights reserved. This program and the accompanying materials
 * are made available under the terms of the GNU Lesser Public License v3
 * which accompanies this distribution, and is available at
 * http://www.gnu.org/licenses/lgpl-3.0-standalone.html
 ******************************************************************************/
package se.unlogic.standardutils.dao.script;

import se.unlogic.standardutils.dao.TransactionHandler;
import se.unlogic.standardutils.dao.querys.UpdateQuery;

import javax.sql.DataSource;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.sql.SQLException;
import java.util.List;

public class MySQLScriptDAO implements ScriptDAO {
	
	protected final DataSource dataSource;

	public MySQLScriptDAO(DataSource dataSource) {
		this.dataSource = dataSource;
	}

	public void executeScript(InputStream inputStream) throws SQLException, IOException {

		BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream));
		
		StringBuilder sb = new StringBuilder();

        String line = null;
        try {
            while ((line = reader.readLine()) != null) {
                sb.append(line + "\n");
            }
        } catch (IOException e) {
            throw e;
        } finally {
            try {
            	reader.close();
            	inputStream.close();
            } catch (IOException e) {
                throw e;
            }
        }
        
        this.executeScript(sb.toString());

	}
	
	public void executeScript(String script) throws SQLException {

		TransactionHandler transactionHandler = null;
		UpdateQuery updateQuery;

		ScriptUtility scriptUtility = new MySQLScriptUtility();
		List<String> statements = scriptUtility.getStatements(script);
		
		try {
			
			transactionHandler = new TransactionHandler(this.dataSource);

			for(String query : statements) {
				updateQuery = transactionHandler.getUpdateQuery(query.toString());
				updateQuery.executeUpdate();
			}
			
			transactionHandler.commit();

		} finally {

			TransactionHandler.autoClose(transactionHandler);
		
		}
	}
}
