/*******************************************************************************
 * 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);

      }
   }
}
