예제 #1
0
        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>();
        }
예제 #2
0
        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();
            }
        }