11package com .codingapi .dbstream .listener ;
22
33import com .codingapi .dbstream .interceptor .SQLExecuteState ;
4- import com .codingapi .dbstream .parser .DeleteDataParser ;
4+ import com .codingapi .dbstream .parser .DeleteDBEventParser ;
5+ import com .codingapi .dbstream .scanner .DbTable ;
56import com .codingapi .dbstream .stream .DBEvent ;
67import com .codingapi .dbstream .stream .TransactionEventPools ;
8+ import com .codingapi .dbstream .utils .SQLParamUtils ;
79import net .sf .jsqlparser .parser .CCJSqlParserUtil ;
10+ import net .sf .jsqlparser .schema .Table ;
811import net .sf .jsqlparser .statement .Statement ;
912import net .sf .jsqlparser .statement .delete .Delete ;
1013
1114import java .sql .SQLException ;
1215import java .util .List ;
13- import java .util .regex .Pattern ;
1416
1517public class SQLDeleteExecuteListener implements SQLExecuteListener {
1618
17- private final static ThreadLocal <DeleteDataParser > threadLocal = new ThreadLocal <>();
18-
19- private static final Pattern DELETE_SQL_PATTERN = Pattern .compile (
20- "^\\ s*(?i)(DELETE)\\ b.*" ,
21- Pattern .DOTALL
22- );
23-
24-
25- public static boolean match (String sql ) {
26- if (sql == null || sql .trim ().isEmpty ()) {
27- return false ;
28- }
29- return DELETE_SQL_PATTERN .matcher (sql .trim ()).matches ();
30- }
31-
32- @ Override
33- public void after (SQLExecuteState executeState , Object result ) throws SQLException {
34- String sql = executeState .getSql ();
35- String transactionKey = executeState .getTransactionKey ();
36- if (match (sql ) && executeState .hasMetaData ()) {
37- DeleteDataParser dataParser = threadLocal .get ();
38- if (dataParser != null ) {
39- List <DBEvent > eventList = dataParser .loadEvents (result );
40- TransactionEventPools .getInstance ().addEvents (transactionKey ,eventList );
41- threadLocal .remove ();
42- }
43- }
44- }
19+ private final static ThreadLocal <DeleteDBEventParser > threadLocal = new ThreadLocal <>();
4520
4621 @ Override
4722 public void before (SQLExecuteState executeState ) throws SQLException {
4823 String sql = executeState .getSql ();
49- if (match ( sql ) && executeState . hasMetaData ( )) {
24+ if (SQLParamUtils . isDeleteSQL ( sql )) {
5025 try {
5126 threadLocal .remove ();
5227 Statement parserStatement = CCJSqlParserUtil .parse (sql );
5328 Delete delete = (Delete ) parserStatement ;
54- DeleteDataParser dataParser = new DeleteDataParser (executeState , delete );
55- dataParser .prepare ();
56- threadLocal .set (dataParser );
29+ Table table = delete .getTable ();
30+ DbTable dbTable = executeState .getDbTable (table .getName ());
31+ if (dbTable != null ) {
32+ DeleteDBEventParser dataParser = new DeleteDBEventParser (executeState , delete , table , dbTable );
33+ dataParser .prepare ();
34+ threadLocal .set (dataParser );
35+ }
5736 } catch (Exception e ) {
5837 threadLocal .remove ();
5938 throw new SQLException (e );
@@ -62,4 +41,18 @@ public void before(SQLExecuteState executeState) throws SQLException {
6241 threadLocal .remove ();
6342 }
6443 }
44+
45+ @ Override
46+ public void after (SQLExecuteState executeState , Object result ) throws SQLException {
47+ String sql = executeState .getSql ();
48+ String transactionKey = executeState .getTransactionKey ();
49+ if (SQLParamUtils .isDeleteSQL (sql )) {
50+ DeleteDBEventParser dataParser = threadLocal .get ();
51+ if (dataParser != null ) {
52+ List <DBEvent > eventList = dataParser .loadEvents (result );
53+ TransactionEventPools .getInstance ().addEvents (transactionKey , eventList );
54+ threadLocal .remove ();
55+ }
56+ }
57+ }
6558}
0 commit comments