/* * Copyright 2004-2014 H2 Group. Multiple-Licensed under the MPL 2.0, * and the EPL 1.0 (http://h2database.com/html/license.html). * Initial Developer: H2 Group */ package org.h2.command.dml; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.nio.charset.Charset; import org.h2.command.CommandInterface; import org.h2.command.Prepared; import org.h2.engine.Constants; import org.h2.engine.Session; import org.h2.message.DbException; import org.h2.result.ResultInterface; import org.h2.util.ScriptReader; /** * This class represents the statement * RUNSCRIPT */ public class RunScriptCommand extends ScriptBase { //执行SQL脚本文件 /** * The byte order mark. * 0xfeff because this is the Unicode char * represented by the UTF-8 byte order mark (EF BB BF). */ private static final char UTF8_BOM = '\uFEFF'; private Charset charset = Constants.UTF8; public RunScriptCommand(Session session) { super(session); } @Override public int update() { session.getUser().checkAdmin(); int count = 0; try { openInput(); BufferedReader reader = new BufferedReader(new InputStreamReader(in, charset)); // if necessary, strip the BOM from the front of the file reader.mark(1); if (reader.read() != UTF8_BOM) { reader.reset(); } ScriptReader r = new ScriptReader(reader); while (true) { String sql = r.readStatement(); if (sql == null) { break; } execute(sql); count++; if ((count & 127) == 0) { checkCanceled(); } } r.close(); } catch (IOException e) { throw DbException.convertIOException(e, null); } finally { closeIO(); } return count; } private void execute(String sql) { try { Prepared command = session.prepare(sql); if (command.isQuery()) { command.query(0); } else { command.update(); } if (session.getAutoCommit()) { session.commit(false); } } catch (DbException e) { throw e.addSQL(sql); } } public void setCharset(Charset charset) { this.charset = charset; } @Override public ResultInterface queryMeta() { return null; } @Override public int getType() { return CommandInterface.RUNSCRIPT; } }