Skip to content

Commit f0730f4

Browse files
committed
add DBTableSupportProvider
1 parent 8af9763 commit f0730f4

File tree

12 files changed

+94
-27
lines changed

12 files changed

+94
-27
lines changed

README.md

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -145,6 +145,13 @@ DBStreamContext.getInstance().addEventPusher(DBEventPusher pusher);
145145
DBStreamContext.getInstance().addListener(SQLExecuteListener listener);
146146
```
147147

148+
#### 数据库表支持判断
149+
150+
```java
151+
// 添加 SQL 表执行判断
152+
DBStreamContext.getInstance().setDbTableSupportProvider(DBTableSupportProvider dbTableSupportProvider);
153+
```
154+
148155
#### 元数据管理
149156

150157
```java

pom.xml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
<modelVersion>4.0.0</modelVersion>
55
<groupId>com.codingapi.dbstream</groupId>
66
<artifactId>dbstream-driver</artifactId>
7-
<version>1.0.0</version>
7+
<version>1.0.1</version>
88

99
<url>https://github.com/codingapi/dbstream-driver</url>
1010
<name>dbstream-driver</name>

src/main/java/com/codingapi/dbstream/DBStreamContext.java

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,13 +2,17 @@
22

33
import com.codingapi.dbstream.interceptor.SQLRunningContext;
44
import com.codingapi.dbstream.listener.SQLExecuteListener;
5+
import com.codingapi.dbstream.provider.DBTableSupportProvider;
6+
import com.codingapi.dbstream.provider.DefaultDBTableSupportProvider;
57
import com.codingapi.dbstream.scanner.DBMetaContext;
68
import com.codingapi.dbstream.scanner.DBMetaData;
79
import com.codingapi.dbstream.stream.DBEventContext;
810
import com.codingapi.dbstream.stream.DBEventPusher;
911
import lombok.Getter;
12+
import lombok.Setter;
1013

1114
import java.util.List;
15+
import java.util.Properties;
1216

1317
/**
1418
* DBStream 对外提供的能力服务
@@ -18,6 +22,10 @@ public class DBStreamContext {
1822
@Getter
1923
private final static DBStreamContext instance = new DBStreamContext();
2024

25+
@Setter
26+
private DBTableSupportProvider dbTableSupportProvider;
27+
28+
2129
private DBStreamContext() {
2230

2331
}
@@ -31,6 +39,19 @@ public void addListener(SQLExecuteListener sqlExecuteListener) {
3139
SQLRunningContext.getInstance().addListener(sqlExecuteListener);
3240
}
3341

42+
/**
43+
* 是否支持SQL 拦截代理分析
44+
* @param info 数据库连接信息
45+
* @param tableName 数据库名称
46+
* @return 是否支持
47+
*/
48+
public boolean support(Properties info, String tableName) {
49+
if (dbTableSupportProvider == null) {
50+
this.dbTableSupportProvider = new DefaultDBTableSupportProvider();
51+
}
52+
return dbTableSupportProvider.support(info, tableName);
53+
}
54+
3455

3556
/**
3657
* 添加DB事件推送

src/main/java/com/codingapi/dbstream/interceptor/SQLExecuteState.java

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -8,10 +8,7 @@
88
import lombok.Setter;
99

1010
import java.sql.*;
11-
import java.util.ArrayList;
12-
import java.util.HashMap;
13-
import java.util.List;
14-
import java.util.Map;
11+
import java.util.*;
1512

1613
/**
1714
* 数据库的执行状态
@@ -218,6 +215,14 @@ public List<Map<String, Object>> getStatementGenerateKeys(DbTable dbTable) {
218215
}
219216

220217

218+
public Properties getDriverProperties(){
219+
if (metaData == null) {
220+
return null;
221+
}
222+
return this.metaData.getProperties();
223+
}
224+
225+
221226
public String getJdbcUrl() {
222227
if (metaData == null) {
223228
return null;

src/main/java/com/codingapi/dbstream/listener/SQLDeleteExecuteListener.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package com.codingapi.dbstream.listener;
22

3+
import com.codingapi.dbstream.DBStreamContext;
34
import com.codingapi.dbstream.interceptor.SQLExecuteState;
45
import com.codingapi.dbstream.parser.DeleteDBEventParser;
56
import com.codingapi.dbstream.scanner.DbTable;
@@ -28,7 +29,7 @@ public void before(SQLExecuteState executeState) throws SQLException {
2829
Delete delete = (Delete) parserStatement;
2930
Table table = delete.getTable();
3031
DbTable dbTable = executeState.getDbTable(table.getName());
31-
if (dbTable != null) {
32+
if (dbTable != null && DBStreamContext.getInstance().support(executeState.getDriverProperties(), dbTable.getName())) {
3233
DeleteDBEventParser dataParser = new DeleteDBEventParser(executeState, delete, table, dbTable);
3334
dataParser.prepare();
3435
threadLocal.set(dataParser);

src/main/java/com/codingapi/dbstream/listener/SQLInsertExecuteListener.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package com.codingapi.dbstream.listener;
22

3+
import com.codingapi.dbstream.DBStreamContext;
34
import com.codingapi.dbstream.interceptor.SQLExecuteState;
45
import com.codingapi.dbstream.parser.InsertDBEventParser;
56
import com.codingapi.dbstream.scanner.DbTable;
@@ -28,7 +29,7 @@ public void before(SQLExecuteState executeState) throws SQLException {
2829
Insert insert = (Insert) parserStatement;
2930
Table table = insert.getTable();
3031
DbTable dbTable = executeState.getDbTable(table.getName());
31-
if (dbTable != null) {
32+
if (dbTable != null && DBStreamContext.getInstance().support(executeState.getDriverProperties(), dbTable.getName())) {
3233
InsertDBEventParser dataParser = new InsertDBEventParser(executeState, insert, table, dbTable);
3334
dataParser.prepare();
3435
threadLocal.set(dataParser);

src/main/java/com/codingapi/dbstream/listener/SQLUpdateExecuteListener.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package com.codingapi.dbstream.listener;
22

3+
import com.codingapi.dbstream.DBStreamContext;
34
import com.codingapi.dbstream.interceptor.SQLExecuteState;
45
import com.codingapi.dbstream.parser.UpdateDBEventParser;
56
import com.codingapi.dbstream.scanner.DbTable;
@@ -28,7 +29,7 @@ public void before(SQLExecuteState executeState) throws SQLException {
2829
Update update = (Update) parserStatement;
2930
Table table = update.getTable();
3031
DbTable dbTable = executeState.getDbTable(table.getName());
31-
if (dbTable != null) {
32+
if (dbTable != null && DBStreamContext.getInstance().support(executeState.getDriverProperties(), dbTable.getName())) {
3233
UpdateDBEventParser dataParser = new UpdateDBEventParser(executeState, update, table, dbTable);
3334
dataParser.prepare();
3435
threadLocal.set(dataParser);

src/main/java/com/codingapi/dbstream/parser/InsertDBEventParser.java

Lines changed: 15 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -6,12 +6,16 @@
66
import com.codingapi.dbstream.stream.DBEvent;
77
import com.codingapi.dbstream.stream.EventType;
88
import com.codingapi.dbstream.utils.SQLParamUtils;
9+
import net.sf.jsqlparser.expression.Expression;
10+
import net.sf.jsqlparser.expression.JdbcParameter;
11+
import net.sf.jsqlparser.expression.operators.relational.ExpressionList;
912
import net.sf.jsqlparser.schema.Column;
1013
import net.sf.jsqlparser.schema.Table;
1114
import net.sf.jsqlparser.statement.Statement;
1215
import net.sf.jsqlparser.statement.insert.Insert;
1316
import net.sf.jsqlparser.statement.select.PlainSelect;
1417
import net.sf.jsqlparser.statement.select.Select;
18+
import net.sf.jsqlparser.statement.select.Values;
1519

1620
import java.sql.SQLException;
1721
import java.util.ArrayList;
@@ -100,7 +104,7 @@ private List<DBEvent> loadDefaultInsertEvent() {
100104
Object value = params.get(i);
101105
String column = insertColumns.get(i);
102106
DbColumn dbColumn = dbTable.getColumnByName(column);
103-
if (dbColumn != null) {
107+
if (dbColumn != null && !dbColumn.isPrimaryKey()) {
104108
event.set(dbColumn.getName(), value);
105109
}
106110
}
@@ -111,11 +115,17 @@ private List<DBEvent> loadDefaultInsertEvent() {
111115

112116

113117
private List<String> loadInsertColumns() {
114-
List<String> columns = new ArrayList<>();
115-
for (Column column : this.insert.getColumns()) {
116-
columns.add(column.getColumnName());
118+
ExpressionList<?> values = this.insert.getValues().getExpressions();
119+
ExpressionList<Column> columns = this.insert.getColumns();
120+
List<String> columnList = new ArrayList<>();
121+
for (int i=0;i<columns.size();i++) {
122+
Column column = columns.get(i);
123+
Expression expression = values.get(i);
124+
if(expression instanceof JdbcParameter) {
125+
columnList.add(column.getColumnName());
126+
}
117127
}
118-
return columns;
128+
return columnList;
119129
}
120130

121131

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
package com.codingapi.dbstream.provider;
2+
3+
import java.util.Properties;
4+
5+
/**
6+
* 数据库表支持判断
7+
*/
8+
public interface DBTableSupportProvider {
9+
10+
boolean support(Properties info,String tableName);
11+
}
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
package com.codingapi.dbstream.provider;
2+
3+
import java.util.Properties;
4+
5+
public class DefaultDBTableSupportProvider implements DBTableSupportProvider {
6+
7+
@Override
8+
public boolean support(Properties info, String tableName) {
9+
return true;
10+
}
11+
}

0 commit comments

Comments
 (0)