summaryrefslogtreecommitdiff
path: root/src/main
diff options
context:
space:
mode:
authorFeideus <erwan.ulrich@gmail.com>2018-06-06 18:37:12 +0200
committerFeideus <erwan.ulrich@gmail.com>2018-06-06 18:37:12 +0200
commit9e91b4a113ef79e4e06e679f75ea7ed871ab2577 (patch)
tree5e98e8f0e0a55b1e5195053735a768a3532884d1 /src/main
parentb848c8af6e7b3119b20ded990db5c0d6fa56071e (diff)
downloadschemafuzz-9e91b4a113ef79e4e06e679f75ea7ed871ab2577.tar.gz
schemafuzz-9e91b4a113ef79e4e06e679f75ea7ed871ab2577.tar.bz2
schemafuzz-9e91b4a113ef79e4e06e679f75ea7ed871ab2577.zip
Still Working on Fk. not very far now I hope
Diffstat (limited to 'src/main')
-rw-r--r--src/main/java/org/schemaspy/model/FkGenericTreeNode.java90
-rw-r--r--src/main/java/org/schemaspy/model/GenericTreeNode.java170
-rw-r--r--src/main/java/org/schemaspy/model/QueryResponse.java4
3 files changed, 173 insertions, 91 deletions
diff --git a/src/main/java/org/schemaspy/model/FkGenericTreeNode.java b/src/main/java/org/schemaspy/model/FkGenericTreeNode.java
new file mode 100644
index 0000000..19cda15
--- /dev/null
+++ b/src/main/java/org/schemaspy/model/FkGenericTreeNode.java
@@ -0,0 +1,90 @@
+package org.schemaspy.model;
+
+import org.schemaspy.service.SqlService;
+
+import java.util.Map;
+
+public class FkGenericTreeNode {
+
+ private GenericTreeNode parent;
+ private Row initial_state_row;
+ private Row post_change_row;
+ private SingleChange fkChange;
+
+ public FkGenericTreeNode(Row initial_state_row,GenericTreeNode parent, SingleChange sg)
+ {
+ this.parent = null;
+ this.initial_state_row = initial_state_row;
+ this.fkChange = fkChange;
+ initPostChangeRow();
+ }
+
+
+ public void initPostChangeRow()
+ {
+ this.post_change_row = this.initial_state_row.clone();
+ this.post_change_row.setValueOfColumn(fkChange.getParentTableColumn().getName(), fkChange.getNewValue());
+ }
+
+ public String updateQueryBuilder(boolean undo,Database db, SqlService sqlService) //undo variable tells if the function should build Inject string or Undo string
+ {
+ String theQuery;
+
+ if (undo)
+ {
+ if (fkChange.getParentTableColumn().getTypeName().equals("varchar")
+ || fkChange.getParentTableColumn().getTypeName().equals("bool")
+ || fkChange.getParentTableColumn().getTypeName().equals("timestamp")
+ || fkChange.getParentTableColumn().getTypeName().equals("date")
+ || fkChange.getParentTableColumn().getTypeName().equals("_text")
+ || fkChange.getParentTableColumn().getTypeName().equals("text")
+ || fkChange.getParentTableColumn().getTypeName().equals("fulltext"))
+ theQuery = "UPDATE " + initial_state_row.getParentTable().getName() + " SET " + fkChange.getParentTableColumn().getName() + "='" + fkChange.getOldValue().toString() + "', ";
+ else
+ theQuery = "UPDATE " + initial_state_row.getParentTable().getName() + " SET " + fkChange.getParentTableColumn().getName() + " = " + fkChange.getOldValue().toString() + ", ";
+ }
+ else
+ {
+ if (fkChange.getParentTableColumn().getTypeName().equals("varchar")
+ || fkChange.getParentTableColumn().getTypeName().equals("bool")
+ || fkChange.getParentTableColumn().getTypeName().equals("timestamp")
+ || fkChange.getParentTableColumn().getTypeName().equals("date")
+ || fkChange.getParentTableColumn().getTypeName().equals("_text")
+ || fkChange.getParentTableColumn().getTypeName().equals("text")
+ || fkChange.getParentTableColumn().getTypeName().equals("fulltext"))
+ theQuery = "UPDATE " + initial_state_row.getParentTable().getName() + " SET " + fkChange.getParentTableColumn().getName() + "='" + fkChange.getNewValue().toString() + "', ";
+ else
+ theQuery = "UPDATE " + initial_state_row.getParentTable().getName() + " SET " + fkChange.getParentTableColumn().getName() + "=" + fkChange.getNewValue().toString() + ", ";
+ }
+ theQuery = theQuery.substring(0, theQuery.lastIndexOf(","));
+ theQuery = theQuery + " WHERE ";
+
+
+ for (Map.Entry<String, Object> entry : initial_state_row.getContent().entrySet())
+ {
+ if (!entry.getKey().equals(fkChange.getParentTableColumn().getName()))
+ {
+ if (fkChange.getParentTableColumn().getTable().getColumn(entry.getKey()).getTypeName().equals("varchar")
+ || fkChange.getParentTableColumn().getTable().getColumn(entry.getKey()).getTypeName().equals("bool")
+ || fkChange.getParentTableColumn().getTable().getColumn(entry.getKey()).getTypeName().equals("timestamp")
+ || fkChange.getParentTableColumn().getTable().getColumn(entry.getKey()).getTypeName().equals("date")
+ || fkChange.getParentTableColumn().getTable().getColumn(entry.getKey()).getTypeName().equals("_text")
+ || fkChange.getParentTableColumn().getTable().getColumn(entry.getKey()).getTypeName().equals("text")
+ || fkChange.getParentTableColumn().getTable().getColumn(entry.getKey()).getTypeName().equals("fulltext"))
+ theQuery = theQuery + (entry.getKey() + "='" + entry.getValue().toString() + "' AND ");
+ }
+ else
+ {
+ if (undo)
+ theQuery = theQuery + (entry.getKey() + "='" + fkChange.getNewValue().toString() + "' AND ");
+ else
+ theQuery = theQuery + (entry.getKey() + "='" + fkChange.getOldValue().toString() + "' AND ");
+ }
+ }
+ theQuery = theQuery.substring(0, theQuery.lastIndexOf(" AND "));
+
+ System.out.println(theQuery);
+
+ return theQuery;
+ }
+}
diff --git a/src/main/java/org/schemaspy/model/GenericTreeNode.java b/src/main/java/org/schemaspy/model/GenericTreeNode.java
index 183fd1a..f4a319b 100644
--- a/src/main/java/org/schemaspy/model/GenericTreeNode.java
+++ b/src/main/java/org/schemaspy/model/GenericTreeNode.java
@@ -23,18 +23,19 @@ public class GenericTreeNode {
private final Row initial_state_row;
private Row post_change_row;
private ArrayList<SingleChange> potential_changes = new ArrayList<SingleChange>();
- private ArrayList<SingleChange> cascadeFK = new ArrayList<SingleChange>(); // a integrer
- private boolean cascadingFK;
+ //private ArrayList<SingleChange> cascadeFK = new ArrayList<SingleChange>(); // a integrer
+ //private boolean cascadingFK;
private GenericTreeNode parent;
private ArrayList<GenericTreeNode> children = new ArrayList<GenericTreeNode>();
private SingleChange chosenChange;
private boolean isFirstApperance;
+ private HashMap<TableColumn,FkGenericTreeNode> fkMutations = new HashMap<TableColumn,FkGenericTreeNode>();
/**
* Default GenericTreeNode constructor
*/
public GenericTreeNode(Row initial_state_row, int id) { // used only for rootMutation and Tests
- this.cascadingFK = false;
+ //this.cascadingFK = false;
this.subTreeWeight = 0;
this.parent = null;
this.weight = 1;
@@ -42,33 +43,19 @@ public class GenericTreeNode {
this.id = id;
this.isFirstApperance = true;
this.initial_state_row = initial_state_row;
- this.potential_changes = new ArrayList<>();
this.potential_changes = discoverMutationPossibilities(this);
}
- public GenericTreeNode(Row initial_state_row,int id, SingleChange sg) { // used only for Tests
- this.cascadingFK = false;
- this.subTreeWeight = 0;
- this.parent = null;
- this.weight = 1;
- this.depth = 0;
- this.id = id;
- this.isFirstApperance = false;
- this.initial_state_row = initial_state_row;
- this.chosenChange = sg;
- }
-
public GenericTreeNode(Row initial_state_row, int id, GenericTreeNode rootMutation, GenericTreeNode parentMutation,boolean isFirstApperance) {
+ //this.cascadingFK = false;
this.parent = parentMutation;
- this.cascadingFK = false;
this.subTreeWeight = 0;
this.weight = 1;
this.id = id;
initDepth();
this.isFirstApperance = isFirstApperance;
this.initial_state_row = initial_state_row;
- this.potential_changes = new ArrayList<>();
this.potential_changes = discoverMutationPossibilities(rootMutation);
}
@@ -421,31 +408,6 @@ public class GenericTreeNode {
else
theQuery = "UPDATE " + initial_state_row.getParentTable().getName() + " SET " + chosenChange.getParentTableColumn().getName() + "=" + chosenChange.getNewValue().toString() + ", ";
}
-// for (Map.Entry<String, Object> entry : initial_state_row.getContent().entrySet())
-// {
-// if (!entry.getKey().equals(chosenChange.getParentTableColumn().getName()))
-// {
-// if (chosenChange.getParentTableColumn().getTable().getColumn(entry.getKey()).getTypeName().equals("varchar")
-// || chosenChange.getParentTableColumn().getTable().getColumn(entry.getKey()).getTypeName().equals("bool")
-// || chosenChange.getParentTableColumn().getTable().getColumn(entry.getKey()).getTypeName().equals("timestamp")
-// || chosenChange.getParentTableColumn().getTable().getColumn(entry.getKey()).getTypeName().equals("date")
-// || chosenChange.getParentTableColumn().getTable().getColumn(entry.getKey()).getTypeName().equals("_text")
-// || chosenChange.getParentTableColumn().getTable().getColumn(entry.getKey()).getTypeName().equals("text"))
-// theQuery = theQuery + (entry.getKey() + "='" + entry.getValue().toString() + "', ");
-// else
-// {
-// if(entry.getValue() == null || entry.getValue().toString() == "" || entry.getValue().toString() == null)
-// {
-// String tmp = "null";
-// theQuery = theQuery + (entry.getKey() + "=" + tmp+ ", "); // A CHANGER DURGENCE
-//
-// }
-// else
-// theQuery = theQuery + (entry.getKey() + "=" + entry.getValue().toString() + ", ");
-// }
-// }
-// }
-
theQuery = theQuery.substring(0, theQuery.lastIndexOf(","));
theQuery = theQuery + " WHERE ";
@@ -462,15 +424,6 @@ public class GenericTreeNode {
|| chosenChange.getParentTableColumn().getTable().getColumn(entry.getKey()).getTypeName().equals("text")
|| chosenChange.getParentTableColumn().getTable().getColumn(entry.getKey()).getTypeName().equals("fulltext"))
theQuery = theQuery + (entry.getKey() + "='" + entry.getValue().toString() + "' AND ");
-// else
-// {
-// if (entry.getValue() == null || entry.getValue().toString() == "" || entry.getValue().toString() == null) {
-// String tmp = "null";
-// theQuery = theQuery + (entry.getKey() + "=" + tmp + " AND "); // A CHANGER DURGENCE
-//
-// } else
-// theQuery = theQuery + (entry.getKey() + "=" + entry.getValue().toString() + " AND ");
-// }
}
else
{
@@ -677,46 +630,81 @@ public class GenericTreeNode {
theQuery = "START TRANSACTION; SET CONSTRAINTS ALL DEFERRED;";
- Collection<ForeignKeyConstraint> tmp2 = db.getLesForeignKeys().get(chosenChange.getParentTableColumn().getTable().getName().toUpperCase());
- for (ForeignKeyConstraint fk : db.getLesForeignKeys().get(chosenChange.getParentTableColumn().getTable().getName().toUpperCase()))
- {
- for (TableColumn tb : fk.getChildColumns())
- {
- String semiQuery = "SELECT * FROM " + tb.getTable() + " WHERE " + tb.getName() + "=";
- if (chosenChange.getParentTableColumn().getTypeName().equals("varchar")
- || chosenChange.getParentTableColumn().getTypeName().equals("bool")
- || chosenChange.getParentTableColumn().getTypeName().equals("timestamp")
- || chosenChange.getParentTableColumn().getTypeName().equals("date")
- || chosenChange.getParentTableColumn().getTypeName().equals("_text")
- || chosenChange.getParentTableColumn().getTypeName().equals("text")
- || chosenChange.getParentTableColumn().getTypeName().equals("fulltext"))
- semiQuery = semiQuery + "' " + chosenChange.getNewValue() + " ' ORDER BY RANDOM() LIMIT 1";
- else
- semiQuery = semiQuery + chosenChange.getNewValue()+" ORDER BY RANDOM() LIMIT 1";
-
- QueryResponseParser qrp;
- QueryResponse response = null;
- try {
- Statement stmt = sqlService.getConnection().createStatement();
- ResultSet res = stmt.executeQuery(semiQuery);
- qrp = new QueryResponseParser();
- ArrayList<Row> rows = new ArrayList<Row>(qrp.parse(res, tb.getTable()).getRows());
- response = new QueryResponse(rows, rows.size());
- } catch (Exception e) {
- e.printStackTrace();
- }
+ System.out.println(db.getLesForeignKeys().get(chosenChange.getParentTableColumn().getTable().getName().toUpperCase()).isEmpty());
+
+ for (ForeignKeyConstraint fk : db.getLesForeignKeys().get(chosenChange.getParentTableColumn().getTable().getName().toUpperCase())) {
+ for (TableColumn tb : fk.getChildColumns())
+ {
+ String semiQuery = "SELECT * FROM " + tb.getTable() + " WHERE " + tb.getName() + "=";
+ if (chosenChange.getParentTableColumn().getTypeName().equals("varchar")
+ || chosenChange.getParentTableColumn().getTypeName().equals("bool")
+ || chosenChange.getParentTableColumn().getTypeName().equals("timestamp")
+ || chosenChange.getParentTableColumn().getTypeName().equals("date")
+ || chosenChange.getParentTableColumn().getTypeName().equals("_text")
+ || chosenChange.getParentTableColumn().getTypeName().equals("text")
+ || chosenChange.getParentTableColumn().getTypeName().equals("fulltext"))
+ semiQuery = semiQuery + "' " + chosenChange.getNewValue() + " ' ORDER BY RANDOM() LIMIT 1";
+ else
+ semiQuery = semiQuery + chosenChange.getNewValue() + " ORDER BY RANDOM() LIMIT 1";
+
+ QueryResponseParser qrp;
+ QueryResponse response = null;
+ try
+ {
+ Statement stmt = sqlService.getConnection().createStatement();
+ ResultSet res = stmt.executeQuery(semiQuery);
+ qrp = new QueryResponseParser();
+ ArrayList<Row> rows = new ArrayList<Row>(qrp.parse(res, tb.getTable()).getRows());
+ response = new QueryResponse(rows);
+ }
+ catch (Exception e)
+ {
+ e.printStackTrace();
+ }
- if (response != null) {
- if (response.getNbRows() == 0) {
- for (int i = 0; i < response.getNbRows(); i++) {
- //select all rows with oldValue. change to newValue for all of them
- 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);
+ if (response != null)
+ {
+ if (response.getNbRows() == 0)
+ {
+ int tmpIndex = semiQuery.lastIndexOf("=");
+ if (chosenChange.getParentTableColumn().getTypeName().equals("varchar")
+ || chosenChange.getParentTableColumn().getTypeName().equals("bool")
+ || chosenChange.getParentTableColumn().getTypeName().equals("timestamp")
+ || chosenChange.getParentTableColumn().getTypeName().equals("date")
+ || chosenChange.getParentTableColumn().getTypeName().equals("_text")
+ || chosenChange.getParentTableColumn().getTypeName().equals("text")
+ || chosenChange.getParentTableColumn().getTypeName().equals("fulltext"))
+ semiQuery = semiQuery.substring(tmpIndex) + "' " + chosenChange.getOldValue()+"' ";
+ else
+ semiQuery = semiQuery.substring(tmpIndex) + chosenChange.getOldValue();
+
+ try
+ {
+ Statement stmt = sqlService.getConnection().createStatement();
+ ResultSet res = stmt.executeQuery(semiQuery);
+ qrp = new QueryResponseParser();
+ ArrayList<Row> rows = new ArrayList<Row>(qrp.parse(res, tb.getTable()).getRows());
+ response = new QueryResponse(rows);
+ }
+ catch (Exception e)
+ {
+ e.printStackTrace();
+ }
+
+ if(!response.getRows().isEmpty())
+ {
+ for (int i = 0; i < response.getNbRows(); i++)
+ {
+ FkGenericTreeNode tmp = new FkGenericTreeNode(response.getRows().get(i), this, new SingleChange(chosenChange.getParentTableColumn(), this, chosenChange.getOldValue(), chosenChange.getNewValue()));
+ fkMutations.put(tb,tmp);
+ theQuery = theQuery + tmp.updateQueryBuilder(false, db, sqlService);
+ }
+ }
}
}
}
}
- }
+
theQuery = theQuery + updateQueryBuilder(undo,db,sqlService);
theQuery = theQuery + " ; COMMIT TRANSACTION;";
@@ -727,8 +715,12 @@ public class GenericTreeNode {
public boolean checkIfHasFk(Database db)
{
- if(db.getLesForeignKeys().get(chosenChange.getParentTableColumn().getTable().getName().toUpperCase()).size() > 0)
- return true;
+ Collection<ForeignKeyConstraint> lesFk= db.getLesForeignKeys().get(chosenChange.getParentTableColumn().getTable().getName().toUpperCase());
+ for(ForeignKeyConstraint fk : lesFk)
+ {
+ if(fk.getChildColumns().contains(chosenChange.getParentTableColumn()))
+ return true;
+ }
return false;
}
diff --git a/src/main/java/org/schemaspy/model/QueryResponse.java b/src/main/java/org/schemaspy/model/QueryResponse.java
index 33b6aa6..fb3e28a 100644
--- a/src/main/java/org/schemaspy/model/QueryResponse.java
+++ b/src/main/java/org/schemaspy/model/QueryResponse.java
@@ -36,11 +36,11 @@ public class QueryResponse
/**
* Default QueryResponse constructor
*/
- public QueryResponse(ArrayList<Row> rows, Integer nbRows)
+ public QueryResponse(ArrayList<Row> rows)
{
this.rows = new ArrayList<Row>();
this.rows = rows;
- this.nbRows = nbRows;
+ this.nbRows = rows.size();
}
/**
* Returns value of rows