svnno****@sourc*****
svnno****@sourc*****
2009年 5月 26日 (火) 20:26:51 JST
Revision: 3417 http://svn.sourceforge.jp/view?root=jiemamy&view=rev&rev=3417 Author: ewigkeit1204 Date: 2009-05-26 20:26:51 +0900 (Tue, 26 May 2009) Log Message: ----------- [COM-1] 複文SQL実行の初期対処。 まだ未完成。 Modified Paths: -------------- leto/jiemamy-commons/trunk/src/main/java/org/jiemamy/utils/SqlExecutor.java leto/jiemamy-commons/trunk/src/test/java/org/jiemamy/utils/SqlExecutorTest.java -------------- next part -------------- Modified: leto/jiemamy-commons/trunk/src/main/java/org/jiemamy/utils/SqlExecutor.java =================================================================== --- leto/jiemamy-commons/trunk/src/main/java/org/jiemamy/utils/SqlExecutor.java 2009-05-22 01:39:14 UTC (rev 3416) +++ leto/jiemamy-commons/trunk/src/main/java/org/jiemamy/utils/SqlExecutor.java 2009-05-26 11:26:51 UTC (rev 3417) @@ -18,11 +18,16 @@ */ package org.jiemamy.utils; +import java.io.IOException; +import java.io.InputStream; +import java.io.InputStreamReader; +import java.io.Reader; import java.sql.Connection; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; +import org.apache.commons.io.IOUtils; import org.apache.commons.lang.Validate; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -36,8 +41,16 @@ private static Logger logger = LoggerFactory.getLogger(SqlExecutor.class); + private static final char SINGLEQUOTE = '\''; + + private static final char SEMICOLON = ';'; + private final Connection connection; + private SqlExecutorHandler handler; + + private Reader in; + /** * インスタンスを生成する。 @@ -52,27 +65,119 @@ /** * SQLを実行する。 * + * @throws SQLException SQLの実行に失敗した場合 + * @throws IOException SQLデータの取得に失敗した場合 + */ + public void execute() throws SQLException, IOException { + StringBuilder builder = new StringBuilder(); + + boolean quotedFlag = false; + boolean execFlag = false; + int ch = in.read(); + while (ch != -1) { + switch (ch) { + case SINGLEQUOTE: + quotedFlag ^= true; + break; + case SEMICOLON: + execFlag = !quotedFlag; + break; + default: + builder.append((char) ch); + } + + if (execFlag) { + execute(builder.toString()); + builder.setLength(0); + } + + ch = in.read(); + } + } + + /** + * SQLを実行する。 + * * @param sql 実行するSQL - * @return 結果の{@link ResultSet} * @throws SQLException SQLの実行に失敗した場合 */ - public ResultSet execute(String sql) throws SQLException { + public void execute(String sql) throws SQLException { logger.info(sql); connection.setAutoCommit(false); - Statement statement = null; - ResultSet resultSet = null; + Statement stmt = null; + ResultSet rs = null; try { - statement = connection.createStatement(); - if (statement.execute(sql)) { - resultSet = statement.getResultSet(); + stmt = connection.createStatement(); + + if (stmt.execute(sql)) { + rs = stmt.getResultSet(); } + + if (handler != null) { + handler.sqlExecuted(sql, rs); + } + connection.commit(); } finally { - JmIOUtil.closeQuietly(statement); + JmIOUtil.closeQuietly(rs); + JmIOUtil.closeQuietly(stmt); } - return resultSet; } + /** + * SQL実行後に呼び出すハンドラをセットする。 + * + * @param handler ハンドラ + */ + public void setHandler(SqlExecutorHandler handler) { + this.handler = handler; + } + + /** + * 実行するSQLを保持する入力ストリームをセットする。 + * + * @param is 実行するSQLを保持する入力ストリーム + */ + public void setInputStream(InputStream is) { + Validate.notNull(is); + in = new InputStreamReader(is); + } + + /** + * 実行するSQLを保持する入力ストリームをセットする。 + * + * @param in 実行するSQLを保持する入力ストリーム + */ + public void setReader(Reader in) { + Validate.notNull(in); + this.in = in; + } + + @Override + protected void finalize() throws Throwable { + IOUtils.closeQuietly(in); + + super.finalize(); + } + + + /** + * SQL実行クラスが、1つのSQLを実行後に呼び出すハンドラインタフェース。 + * + * @author Keisuke.K + */ + public interface SqlExecutorHandler { + + /** + * SQLが実行されると呼び出されるハンドラメソッド。 + * + * @param sql 実行したSQL + * @param rs 実行結果の {@link ResultSet}。SQLの実行結果が {@link ResultSet} とならないSQLの場合、<code>null</code>。 + */ + void sqlExecuted(String sql, ResultSet rs); + + } + } Modified: leto/jiemamy-commons/trunk/src/test/java/org/jiemamy/utils/SqlExecutorTest.java =================================================================== --- leto/jiemamy-commons/trunk/src/test/java/org/jiemamy/utils/SqlExecutorTest.java 2009-05-22 01:39:14 UTC (rev 3416) +++ leto/jiemamy-commons/trunk/src/test/java/org/jiemamy/utils/SqlExecutorTest.java 2009-05-26 11:26:51 UTC (rev 3417) @@ -32,6 +32,8 @@ import org.junit.BeforeClass; import org.junit.Test; +import org.jiemamy.utils.SqlExecutor.SqlExecutorHandler; + /** * {@link SqlExecutor} のテストクラス。 * @@ -93,14 +95,16 @@ @Test public void test01_単純なSQLの実行() throws Exception { SqlExecutor executor = new SqlExecutor(conn); - ResultSet rs = null; + SqlExecutorHandler handler = new SqlExecutorHandler() { + + public void sqlExecuted(String sql, ResultSet rs) { + assertThat(sql, is("SELECT * FROM DUAL")); + assertThat(rs, is(notNullValue())); + } + + }; - try { - rs = executor.execute("SELECT * FROM DUAL"); - - assertThat(rs, is(notNullValue())); - } finally { - JmIOUtil.closeQuietly(rs); - } + executor.setHandler(handler); + executor.execute("SELECT * FROM DUAL"); } }