package com.taobao.tddl.common.mock; import java.sql.Connection; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.SQLWarning; import java.sql.Statement; import java.util.ArrayList; import java.util.List; import com.taobao.tddl.common.exception.NotSupportException; import com.taobao.tddl.common.mock.MockDataSource.ExecuteInfo; import com.taobao.tddl.common.utils.logger.Logger; import com.taobao.tddl.common.utils.logger.LoggerFactory; public class MockStatement implements Statement { private static final Logger logger = LoggerFactory.getLogger(MockStatement.class); protected MockDataSource mds; protected String sql; protected List<String> sqls = new ArrayList<String>(); protected int queryTimeout; protected int fetchSize; protected int maxRows; private boolean isClosed; private int closeInvokingTimes = 0; private boolean success = true; private int executeSqlInvokingTimes = 0; public MockStatement(String method, MockDataSource mockDataSource, String sql){ this.sql = sql; this.mds = mockDataSource; MockDataSource.record(new ExecuteInfo(this.mds, method, null, null)); } public MockStatement(String method, MockDataSource mockDataSource){ this.mds = mockDataSource; MockDataSource.record(new ExecuteInfo(this.mds, method, null, null)); } public void addBatch(String sql) throws SQLException { mds.checkState(); this.sqls.add(sql); } public void cancel() throws SQLException { mds.checkState(); throw new NotSupportException(""); } public void clearBatch() throws SQLException { mds.checkState(); this.sqls.clear(); } public void clearWarnings() throws SQLException { throw new NotSupportException(""); } public void close() throws SQLException { mds.checkState(); closeInvokingTimes++; } protected void checkClosed() throws SQLException { if (isClosed) { throw new SQLException("closed"); } } public boolean execute(String sql) throws SQLException { mds.checkState(); this.sql = sql; executeSqlInvokingTimes++; logger.warn("[execute(String)]" + sql); MockDataSource.record(new ExecuteInfo(this.mds, "execute", this.sql, null)); return success; } public boolean execute(String sql, int autoGeneratedKeys) throws SQLException { mds.checkState(); this.sql = sql; executeSqlInvokingTimes++; logger.warn("[execute(String,int)]" + sql); MockDataSource.record(new ExecuteInfo(this.mds, "execute_sql_int", this.sql, null)); return success; } protected ExecuteHandler executerHandler = new ExecuteHandler() { public ResultSet execute(String method, String tsql) { sql = tsql; executeSqlInvokingTimes++; logger.warn("[executerHandler]" + sql); MockDataSource.record(new ExecuteInfo(MockStatement.this.mds, method, MockStatement.this.sql, null)); return new MockResultSet(mds, MockDataSource.popPreData()); } public boolean executeSql(String method, String tsql) { sql = tsql; executeSqlInvokingTimes++; logger.warn("[executerHandler]" + sql); MockDataSource.record(new ExecuteInfo(MockStatement.this.mds, method, MockStatement.this.sql, null)); return true; }; }; public boolean execute(String sql, int[] columnIndexes) throws SQLException { mds.checkState(); return executerHandler.executeSql("execute#sql_int[", sql); } public boolean execute(String sql, String[] columnNames) throws SQLException { mds.checkState(); return executerHandler.executeSql("execute#sql_string[", sql); } public int[] executeBatch() throws SQLException { mds.checkState(); logger.warn("[executeBatch]" + sql); MockDataSource.record(new ExecuteInfo(this.mds, "executeBatch", this.sql, null)); return new int[] { -1, -1 }; } public ResultSet executeQuery(String sql) throws SQLException { mds.checkState(); return executerHandler.execute("executeQuery", sql); } protected int updateInternal(String method, String sql) { try { Thread.sleep(insertSleepTime); } catch (InterruptedException e) { e.printStackTrace(); } this.sql = sql; MockDataSource.record(new ExecuteInfo(this.mds, method, this.sql, null)); logger.warn("[UpdateHandler]" + sql); return MockDataSource.popPreAffectedRow(); } public int executeUpdate(String sql) throws SQLException { mds.checkState(); return updateInternal("executeUpdate", sql); } private long insertSleepTime = 0; public int executeUpdate(String sql, int autoGeneratedKeys) throws SQLException { mds.checkState(); return updateInternal("executeUpdate#sql_int", sql); } public int executeUpdate(String sql, int[] columnIndexes) throws SQLException { mds.checkState(); return updateInternal("executeUpdate#sql_int[", sql); } public int executeUpdate(String sql, String[] columnNames) throws SQLException { mds.checkState(); return updateInternal("executeUpdate#sql_string[", sql); } public Connection getConnection() throws SQLException { throw new NotSupportException(""); } public int getFetchDirection() throws SQLException { throw new NotSupportException(""); } public int getFetchSize() throws SQLException { return this.fetchSize; } public ResultSet getGeneratedKeys() throws SQLException { throw new NotSupportException(""); } public int getMaxFieldSize() throws SQLException { throw new NotSupportException(""); } public int getMaxRows() throws SQLException { return this.maxRows; } public boolean getMoreResults() throws SQLException { throw new NotSupportException(""); } public boolean getMoreResults(int current) throws SQLException { throw new NotSupportException(""); } public int getQueryTimeout() throws SQLException { return this.queryTimeout; } public ResultSet getResultSet() throws SQLException { mds.checkState(); return new MockResultSet(mds, MockDataSource.popPreData()); } public int getResultSetConcurrency() throws SQLException { throw new NotSupportException(""); } public int getResultSetHoldability() throws SQLException { throw new NotSupportException(""); } public int getResultSetType() throws SQLException { throw new NotSupportException(""); } public int getUpdateCount() throws SQLException { throw new NotSupportException(""); } public SQLWarning getWarnings() throws SQLException { return null; } public void setCursorName(String name) throws SQLException { throw new NotSupportException(""); } public void setEscapeProcessing(boolean enable) throws SQLException { throw new NotSupportException(""); } public void setFetchDirection(int direction) throws SQLException { throw new NotSupportException(""); } public void setFetchSize(int rows) throws SQLException { this.fetchSize = rows; } public void setMaxFieldSize(int max) throws SQLException { throw new NotSupportException(""); } public void setMaxRows(int max) throws SQLException { this.maxRows = max; } public void setQueryTimeout(int seconds) throws SQLException { this.queryTimeout = seconds; } public String getSql() { return sql; } public void setSql(String sql) { this.sql = sql; } public int getCloseInvokingTimes() { return closeInvokingTimes; } public void setCloseInvokingTimes(int closeInvokingTimes) { this.closeInvokingTimes = closeInvokingTimes; } public boolean isClosed() { return isClosed; } public void setClosed(boolean isClosed) { this.isClosed = isClosed; } public boolean isSuccess() { return success; } public void setSuccess(boolean success) { this.success = success; } public int getExecuteSqlInvokingTimes() { return executeSqlInvokingTimes; } public void setExecuteSqlInvokingTimes(int executeSqlInvokingTimes) { this.executeSqlInvokingTimes = executeSqlInvokingTimes; } public ExecuteHandler getExecuterHandler() { return executerHandler; } public void setExecuterHandler(ExecuteHandler executerHandler) { this.executerHandler = executerHandler; } public long getInsertSleepTime() { return insertSleepTime; } public void setInsertSleepTime(long insertSleepTime) { this.insertSleepTime = insertSleepTime; } public <T> T unwrap(Class<T> iface) throws SQLException { return null; } public boolean isWrapperFor(Class<?> iface) throws SQLException { return false; } public void setPoolable(boolean poolable) throws SQLException { } public boolean isPoolable() throws SQLException { return false; } }