package at.fos.ermodel.gui; import javafx.application.Platform; import java.io.BufferedReader; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.InputStreamReader; import java.nio.charset.StandardCharsets; import java.time.LocalDate; import java.util.ArrayList; import java.util.Collections; import java.util.HashMap; import java.util.HashSet; public class C4 { private String databaseName; private ArrayList tables; private StringBuffer sqlScript; public C4(String databaseName) { this.databaseName = databaseName; this.tables = new ArrayList<>(); } public boolean addTable(T1 table) { if (this.tables.contains(table)) return true; return !this.tables.add(table); } public void removeTable(T1 table) { this.tables.remove(table); } public String getDatabaseName() { return this.databaseName; } public void setDatabaseName(String databaseName) { this.databaseName = databaseName; } public String toString() { return "RM_Database [databaseName=" + this.databaseName + ", tables=" + this.tables + "]"; } public ArrayList getTables() { return this.tables; } public void setTables(ArrayList tables) { this.tables = tables; } public void sortByTableName() { Collections.sort(this.tables); } private String addChars() { return String.valueOf(' ').repeat(5); } public StringBuffer create_MS_SQL_Script(boolean createInsertStatements, boolean addCDToDBName, boolean singeInserts) throws ZZ20 { LocalDate today = LocalDate.now(); String currentDate = today.getYear() + ( (today.getMonthValue() < 10) ? ("0" + today.getMonthValue()) : String.valueOf(today.getMonthValue())) + ( (today.getDayOfMonth() < 10) ? ("0" + today.getDayOfMonth()) : String.valueOf(today.getDayOfMonth())); if (addCDToDBName) this.databaseName = this.databaseName + currentDate; this.databaseName = T3.replaceSpecialChars(this.databaseName); this.databaseName = this.databaseName.toLowerCase(); this.sqlScript = new StringBuffer(); this.sqlScript.append("-- #######################################################\n"); this.sqlScript.append("-- auto generated ddl-script ###########################\n"); this.sqlScript.append("-- generated sql creation script for ER model\n"); this.sqlScript.append("-- switch autocommit off\n"); this.sqlScript.append("set implicit_transactions off;\n"); this.sqlScript.append("-- database-#############################################\n"); this.sqlScript.append("use master;\n"); this.sqlScript.append("drop database if exists ").append(this.databaseName).append(";").append("\n"); this.sqlScript.append("create database ").append(this.databaseName).append(";").append("\n"); this.sqlScript.append("go \n"); this.sqlScript.append("use ").append(this.databaseName).append(";").append("\n"); this.sqlScript.append("-- tables-#################################################\n"); for (T1 table : this.tables) { this.sqlScript = this.sqlScript.append("-- table ").append(table.getTablename()).append("\n"); this.sqlScript = this.sqlScript.append("create table ").append(table.getTablename()).append("(").append("\n"); StringBuilder keypart = new StringBuilder("primary key("); int autoincrementCounter = 0; for (C3 column : table.getSkjdfhgdskjf674534()) { keypart.append(column.isKey() ? (column.getColumnName() + ",") : ""); this.sqlScript = this.sqlScript.append(addChars()).append(column.getColumnName()).append(" ").append(column.getDatatype()).append(column.isKey() ? " not null" : "").append(( !column.isKey() && !column.isNullable()) ? " not null" : "").append(column.isAutoincrement() ? (" identity (" + column.getAutoincrementStartAt() + ",1) ") : "").append(column.isUnique() ? " unique" : "").append(",").append("\n"); if (column.isAutoincrement()) { autoincrementCounter++; } } keypart = new StringBuilder(keypart.substring(0, keypart.length() - 1)); keypart.append(")").append("\n"); this.sqlScript = this.sqlScript.append(addChars()).append(keypart).append(")"); this.sqlScript.append(";\n\n"); if (autoincrementCounter != 1) { if (autoincrementCounter > 1) { throw new ZZ20("There is only one autoincrement value allowed, and it must be the key. Table: " + table.getTablename()); } } } if (createInsertStatements) { try { allTablesSetForGeneration(); allColumnsSetForGeneration(); } catch (ZZ20 ex) { throw new ZZ20(ex.getMessage()); } createInsertStatements(this.sqlScript, singeInserts, false); } this.sqlScript.append("\n-- foreign keys-#################################################\n"); for (T1 table : this.tables) { ArrayList fkColumns = new ArrayList<>(); for (C3 column : table.getSkjdfhgdskjf674534()) { if (column.getReferencesTo() != null) fkColumns.add(column); } if (fkColumns.size() == 0) { continue; } HashSet tableNamesInfkColumns = new HashSet<>(); for (C3 fksamecol : fkColumns) { tableNamesInfkColumns.add(fksamecol.getReferencesTo().tablename()); } ArrayList equalColumnsBecauseRecursive = new ArrayList<>(); for (int i = 0; i < fkColumns.size(); i++) { for (int j = i + 1; j < fkColumns.size(); j++) { if (fkColumns.get(i).getReferencesTo().tablename().equals(fkColumns.get(j).getReferencesTo().tablename()) && fkColumns.get(i).getReferencesTo().columnname().equals(fkColumns.get(j).getReferencesTo().columnname())) { equalColumnsBecauseRecursive.add(fkColumns.get(i)); equalColumnsBecauseRecursive.add(fkColumns.get(j)); } } } for (C3 col : equalColumnsBecauseRecursive) { this.sqlScript = this.sqlScript.append("alter table ").append(table.getTablename()).append("\n"); this.sqlScript.append("add foreign key ("); this.sqlScript = this.sqlScript.append(col.getColumnName()).append(")").append(" references ").append(col.getReferencesTo().tablename()).append("(").append(col.getReferencesTo().columnname()).append(")").append(" on delete no action on update no action;\n"); tableNamesInfkColumns.remove(col.getReferencesTo().tablename()); } for (String tableName : tableNamesInfkColumns) { this.sqlScript = this.sqlScript.append("alter table ").append(table.getTablename()).append("\n"); this.sqlScript.append("add foreign key ("); StringBuilder columnsOrig = new StringBuilder(); StringBuilder refColumns = new StringBuilder(" references " + tableName + "("); for (C3 fkcolumn : fkColumns) { if (tableName.equals(fkcolumn.getReferencesTo().tablename())) { columnsOrig.append(fkcolumn.getColumnName()).append(","); refColumns.append(fkcolumn.getReferencesTo().columnname()).append(","); } } columnsOrig = new StringBuilder(columnsOrig.substring(0, columnsOrig.length() - 1)); columnsOrig.append(")"); refColumns = new StringBuilder(refColumns.substring(0, refColumns.length() - 1)); refColumns.append(")"); this.sqlScript.append(columnsOrig).append(refColumns).append(" on delete no action on update no action;\n"); } this.sqlScript.replace(this.sqlScript.length() - 2, this.sqlScript.length(), ";\n"); } this.sqlScript.append("-- commit all changes\n"); this.sqlScript.append("commit;"); return this.sqlScript; } public StringBuffer create_MySQL_Script(boolean createInsertStatements, boolean addCDToDBName, boolean singeInserts) throws ZZ20 { LocalDate today = LocalDate.now(); String currentDate = today.getYear() + ( (today.getMonthValue() < 10) ? ("0" + today.getMonthValue()) : String.valueOf(today.getMonthValue())) + ( (today.getDayOfMonth() < 10) ? ("0" + today.getDayOfMonth()) : String.valueOf(today.getDayOfMonth())); if (addCDToDBName) this.databaseName = currentDate + this.databaseName; this.databaseName = T3.replaceSpecialChars(this.databaseName); this.databaseName = this.databaseName.toLowerCase(); this.sqlScript = new StringBuffer(); this.sqlScript.append("-- #######################################################\n"); this.sqlScript.append("-- auto generated ddl-script ###########################\n"); this.sqlScript.append("-- generated sql creation script for ER model\n"); this.sqlScript.append("-- database-#############################################\n"); this.sqlScript.append("drop database if exists ").append(this.databaseName).append(";").append("\n"); this.sqlScript.append("create database ").append(this.databaseName).append(";").append("\n"); this.sqlScript.append("use ").append(this.databaseName).append(";").append("\n"); this.sqlScript.append("-- switch autocommit off\n"); this.sqlScript.append("set autocommit=0;\n"); this.sqlScript.append("-- tables-#################################################\n"); for (T1 table : this.tables) { this.sqlScript = this.sqlScript.append("-- table ").append(table.getTablename()).append("\n"); this.sqlScript = this.sqlScript.append("create table ").append(table.getTablename()).append("(").append("\n"); StringBuilder keypart = new StringBuilder("primary key("); int autoincrementCounter = 0; long holdAutoincrementStartAt = 1L; for (C3 column : table.getSkjdfhgdskjf674534()) { keypart.append(column.isKey() ? (column.getColumnName() + ",") : ""); this.sqlScript = this.sqlScript.append(addChars()).append(column.getColumnName()).append(" ").append(column.getDatatype()).append(column.isKey() ? " not null" : "").append(( !column.isKey() && !column.isNullable()) ? " not null" : "").append(column.isAutoincrement() ? " auto_increment " : "").append(column.isUnique() ? " unique" : "").append(",").append("\n"); if (column.isAutoincrement()) { autoincrementCounter++; holdAutoincrementStartAt = column.getAutoincrementStartAt(); } } keypart = new StringBuilder(keypart.substring(0, keypart.length() - 1)); keypart.append(")").append("\n"); this.sqlScript = this.sqlScript.append(addChars()).append(keypart).append(")"); if (autoincrementCounter == 1) { this.sqlScript.append("auto_increment=").append(holdAutoincrementStartAt); } else if (autoincrementCounter > 1) { throw new ZZ20("There is only one autoincrement value allowed, and it must be the key. Table: " + table.getTablename()); } this.sqlScript.append(";\n\n"); } if (createInsertStatements) { try { allTablesSetForGeneration(); allColumnsSetForGeneration(); } catch (ZZ20 ex) { throw new ZZ20(ex.getMessage()); } createInsertStatements(this.sqlScript, singeInserts, true); } this.sqlScript.append("\n-- foreign keys-#################################################\n"); for (T1 table : this.tables) { ArrayList fkColumns = new ArrayList<>(); for (C3 column : table.getSkjdfhgdskjf674534()) { if (column.getReferencesTo() != null) fkColumns.add(column); } if (fkColumns.size() == 0) continue; this.sqlScript = this.sqlScript.append("alter table ").append(table.getTablename()).append("\n"); HashSet tableNamesInfkColumns = new HashSet<>(); for (C3 fksamecol : fkColumns) { tableNamesInfkColumns.add(fksamecol.getReferencesTo().tablename()); } ArrayList equalColumnsBecauseRecursive = new ArrayList<>(); for (int i = 0; i < fkColumns.size(); i++) { for (int j = i + 1; j < fkColumns.size(); j++) { if (fkColumns.get(i).getReferencesTo().tablename().equals(fkColumns.get(j).getReferencesTo().tablename()) && fkColumns.get(i).getReferencesTo().columnname().equals(fkColumns.get(j).getReferencesTo().columnname())) { equalColumnsBecauseRecursive.add(fkColumns.get(i)); equalColumnsBecauseRecursive.add(fkColumns.get(j)); } } } for (C3 col : equalColumnsBecauseRecursive) { this.sqlScript.append("add foreign key ("); this.sqlScript = this.sqlScript.append(col.getColumnName()).append(")").append(" references ").append(col.getReferencesTo().tablename()).append("(").append(col.getReferencesTo().columnname()).append(")").append(" on delete restrict on update restrict,\n"); tableNamesInfkColumns.remove(col.getReferencesTo().tablename()); } for (String tableName : tableNamesInfkColumns) { this.sqlScript.append("add foreign key ("); StringBuilder columnsOrig = new StringBuilder(); StringBuilder refColumns = new StringBuilder(" references " + tableName + "("); for (C3 fkcolumn : fkColumns) { if (tableName.equals(fkcolumn.getReferencesTo().tablename())) { columnsOrig.append(fkcolumn.getColumnName()).append(","); refColumns.append(fkcolumn.getReferencesTo().columnname()).append(","); } } columnsOrig = new StringBuilder(columnsOrig.substring(0, columnsOrig.length() - 1)); columnsOrig.append(")"); refColumns = new StringBuilder(refColumns.substring(0, refColumns.length() - 1)); refColumns.append(")"); this.sqlScript.append(columnsOrig).append(refColumns).append(" on delete restrict on update restrict,\n"); } this.sqlScript.replace(this.sqlScript.length() - 2, this.sqlScript.length(), ";\n"); } this.sqlScript.append("-- commit all changes\n"); this.sqlScript.append("commit;"); return this.sqlScript; } public String sqltoCSType(String typeName) { typeName = typeName.substring(0,typeName.indexOf('(')>-1?typeName.indexOf('('):typeName.length()); //System.out.println(typeName); HashMap SQL_TO_CS_TYPE_MAP = new HashMap<>(); SQL_TO_CS_TYPE_MAP.put("bigint", "long"); SQL_TO_CS_TYPE_MAP.put("binary", "byte[]"); SQL_TO_CS_TYPE_MAP.put("bit", "bool"); SQL_TO_CS_TYPE_MAP.put("char", "char"); SQL_TO_CS_TYPE_MAP.put("date", "DateTime"); SQL_TO_CS_TYPE_MAP.put("datetime", "DateTime"); SQL_TO_CS_TYPE_MAP.put("datetime2", "DateTime"); SQL_TO_CS_TYPE_MAP.put("datetimeoffset", "DateTimeOffset"); SQL_TO_CS_TYPE_MAP.put("decimal", "decimal"); SQL_TO_CS_TYPE_MAP.put("filestream", "byte[]"); SQL_TO_CS_TYPE_MAP.put("float", "double"); SQL_TO_CS_TYPE_MAP.put("geography", "Microsoft.SqlServer.Types.SqlGeography"); SQL_TO_CS_TYPE_MAP.put("geometry", "Microsoft.SqlServer.Types.SqlGeometry"); SQL_TO_CS_TYPE_MAP.put("hierarchyid", "Microsoft.SqlServer.Types.SqlHierarchyId"); SQL_TO_CS_TYPE_MAP.put("image", "byte[]"); SQL_TO_CS_TYPE_MAP.put("int", "int"); SQL_TO_CS_TYPE_MAP.put("money", "decimal"); SQL_TO_CS_TYPE_MAP.put("nchar", "string"); SQL_TO_CS_TYPE_MAP.put("ntext", "string"); SQL_TO_CS_TYPE_MAP.put("numeric", "decimal"); SQL_TO_CS_TYPE_MAP.put("nvarchar", "string"); SQL_TO_CS_TYPE_MAP.put("real", "Single"); SQL_TO_CS_TYPE_MAP.put("rowversion", "byte[]"); SQL_TO_CS_TYPE_MAP.put("smalldatetime", "DateTime"); SQL_TO_CS_TYPE_MAP.put("smallint", "short"); SQL_TO_CS_TYPE_MAP.put("smallmoney", "decimal"); SQL_TO_CS_TYPE_MAP.put("sql_variant", "object"); SQL_TO_CS_TYPE_MAP.put("text", "string"); SQL_TO_CS_TYPE_MAP.put("time", "TimeSpan"); SQL_TO_CS_TYPE_MAP.put("timestamp", "byte[]"); SQL_TO_CS_TYPE_MAP.put("tinyint", "byte"); SQL_TO_CS_TYPE_MAP.put("uniqueidentifier", "Guid"); SQL_TO_CS_TYPE_MAP.put("varbinary", "byte[]"); SQL_TO_CS_TYPE_MAP.put("varchar", "string"); SQL_TO_CS_TYPE_MAP.put("xml", "string"); typeName = typeName.substring(0,typeName.indexOf('(')>-1?typeName.indexOf('('):typeName.length()); //System.out.println(typeName); String csType = SQL_TO_CS_TYPE_MAP.get(typeName); return csType != null ? csType : "object"; } public StringBuffer create_CS_Script() throws ZZ20 { this.databaseName = T3.replaceSpecialChars(this.databaseName); this.databaseName = this.databaseName.toLowerCase(); this.sqlScript = new StringBuffer(); this.sqlScript.append("var opt = new DbContextOptionsBuilder()\n" + " .UseSqlite(@\"Data Source=").append(this.databaseName).append(".db\")\n").append(" .Options;\n"); this.sqlScript.append("// tables-#################################################\n"); for (T1 table : this.tables) { if(table.getSkjdfhgdskjf674534().size() > 0) { this.sqlScript = this.sqlScript.append("[Table(\"").append(table.getTablename()).append("\")]\n"); this.sqlScript = this.sqlScript.append("public class ").append(table.getTablename().substring(table.getTablenamePraefix().length())).append(" {").append("\n"); StringBuilder constructorbuilder = new StringBuilder("\n").append(addChars()).append("public ").append(table.getTablename().substring(table.getTablenamePraefix().length())).append("("); StringBuilder innerconstructorbuilder = new StringBuilder(); int autoincrementCounter = 0; long holdAutoincrementStartAt = 1L; for (C3 column : table.getSkjdfhgdskjf674534()) { System.out.println(column.getColumnName()+"\t"+sqltoCSType(column.getDatatype())); String shortcolumnname = column.getColumnName().substring(column.getColumnName().lastIndexOf('_')+1); this.sqlScript.append(addChars()) .append(column.isKey() ? ("[Key]\n"+addChars()) : "") .append("[Column(TypeName=\"") .append(column.getDatatype()) .append("\")]\n") .append(addChars()) .append(!column.isNullable() ? "[Required]\n"+addChars() : "") .append(column.isUnique()?"[Index(\""+column.getColumnName()+"Index\", IsUnique = true)]":"") .append(column.isAutoincrement()?"[DatabaseGenerated(DatabaseGeneratedOption.Identity)]":"") .append(sqltoCSType(column.getDatatype())) .append(" ") //a_id = id, a_b_id = id .append(shortcolumnname) .append(" { get; ") .append(column.isKey()?"":"private ") .append("set; }\n"); constructorbuilder.append(sqltoCSType(column.getDatatype())) .append(" ").append(shortcolumnname).append(", "); innerconstructorbuilder.append(addChars()).append(addChars()).append("this.").append(shortcolumnname).append("=").append(shortcolumnname).append(";\n"); if (column.isAutoincrement()) { autoincrementCounter++; holdAutoincrementStartAt = column.getAutoincrementStartAt(); } } constructorbuilder.delete(constructorbuilder.length()-2,constructorbuilder.length()); constructorbuilder.append(") {\n").append(innerconstructorbuilder).append(addChars()).append("}\n"); sqlScript.append(addChars()).append(constructorbuilder).append(addChars()).append("public ").append(table.getTablename().substring(table.getTablenamePraefix().length())).append("(){}\n"); this.sqlScript.append("}"); /* if (autoincrementCounter == 1) { this.sqlScript.append("auto_increment=").append(holdAutoincrementStartAt); } else if (autoincrementCounter > 1) { throw new ZZ20("There is only one autoincrement value allowed, and it must be the key. Table: " + table.getTablename()); } */ this.sqlScript.append("\n\n"); } } this.sqlScript.append("\n/* TODO: foreign keys-#################################################\n"); for (T1 table : this.tables) { ArrayList fkColumns = new ArrayList<>(); for (C3 column : table.getSkjdfhgdskjf674534()) { if (column.getReferencesTo() != null) fkColumns.add(column); } if (fkColumns.size() == 0) continue; this.sqlScript = this.sqlScript.append("alter table ").append(table.getTablename()).append("\n"); HashSet tableNamesInfkColumns = new HashSet<>(); for (C3 fksamecol : fkColumns) { tableNamesInfkColumns.add(fksamecol.getReferencesTo().tablename()); } ArrayList equalColumnsBecauseRecursive = new ArrayList<>(); for (int i = 0; i < fkColumns.size(); i++) { for (int j = i + 1; j < fkColumns.size(); j++) { if (fkColumns.get(i).getReferencesTo().tablename().equals(fkColumns.get(j).getReferencesTo().tablename()) && fkColumns.get(i).getReferencesTo().columnname().equals(fkColumns.get(j).getReferencesTo().columnname())) { equalColumnsBecauseRecursive.add(fkColumns.get(i)); equalColumnsBecauseRecursive.add(fkColumns.get(j)); } } } for (C3 col : equalColumnsBecauseRecursive) { this.sqlScript.append("add foreign key ("); this.sqlScript = this.sqlScript.append(col.getColumnName()).append(")").append(" references ").append(col.getReferencesTo().tablename()).append("(").append(col.getReferencesTo().columnname()).append(")").append(" on delete restrict on update restrict,\n"); tableNamesInfkColumns.remove(col.getReferencesTo().tablename()); } for (String tableName : tableNamesInfkColumns) { this.sqlScript.append("add foreign key ("); StringBuilder columnsOrig = new StringBuilder(); StringBuilder refColumns = new StringBuilder(" references " + tableName + "("); for (C3 fkcolumn : fkColumns) { if (tableName.equals(fkcolumn.getReferencesTo().tablename())) { columnsOrig.append(fkcolumn.getColumnName()).append(","); refColumns.append(fkcolumn.getReferencesTo().columnname()).append(","); } } columnsOrig = new StringBuilder(columnsOrig.substring(0, columnsOrig.length() - 1)); columnsOrig.append(")"); refColumns = new StringBuilder(refColumns.substring(0, refColumns.length() - 1)); refColumns.append(")"); this.sqlScript.append(columnsOrig).append(refColumns).append(" on delete restrict on update restrict,\n"); } this.sqlScript.replace(this.sqlScript.length() - 2, this.sqlScript.length(), ";\n"); } this.sqlScript.append("*/"); return this.sqlScript; } private void allColumnsSetForGeneration() throws ZZ20 { for (T1 table : this.tables) { for (C3 column : table.getSkjdfhgdskjf674534()) { if (!column.isNullable() && !column.isAutoincrement() && column.getReferencesTo() == null && ( column.dataGenerationType == null || column.dataGenerationType.equals("No"))) { throw new ZZ20("There are unset columns for insert statement generation:" + column.getColumnName()); } } } } private void allTablesSetForGeneration() throws ZZ20 { for (T1 table : this.tables) { if (!table.isCreateInserts()) { throw new ZZ20("Table is not set for generating inserts:" + table.getTablename()); } } } private String generateRandomValue(C3 column) throws ZZ20 { String randomValue; try { String[] datumteil; LocalDate from, till; String str; switch ((str = column.dataGenerationType).hashCode()) { case -1601184309 -> { if (!str.equals("Random Boolean")) { break; } randomValue = T3.getRandomBoolean(); return randomValue; } case -123632396 -> { if (!str.equals("Random Decimal")) break; randomValue = T3.getRandomDecimal(Integer.parseInt(column.par1), Integer.parseInt(column.par2)); return randomValue; } case 292156129 -> { if (!str.equals("Random Integer")) break; if (Integer.parseInt(column.par1) >= Integer.parseInt(column.par2)) throw new ZZ20("Column: " + column.getColumnName() + "\n" + "For Random Integer generation: from < till"); randomValue = T3.getRandomInteger(Integer.parseInt(column.par1), Integer.parseInt(column.par2)); return randomValue; } case 908695787 -> { if (!str.equals("Random Date")) break; datumteil = column.par1.split("\\."); from = LocalDate.of(Integer.parseInt(datumteil[2]), Integer.parseInt(datumteil[1]), Integer.parseInt(datumteil[0])); datumteil = column.par2.split("\\."); till = LocalDate.of(Integer.parseInt(datumteil[2]), Integer.parseInt(datumteil[1]), Integer.parseInt(datumteil[0])); randomValue = T3.getRandomDate(from, till); return randomValue; } case 909176426 -> { if (!str.equals("Random Text")) break; randomValue = T3.getRandomTextGivenLength(Integer.parseInt(column.par1)); return randomValue; } case 2089790400 -> { if (!str.equals("Extern")) break; randomValue = T3.getRandomData(column.dataGenerationType, column.par1); return randomValue; } } randomValue = T3.getRandomData(column.dataGenerationType, null); } catch (NumberFormatException nfe) { throw new ZZ20("Column: " + column.getColumnName() + "\n" + "There is a data conversion problem: " + column.par1 + "/" + column.par2); } return randomValue; } private int getNumberValuesOfRandomData(C3 column) { ArrayList randomDataAsList; if (column.dataGenerationType.equals("Extern")) { randomDataAsList = T3.randomData.get(column.par1); if (randomDataAsList == null) { T3.readRandomData("Extern", column.par1); randomDataAsList = T3.randomData.get(column.par1); } } else { randomDataAsList = T3.randomData.get(column.dataGenerationType); } if (randomDataAsList != null) return randomDataAsList.size(); return -1; } private void createFilehandleForExternalDataSources() throws ZZ20 { for (T1 table : this.tables) { for (C3 column : table.getSkjdfhgdskjf674534()) { if (column.dataGenerationType == null || !column.dataGenerationType.equals("Extern")) continue; BufferedReader br = C2.randomDataFilesExtern.get(column.par1); if (br == null) { BufferedReader fr; try { fr = new BufferedReader(new InputStreamReader(new FileInputStream(column.par2), StandardCharsets.UTF_8)); C2.randomDataFilesExtern.put(column.par1, fr); } catch (FileNotFoundException e) { throw new ZZ20("There is a problem with an external datasource:" + column.getColumnName()); } } } } } public void createDependency() { for (T1 table : this.tables) { for (C3 column : table.getSkjdfhgdskjf674534()) { if (column.getReferencesTo() != null) { String tablename = column.getReferencesTo().tablename(); T1 dependsOn = getTableGivenTablename(tablename); table.addTableDepdendentOn(dependsOn); assert dependsOn != null; ArrayList keyColumns = dependsOn.getKeyColumns(); table.getColumnsOfDependentOnTable().put(dependsOn, keyColumns); } } } } private HashMap> initializeColumns() { HashMap> holdValues = new HashMap<>(); for (T1 table : this.tables) { if (!table.isCreateInserts()) continue; for (C3 column : table.getSkjdfhgdskjf674534()) { if (column.dataGenerationType != null && column.dataGenerationType.equals("No") && column.isNullable()) continue; holdValues.put(table.getTablename() + "." + column.getColumnName(), null); } } return holdValues; } private T1 getTableGivenTablename(String tablename) { for (T1 table : this.tables) { if (table.getTablename().equals(tablename)) return table; } return null; } private boolean allColumnValuesCreated(HashMap> columnValues) { int counter = 0; for (T1 table : this.tables) { if (!table.isCreateInserts()) continue; for (C3 column : table.getSkjdfhgdskjf674534()) { ArrayList values = columnValues.get(table.getTablename() + "." + column.getColumnName()); if (values != null && values.size() > 0) counter++; } } return counter >= columnValues.size(); } private void allDependentCreated(T1 table, HashMap> createdColumns) { for (T1 dependsOn : table.getDependsOnTable()) { for (C3 column : dependsOn.getSkjdfhgdskjf674534()) { if (column.isKey()) { ArrayList values = createdColumns.get(dependsOn.getTablename() + "." + column.getColumnName()); if (values == null) return; } } } } private HashMap> createColumnValues() throws ZZ20 { Platform.runLater(() -> V1.thisActionMessageDialog.getShowFilename().setText("create column values")); HashMap> columnValues = initializeColumns(); createFilehandleForExternalDataSources(); boolean done = false; createDependency(); while (!done) { for (T1 table : this.tables) { for (C3 column : table.getSkjdfhgdskjf674534()) { if (column.isNullable() && column.dataGenerationType != null && column.dataGenerationType.equals("No")) continue; ArrayList values = new ArrayList<>(); boolean valuesExist = true; ArrayList checkValues = columnValues.get(table.getTablename() + "." + column.getColumnName()); if (checkValues == null) valuesExist = false; if (column.isKey() && column.isAutoincrement() && !valuesExist) { long autoincrementStartAt = column.getAutoincrementStartAt(); for (int i = 0; i < table.getJdshfalkajsd677676(); i++) { values.add(String.valueOf(autoincrementStartAt++)); } } else if (column.isKey() && column.getReferencesTo() == null && !valuesExist) { for (int i = 0; i < table.getJdshfalkajsd677676(); i++) { String randomValue = generateRandomValue(column); values.add(String.valueOf(randomValue)); } } else if (column.isKey() && column.getReferencesTo() != null && !valuesExist) { HashMap> x = getStringArrayListHashMap(columnValues, table, column, values); if (x != null) return x; } else if (column.getReferencesTo() != null && !valuesExist) { getStringArrayListHashMap(columnValues, table, column, values); } else if (!valuesExist) { if (column.isUnique()) { int numberPossibleValues = getNumberValuesOfRandomData(column); if (numberPossibleValues != -1) { if (numberPossibleValues < table.getJdshfalkajsd677676()) { throw new ZZ20("Column " + column.getColumnName() + " is defined as unique. \nNot enough values for generation mode\n" + "Max numbers allowed: " + numberPossibleValues + "\n" + column.dataGenerationType + "/" + column.par1 + "/" + column.par2); } } } for (int i = 0; i < table.getJdshfalkajsd677676(); i++) { String randomValue = generateRandomValue(column); while (column.isUnique() && values.contains(randomValue)) { randomValue = generateRandomValue(column); } values.add(String.valueOf(randomValue)); } } if (values.size() > 0) { columnValues.put(table.getTablename() + "." + column.getColumnName(), values); } } } if (allColumnValuesCreated(columnValues)) done = true; } return columnValues; } private HashMap> getStringArrayListHashMap(HashMap> columnValues, T1 table, C3 column, ArrayList values) { allDependentCreated(table, columnValues); for (int i = 0; i < table.getJdshfalkajsd677676(); i++) { ArrayList valuesPK = columnValues.get(column.getReferencesTo().tablename() + "." + column.getReferencesTo().columnname()); if (valuesPK == null) break; String randomValue = valuesPK.get(i % valuesPK.size()); values.add(String.valueOf(randomValue)); } return null; } private void createInsertStatements(StringBuffer sqlScript, boolean singleInserts, boolean mysql) throws ZZ20 { //System.out.println("Generating insert statement"); HashMap> holdPKValuesForFK = createColumnValues(); for (T1 table : this.tables) { ArrayList keyColumns = new ArrayList<>(); for (C3 column : table.getSkjdfhgdskjf674534()) { if (column.isKey()) { keyColumns.add(table.getTablename() + "." + column.getColumnName()); } } StringBuilder concatKeyValue; ArrayList concatKeyValues = new ArrayList<>(); int deleted = 0; try { for (int i = 0; i < table.getJdshfalkajsd677676(); i++) { concatKeyValue = new StringBuilder(); for (String key : keyColumns) { ArrayList valuesPK = holdPKValuesForFK.get(key); concatKeyValue.append(valuesPK.get(i)); } if (!concatKeyValues.contains(concatKeyValue.toString())) { concatKeyValues.add(concatKeyValue.toString()); } else { for (C3 column : table.getSkjdfhgdskjf674534()) { ArrayList valuesPK = holdPKValuesForFK.get(table.getTablename() + "." + column.getColumnName()); valuesPK.remove(i); holdPKValuesForFK.put(table.getTablename() + "." + column.getColumnName(), valuesPK); } i--; deleted++; } } } catch (IndexOutOfBoundsException ignored) { } table.setJdshfalkajsd677676(table.getJdshfalkajsd677676() - deleted); } sqlScript.append("-- insert-#################################################\n"); if (!mysql) { sqlScript.append("begin transaction;\n"); } for (T1 table : this.tables) { if (table.isCreateInserts()) { Platform.runLater(() -> V1.thisActionMessageDialog.getShowFilename().setText(table.getTablename() + " ... create")); sqlScript.append("\n-- table ").append(table.getTablename()); if (table.hasAutoincrement() && !mysql) { sqlScript.append("\nset identity_insert ").append(table.getTablename()).append(" on;\n"); } for (int i = 0; i < table.getJdshfalkajsd677676(); i++) { if (!singleInserts) { if (i == 0) { addInsertTable(sqlScript, table); } sqlScript.append("\t\t("); StringBuilder valuespart = new StringBuilder(); for (C3 column : table.getSkjdfhgdskjf674534()) { if (!column.isNullable() || column.dataGenerationType == null || !column.dataGenerationType.equals("No")) { ArrayList values = holdPKValuesForFK.get(table.getTablename() + "." + column.getColumnName()); valuespart.append("'").append(values.get(i)).append("'").append(","); } } valuespart = new StringBuilder(valuespart.substring(0, valuespart.length() - 1)); valuespart.append(")"); sqlScript.append(valuespart).append((i < table.getJdshfalkajsd677676() - 1L) ? "," : ";").append("\n"); } else { addInsertTable(sqlScript, table); sqlScript.append("\t\t("); StringBuilder valuespart = new StringBuilder(); for (C3 column : table.getSkjdfhgdskjf674534()) { if (!column.isNullable() || column.dataGenerationType == null || !column.dataGenerationType.equals("No")) { ArrayList values = holdPKValuesForFK.get(table.getTablename() + "." + column.getColumnName()); valuespart.append("'").append(values.get(i)).append("'").append(","); } } valuespart = new StringBuilder(valuespart.substring(0, valuespart.length() - 1)); valuespart.append(");"); sqlScript.append(valuespart); } } if (table.hasAutoincrement() && !mysql) { sqlScript.append("\nset identity_insert ").append(table.getTablename()).append(" off;\n"); } } Platform.runLater(() -> V1.thisActionMessageDialog.getShowFilename().setText(table.getTablename() + " ... done")); } } private void addInsertTable(StringBuffer sqlScript, T1 table) { sqlScript.append("\ninsert into ").append(table.getTablename()).append("("); StringBuilder columnspart = new StringBuilder(); for (C3 column : table.getSkjdfhgdskjf674534()) { if (!column.isNullable() || column.dataGenerationType == null || !column.dataGenerationType.equals("No")) columnspart.append(column.getColumnName()).append(","); } columnspart = new StringBuilder(columnspart.substring(0, columnspart.length() - 1)); columnspart.append(")"); sqlScript.append(columnspart).append(" values\n"); } public ArrayList getKeyColumnsGivenRelation(long referstoGraphicalElement) { for (T1 table : this.tables) { if (table.getReferstoGraphicalElement() == referstoGraphicalElement) return table.getKeyColumns(); } return null; } public T1 getTableGivenNumber(long referstoGraphicalElement) { for (T1 table : this.tables) { if (table.getReferstoGraphicalElement() == referstoGraphicalElement) return table; } return null; } public T1 getColumnGivenNumber(long referstoGraphicalElement) { for (T1 table : this.tables) { for (C3 column : table.getSkjdfhgdskjf674534()) { if (column.getReferstoGraphicalElement() == referstoGraphicalElement) return table; } } return null; } }