[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[GNUnet-SVN] [taler-schemafuzz] branch master updated: Still working on
From: |
gnunet |
Subject: |
[GNUnet-SVN] [taler-schemafuzz] branch master updated: Still working on fk hanling. went back to Cascade |
Date: |
Thu, 07 Jun 2018 18:56:58 +0200 |
This is an automated email from the git hooks/post-receive script.
erwan-ulrich pushed a commit to branch master
in repository schemafuzz.
The following commit(s) were added to refs/heads/master by this push:
new 8f232dc Still working on fk hanling. went back to Cascade
8f232dc is described below
commit 8f232dc8fa87c674fc4e4fec18957df286913da8
Author: Feideus <address@hidden>
AuthorDate: Thu Jun 7 18:52:31 2018 +0200
Still working on fk hanling. went back to Cascade
---
src/main/java/org/schemaspy/DBFuzzer.java | 14 +-
.../org/schemaspy/model/FkGenericTreeNode.java | 8 +-
.../java/org/schemaspy/model/GenericTreeNode.java | 212 ++++++++++++---------
.../org/schemaspy/model/QueryResponseParser.java | 1 -
src/main/java/org/schemaspy/model/Row.java | 6 +-
.../java/org/schemaspy/model/SingleChange.java | 6 +-
6 files changed, 145 insertions(+), 102 deletions(-)
diff --git a/src/main/java/org/schemaspy/DBFuzzer.java
b/src/main/java/org/schemaspy/DBFuzzer.java
index 05cdaba..825db44 100644
--- a/src/main/java/org/schemaspy/DBFuzzer.java
+++ b/src/main/java/org/schemaspy/DBFuzzer.java
@@ -81,7 +81,7 @@ public class DBFuzzer
int maxDepth =
Integer.parseInt(analyzer.getCommandLineArguments().getMaxDepth());
int mark = 0;
//adding CASCADE to all foreign key tableColumns.
- //settingTemporaryCascade(false); // need to drop and recreate database
+ settingTemporaryCascade(false); // need to drop and recreate database
LOGGER.info("Starting Database Fuzzing");
@@ -170,7 +170,7 @@ public class DBFuzzer
System.out.println("success");
printMutationTree();
- //removeTemporaryCascade();
+ removeTemporaryCascade();
return returnStatus;
}
@@ -192,7 +192,7 @@ public class DBFuzzer
try {
stmt = analyzer.getSqlService().prepareStatement(theQuery);
rs = stmt.executeQuery();
- res = qrp.parse(rs,
analyzer.getDb().getTablesMap().get(randomTable.getName())).getRows().get(0);
//randomTable should be set there
+ res = qrp.parse(rs,
analyzer.getDb().getTablesMap().get(randomTable.getName())).getRows().get(0);
} catch (Exception e) {
LOGGER.info("This query threw an error" + e);
}
@@ -231,12 +231,12 @@ public class DBFuzzer
dropSetCascade = "ALTER TABLE
"+currentFK.getChildTable().getName()+" DROP CONSTRAINT "+currentFK.getName()+
" CASCADE";
try
{
- PreparedStatement stmt =
analyzer.getSqlService().prepareStatement(dropSetCascade,
analyzer.getDb(),null);
- stmt.execute();
+ PreparedStatement stmt =
analyzer.getSqlService().prepareStatement(dropSetCascade,
analyzer.getDb(),null);
+ stmt.execute();
}
catch(Exception e)
{
- System.out.println("Dans le catch erreur :"+e);
+ e.printStackTrace();
}
}
@@ -261,7 +261,7 @@ public class DBFuzzer
}
catch(Exception e)
{
- System.out.println("Dans le catch 2 erreur :"+e);
+ e.printStackTrace();
}
}
diff --git a/src/main/java/org/schemaspy/model/FkGenericTreeNode.java
b/src/main/java/org/schemaspy/model/FkGenericTreeNode.java
index 19cda15..cdad44a 100644
--- a/src/main/java/org/schemaspy/model/FkGenericTreeNode.java
+++ b/src/main/java/org/schemaspy/model/FkGenericTreeNode.java
@@ -10,12 +10,14 @@ public class FkGenericTreeNode {
private Row initial_state_row;
private Row post_change_row;
private SingleChange fkChange;
+ private boolean targetsMultipleRows;
- public FkGenericTreeNode(Row initial_state_row,GenericTreeNode parent,
SingleChange sg)
+ public FkGenericTreeNode(Row initial_state_row,GenericTreeNode parent,
SingleChange sg,boolean multipleRows)
{
- this.parent = null;
+ this.targetsMultipleRows = multipleRows;
+ this.parent = parent;
this.initial_state_row = initial_state_row;
- this.fkChange = fkChange;
+ this.fkChange = sg;
initPostChangeRow();
}
diff --git a/src/main/java/org/schemaspy/model/GenericTreeNode.java
b/src/main/java/org/schemaspy/model/GenericTreeNode.java
index f4a319b..8839d82 100644
--- a/src/main/java/org/schemaspy/model/GenericTreeNode.java
+++ b/src/main/java/org/schemaspy/model/GenericTreeNode.java
@@ -20,7 +20,7 @@ public class GenericTreeNode {
private Integer weight;
private Integer subTreeWeight;
private int depth;
- private final Row initial_state_row;
+ private 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
@@ -340,11 +340,10 @@ public class GenericTreeNode {
System.out.println("UNDOING");
else
System.out.println("INJECT");
+ if(checkIfHasParentFk(db))
+ transferMutationToParent(db,sqlService);
- if(checkIfHasFk(db))
- theQuery = updateQueryBuilderWrapper(undo,db,sqlService);
- else
- theQuery = updateQueryBuilder(undo,db,sqlService);
+ theQuery = updateQueryBuilder(undo,db,sqlService);
try
{
Statement stmt = sqlService.getConnection().createStatement();
@@ -624,101 +623,136 @@ public class GenericTreeNode {
}
- public String updateQueryBuilderWrapper(boolean undo,Database db,
SqlService sqlService)
+// public String updateQueryBuilderWrapper(boolean undo,Database db,
SqlService sqlService)
+// {
+// String theQuery = "";
+//
+// theQuery = "START TRANSACTION; SET CONSTRAINTS ALL DEFERRED;";
+//
+// 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());
+// System.out.println(rows);
+// response = new QueryResponse(rows);
+// } catch (Exception e) {
+// e.printStackTrace();
+// }
+// if (response.getNbRows() == 0) {
+// int tmpIndex =
semiQuery.lastIndexOf("=") + 1;
+// 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(0,
tmpIndex) + "' " + chosenChange.getOldValue() + "' ";
+// else
+// semiQuery = semiQuery.substring(0,
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().size() > 1) {
+// FkGenericTreeNode tmp = new
FkGenericTreeNode(response.getRows().get(0), this, new SingleChange(tb, this,
chosenChange.getOldValue(), chosenChange.getNewValue()), true);
+// fkMutations.put(tb, tmp);
+// theQuery = theQuery +
tmp.updateQueryBuilder(false, db, sqlService) + ";"; // adding semicolon
between fk updates inside the transaction
+//
+// } else if (response.getRows().size() ==
1) {
+// FkGenericTreeNode tmp = new
FkGenericTreeNode(response.getRows().get(0), this, new SingleChange(tb, this,
chosenChange.getOldValue(), chosenChange.getNewValue()), false);
+// fkMutations.put(tb, tmp);
+// theQuery = theQuery +
tmp.updateQueryBuilder(false, db, sqlService) + ";"; // adding semicolon
between fk updates inside the transaction
+//
+// }
+// }
+// }
+// }
+//
+//
+//
+// theQuery = theQuery + updateQueryBuilder(undo,db,sqlService);
+// theQuery = theQuery + " ; COMMIT TRANSACTION;";
+//
+// System.out.println("Total query = "+theQuery);
+// return theQuery;
+// }
+
+ public void transferMutationToParent( Database db,SqlService sqlService)
{
- String theQuery = "";
+ TableColumn sgParentColumn = chosenChange.getParentTableColumn();
- theQuery = "START TRANSACTION; SET CONSTRAINTS ALL DEFERRED;";
-
-
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)
- {
- 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);
- }
- }
- }
- }
- }
- }
+ QueryResponseParser qrp;
+ QueryResponse response = null;
+ Collection<ForeignKeyConstraint> lesFk=
db.getLesForeignKeys().get(sgParentColumn.getTable().getName().toUpperCase());
+ for(ForeignKeyConstraint fk : lesFk)
+ {
+ if(fk.getChildColumns().contains(sgParentColumn))
+ {
+
chosenChange.setParentTableColumn(fk.getParentColumns().get(0)); // might
require some change if there are multiple parents to one field
+ }
+ }
- theQuery = theQuery + updateQueryBuilder(undo,db,sqlService);
- theQuery = theQuery + " ; COMMIT TRANSACTION;";
+ String semiQuery = "SELECT * FROM " +
chosenChange.getParentTableColumn().getTable().getName() + " WHERE " +
chosenChange.getParentTableColumn().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.getOldValue() + "' ";
+ else
+ semiQuery = semiQuery + chosenChange.getOldValue();
- System.out.println("Total query = "+theQuery);
- return theQuery;
+
+
+ try {
+ Statement stmt = sqlService.getConnection().createStatement();
+ ResultSet res = stmt.executeQuery(semiQuery);
+ qrp = new QueryResponseParser();
+ ArrayList<Row> rows = new ArrayList<Row>(qrp.parse(res,
chosenChange.getParentTableColumn().getTable()).getRows());
+ response = new QueryResponse(rows);
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+
+ initial_state_row = response.getRows().get(0);
}
- public boolean checkIfHasFk(Database db)
+ public boolean checkIfHasParentFk(Database db)
{
Collection<ForeignKeyConstraint> lesFk=
db.getLesForeignKeys().get(chosenChange.getParentTableColumn().getTable().getName().toUpperCase());
for(ForeignKeyConstraint fk : lesFk)
{
-
if(fk.getChildColumns().contains(chosenChange.getParentTableColumn()))
+ if(!fk.getParentColumns().isEmpty())
return true;
}
return false;
diff --git a/src/main/java/org/schemaspy/model/QueryResponseParser.java
b/src/main/java/org/schemaspy/model/QueryResponseParser.java
index e25956a..e24b825 100644
--- a/src/main/java/org/schemaspy/model/QueryResponseParser.java
+++ b/src/main/java/org/schemaspy/model/QueryResponseParser.java
@@ -68,7 +68,6 @@ public class QueryResponseParser
Row currentRow = new
Row(parentTable,mapOfTheRow,resultMeta.getColumnCount());
queryResponse.getRows().add(currentRow);
}
-
assert(!queryResponse.getRows().get(0).getContent().containsValue(null));
return queryResponse;
}
diff --git a/src/main/java/org/schemaspy/model/Row.java
b/src/main/java/org/schemaspy/model/Row.java
index 53f7d80..a5858d7 100644
--- a/src/main/java/org/schemaspy/model/Row.java
+++ b/src/main/java/org/schemaspy/model/Row.java
@@ -48,7 +48,11 @@ public class Row
this.nbKeys = nbKeys;
}
- public Table getParentTable()
+ public void setParentTable(Table parentTable) {
+ this.parentTable = parentTable;
+ }
+
+ public Table getParentTable()
{
return this.parentTable;
}
diff --git a/src/main/java/org/schemaspy/model/SingleChange.java
b/src/main/java/org/schemaspy/model/SingleChange.java
index b0be256..897b517 100644
--- a/src/main/java/org/schemaspy/model/SingleChange.java
+++ b/src/main/java/org/schemaspy/model/SingleChange.java
@@ -39,7 +39,11 @@ public class SingleChange
}
}
- @Override
+ public void setParentTableColumn(TableColumn parentTableColumn) {
+ this.parentTableColumn = parentTableColumn;
+ }
+
+ @Override
public String toString()
{
return "\n[SG - attachedToMutation :
"+this.getAttachedToMutation().getId()+"| OV :"+oldValue+" | NV :"+newValue+"
]\n";
--
To stop receiving notification emails like this one, please contact
address@hidden
[Prev in Thread] |
Current Thread |
[Next in Thread] |
- [GNUnet-SVN] [taler-schemafuzz] branch master updated: Still working on fk hanling. went back to Cascade,
gnunet <=