diff options
author | Feideus <erwan.ulrich@gmail.com> | 2018-06-04 16:10:07 +0200 |
---|---|---|
committer | Feideus <erwan.ulrich@gmail.com> | 2018-06-04 16:10:07 +0200 |
commit | bb23b7381beba9aca0cf12240d980e1f794827ee (patch) | |
tree | ab10de83faeb33ce57c30e34ed7e22d8dee6ab34 /src | |
parent | a4672b9444855826e458d70ce7cec350a9483c45 (diff) | |
download | schemafuzz-bb23b7381beba9aca0cf12240d980e1f794827ee.tar.gz schemafuzz-bb23b7381beba9aca0cf12240d980e1f794827ee.tar.bz2 schemafuzz-bb23b7381beba9aca0cf12240d980e1f794827ee.zip |
First drop for fk handling (high crash probability)
Diffstat (limited to 'src')
-rw-r--r-- | src/main/java/org/schemaspy/model/GenericTreeNode.java | 64 |
1 files changed, 58 insertions, 6 deletions
diff --git a/src/main/java/org/schemaspy/model/GenericTreeNode.java b/src/main/java/org/schemaspy/model/GenericTreeNode.java index 579d645..f193c3f 100644 --- a/src/main/java/org/schemaspy/model/GenericTreeNode.java +++ b/src/main/java/org/schemaspy/model/GenericTreeNode.java @@ -1,10 +1,8 @@ package org.schemaspy.model; -import java.sql.PreparedStatement; +import java.io.IOException; +import java.sql.*; -import java.sql.ResultSet; -import java.sql.Statement; -import java.sql.Timestamp; import java.text.SimpleDateFormat; import java.util.*; import java.util.ArrayList; @@ -350,12 +348,13 @@ public class GenericTreeNode { public boolean inject(SqlService sqlService,Database db, boolean undo) { + if (undo) System.out.println("UNDOING"); else System.out.println("INJECT"); - String theQuery = updateQueryBuilder(undo); + String theQuery = updateQueryBuilderWrapper(undo,db,sqlService); try { Statement stmt = sqlService.getConnection().createStatement(); @@ -389,7 +388,7 @@ public class GenericTreeNode { } } - public String updateQueryBuilder(boolean undo) //undo variable tells if the function should build Inject string or Undo string + public String updateQueryBuilder(boolean undo,Database db, SqlService sqlService) //undo variable tells if the function should build Inject string or Undo string { String theQuery; @@ -665,4 +664,57 @@ public class GenericTreeNode { return FirstApperanceOf(mutation.getParent()); } + + public String updateQueryBuilderWrapper(boolean undo,Database db, SqlService sqlService) + { + String theQuery = ""; + boolean hasFk = db.getLesForeignKeys().containsKey(chosenChange.getParentTableColumn().getName()); + + if(hasFk) + { + theQuery = "START TRANSACTION; SET CONSTRAINTS ALL DEFERRED;"; + + for(ForeignKeyConstraint fk : db.getLesForeignKeys().get(chosenChange.getParentTableColumn().getName())) + { + ArrayList<TableColumn> allChildrenAndParents = new ArrayList<TableColumn>(); + allChildrenAndParents.addAll(fk.getChildColumns()); + allChildrenAndParents.addAll(fk.getParentColumns()); + + for(TableColumn tb : allChildrenAndParents) + { + String semiQuery = "SELECT * FROM "+tb.getTable()+" WHERE "+tb.getName()+"="+chosenChange.getOldValue(); + QueryResponseParser qrp; + QueryResponse response = null ; + try { + Statement stmt = sqlService.getConnection().createStatement(); + ResultSet res = stmt.executeQuery(semiQuery); + qrp = new QueryResponseParser(); + response = qrp.parse(res,tb.getTable()); + } + catch(Exception e) + { + e.printStackTrace(); + } + + if(response != null) + { + for (int i = 0; i < response.getNbRows(); i++) + { + GenericTreeNode tmp = new GenericTreeNode(response.getRows().get(i),0,new SingleChange(chosenChange.getParentTableColumn(),this,chosenChange.getOldValue(),chosenChange.getNewValue())); + theQuery = theQuery + tmp.updateQueryBuilder(false,db,sqlService); + } + } + } + } + } + + theQuery = theQuery + updateQueryBuilder(undo,db,sqlService); + + if(hasFk) + { + theQuery = theQuery + " ; COMMIT TRANSACTION;"; + } + return theQuery; + } + } |