This commit is contained in:
温少
2012-03-17 11:48:14 +08:00
parent cd632cd8f1
commit 6de22b54df
17 changed files with 339 additions and 58 deletions
@@ -21,9 +21,8 @@ import java.sql.Clob;
import java.sql.NClob;
import java.sql.SQLException;
import java.sql.Savepoint;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Map;
import java.util.Properties;
import java.util.concurrent.ConcurrentMap;
import java.util.concurrent.atomic.AtomicLong;
@@ -40,6 +39,7 @@ import com.alibaba.druid.logging.LogFactory;
import com.alibaba.druid.proxy.jdbc.CallableStatementProxy;
import com.alibaba.druid.proxy.jdbc.ConnectionProxy;
import com.alibaba.druid.proxy.jdbc.DataSourceProxy;
import com.alibaba.druid.proxy.jdbc.JdbcParameter;
import com.alibaba.druid.proxy.jdbc.PreparedStatementProxy;
import com.alibaba.druid.proxy.jdbc.ResultSetProxy;
import com.alibaba.druid.proxy.jdbc.StatementProxy;
@@ -406,29 +406,32 @@ public class StatFilter extends FilterEventAdapter implements StatFilterMBean {
long millis = nanoSpan / (1000 * 1000);
if (millis >= slowSqlMillis) {
List<String> lastSlowParameters = new ArrayList<String>();
for (Object value : statement.getParameters().values()) {
Map<Integer, JdbcParameter> parameters = statement.getParameters();
String[] lastSlowParameters = new String[parameters.size()];
int index = 0;
for (JdbcParameter parameter : statement.getParameters().values()) {
Object value = parameter.getValue();
if (value == null) {
lastSlowParameters.add("null");
lastSlowParameters[index] = "null";
} else if (value instanceof String) {
lastSlowParameters.add("'" + value.toString() + "'");
lastSlowParameters[index] = "'" + value.toString() + "'";
} else if (value instanceof Number) {
lastSlowParameters.add(value.toString());
lastSlowParameters[index] = value.toString();
} else if (value instanceof java.util.Date) {
java.util.Date date = (java.util.Date) value;
lastSlowParameters.add(date.getClass().getSimpleName() + "(" + date.getTime() + ")");
lastSlowParameters[index] = date.getClass().getSimpleName() + "(" + date.getTime() + ")";
} else if (value instanceof Boolean) {
lastSlowParameters.add(value.toString());
lastSlowParameters[index] = value.toString();
} else if (value instanceof InputStream) {
lastSlowParameters.add("<InputStream>");
lastSlowParameters[index] = "<InputStream>";
} else if (value instanceof Clob) {
lastSlowParameters.add("<Clob>");
lastSlowParameters[index] = "<Clob>";
} else if (value instanceof NClob) {
lastSlowParameters.add("<NClob>");
lastSlowParameters[index] = "<NClob>";
} else if (value instanceof Blob) {
lastSlowParameters.add("<Blob>");
lastSlowParameters[index] = "<Blob>";
} else {
lastSlowParameters.add("<" + value.getClass() + ">");
lastSlowParameters[index] = "<" + value.getClass() + ">";
}
}
sqlStat.setLastSlowParameters(lastSlowParameters);
@@ -9,9 +9,19 @@ public class WallUtils {
MySqlWallProvider provider = new MySqlWallProvider();
return provider.check(sql, false);
}
public static boolean isValidateMySql(String sql, WallConfig config) {
MySqlWallProvider provider = new MySqlWallProvider(config);
return provider.check(sql, false);
}
public static boolean isValidateOracle(String sql) {
OracleWallProvider provider = new OracleWallProvider();
return provider.check(sql, false);
}
public static boolean isValidateOracle(String sql, WallConfig config) {
OracleWallProvider provider = new OracleWallProvider(config);
return provider.check(sql, false);
}
}
@@ -89,23 +89,13 @@ public class MySqlWallVisitor extends MySqlASTVisitorAdapter implements WallVisi
@Override
public boolean visit(SQLDeleteStatement x) {
if (!config.isDeleteAllow()) {
this.getViolations().add(new IllegalSQLObjectViolation(this.toSQL(x)));
return false;
}
WallVisitorUtils.checkDeleteCondition(this, x.getWhere());
WallVisitorUtils.checkDelete(this, x);
return true;
}
@Override
public boolean visit(SQLUpdateStatement x) {
if (!config.isUpdateAllow()) {
this.getViolations().add(new IllegalSQLObjectViolation(this.toSQL(x)));
return false;
}
WallVisitorUtils.checkUpdateCondition(this, x.getWhere());
WallVisitorUtils.checkUpdate(this, x);
return true;
}
@@ -200,12 +200,7 @@ public class OracleWallVisitor extends OracleASTVIsitorAdapter implements WallVi
@Override
public boolean visit(SQLDeleteStatement x) {
if (!config.isDeleteAllow()) {
this.getViolations().add(new IllegalSQLObjectViolation(this.toSQL(x)));
return false;
}
WallVisitorUtils.checkDeleteCondition(this, x.getWhere());
WallVisitorUtils.checkDelete(this, x);
return true;
}
@@ -216,12 +211,7 @@ public class OracleWallVisitor extends OracleASTVIsitorAdapter implements WallVi
@Override
public boolean visit(SQLUpdateStatement x) {
if (!config.isUpdateAllow()) {
this.getViolations().add(new IllegalSQLObjectViolation(this.toSQL(x)));
return false;
}
WallVisitorUtils.checkUpdateCondition(this, x.getWhere());
WallVisitorUtils.checkUpdate(this, x);
return true;
}
@@ -29,6 +29,7 @@ import com.alibaba.druid.sql.ast.expr.SQLNullExpr;
import com.alibaba.druid.sql.ast.expr.SQLNumericLiteralExpr;
import com.alibaba.druid.sql.ast.expr.SQLPropertyExpr;
import com.alibaba.druid.sql.ast.expr.SQLQueryExpr;
import com.alibaba.druid.sql.ast.statement.SQLDeleteStatement;
import com.alibaba.druid.sql.ast.statement.SQLExprTableSource;
import com.alibaba.druid.sql.ast.statement.SQLSelect;
import com.alibaba.druid.sql.ast.statement.SQLSelectItem;
@@ -36,6 +37,7 @@ import com.alibaba.druid.sql.ast.statement.SQLSelectQuery;
import com.alibaba.druid.sql.ast.statement.SQLSelectQueryBlock;
import com.alibaba.druid.sql.ast.statement.SQLSubqueryTableSource;
import com.alibaba.druid.sql.ast.statement.SQLTableSource;
import com.alibaba.druid.sql.ast.statement.SQLUpdateStatement;
import com.alibaba.druid.sql.dialect.mysql.ast.expr.MySqlBooleanExpr;
import com.alibaba.druid.util.JdbcUtils;
@@ -92,8 +94,9 @@ public class WallVisitorUtils {
}
}
public static void checkDeleteCondition(WallVisitor visitor, SQLExpr x) {
if (x == null) {
public static void checkDelete(WallVisitor visitor, SQLDeleteStatement x) {
if (!visitor.getConfig().isDeleteAllow()) {
visitor.getViolations().add(new IllegalSQLObjectViolation(visitor.toSQL(x)));
return;
}
@@ -101,22 +104,23 @@ public class WallVisitorUtils {
return;
}
if (Boolean.TRUE == getValue(x)) {
visitor.getViolations().add(new IllegalSQLObjectViolation(SQLUtils.toSQLString(x)));
if (x.getWhere() == null || Boolean.TRUE == getValue(x.getWhere())) {
visitor.getViolations().add(new IllegalSQLObjectViolation(visitor.toSQL(x)));
}
}
public static void checkUpdateCondition(WallVisitor visitor, SQLExpr x) {
if (x == null) {
public static void checkUpdate(WallVisitor visitor, SQLUpdateStatement x) {
if (!visitor.getConfig().isUpdateAllow()) {
visitor.getViolations().add(new IllegalSQLObjectViolation(visitor.toSQL(x)));
return;
}
if (!visitor.getConfig().isUpdateWhereAlayTrueCheck()) {
return;
}
if (Boolean.TRUE == getValue(x)) {
visitor.getViolations().add(new IllegalSQLObjectViolation(SQLUtils.toSQLString(x)));
if (x.getWhere() == null || Boolean.TRUE == getValue(x.getWhere())) {
visitor.getViolations().add(new IllegalSQLObjectViolation(visitor.toSQL(x)));
}
}
@@ -395,11 +399,11 @@ public class WallVisitorUtils {
visitor.getViolations().add(new IllegalSQLObjectViolation(visitor.toSQL(x)));
}
}
if (!visitor.getConfig().isFunctionCheck()) {
return;
}
String methodName = x.getMethodName();
if (visitor.getConfig().isPermitFunction(methodName.toLowerCase())) {
@@ -17,7 +17,6 @@ package com.alibaba.druid.stat;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.concurrent.atomic.AtomicLong;
@@ -65,7 +64,7 @@ public final class JdbcSqlStat implements JdbcSqlStatMBean {
private final AtomicLong inTransactionCount = new AtomicLong();
private List<String> lastSlowParameters;
private String[] lastSlowParameters;
private final Histogram histogram = new Histogram(new long[] { //
//
@@ -78,11 +77,11 @@ public final class JdbcSqlStat implements JdbcSqlStatMBean {
this.sql = sql;
}
public List<String> getLastSlowParameters() {
public String[] getLastSlowParameters() {
return lastSlowParameters;
}
public void setLastSlowParameters(List<String> lastSlowParameters) {
public void setLastSlowParameters(String[] lastSlowParameters) {
this.lastSlowParameters = lastSlowParameters;
}
@@ -391,7 +390,8 @@ public final class JdbcSqlStat implements JdbcSqlStatMBean {
SimpleType.STRING, //
// 25 -
new ArrayType<Long>(SimpleType.LONG, true) //
new ArrayType<Long>(SimpleType.LONG, true), //
new ArrayType<Long>(SimpleType.STRING, true), //
};
String[] indexNames = {
@@ -431,7 +431,9 @@ public final class JdbcSqlStat implements JdbcSqlStatMBean {
"URL", //
// 25 -
"Histogram" //
"Histogram", //
"LastSlowParameters"
//
};
String[] indexDescriptions = indexNames;
COMPOSITE_TYPE = new CompositeType("SqlStatistic", "Sql Statistic", indexNames, indexDescriptions, indexTypes);
@@ -446,6 +448,7 @@ public final class JdbcSqlStat implements JdbcSqlStatMBean {
public Map<String, Object> getData() throws JMException {
Map<String, Object> map = new HashMap<String, Object>();
// 0 - 4
map.put("ID", id);
map.put("DataSource", dataSource);
map.put("SQL", sql);
@@ -487,6 +490,7 @@ public final class JdbcSqlStat implements JdbcSqlStatMBean {
map.put("InTransactionCount", getInTransactionCount());
map.put("Histogram", this.histogram.toArray());
map.put("LastSlowParameters", lastSlowParameters);
return map;
}