summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorFeideus <erwan.ulrich@gmail.com>2018-06-04 16:10:07 +0200
committerFeideus <erwan.ulrich@gmail.com>2018-06-04 16:10:07 +0200
commitbb23b7381beba9aca0cf12240d980e1f794827ee (patch)
treeab10de83faeb33ce57c30e34ed7e22d8dee6ab34 /src
parenta4672b9444855826e458d70ce7cec350a9483c45 (diff)
downloadschemafuzz-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.java64
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;
+ }
+
}