yangys
2024-04-04 2cf2921440e7473ae50796c2cb688f609b3a7995
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
package com.qianwen.core.mp.plugins;
 
import com.alibaba.druid.DbType;
import com.alibaba.druid.filter.FilterChain;
import com.alibaba.druid.filter.FilterEventAdapter;
import com.alibaba.druid.proxy.jdbc.JdbcParameter;
import com.alibaba.druid.proxy.jdbc.ResultSetProxy;
import com.alibaba.druid.proxy.jdbc.StatementProxy;
import com.alibaba.druid.sql.SQLUtils;
import java.time.temporal.TemporalAccessor;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.qianwen.core.mp.props.MybatisPlusProperties;
import com.qianwen.core.tool.utils.StringUtil;
 
/* loaded from: blade-starter-mybatis-9.3.0.0-SNAPSHOT.jar:org/springblade/core/mp/plugins/SqlLogInterceptor.class */
public class SqlLogInterceptor extends FilterEventAdapter {
    private static final Logger log = LoggerFactory.getLogger(SqlLogInterceptor.class);
    private static final SQLUtils.FormatOption FORMAT_OPTION = new SQLUtils.FormatOption(false, false);
    //private static final List<String> SQL_LOG_EXCLUDE = new ArrayList(Arrays.asList("new_param_json", "ACT_RU_JOB", "ACT_RU_TIMER_JOB"));
    private static final List<String> SQL_LOG_EXCLUDE = new ArrayList<>(Arrays.asList(new String[] { "new_param_json", "ACT_RU_JOB", "ACT_RU_TIMER_JOB" }));
    private final MybatisPlusProperties properties;
 
    public SqlLogInterceptor(MybatisPlusProperties properties) {
        this.properties = properties;
        if (properties.getSqlLogExclude().size() > 0) {
            SQL_LOG_EXCLUDE.addAll(properties.getSqlLogExclude());
        }
    }
 
    protected void statementExecuteBefore(StatementProxy statement, String sql) {
        statement.setLastExecuteStartNano();
    }
 
    protected void statementExecuteBatchBefore(StatementProxy statement) {
        statement.setLastExecuteStartNano();
    }
 
    protected void statementExecuteUpdateBefore(StatementProxy statement, String sql) {
        statement.setLastExecuteStartNano();
    }
 
    protected void statementExecuteQueryBefore(StatementProxy statement, String sql) {
        statement.setLastExecuteStartNano();
    }
 
    protected void statementExecuteAfter(StatementProxy statement, String sql, boolean firstResult) {
        statement.setLastExecuteTimeNano();
    }
 
    protected void statementExecuteBatchAfter(StatementProxy statement, int[] result) {
        statement.setLastExecuteTimeNano();
    }
 
    protected void statementExecuteQueryAfter(StatementProxy statement, String sql, ResultSetProxy resultSet) {
        statement.setLastExecuteTimeNano();
    }
 
    protected void statementExecuteUpdateAfter(StatementProxy statement, String sql, int updateCount) {
        statement.setLastExecuteTimeNano();
    }
 
    public void statement_close(FilterChain chain, StatementProxy statement) {
        try {
            if (!this.properties.getSqlLog().booleanValue()) {
                chain.statement_close(statement);
                return;
            }
            if (!log.isInfoEnabled()) {
                chain.statement_close(statement);
                return;
            }
            String sql = statement.getBatchSql();
            if (StringUtil.isEmpty(sql)) {
                chain.statement_close(statement);
                return;
            }
            if (excludeSql(sql)) {
                chain.statement_close(statement);
                return;
            }
            int parametersSize = statement.getParametersSize();
            List<Object> parameters = new ArrayList<>(parametersSize);
            for (int i = 0; i < parametersSize; i++)
                parameters.add(getJdbcParameter(statement.getParameter(i)));
            String dbType = statement.getConnectionProxy().getDirectDataSource().getDbType();
            String formattedSql = SQLUtils.format(sql, DbType.of(dbType), parameters, FORMAT_OPTION);
            printSql(formattedSql, statement);
            chain.statement_close(statement);
        } catch (Throwable ex) {
            throw new RuntimeException(ex);
        }
    }
 
    private static Object getJdbcParameter(JdbcParameter jdbcParam) {
        if (jdbcParam == null) {
            return null;
        }
        Object value = jdbcParam.getValue();
        if (value instanceof TemporalAccessor) {
            return value.toString();
        }
        return value;
    }
 
    private static void printSql(String sql, StatementProxy statement) {
        log.info("\n\n==============  Sql Start  ==============\nExecute SQL : {}\nExecute Time: {}\n==============  Sql  End   ==============\n", sql.trim(), StringUtil.format(statement.getLastExecuteTimeNano()));
    }
 
    private static boolean excludeSql(String sql) {
        for (String exclude : SQL_LOG_EXCLUDE) {
            if (sql.contains(exclude)) {
                return true;
            }
        }
        return false;
    }
}