From c96818767d28d6e9efb773ee4faf1c5eea4c20e3 Mon Sep 17 00:00:00 2001 From: wenshao Date: Sat, 14 May 2011 08:10:24 +0000 Subject: [PATCH] git-svn-id: http://code.alibabatech.com/svn/druid/trunk@73 b9813039-fb51-4c41-a8b9-e21c2acb5095 --- .../com/alibaba/druid/mock/MockDriver.java | 27 +++++++++++++++---- .../com/alibaba/druid/mock/MockStatement.java | 2 +- .../mock/handler/MockExecuteHandler.java | 10 +++++++ .../handler/MySqlMockExecuteHandlerImpl.java | 26 ++++++++++++++++++ 4 files changed, 59 insertions(+), 6 deletions(-) create mode 100644 src/main/java/com/alibaba/druid/mock/handler/MockExecuteHandler.java create mode 100644 src/main/java/com/alibaba/druid/mock/handler/MySqlMockExecuteHandlerImpl.java diff --git a/src/main/java/com/alibaba/druid/mock/MockDriver.java b/src/main/java/com/alibaba/druid/mock/MockDriver.java index 57aae77516..84715c7bca 100644 --- a/src/main/java/com/alibaba/druid/mock/MockDriver.java +++ b/src/main/java/com/alibaba/druid/mock/MockDriver.java @@ -27,12 +27,17 @@ import java.sql.SQLException; import java.sql.SQLXML; import java.util.Properties; +import com.alibaba.druid.mock.handler.MockExecuteHandler; +import com.alibaba.druid.mock.handler.MySqlMockExecuteHandlerImpl; + public class MockDriver implements Driver { - private String prefix = "jdbc:fake:"; - private String mockPrefix = "jdbc:mock:"; + private String prefix = "jdbc:fake:"; + private String mockPrefix = "jdbc:mock:"; - private final static MockDriver instance = new MockDriver(); + private MockExecuteHandler executeHandler = new MySqlMockExecuteHandlerImpl(); + + private final static MockDriver instance = new MockDriver(); static { registerDriver(instance); @@ -50,6 +55,14 @@ public class MockDriver implements Driver { return false; } + public MockExecuteHandler getExecuteHandler() { + return executeHandler; + } + + public void setExecuteHandler(MockExecuteHandler executeHandler) { + this.executeHandler = executeHandler; + } + @Override public Connection connect(String url, Properties info) throws SQLException { MockConnection conn = new MockConnection(this); @@ -100,13 +113,17 @@ public class MockDriver implements Driver { return true; } - protected ResultSet createResultSet(MockStatement stmt, String sql) { + protected ResultSet executeQuery(MockStatement stmt, String sql) throws SQLException { + if (this.executeHandler != null) { + return this.executeHandler.executeQuery(stmt, sql); + } + MockResultSet rs = new MockResultSet(stmt); if ("SELECT 1".equalsIgnoreCase(sql)) { rs.getRows().add(new Object[] { 1 }); } else if ("SELECT NULL".equalsIgnoreCase(sql)) { - rs.getRows().add(new Object[] { null }); + rs.getRows().add(new Object[] { null }); } else if ("SELECT NOW()".equalsIgnoreCase(sql)) { rs.getRows().add(new Object[] { new java.sql.Timestamp(System.currentTimeMillis()) }); } else if ("SELECT value FROM _int_1000_".equalsIgnoreCase(sql)) { diff --git a/src/main/java/com/alibaba/druid/mock/MockStatement.java b/src/main/java/com/alibaba/druid/mock/MockStatement.java index 39bff4db62..b1fd8a28b2 100644 --- a/src/main/java/com/alibaba/druid/mock/MockStatement.java +++ b/src/main/java/com/alibaba/druid/mock/MockStatement.java @@ -59,7 +59,7 @@ public class MockStatement implements Statement { @Override public ResultSet executeQuery(String sql) throws SQLException { if (fakeConnection != null && fakeConnection.getDriver() != null) { - return fakeConnection.getDriver().createResultSet(this, sql); + return fakeConnection.getDriver().executeQuery(this, sql); } return new MockResultSet(this); diff --git a/src/main/java/com/alibaba/druid/mock/handler/MockExecuteHandler.java b/src/main/java/com/alibaba/druid/mock/handler/MockExecuteHandler.java new file mode 100644 index 0000000000..662919d846 --- /dev/null +++ b/src/main/java/com/alibaba/druid/mock/handler/MockExecuteHandler.java @@ -0,0 +1,10 @@ +package com.alibaba.druid.mock.handler; + +import java.sql.ResultSet; +import java.sql.SQLException; + +import com.alibaba.druid.mock.MockStatement; + +public interface MockExecuteHandler { + ResultSet executeQuery(MockStatement statement, String sql) throws SQLException; +} diff --git a/src/main/java/com/alibaba/druid/mock/handler/MySqlMockExecuteHandlerImpl.java b/src/main/java/com/alibaba/druid/mock/handler/MySqlMockExecuteHandlerImpl.java new file mode 100644 index 0000000000..cc408c2761 --- /dev/null +++ b/src/main/java/com/alibaba/druid/mock/handler/MySqlMockExecuteHandlerImpl.java @@ -0,0 +1,26 @@ +package com.alibaba.druid.mock.handler; + +import java.sql.ResultSet; +import java.sql.SQLException; +import java.util.List; + +import com.alibaba.druid.mock.MockStatement; +import com.alibaba.druid.sql.ast.SQLStatement; +import com.alibaba.druid.sql.dialect.mysql.parser.MySqlStatementParser; +import com.alibaba.druid.sql.parser.SQLStatementParser; + +public class MySqlMockExecuteHandlerImpl implements MockExecuteHandler { + @Override + public ResultSet executeQuery(MockStatement statement, String sql) throws SQLException { + SQLStatementParser parser = new MySqlStatementParser(sql); + List stmtList = parser.parseStatementList(); // + + if (stmtList.size() > 1) { + throw new SQLException("not support multi-statment. " + sql); + } + + // TODO Auto-generated method stub + return null; + } + +}