[Jiemamy-notify:2417] commit [3417] [COM-1] 複文SQL実行の初期対処。

アーカイブの一覧に戻る

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");
 	}
 }



Jiemamy-notify メーリングリストの案内
アーカイブの一覧に戻る