1111
1212import java .sql .SQLException ;
1313import java .util .ArrayList ;
14+ import java .util .HashMap ;
1415import java .util .List ;
1516import 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