Example #1
0
        public void RunDBLint(DatabaseLint dblint)
        {
            this.ExecutionStatus.FoundIssues    = 0;
            this.ExecutionStatus.TablesAnalyzed = 0;
            this.ExecutionStatus.TotalTables    = _viewModel.MetadataSelection.Schemas.Sum(s => (s.Include.HasValue && !s.Include.Value) ? 0 : s.Tables.Value.Count(t => t.Include));
            this.ExecutionStatus.TotalWork      = 100;

            var worker = new ExecuteWorker(new DBLintExecuter(this), dblint);

            worker.StartWork();
        }
Example #2
0
 public ExecuteWorker(DBLintExecuter executer, DatabaseLint dblint)
 {
     _executer = executer;
     _dblint   = dblint;
 }
Example #3
0
        private void Write(String dirName, DatabaseLint dblint)
        {
            this.scoring = new IScoringImpl();
            this.scoring.CalculateScores(dblint);

            if (DBLint.Settings.IsNormalContext)
            {
                //Save run for incremental viewing
                //File name is a timestamp
                DateTime now      = DateTime.Now;
                String   fileName = String.Format("{0}{1}{2}{3}{4}{5}.xml", now.Year, now.Month, now.Day, now.Hour,
                                                  now.Minute, now.Second);
                //Folder, i.e.: runs/dbname/
                String folder   = Settings.INCREMENTAL_FOLDER + "testtest"; // dblint.DatabaseModel.DatabaseName;
                String filePath = folder + "/" + fileName;
                if (!Directory.Exists(folder))
                {
                    Directory.CreateDirectory(folder);
                }


                //Create run
                DBLint.IncrementalRuns.Run run = new IncrementalRuns.Run(dblint.DatabaseModel, dblint.IssueCollector, scoring.GetScores());
                //Write run
                using (FileStream writer = new FileStream(filePath, FileMode.Create))
                {
                    DataContractSerializer ser = new DataContractSerializer(typeof(DBLint.IncrementalRuns.Run));
                    ser.WriteObject(writer, run);
                    writer.Flush();
                }
            }

            DirectoryInfo dir = new DirectoryInfo(dirName);

            int tableNameCounter = 1;

            foreach (Table table in dblint.DatabaseModel.Tables)
            {
                String tName = "table" + tableNameCounter.ToString();
                this.tableNames.Add(table, tName);
                this.tableFiles.Add(table, "tables/" + tName + ".html");
                tableNameCounter++;
            }

            this.dblint = dblint;

            this.formatter = new HTMLDescriptionFormatter(this.tableFiles);

            IssueCollector issues = dblint.IssueCollector;

            //Create result directory if it does not exist
            if (!dir.Exists)
            {
                dir.Create();
            }

            VelocityContext context = new VelocityContext();

            context.Put("db", dblint.DatabaseModel);
            context.Put("totalScore", this.scoring.GetScore());
            context.Put("issuesTotal", issues.Count());
            context.Put("rulesExecuted", this.getRulesExecuted());
            context.Put("ruleTypes", this.getRuleTypes());
            context.Put("formatter", this.formatter);
            context.Put("HTMLBuilder", this);
            context.Put("summaries", this.dblint.ExecutionSummary);
            context.Put("executionTime", this.formatTimeSpan(this.dblint.ExecutionSummary.ExecutionTime));

            //Pagerank
            IProviderCollection providers = dblint.RuleController.ProviderCollection;
            var rank = providers.GetProvider <DBLint.Rules.SchemaProviders.ImportanceProvider>();

            //List all tables
            var tables = (from t in dblint.DatabaseModel.Tables
                          select new
            {
                Table = t,
                Name = t.TableName,
                IssueCount = issues.GetIssues(t).Count(),
                Score = this.scoring.GetScore(t),
                Importance = Math.Round(rank[t], 1)
            }).ToList();

            context.Put("tables", tables);

            //Bottom tables
            var bottom = tables.OrderBy(t => t.Score).Take(5).ToList();

            context.Put("bottomTables", bottom);

            int groupId = 0; //Used in the template to identify a group of issues
            //Group issues by name
            var issueGroups = (from i in issues
                               group i by i.Name into g
                               orderby g.First().Severity
                               select new
            {
                Name = g.Key,
                Count = g.Count(),
                Issues = g,
                GroupID = ++groupId,
                Severity = g.First().Severity
            }).ToList();

            context.Put("issueGroups", issueGroups);

            //Put issueGroups into severity groups
            var severityGroups = (from issueGroup in issueGroups
                                  group issueGroup by issueGroup.Severity into g
                                  orderby g.First().Severity
                                  select new
            {
                Severity = g.First().Severity,
                IssueGroups = g
            }
                                  );

            context.Put("severityGroups", severityGroups);

            //Incremental runs list
            var diffs = new List <DBLint.IncrementalRuns.Diff>();

            if (DBLint.Settings.IsNormalContext)
            {
                //Incremental runs
                try
                {
                    var runs = DBLint.IncrementalRuns.Run.GetRuns(dblint.DatabaseModel.DatabaseName, 5).ToList();
                    for (int i = 1; i < runs.Count; i++)
                    {
                        var diff = new DBLint.IncrementalRuns.Diff();
                        diff.Compare(runs[i], runs[i - 1]);
                        diffs.Add(diff);
                    }
                }
                catch { }
                context.Put("diffs", diffs);
            }
            //Create template for the main html page
            Template template = Velocity.GetTemplate("mainpage.vm");

            //Create outputstream for the main page
            TextWriter htmlOut = new StreamWriter(Path.Combine(dir.FullName, "mainpage.html"));

            //Write template
            template.Merge(context, htmlOut);
            htmlOut.Close();

            //Write issue groups
            String issuePath = Path.Combine(dir.FullName, "issues");

            if (!Directory.Exists(issuePath))
            {
                Directory.CreateDirectory(issuePath);
            }
            Template issueGroupTemplate = Velocity.GetTemplate("issuegroup.vm");

            formatter.PathPrefix = "../";
            foreach (var g in issueGroups)
            {
                context.Put("groupIssues", g.Issues);
                TextWriter issueOut = new StreamWriter(Path.Combine(issuePath, g.GroupID.ToString() + ".html"));
                issueGroupTemplate.Merge(context, issueOut);
                issueOut.Close();
            }
            if (DBLint.Settings.IsNormalContext)
            {
                //Write diffs/increments to files:
                String incPath = Path.Combine(dir.FullName, "increments");
                if (!Directory.Exists(incPath))
                {
                    Directory.CreateDirectory(incPath);
                }
                Template incrementTemplate = Velocity.GetTemplate("increment.vm");
                int      diffId            = 0;
                foreach (var diff in diffs)
                {
                    diffId++;
                    context.Put("diff", diff);
                    TextWriter incOut = new StreamWriter(Path.Combine(incPath, diffId.ToString() + ".html"));
                    incrementTemplate.Merge(context, incOut);
                    incOut.Close();
                }
            }

            formatter.PathPrefix = "";
            writeTableViews(dirName);
        }
Example #4
0
 public static void WriteReport(String dirName, DatabaseLint dblint)
 {
     new HTMLBuilder().Write(dirName, dblint);
 }