From dacdee139c3dc13b30811d64bf2c86bd1b3f9b8f Mon Sep 17 00:00:00 2001 From: wenshao Date: Sat, 14 May 2011 09:09:13 +0000 Subject: [PATCH] git-svn-id: http://code.alibabatech.com/svn/druid/trunk@74 b9813039-fb51-4c41-a8b9-e21c2acb5095 --- .../com/alibaba/druid/mock/MockDriver.java | 28 +++---- .../handler/MySqlMockExecuteHandlerImpl.java | 81 ++++++++++++++++++- .../com/alibaba/druid/proxy/DruidDriver.java | 4 + .../sql/ast/expr/SQLNumericLiteralExpr.java | 2 + .../druid/bvt/mock/MockExecuteTest.java | 53 ++++++++++++ 5 files changed, 150 insertions(+), 18 deletions(-) create mode 100644 src/test/java/com/alibaba/druid/bvt/mock/MockExecuteTest.java diff --git a/src/main/java/com/alibaba/druid/mock/MockDriver.java b/src/main/java/com/alibaba/druid/mock/MockDriver.java index 84715c7bca..532d003272 100644 --- a/src/main/java/com/alibaba/druid/mock/MockDriver.java +++ b/src/main/java/com/alibaba/druid/mock/MockDriver.java @@ -65,6 +65,10 @@ public class MockDriver implements Driver { @Override public Connection connect(String url, Properties info) throws SQLException { + if (!acceptsURL(url)) { + return null; + } + MockConnection conn = new MockConnection(this); if (url == null) { @@ -90,7 +94,11 @@ public class MockDriver implements Driver { @Override public boolean acceptsURL(String url) throws SQLException { - return url.startsWith(prefix); + if (url == null) { + return false; + } + + return url.startsWith(prefix) || url.startsWith(mockPrefix); } @Override @@ -114,25 +122,17 @@ public class MockDriver implements Driver { } 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 value FROM _int_1000_".equalsIgnoreCase(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 }); - } 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)) { for (int i = 0; i < 1000; ++i) { rs.getRows().add(new Object[] { i }); } + + return rs; } - return rs; + return this.executeHandler.executeQuery(stmt, sql); } protected ResultSet createResultSet(MockPreparedStatement stmt) { diff --git a/src/main/java/com/alibaba/druid/mock/handler/MySqlMockExecuteHandlerImpl.java b/src/main/java/com/alibaba/druid/mock/handler/MySqlMockExecuteHandlerImpl.java index cc408c2761..6206bbea6a 100644 --- a/src/main/java/com/alibaba/druid/mock/handler/MySqlMockExecuteHandlerImpl.java +++ b/src/main/java/com/alibaba/druid/mock/handler/MySqlMockExecuteHandlerImpl.java @@ -2,25 +2,98 @@ package com.alibaba.druid.mock.handler; import java.sql.ResultSet; import java.sql.SQLException; +import java.sql.Timestamp; import java.util.List; +import com.alibaba.druid.mock.MockResultSet; import com.alibaba.druid.mock.MockStatement; +import com.alibaba.druid.sql.ast.SQLExpr; import com.alibaba.druid.sql.ast.SQLStatement; +import com.alibaba.druid.sql.ast.expr.SQLMethodInvokeExpr; +import com.alibaba.druid.sql.ast.expr.SQLNullExpr; +import com.alibaba.druid.sql.ast.expr.SQLNumericLiteralExpr; +import com.alibaba.druid.sql.ast.statement.SQLExprTableSource; +import com.alibaba.druid.sql.ast.statement.SQLSelect; +import com.alibaba.druid.sql.ast.statement.SQLSelectItem; +import com.alibaba.druid.sql.ast.statement.SQLSelectQuery; +import com.alibaba.druid.sql.ast.statement.SQLSelectQueryBlock; +import com.alibaba.druid.sql.ast.statement.SQLSelectStatement; +import com.alibaba.druid.sql.ast.statement.SQLTableSource; 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; + + if (stmtList.size() == 0) { + throw new SQLException("executeQueryError : " + sql); + } + + SQLStatement stmt = stmtList.get(0); + + if (!(stmt instanceof SQLSelectStatement)) { + throw new SQLException("executeQueryError : " + sql); + } + + SQLSelect select = ((SQLSelectStatement) stmt).getSelect(); + SQLSelectQuery query = select.getQuery(); + + if (query instanceof SQLSelectQueryBlock) { + return executeQuery(statement, (SQLSelectQueryBlock) query); + } + + throw new SQLException("TODO"); } + public ResultSet executeQuery(MockStatement statement, SQLSelectQueryBlock query) throws SQLException { + SQLTableSource from = query.getFrom(); + + if (from instanceof SQLExprTableSource) { + throw new SQLException("TODO"); + } else if (from == null) { + return executeQueryFromDual(statement, query); + } else { + throw new SQLException("TODO"); + } + + } + + public ResultSet executeQueryFromDual(MockStatement statement, SQLSelectQueryBlock query) throws SQLException { + MockResultSet rs = new MockResultSet(statement); + Object[] row = new Object[query.getSelectList().size()]; + + for (int i = 0, size = query.getSelectList().size(); i < size; ++i) { + SQLSelectItem item = query.getSelectList().get(i); + SQLExpr expr = item.getExpr(); + + if (expr instanceof SQLNumericLiteralExpr) { + row[i] = ((SQLNumericLiteralExpr) expr).getNumber(); + } else if (expr instanceof SQLNullExpr) { + row[i] = null; + } else if (expr instanceof SQLMethodInvokeExpr) { + SQLMethodInvokeExpr methodInvokeExpr = (SQLMethodInvokeExpr) expr; + + if ("NOW".equalsIgnoreCase(methodInvokeExpr.getMethodName())) { + row[i] = new Timestamp(System.currentTimeMillis()); + } else { + throw new SQLException("TODO"); + } + + } else { + throw new SQLException("TODO"); + } + } + + rs.getRows().add(row); + + return rs; + } } diff --git a/src/main/java/com/alibaba/druid/proxy/DruidDriver.java b/src/main/java/com/alibaba/druid/proxy/DruidDriver.java index 67da98f911..c33f460874 100644 --- a/src/main/java/com/alibaba/druid/proxy/DruidDriver.java +++ b/src/main/java/com/alibaba/druid/proxy/DruidDriver.java @@ -105,6 +105,10 @@ public class DruidDriver implements Driver, DruidDriverMBean { @Override public Connection connect(String url, Properties info) throws SQLException { + if (!acceptsURL(url)) { + return null; + } + connectCounter.incrementAndGet(); DataSourceProxyImpl dataSource = getDataSource(url, info); diff --git a/src/main/java/com/alibaba/druid/sql/ast/expr/SQLNumericLiteralExpr.java b/src/main/java/com/alibaba/druid/sql/ast/expr/SQLNumericLiteralExpr.java index 7b4df88e81..e95491a779 100644 --- a/src/main/java/com/alibaba/druid/sql/ast/expr/SQLNumericLiteralExpr.java +++ b/src/main/java/com/alibaba/druid/sql/ast/expr/SQLNumericLiteralExpr.java @@ -22,4 +22,6 @@ public abstract class SQLNumericLiteralExpr extends SQLLiteralExpr { public SQLNumericLiteralExpr(){ } + + public abstract Number getNumber(); } diff --git a/src/test/java/com/alibaba/druid/bvt/mock/MockExecuteTest.java b/src/test/java/com/alibaba/druid/bvt/mock/MockExecuteTest.java new file mode 100644 index 0000000000..0e065f0821 --- /dev/null +++ b/src/test/java/com/alibaba/druid/bvt/mock/MockExecuteTest.java @@ -0,0 +1,53 @@ +package com.alibaba.druid.bvt.mock; + +import java.sql.Connection; +import java.sql.DriverManager; +import java.sql.ResultSet; +import java.sql.Statement; +import java.sql.Timestamp; + +import junit.framework.TestCase; + +import org.junit.Assert; + +public class MockExecuteTest extends TestCase { + public void test_0 () throws Exception { + Connection conn = DriverManager.getConnection("jdbc:mock:"); + Statement stmt = conn.createStatement(); + + ResultSet rs = stmt.executeQuery("SELECT 2"); + Assert.assertTrue(rs.next()); + Assert.assertEquals(2, rs.getInt(1)); + rs.close(); + + stmt.close(); + conn.close(); + } + + public void test_1 () throws Exception { + Connection conn = DriverManager.getConnection("jdbc:mock:"); + Statement stmt = conn.createStatement(); + + ResultSet rs = stmt.executeQuery("SELECT NULL"); + Assert.assertTrue(rs.next()); + Assert.assertEquals(0, rs.getInt(1)); + Assert.assertEquals(null, rs.getObject(1)); + rs.close(); + + stmt.close(); + conn.close(); + } + + public void test_2 () throws Exception { + Connection conn = DriverManager.getConnection("jdbc:mock:"); + Statement stmt = conn.createStatement(); + + ResultSet rs = stmt.executeQuery("SELECT NOW()"); + Assert.assertTrue(rs.next()); + Assert.assertTrue(rs.getObject(1) instanceof Timestamp); + rs.close(); + + stmt.close(); + conn.close(); + } +}