internal Table(Database database, ObjectName name) { _database = database; _name = name; _parsedName = new ParsedTableIdentifier(name.Name); _tableConstraints = new Dictionary<ObjectName, TableConstraint>(); _foreignKeyConstraints = new Dictionary<ObjectName, ForeignKeyConstraint>(); _foreignKeyDependencies = new List<ForeignKeyConstraint>(); }
public static void CreateDependenciesGraph(Database database, Set<Table> tableSubset) { using (StreamWriter writer = new StreamWriter("C:\\test.viz")) { writer.WriteLine("digraph database {"); writer.WriteLine(" node [fontname=Helvetica];"); writer.WriteLine(" node [shape=none, fontcolor=white, style=filled];"); foreach (Table table in database.TablesByName.Values) { if (tableSubset != null && !tableSubset.Contains(table)) continue; ParsedTableIdentifier tableIdentifier = new ParsedTableIdentifier(table.Name.Name); string nodeStyle = "black"; if (tableIdentifier.Prefix == "common") nodeStyle = "fillcolor=yellow4"; if (tableIdentifier.Prefix == "courier") nodeStyle = "fillcolor=darkolivegreen"; if (tableIdentifier.Prefix == "haulage") nodeStyle = "fillcolor=darkgoldenrod4"; string nodeSizing = ""; int connectionCount = table.ForeignKeyConstraintsByName.Count; foreach (TableConstraint constraint in table.TableConstraints) { connectionCount += constraint.RelatedForeignKeysByName.Count; } double width = 1.5 + 1.5 * connectionCount / 3.0; double height = 0.5 + 0.5 * connectionCount / 3.0; if (connectionCount > 3) nodeSizing = string.Format(", width={0:0.0}, height={1:0.0}", width, height); writer.WriteLine(" \"{0}\" [{1}{2}]", tableIdentifier.Value, nodeStyle, nodeSizing); foreach (ForeignKeyConstraint foreignKey in table.ForeignKeyConstraints) { if (tableSubset != null && !tableSubset.Contains(foreignKey.Table)) continue; ParsedTableIdentifier foreignKeyTableName = new ParsedTableIdentifier(foreignKey.Table.Name.Name); ParsedTableIdentifier primaryKeyTableName = new ParsedTableIdentifier(foreignKey.UniqueConstraint.Table.Name.Name); string edgeStyle = "color=gray15"; string arrowStyle = "diamondnormal"; if (foreignKey.IsOneToOne) arrowStyle = "normal"; if (foreignKey.IsDisabled ?? false) edgeStyle = "style=dotted, color=gray15"; if (foreignKey.UpdateRule == ForeignKeyRule.Cascade) edgeStyle = "color=red4"; writer.WriteLine(" \"{0}\" -> \"{1}\" [{2}, arrowhead={3}]", foreignKeyTableName.Value, primaryKeyTableName.Value, edgeStyle, arrowStyle); } } writer.WriteLine("}"); writer.Close(); } }