mirror of
https://github.com/alibaba/druid.git
synced 2023-03-04 19:17:16 +00:00
git-svn-id: http://code.alibabatech.com/svn/druid/trunk@74 b9813039-fb51-4c41-a8b9-e21c2acb5095
This commit is contained in:
@@ -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) {
|
||||
|
||||
@@ -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<SQLStatement> 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;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -22,4 +22,6 @@ public abstract class SQLNumericLiteralExpr extends SQLLiteralExpr {
|
||||
public SQLNumericLiteralExpr(){
|
||||
|
||||
}
|
||||
|
||||
public abstract Number getNumber();
|
||||
}
|
||||
|
||||
@@ -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();
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user