Skip to content

Commit 13635da

Browse files
committed
remove jsqlparser
1 parent 5f0b7a6 commit 13635da

File tree

14 files changed

+352
-167
lines changed

14 files changed

+352
-167
lines changed

README.md

Lines changed: 4 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -137,10 +137,8 @@ public class DefaultDBTableSupportProvider implements DBTableSupportProvider {
137137
138138
@Override
139139
public boolean support(Properties info, DbTable dbTable) {
140-
if (dbTable.hasColumns()) {
141-
return true;
142-
}
143-
return false;
140+
// 所有表都会监听
141+
return true;
144142
}
145143
}
146144
@@ -244,10 +242,8 @@ mvn clean test -P travis
244242
- 手动事务模式下,事件会在 `commit()` 时批量推送
245243
- 事务回滚时,相关事件会被丢弃
246244

247-
3. **SQL 限制**
248-
- 由于 JDBC 在执行 `INSERT INTO ... SELECT` 语句时无法获取自增 ID,框架暂不支持此类插入方式
249-
- 请避免使用 `INSERT INTO ... SELECT` 语句
250-
- 请避免对字段进行自增或自引用赋值。例如:`UPDATE set name = name+1 ` 语句
245+
3. **数据表限制**
246+
- 执行数据拦截事件的分析,要求表必须存在主键的定义
251247

252248
4. **元数据缓存**
253249
- 数据库元数据会在首次连接时自动扫描并缓存

pom.xml

Lines changed: 0 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -59,20 +59,6 @@
5959
<scope>test</scope>
6060
</dependency>
6161

62-
<dependency>
63-
<groupId>com.dameng</groupId>
64-
<artifactId>DmJdbcDriver18</artifactId>
65-
<version>8.1.3.62</version>
66-
<scope>test</scope>
67-
</dependency>
68-
69-
<dependency>
70-
<groupId>com.dameng</groupId>
71-
<artifactId>DmDialect-for-hibernate5.6</artifactId>
72-
<version>8.1.3.62</version>
73-
<scope>test</scope>
74-
</dependency>
75-
7662
<dependency>
7763
<groupId>org.springframework.boot</groupId>
7864
<artifactId>spring-boot-starter-test</artifactId>

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

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,11 @@ public boolean support(Properties info, DbTable dbTable) {
5151
if (dbTableSupportProvider == null) {
5252
this.dbTableSupportProvider = new DefaultDBTableSupportProvider();
5353
}
54-
return dbTableSupportProvider.support(info, dbTable);
54+
if (dbTable.hasColumns() && dbTable.hasPrimaryKeys()) {
55+
return dbTableSupportProvider.support(info, dbTable);
56+
} else {
57+
return false;
58+
}
5559
}
5660

5761

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

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -165,6 +165,15 @@ public String getTransactionKey() {
165165
return null;
166166
}
167167

168+
/**
169+
* 查询
170+
* @param sql sql
171+
* @return 查询结果
172+
* @throws SQLException 查询异常
173+
*/
174+
public List<Map<String, Object>> query(String sql) throws SQLException {
175+
return this.query(sql,new ArrayList<>());
176+
}
168177
/**
169178
* 查询
170179
*

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

Lines changed: 5 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -46,17 +46,13 @@ private String loadUpdateRowSQL() {
4646
String tableName = this.dbTable.getName();
4747
StringBuilder querySQL = new StringBuilder();
4848
querySQL.append("SELECT ");
49-
if(dbTable.hasPrimaryKeys()) {
50-
for (DbColumn dbColumn : dbTable.getPrimaryColumns()) {
51-
if (this.aliasTable != null) {
52-
querySQL.append(this.aliasTable).append(".");
53-
}
54-
querySQL.append(dbColumn.getName()).append(",");
49+
for (DbColumn dbColumn : dbTable.getPrimaryColumns()) {
50+
if (this.aliasTable != null) {
51+
querySQL.append(this.aliasTable).append(".");
5552
}
56-
querySQL.deleteCharAt(querySQL.length() - 1);
57-
}else {
58-
querySQL.append(" * ");
53+
querySQL.append(dbColumn.getName()).append(",");
5954
}
55+
querySQL.deleteCharAt(querySQL.length() - 1);
6056
querySQL.append(" FROM ").append(tableName);
6157
if (this.aliasTable != null) {
6258
querySQL.append(" AS ").append(aliasTable);

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

Lines changed: 95 additions & 84 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111

1212
import java.sql.SQLException;
1313
import java.util.ArrayList;
14+
import java.util.HashMap;
1415
import java.util.List;
1516
import java.util.Map;
1617

@@ -19,122 +20,132 @@ public class InsertDBEventParser {
1920
private final InsertSQLParser sqlParser;
2021
private final SQLExecuteState executeState;
2122
private final DbTable dbTable;
22-
23-
private final List<Map<String, Object>> prepareList = new ArrayList<>();
23+
private boolean defaultInsertSQL = true;
24+
private List<Map<String, Object>> dataList = new ArrayList<>();
25+
private final List<String> columns;
2426

2527
public InsertDBEventParser(SQLExecuteState executeState, InsertSQLParser sqlParser, DbTable dbTable) {
2628
this.sqlParser = sqlParser;
2729
this.executeState = executeState;
2830
this.dbTable = dbTable;
31+
this.columns = sqlParser.getColumnValues();
2932
}
3033

3134
public List<DBEvent> loadEvents(Object result) throws SQLException {
32-
List<DBEvent> eventList = new ArrayList<>();
3335
if (ResultSetUtils.isNotUpdatedRows(result)) {
34-
return eventList;
35-
}
36-
if (this.prepareList.isEmpty()) {
37-
eventList.addAll(this.loadDefaultInsertEvent());
38-
} else {
39-
System.err.println("INSERT INTO SELECT MODE CAN'T SUPPORT MULTIPLE EVENTS.");
40-
System.err.println("<-----------WARNING-------------->");
41-
System.err.println("SAVE DATA:" + this.prepareList);
42-
System.err.println(">--------------------------------<");
43-
}
44-
return eventList;
45-
}
46-
47-
48-
private void loadSelectPrepare() throws SQLException {
49-
String query = sqlParser.getSelectSQL();
50-
List<Object> params = this.loadUpdateRowParamList();
51-
this.prepareList.clear();
52-
this.prepareList.addAll(this.executeState.query(query, params));
53-
}
54-
55-
private List<Object> loadUpdateRowParamList() {
56-
List<Object> params = new ArrayList<>();
57-
String nativeSQL = this.executeState.getSql();
58-
59-
int whereIndex = nativeSQL.toUpperCase().indexOf(" SELECT ");
60-
String beforeSQL;
61-
if (whereIndex > 0) {
62-
beforeSQL = nativeSQL.substring(0, whereIndex);
63-
} else {
64-
beforeSQL = nativeSQL;
36+
return new ArrayList<>();
6537
}
66-
67-
int paramsSize = SQLUtils.paramsCount(beforeSQL);
68-
69-
List<Object> paramsList = this.executeState.getListParams();
70-
for (int i = 0; i < paramsList.size(); i++) {
71-
if (i >= paramsSize) {
72-
params.add(paramsList.get(i));
73-
}
74-
}
75-
return params;
38+
return this.loadDataEvents();
7639
}
7740

7841

79-
private List<DBEvent> loadDefaultInsertEvent() {
42+
private List<DBEvent> loadDataEvents() {
8043
String jdbcUrl = this.executeState.getJdbcUrl();
8144
List<DBEvent> eventList = new ArrayList<>();
82-
List<Map<String, Object>> primaryKeyValues = this.executeState.getStatementGenerateKeys(dbTable);
83-
if(!primaryKeyValues.isEmpty()) {
84-
for (Map<String, Object> map : primaryKeyValues) {
85-
DBEvent event = new DBEvent(jdbcUrl, this.dbTable.getName(), EventType.INSERT);
86-
List<Object> params = this.executeState.getListParams();
87-
List<String> insertColumns = this.sqlParser.getColumnValues();
88-
//主键
89-
for (String key : map.keySet()) {
90-
DbColumn dbColumn = dbTable.getColumnByName(key);
91-
if (dbColumn.isPrimaryKey()) {
92-
event.addPrimaryKey(dbColumn.getName());
93-
}
94-
event.set(dbColumn.getName(), map.get(key));
95-
}
45+
List<Map<String, Object>> generateValues = this.executeState.getStatementGenerateKeys(dbTable);
9646

97-
//字段
98-
for (int i = 0; i < params.size(); i++) {
99-
Object value = params.get(i);
100-
String column = insertColumns.get(i);
101-
DbColumn dbColumn = dbTable.getColumnByName(column);
102-
if (dbColumn != null && !dbColumn.isPrimaryKey()) {
103-
event.set(dbColumn.getName(), value);
104-
}
105-
}
106-
eventList.add(event);
107-
}
108-
}else {
47+
// 插入拦截到的数据
48+
for (Map<String, Object> data : dataList) {
10949
DBEvent event = new DBEvent(jdbcUrl, this.dbTable.getName(), EventType.INSERT);
110-
List<Object> params = this.executeState.getListParams();
111-
List<String> insertColumns = this.sqlParser.getColumnValues();
112-
//字段
113-
for (int i = 0; i < params.size(); i++) {
114-
Object value = params.get(i);
115-
String column = insertColumns.get(i);
116-
DbColumn dbColumn = dbTable.getColumnByName(column);
50+
for (String key : data.keySet()) {
51+
DbColumn dbColumn = dbTable.getColumnByName(key);
11752
if (dbColumn != null) {
118-
event.set(dbColumn.getName(), value);
119-
if(dbColumn.isPrimaryKey()){
53+
event.set(dbColumn.getName(), data.get(key));
54+
if (dbColumn.isPrimaryKey()) {
12055
event.addPrimaryKey(dbColumn.getName());
12156
}
12257
}
12358
}
12459
eventList.add(event);
12560
}
61+
62+
// 放入自动生成的数据
63+
if(!generateValues.isEmpty()) {
64+
for(int i=0;i<generateValues.size();i++){
65+
Map<String, Object> generateValue = generateValues.get(i);
66+
DBEvent event = eventList.get(i);
67+
for (String key : generateValue.keySet()) {
68+
DbColumn dbColumn = dbTable.getColumnByName(key);
69+
if (dbColumn != null) {
70+
event.set(dbColumn.getName(), generateValue.get(key));
71+
if (dbColumn.isPrimaryKey()) {
72+
event.addPrimaryKey(dbColumn.getName());
73+
}
74+
}
75+
}
76+
}
77+
}
78+
12679
return eventList;
12780
}
12881

82+
private boolean isColumnPrimaryKey(String primaryKey) {
83+
for (String column : columns) {
84+
if (primaryKey.equalsIgnoreCase(column)) {
85+
return true;
86+
}
87+
}
88+
return false;
89+
}
12990

13091

92+
private boolean columnsHasPrimaryKeys() {
93+
List<String> primaryKeys = this.dbTable.getPrimaryKeys();
94+
for (String primaryKey : primaryKeys) {
95+
if (!this.isColumnPrimaryKey(primaryKey)) {
96+
return false;
97+
}
98+
}
99+
return true;
100+
}
101+
131102

132103
public void prepare() throws SQLException {
133-
String selectSQL = this.sqlParser.getSelectSQL();
134-
if (selectSQL!=null) {
135-
this.loadSelectPrepare();
104+
this.defaultInsertSQL = this.sqlParser.isDefaultInsertSQL();
105+
if (this.defaultInsertSQL) {
106+
this.loadDefaultInsertDataList();
136107
} else {
137-
prepareList.clear();
108+
this.loadSelectInsertDataList();
109+
}
110+
}
111+
112+
private void loadSelectInsertDataList() throws SQLException {
113+
String query = this.sqlParser.getValuesSQL();
114+
int paramCount = SQLUtils.paramsCount(query);
115+
List<Object> listParams = this.executeState.getListParams();
116+
List<Object> queryParams = new ArrayList<>();
117+
for (int i = 0; i < listParams.size(); i++) {
118+
if (i + 1 >= paramCount) {
119+
queryParams.add(listParams.get(i));
120+
}
121+
}
122+
this.dataList = this.executeState.query(query, queryParams);
123+
}
124+
125+
private void loadDefaultInsertDataList() throws SQLException {
126+
List<InsertSQLParser.InsertValue> values = this.sqlParser.getValues();
127+
Map<String, Object> data = new HashMap<>();
128+
for (int i = 0; i < columns.size(); i++) {
129+
String column = columns.get(i);
130+
InsertSQLParser.InsertValue insertValue = values.get(i);
131+
Object value = insertValue;
132+
133+
if (insertValue.isSelect()) {
134+
List<Map<String, Object>> columValues = this.executeState.query(insertValue.getValue());
135+
if (!columValues.isEmpty()) {
136+
Map<String, Object> first = columValues.get(0);
137+
for (String key : first.keySet()) {
138+
value = first.get(key);
139+
}
140+
}
141+
} else if (insertValue.isJdbc()) {
142+
value = i + 1;
143+
} else {
144+
value = insertValue.getValue();
145+
}
146+
data.put(column, value);
138147
}
148+
dataList.add(data);
139149
}
150+
140151
}

0 commit comments

Comments
 (0)